nuclear@36: #include nuclear@36: #include nuclear@36: #include nuclear@24: #include nuclear@18: #include nuclear@18: #include "demo.h" nuclear@18: #include "sdr.h" nuclear@18: #include "volray.h" nuclear@36: #include "ui.h" nuclear@18: nuclear@36: #define SZ 128 nuclear@36: #define TIMER_INTERVAL 33 nuclear@18: nuclear@18: nuclear@36: Demo::Demo() nuclear@36: { nuclear@36: vol = 0; nuclear@36: sdr_mballs = 0; nuclear@36: fbo = 0; nuclear@36: timer = 0; nuclear@36: balls = 0; nuclear@36: tmsec = 0; nuclear@36: } nuclear@36: nuclear@36: Demo::~Demo() nuclear@36: { nuclear@36: glDeleteFramebuffersEXT(1, &fbo); nuclear@36: free_program(sdr_mballs); nuclear@36: delete vol; nuclear@36: delete timer; nuclear@36: nuclear@36: delete [] balls; nuclear@36: } nuclear@36: nuclear@36: void Demo::timer_func() nuclear@36: { nuclear@36: float tsec = tmsec / 1000.0; nuclear@36: const float speed = 1.0; nuclear@36: nuclear@36: for(int i=0; icreate(SZ, SZ, SZ); nuclear@18: volray_setvolume(vol); nuclear@18: nuclear@24: assert(glGenFramebuffersEXT); nuclear@24: assert(glBindFramebufferEXT); nuclear@24: assert(glFramebufferTexture3DEXT); nuclear@24: assert(glCheckFramebufferStatusEXT); nuclear@24: nuclear@24: glGenFramebuffersEXT(1, &fbo); nuclear@24: glBindFramebufferEXT(GL_FRAMEBUFFER, fbo); nuclear@24: glFramebufferTexture3DEXT(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_3D, nuclear@18: vol->get_texture(), 0, 0); nuclear@18: nuclear@24: unsigned int stat = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER); nuclear@18: if(stat != GL_FRAMEBUFFER_COMPLETE) { nuclear@18: printf("incomplete framebuffer: %u\n", stat); nuclear@18: delete vol; nuclear@18: return false; nuclear@18: } nuclear@24: glBindFramebufferEXT(GL_FRAMEBUFFER, 0); nuclear@18: nuclear@36: // initialize metaballs nuclear@36: auto rnd_energy = std::bind(std::uniform_real_distribution(0.7, 1.6), std::mt19937()); nuclear@36: auto rnd_path = std::bind(std::uniform_real_distribution(-0.5, 0.5), std::mt19937()); nuclear@36: nuclear@36: num_balls = 4; nuclear@36: balls = new MetaBall[4]; nuclear@36: nuclear@36: for(int i=0; i<4; i++) { nuclear@36: balls[i].energy = rnd_energy(); nuclear@36: nuclear@36: for(int j=0; jsetSingleShot(false); nuclear@36: connect(timer, SIGNAL(timeout()), this, SLOT(timer_func())); nuclear@36: timer->start(TIMER_INTERVAL); nuclear@36: nuclear@18: return true; nuclear@18: } nuclear@18: nuclear@36: void Demo::draw() const nuclear@18: { nuclear@18: if(volray_getvolume() != vol) { nuclear@36: if(timer->isActive()) { nuclear@36: timer->stop(); nuclear@36: } nuclear@18: return; nuclear@36: } else { nuclear@36: if(!timer->isActive()) { nuclear@36: timer->start(TIMER_INTERVAL); nuclear@36: } nuclear@18: } nuclear@18: nuclear@21: glPushAttrib(GL_VIEWPORT_BIT); nuclear@21: glViewport(0, 0, SZ, SZ); nuclear@21: nuclear@24: glBindFramebufferEXT(GL_FRAMEBUFFER, fbo); nuclear@18: bind_program(sdr_mballs); nuclear@18: nuclear@18: for(int i=0; iget_texture(), 0, i); nuclear@18: nuclear@21: float z = (float)i / (float)SZ; nuclear@21: nuclear@18: glBegin(GL_QUADS); nuclear@21: glTexCoord3f(0, 0, z); nuclear@18: glVertex2f(-1, -1); nuclear@21: glTexCoord3f(1, 0, z); nuclear@18: glVertex2f(1, -1); nuclear@21: glTexCoord3f(1, 1, z); nuclear@18: glVertex2f(1, 1); nuclear@21: glTexCoord3f(0, 1, z); nuclear@18: glVertex2f(-1, 1); nuclear@18: glEnd(); nuclear@18: } nuclear@18: nuclear@18: bind_program(0); nuclear@24: glBindFramebufferEXT(GL_FRAMEBUFFER, 0); nuclear@21: nuclear@21: glPopAttrib(); nuclear@18: }