qvolray

annotate src/demo.cc @ 21:4c62be57fc1a

foo
author John Tsiombikas <nuclear@member.fsf.org>
date Wed, 11 Apr 2012 16:59:45 +0300
parents 3d05c261a2f4
children c27ce79632db
rev   line source
nuclear@18 1 #include <GL/glew.h>
nuclear@18 2 #include "demo.h"
nuclear@18 3 #include "sdr.h"
nuclear@18 4 #include "volray.h"
nuclear@18 5
nuclear@18 6 #define SZ 128
nuclear@18 7
nuclear@18 8 static Volume *vol;
nuclear@18 9 static unsigned int sdr_mballs;
nuclear@18 10 static unsigned int fbo;
nuclear@18 11
nuclear@18 12 bool init_demo()
nuclear@18 13 {
nuclear@18 14 if(!(sdr_mballs = create_program_load("sdr/demo.v.glsl", "sdr/demo.p.glsl"))) {
nuclear@18 15 return false;
nuclear@18 16 }
nuclear@18 17
nuclear@18 18 vol = new Volume;
nuclear@18 19 vol->create(SZ, SZ, SZ);
nuclear@18 20 volray_setvolume(vol);
nuclear@18 21
nuclear@18 22 glGenFramebuffers(1, &fbo);
nuclear@18 23 glBindFramebuffer(GL_FRAMEBUFFER, fbo);
nuclear@18 24 glFramebufferTexture3D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_3D,
nuclear@18 25 vol->get_texture(), 0, 0);
nuclear@18 26
nuclear@18 27 unsigned int stat = glCheckFramebufferStatus(GL_FRAMEBUFFER);
nuclear@18 28 if(stat != GL_FRAMEBUFFER_COMPLETE) {
nuclear@18 29 printf("incomplete framebuffer: %u\n", stat);
nuclear@18 30 delete vol;
nuclear@18 31 return false;
nuclear@18 32 }
nuclear@18 33 glBindFramebuffer(GL_FRAMEBUFFER, 0);
nuclear@18 34
nuclear@18 35 return true;
nuclear@18 36 }
nuclear@18 37
nuclear@18 38 void draw_demo()
nuclear@18 39 {
nuclear@18 40 if(volray_getvolume() != vol) {
nuclear@18 41 return;
nuclear@18 42 }
nuclear@18 43
nuclear@21 44 glPushAttrib(GL_VIEWPORT_BIT);
nuclear@21 45 glViewport(0, 0, SZ, SZ);
nuclear@21 46
nuclear@18 47 glBindFramebuffer(GL_FRAMEBUFFER, fbo);
nuclear@18 48 bind_program(sdr_mballs);
nuclear@18 49
nuclear@18 50 for(int i=0; i<SZ; i++) {
nuclear@18 51 glFramebufferTexture3D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_3D,
nuclear@18 52 vol->get_texture(), 0, i);
nuclear@18 53
nuclear@21 54 float z = (float)i / (float)SZ;
nuclear@21 55
nuclear@18 56 glBegin(GL_QUADS);
nuclear@21 57 glTexCoord3f(0, 0, z);
nuclear@18 58 glVertex2f(-1, -1);
nuclear@21 59 glTexCoord3f(1, 0, z);
nuclear@18 60 glVertex2f(1, -1);
nuclear@21 61 glTexCoord3f(1, 1, z);
nuclear@18 62 glVertex2f(1, 1);
nuclear@21 63 glTexCoord3f(0, 1, z);
nuclear@18 64 glVertex2f(-1, 1);
nuclear@18 65 glEnd();
nuclear@18 66 }
nuclear@18 67
nuclear@18 68 bind_program(0);
nuclear@18 69 glBindFramebuffer(GL_FRAMEBUFFER, 0);
nuclear@21 70
nuclear@21 71 glPopAttrib();
nuclear@18 72 }