nuclear@24: #include nuclear@18: #include nuclear@18: #include "demo.h" nuclear@18: #include "sdr.h" nuclear@18: #include "volray.h" nuclear@18: nuclear@18: #define SZ 128 nuclear@18: nuclear@18: static Volume *vol; nuclear@18: static unsigned int sdr_mballs; nuclear@18: static unsigned int fbo; nuclear@18: nuclear@18: bool init_demo() nuclear@18: { nuclear@18: if(!(sdr_mballs = create_program_load("sdr/demo.v.glsl", "sdr/demo.p.glsl"))) { nuclear@18: return false; nuclear@18: } nuclear@18: nuclear@18: vol = new Volume; nuclear@18: vol->create(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@18: return true; nuclear@18: } nuclear@18: nuclear@18: void draw_demo() nuclear@18: { nuclear@18: if(volray_getvolume() != vol) { nuclear@18: return; 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: }