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 }
|