rev |
line source |
nuclear@0
|
1 #include <stdio.h>
|
nuclear@0
|
2 #include <stdlib.h>
|
nuclear@0
|
3 #include <math.h>
|
nuclear@0
|
4 #include <assert.h>
|
nuclear@0
|
5
|
nuclear@0
|
6 #include <GL/glew.h>
|
nuclear@0
|
7 #ifndef __APPLE__
|
nuclear@0
|
8 #include <GL/glut.h>
|
nuclear@0
|
9 #else
|
nuclear@0
|
10 #include <GLUT/glut.h>
|
nuclear@0
|
11 #endif
|
nuclear@0
|
12 #include "rtarg.h"
|
nuclear@0
|
13 #include "sdr.h"
|
nuclear@0
|
14
|
nuclear@0
|
15 enum {
|
nuclear@0
|
16 BLUR_REG,
|
nuclear@0
|
17 BLUR_SEP,
|
nuclear@0
|
18
|
nuclear@0
|
19 NUM_BLUR_TYPES
|
nuclear@0
|
20 };
|
nuclear@0
|
21
|
nuclear@0
|
22 static bool init();
|
nuclear@0
|
23 static void cleanup();
|
nuclear@0
|
24 static void disp();
|
nuclear@0
|
25 static void print_string(const char *str);
|
nuclear@0
|
26 static void idle();
|
nuclear@0
|
27 static void reshape(int x, int y);
|
nuclear@0
|
28 static void keyb(unsigned char key, int x, int y);
|
nuclear@0
|
29 static void mouse(int bn, int st, int x, int y);
|
nuclear@0
|
30 static void motion(int x, int y);
|
nuclear@0
|
31
|
nuclear@0
|
32 static int win_width, win_height;
|
nuclear@0
|
33 static float cam_theta, cam_phi, cam_dist = 8;
|
nuclear@0
|
34
|
nuclear@0
|
35 static RenderTarget *rtarg, *tmp_rtarg;
|
nuclear@0
|
36 static unsigned int sdrblur, sdr_hblur, sdr_vblur;
|
nuclear@0
|
37
|
nuclear@0
|
38 static int blur_type = BLUR_REG;
|
nuclear@0
|
39
|
nuclear@0
|
40
|
nuclear@0
|
41 int main(int argc, char **argv)
|
nuclear@0
|
42 {
|
nuclear@0
|
43 glutInitWindowSize(1280, 800);
|
nuclear@0
|
44 glutInit(&argc, argv);
|
nuclear@0
|
45 glutInitDisplayMode(GLUT_RGB | GLUT_DEPTH | GLUT_DOUBLE);
|
nuclear@0
|
46 glutCreateWindow("convolution");
|
nuclear@0
|
47
|
nuclear@0
|
48 glutDisplayFunc(disp);
|
nuclear@0
|
49 glutIdleFunc(idle);
|
nuclear@0
|
50 glutReshapeFunc(reshape);
|
nuclear@0
|
51 glutKeyboardFunc(keyb);
|
nuclear@0
|
52 glutMouseFunc(mouse);
|
nuclear@0
|
53 glutMotionFunc(motion);
|
nuclear@0
|
54
|
nuclear@0
|
55 if(!init()) {
|
nuclear@0
|
56 return 1;
|
nuclear@0
|
57 }
|
nuclear@0
|
58 atexit(cleanup);
|
nuclear@0
|
59
|
nuclear@0
|
60 glutMainLoop();
|
nuclear@0
|
61 return 0;
|
nuclear@0
|
62 }
|
nuclear@0
|
63
|
nuclear@0
|
64 static bool init()
|
nuclear@0
|
65 {
|
nuclear@0
|
66 glewInit();
|
nuclear@0
|
67
|
nuclear@0
|
68 glClearColor(0.1, 0.1, 0.1, 1);
|
nuclear@0
|
69
|
nuclear@0
|
70 glEnable(GL_DEPTH_TEST);
|
nuclear@0
|
71 glEnable(GL_CULL_FACE);
|
nuclear@0
|
72 glEnable(GL_LIGHTING);
|
nuclear@0
|
73 glEnable(GL_LIGHT0);
|
nuclear@0
|
74
|
nuclear@0
|
75 rtarg = new RenderTarget;
|
nuclear@0
|
76 tmp_rtarg = new RenderTarget;
|
nuclear@0
|
77
|
nuclear@0
|
78 if(!(sdrblur = create_program_load("sdr/vert.glsl", "sdr/blur.glsl"))) {
|
nuclear@0
|
79 return false;
|
nuclear@0
|
80 }
|
nuclear@0
|
81 if(!(sdr_hblur = create_program_load("sdr/vert.glsl", "sdr/hblur.glsl"))) {
|
nuclear@0
|
82 return false;
|
nuclear@0
|
83 }
|
nuclear@0
|
84 if(!(sdr_vblur = create_program_load("sdr/vert.glsl", "sdr/vblur.glsl"))) {
|
nuclear@0
|
85 return false;
|
nuclear@0
|
86 }
|
nuclear@0
|
87
|
nuclear@0
|
88 return true;
|
nuclear@0
|
89 }
|
nuclear@0
|
90
|
nuclear@0
|
91 static void cleanup()
|
nuclear@0
|
92 {
|
nuclear@0
|
93 delete rtarg;
|
nuclear@0
|
94 delete tmp_rtarg;
|
nuclear@0
|
95 }
|
nuclear@0
|
96
|
nuclear@0
|
97 static void disp()
|
nuclear@0
|
98 {
|
nuclear@0
|
99 glMatrixMode(GL_MODELVIEW);
|
nuclear@0
|
100 glLoadIdentity();
|
nuclear@0
|
101 glTranslatef(0, 0, -cam_dist);
|
nuclear@0
|
102 glRotatef(cam_phi, 1, 0, 0);
|
nuclear@0
|
103 glRotatef(cam_theta, 0, 1, 0);
|
nuclear@0
|
104
|
nuclear@0
|
105 bind_render_target(rtarg);
|
nuclear@0
|
106
|
nuclear@0
|
107 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
nuclear@0
|
108
|
nuclear@0
|
109 glFrontFace(GL_CW);
|
nuclear@0
|
110 glutSolidTeapot(1.0);
|
nuclear@0
|
111 glFrontFace(GL_CCW);
|
nuclear@0
|
112
|
nuclear@0
|
113 if(blur_type == BLUR_SEP) {
|
nuclear@0
|
114 // render with horizontal blur into tmp_rtarg
|
nuclear@0
|
115 bind_render_target(tmp_rtarg);
|
nuclear@0
|
116
|
nuclear@0
|
117 set_uniform_float2(sdr_hblur, "size", rtarg->xsz, rtarg->ysz);
|
nuclear@0
|
118 set_uniform_float2(sdr_hblur, "texsize", rtarg->tex_xsz, rtarg->tex_ysz);
|
nuclear@0
|
119 bind_program(sdr_hblur);
|
nuclear@0
|
120
|
nuclear@0
|
121 rtarg->display();
|
nuclear@0
|
122
|
nuclear@0
|
123 // render with vertical blur into the regular framebuffer
|
nuclear@0
|
124 bind_render_target(0);
|
nuclear@0
|
125
|
nuclear@0
|
126 set_uniform_float2(sdr_vblur, "size", tmp_rtarg->xsz, tmp_rtarg->ysz);
|
nuclear@0
|
127 set_uniform_float2(sdr_vblur, "texsize", tmp_rtarg->tex_xsz, tmp_rtarg->tex_ysz);
|
nuclear@0
|
128 bind_program(sdr_vblur);
|
nuclear@0
|
129
|
nuclear@0
|
130 tmp_rtarg->display();
|
nuclear@0
|
131
|
nuclear@0
|
132 } else {
|
nuclear@0
|
133 // render with the full blur into the regular framebuffer
|
nuclear@0
|
134 bind_render_target(0);
|
nuclear@0
|
135
|
nuclear@0
|
136 // display the rendered image
|
nuclear@0
|
137 set_uniform_float2(sdrblur, "size", rtarg->xsz, rtarg->ysz);
|
nuclear@0
|
138 set_uniform_float2(sdrblur, "texsize", rtarg->tex_xsz, rtarg->tex_ysz);
|
nuclear@0
|
139 bind_program(sdrblur);
|
nuclear@0
|
140
|
nuclear@0
|
141 rtarg->display();
|
nuclear@0
|
142 }
|
nuclear@0
|
143 bind_program(0);
|
nuclear@0
|
144
|
nuclear@0
|
145 print_string(blur_type == BLUR_REG ? "Regular blur" : "Seperable blur");
|
nuclear@0
|
146
|
nuclear@0
|
147 glutSwapBuffers();
|
nuclear@0
|
148 assert(glGetError() == GL_NO_ERROR);
|
nuclear@0
|
149 }
|
nuclear@0
|
150
|
nuclear@0
|
151 static void print_string(const char *str)
|
nuclear@0
|
152 {
|
nuclear@0
|
153 glPushAttrib(GL_ENABLE_BIT);
|
nuclear@0
|
154
|
nuclear@0
|
155 glMatrixMode(GL_MODELVIEW);
|
nuclear@0
|
156 glPushMatrix();
|
nuclear@0
|
157 glLoadIdentity();
|
nuclear@0
|
158 glMatrixMode(GL_PROJECTION);
|
nuclear@0
|
159 glPushMatrix();
|
nuclear@0
|
160 glLoadIdentity();
|
nuclear@0
|
161 glOrtho(0, win_width, 0, win_height, -1, 1);
|
nuclear@0
|
162
|
nuclear@0
|
163 glDisable(GL_LIGHTING);
|
nuclear@0
|
164 glDisable(GL_DEPTH_TEST);
|
nuclear@0
|
165
|
nuclear@0
|
166 glRasterPos2f(1, 1);
|
nuclear@0
|
167 glColor3f(1, 1, 0);
|
nuclear@0
|
168 while(*str) {
|
nuclear@0
|
169 glutBitmapCharacter(GLUT_BITMAP_HELVETICA_18, *str++);
|
nuclear@0
|
170 }
|
nuclear@0
|
171
|
nuclear@0
|
172 glPopMatrix();
|
nuclear@0
|
173 glMatrixMode(GL_MODELVIEW);
|
nuclear@0
|
174 glPopMatrix();
|
nuclear@0
|
175
|
nuclear@0
|
176 glPopAttrib();
|
nuclear@0
|
177 }
|
nuclear@0
|
178
|
nuclear@0
|
179 static void idle()
|
nuclear@0
|
180 {
|
nuclear@0
|
181 glutPostRedisplay();
|
nuclear@0
|
182 }
|
nuclear@0
|
183
|
nuclear@0
|
184 static void reshape(int x, int y)
|
nuclear@0
|
185 {
|
nuclear@0
|
186 win_width = x;
|
nuclear@0
|
187 win_height = y;
|
nuclear@0
|
188
|
nuclear@0
|
189 glViewport(0, 0, x, y);
|
nuclear@0
|
190
|
nuclear@0
|
191 glMatrixMode(GL_PROJECTION);
|
nuclear@0
|
192 glLoadIdentity();
|
nuclear@0
|
193 gluPerspective(50.0, (float)x / (float)y, 0.5, 500.0);
|
nuclear@0
|
194
|
nuclear@0
|
195 rtarg->reshape(x, y);
|
nuclear@0
|
196 tmp_rtarg->reshape(x, y);
|
nuclear@0
|
197 }
|
nuclear@0
|
198
|
nuclear@0
|
199 static void keyb(unsigned char key, int x, int y)
|
nuclear@0
|
200 {
|
nuclear@0
|
201 switch(key) {
|
nuclear@0
|
202 case 27:
|
nuclear@0
|
203 exit(0);
|
nuclear@0
|
204
|
nuclear@0
|
205 case ' ':
|
nuclear@0
|
206 blur_type = (blur_type + 1) % NUM_BLUR_TYPES;
|
nuclear@0
|
207 break;
|
nuclear@0
|
208 }
|
nuclear@0
|
209 }
|
nuclear@0
|
210
|
nuclear@0
|
211
|
nuclear@0
|
212 static bool bnstate[32];
|
nuclear@0
|
213 static int prev_x, prev_y;
|
nuclear@0
|
214
|
nuclear@0
|
215 static void mouse(int bn, int st, int x, int y)
|
nuclear@0
|
216 {
|
nuclear@0
|
217 prev_x = x;
|
nuclear@0
|
218 prev_y = y;
|
nuclear@0
|
219 bnstate[bn - GLUT_LEFT_BUTTON] = st == GLUT_DOWN;
|
nuclear@0
|
220 }
|
nuclear@0
|
221
|
nuclear@0
|
222 static void motion(int x, int y)
|
nuclear@0
|
223 {
|
nuclear@0
|
224 int dx = x - prev_x;
|
nuclear@0
|
225 int dy = y - prev_y;
|
nuclear@0
|
226 prev_x = x;
|
nuclear@0
|
227 prev_y = y;
|
nuclear@0
|
228
|
nuclear@0
|
229 if(bnstate[0]) {
|
nuclear@0
|
230 cam_theta += dx * 0.5;
|
nuclear@0
|
231 cam_phi += dy * 0.5;
|
nuclear@0
|
232
|
nuclear@0
|
233 if(cam_phi < -90) cam_phi = -90;
|
nuclear@0
|
234 if(cam_phi > 90) cam_phi = 90;
|
nuclear@0
|
235 }
|
nuclear@0
|
236 if(bnstate[2]) {
|
nuclear@0
|
237 cam_dist -= dy * 0.1;
|
nuclear@0
|
238
|
nuclear@0
|
239 if(cam_dist < 0) cam_dist = 0;
|
nuclear@0
|
240 }
|
nuclear@0
|
241 }
|