sdrblurtest

annotate src/main.cc @ 0:26513fdda566

initial commit
author John Tsiombikas <nuclear@member.fsf.org>
date Thu, 17 Oct 2013 08:19:56 +0300
parents
children e8fc0c9754c9
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 }