# HG changeset patch # User Eleni Maria Stea # Date 1384637355 -7200 # Node ID b50ad2711f5fdd81859cb45a7bedaaeb49bc6243 # Parent 531a814d4d6b1decfe7a82e414bbe00323074ac3 fixed fov aspect projection et c, added shaders todo: segmentation diff -r 531a814d4d6b -r b50ad2711f5f data/shaders/invisible.f.glsl --- a/data/shaders/invisible.f.glsl Sun Nov 10 14:32:29 2013 +0200 +++ b/data/shaders/invisible.f.glsl Sat Nov 16 23:29:15 2013 +0200 @@ -0,0 +1,6 @@ +uniform sampler2D tex; + +void main() +{ + gl_FragColor = texture2D(tex, gl_TexCoord[0].xy); +} diff -r 531a814d4d6b -r b50ad2711f5f data/shaders/invisible.v.glsl --- a/data/shaders/invisible.v.glsl Sun Nov 10 14:32:29 2013 +0200 +++ b/data/shaders/invisible.v.glsl Sat Nov 16 23:29:15 2013 +0200 @@ -0,0 +1,11 @@ +uniform sampler2D depth_tex; + +void main() +{ + float depth = texture2D(depth_tex, gl_MultiTexCoord0.xy).r; + vec4 vpos = gl_Vertex; + vpos.z = depth; + + gl_Position = gl_ModelViewProjectionMatrix * vpos; + gl_TexCoord[0] = gl_MultiTexCoord0; +} diff -r 531a814d4d6b -r b50ad2711f5f src/main.cc --- a/src/main.cc Sun Nov 10 14:32:29 2013 +0200 +++ b/src/main.cc Sat Nov 16 23:29:15 2013 +0200 @@ -1,6 +1,7 @@ #include #include +#include #include #include "kinect.h" @@ -9,7 +10,8 @@ #include "tesquad.h" #include "texture.h" -#define ASPECT 1 +#define FOV 45.0 +#define QUAD_DIST 20.0 /*depth*/ freenect_context *kin_ctx; freenect_device *kin_dev; @@ -17,16 +19,20 @@ Frame *frame; static const char *filename = "data/textures/wallpaper.jpg"; -//static const char *vsdr_path = "data/shaders/invisible.v.glsl"; -//static const char *fsdr_path = "data/shaders/invisible.f.glsl"; +static const char *vsdr_path = "data/shaders/invisible.v.glsl"; +static const char *fsdr_path = "data/shaders/invisible.f.glsl"; +static unsigned int sprog; static unsigned int drawing; static unsigned int debugging; -//static unsigned int sprog; static unsigned char tex; +static int tex_height; +static int tex_width; +static float aspect; static bool show; static void cleanup(); -static void init(); +static bool init(); +static void init_tessquad(); static void display(); static void reshape(int w, int h); @@ -59,7 +65,9 @@ glutIdleFunc(idle); atexit(cleanup); - init(); + if(!init()) { + return 1; + } glutMainLoop(); } @@ -78,8 +86,32 @@ } frame->process(); -// glUseProgram(sprog); + glUseProgram(sprog); + + // draw video frame + glMatrixMode(GL_MODELVIEW); + glPushMatrix(); + glTranslatef(0, 0, -QUAD_DIST); + + glActiveTexture(GL_TEXTURE0); + glEnable(GL_TEXTURE_2D); + glBindTexture(GL_TEXTURE_2D, tex); + glActiveTexture(GL_TEXTURE1); + glEnable(GL_TEXTURE_2D); + glBindTexture(GL_TEXTURE_2D, frame->depth_tex); + glCallList(drawing); + + glActiveTexture(GL_TEXTURE1); + glDisable(GL_TEXTURE_2D); + glActiveTexture(GL_TEXTURE0); + glDisable(GL_TEXTURE_2D); + + glMatrixMode(GL_MODELVIEW); + glPopMatrix(); + + glUseProgram(0); + if(show) glCallList(debugging); glFlush(); @@ -89,10 +121,12 @@ static void reshape(int w, int h) { + aspect = (float)w / (float)h; glViewport(0, 0, (GLsizei) w, (GLsizei) h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); - gluPerspective(45, (float)w / (float)h, 1, 1000); + gluPerspective(FOV, aspect, 1, 1000); + init_tessquad(); } static void keyb(unsigned char key, int x, int y) @@ -118,39 +152,37 @@ static void cleanup() { + glDeleteLists(drawing, 1); + glDeleteLists(debugging, 1); + stop_kinect_frames(kin_dev); stop_kinect(kin_ctx, kin_dev); } -static void init() +static bool init() { - glClearColor(1, 1, 1, 1); + glClearColor(1, 0, 0, 1); frame = new Frame; - if(!(tex = load_texture(filename))) { + if(!(tex = load_texture(filename, &tex_width, &tex_height))) { fprintf(stderr, "Failed to load texture: %s\n", filename); - exit(1); + return false; } /* shaders setup */ -// if(!(sprog = sdr_getprog(vsdr_path, fsdr_path))) { -// fprintf(stderr, "Failed to create shader program!\n"); -// exit(1); -// } + if(!(sprog = sdr_getprog(vsdr_path, fsdr_path))) { + fprintf(stderr, "Failed to create shader program!\n"); + return false; + } - /* drawing */ - drawing = glGenLists(1); - glNewList(drawing, GL_COMPILE); - glMatrixMode(GL_MODELVIEW); - glPushMatrix(); - glTranslatef(0, 0, -24); - glEnable(GL_TEXTURE_2D); - glBindTexture(GL_TEXTURE_2D, tex); - draw_tess_quad(-14, -14 * 1/ASPECT, 28, 28 * 1 / ASPECT, 850, 850 * 1 / ASPECT); - glDisable(GL_TEXTURE_2D); - glPopMatrix(); - glMatrixMode(GL_MODELVIEW); - glEndList(); + glUseProgram(sprog); + int dloc = glGetUniformLocation(sprog, "depth_tex"); + if(dloc != -1) + glUniform1i(dloc, 1); + int tloc = glGetUniformLocation(sprog, "tex"); + if(tloc != -1) + glUniform1i(tloc, 0); + glUseProgram(0); /* debugging */ debugging = glGenLists(1); @@ -162,4 +194,20 @@ draw_tess_quad(0, -1, 1, 2, 1, 1, true); glDisable(GL_TEXTURE_2D); glEndList(); + + return true; } + +static void init_tessquad() +{ + if(drawing) + glDeleteLists(drawing, 1); + + drawing = glGenLists(1); + glNewList(drawing, GL_COMPILE); + float fov_rads = FOV / 180.0 * M_PI; + float ysz = QUAD_DIST * tan(fov_rads / 2.0); + float xsz = ysz * aspect; + draw_tess_quad(-xsz, -ysz, xsz * 2, ysz * 2, tex_width/8 - 1, tex_height/8 - 1); + glEndList(); +} diff -r 531a814d4d6b -r b50ad2711f5f src/sdr.cc --- a/src/sdr.cc Sun Nov 10 14:32:29 2013 +0200 +++ b/src/sdr.cc Sat Nov 16 23:29:15 2013 +0200 @@ -25,14 +25,16 @@ ctr = ftell(fp); rewind(fp); - char *glsl = NULL; + char *glsl; if(!(glsl = (char*) malloc(ctr + 1))) { perror("Failed to allocate memory"); return 0; } - ctr = fread(glsl, 1, ctr, fp); + fread(glsl, 1, ctr, fp); fclose(fp); + glsl[ctr] = 0; + return glsl; } diff -r 531a814d4d6b -r b50ad2711f5f src/tesquad.cc --- a/src/tesquad.cc Sun Nov 10 14:32:29 2013 +0200 +++ b/src/tesquad.cc Sat Nov 16 23:29:15 2013 +0200 @@ -3,11 +3,11 @@ void draw_tess_quad(float x, float y, float w, float h, int usub, int vsub, bool ortho) { + glPushAttrib(GL_ENABLE_BIT); + glDisable(GL_DEPTH_TEST); + glDisable(GL_LIGHTING); + if(ortho) { - glPushAttrib(GL_ENABLE_BIT); - glDisable(GL_DEPTH_TEST); - glDisable(GL_LIGHTING); - glMatrixMode(GL_PROJECTION); glPushMatrix(); glLoadIdentity(); @@ -41,6 +41,6 @@ if(ortho) { glPopMatrix(); - glPopAttrib(); } + glPopAttrib(); } diff -r 531a814d4d6b -r b50ad2711f5f src/texture.cc --- a/src/texture.cc Sun Nov 10 14:32:29 2013 +0200 +++ b/src/texture.cc Sat Nov 16 23:29:15 2013 +0200 @@ -3,7 +3,7 @@ #include #include "texture.h" -unsigned int load_texture(const char* fname) +unsigned int load_texture(const char* fname, int *xsz, int *ysz) { IplImage* img = cvLoadImage(fname); if(!img) { @@ -22,5 +22,11 @@ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, mat.cols, mat.rows, 0, GL_BGR, GL_UNSIGNED_BYTE, mat.data); + if(xsz) { + *xsz = mat.cols; + } + if(ysz) { + *ysz = mat.rows; + } return tex; } diff -r 531a814d4d6b -r b50ad2711f5f src/texture.h --- a/src/texture.h Sun Nov 10 14:32:29 2013 +0200 +++ b/src/texture.h Sat Nov 16 23:29:15 2013 +0200 @@ -1,6 +1,6 @@ #ifndef TEXTURE_H_ #define TEXTURE_H_ -unsigned int load_texture(const char *fname); +unsigned int load_texture(const char *fname, int *xsz = 0, int *ysz = 0); #endif // TEXTURE_H_