From 2660887cf21229a888c5b1c02a6f07e653d1a55b Mon Sep 17 00:00:00 2001 From: taw27 Date: Fri, 21 Dec 2007 21:36:52 +0000 Subject: Fun with shaders git-svn-id: svn://cook.msm.cam.ac.uk:745/diff-tomo/dtr@235 bf6ca9ba-c028-0410-8290-897cf20841d1 --- src/glbits.c | 80 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 79 insertions(+), 1 deletion(-) (limited to 'src/glbits.c') diff --git a/src/glbits.c b/src/glbits.c index 194a919..9a7fca5 100644 --- a/src/glbits.c +++ b/src/glbits.c @@ -28,7 +28,53 @@ #include "reflections.h" #include "image.h" -#define BLOB_BITS 5 +/* Utility function to load and compile a shader, checking the info log */ +static GLhandleARB glbits_load_shader(const char *filename, GLenum type) { + + GLhandleARB shader; + char text[4096]; + size_t len; + FILE *fh; + int l; + + fh = fopen(filename, "r"); + len = fread(text, 1, 4095, fh); + fclose(fh); + text[len] = '\0'; + const GLcharARB *source = text; + shader = glCreateShaderObjectARB(type); + glShaderSourceARB(shader, 1, &source, NULL); + glCompileShaderARB(shader); + glGetInfoLogARB(shader, 4095, &l, text); + if ( l > 0 ) { + printf("%s\n", text); fflush(stdout); + } + + return shader; + +} + +static void glbits_load_shaders(DisplayWindow *dw) { + + dw->gl_vshader_lightpp = glbits_load_shader(DATADIR"/dtr/light-pp.vert", GL_VERTEX_SHADER_ARB); + dw->gl_fshader_lightpp = glbits_load_shader(DATADIR"/dtr/light-pp.frag", GL_FRAGMENT_SHADER_ARB); + + dw->gl_program_lightpp = glCreateProgramObjectARB(); + glAttachObjectARB(dw->gl_program_lightpp, dw->gl_vshader_lightpp); + glAttachObjectARB(dw->gl_program_lightpp, dw->gl_fshader_lightpp); + glLinkProgramARB(dw->gl_program_lightpp); + +} + +static void glbits_delete_shaders(DisplayWindow *dw) { + + glDetachObjectARB(dw->gl_program_lightpp, dw->gl_fshader_lightpp); + glDeleteObjectARB(dw->gl_fshader_lightpp); + glDeleteObjectARB(dw->gl_program_lightpp); + +} + +#define BLOB_BITS 7 #define VERTICES_IN_A_BLOB 4*BLOB_BITS*BLOB_BITS*2 #define ADD_VERTEX \ vertices[3*i + 0] = reflection->x/1e9 + size*xv; \ @@ -704,6 +750,7 @@ gint glbits_expose(GtkWidget *widget, GdkEventExpose *event, DisplayWindow *dw) glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, gold); glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, gold_spec); glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, 70.0); + glUseProgramObjectARB(dw->gl_program_lightpp); if ( dw->gl_use_buffers ) { glBindBufferARB(GL_ARRAY_BUFFER, dw->gl_gen_vertex_buffer); glVertexPointer(3, GL_FLOAT, 0, NULL); @@ -716,6 +763,7 @@ gint glbits_expose(GtkWidget *widget, GdkEventExpose *event, DisplayWindow *dw) glNormalPointer(GL_FLOAT, 0, dw->gl_gen_normal_array); glDrawArrays(GL_QUADS, 0, dw->gl_gen_num_vertices); } + glUseProgramObjectARB(0); glDisableClientState(GL_NORMAL_ARRAY); glPopClientAttrib(); } @@ -812,3 +860,33 @@ void glbits_free_resources(DisplayWindow *dw) { } +void glbits_final_free_resources(DisplayWindow *dw) { + glbits_free_resources(dw); + glbits_delete_shaders(dw); +} + +static void glbits_first_prepare(DisplayWindow *dw) { + glbits_prepare(dw); + glbits_load_shaders(dw); +} + +gint glbits_realise(GtkWidget *widget, DisplayWindow *dw) { + + GdkGLContext *glcontext = gtk_widget_get_gl_context(widget); + GdkGLDrawable *gldrawable = gtk_widget_get_gl_drawable(widget); + GLfloat w = widget->allocation.width; + GLfloat h = widget->allocation.height; + + if ( !gdk_gl_drawable_gl_begin(gldrawable, glcontext) ) { + return 0; + } + + glbits_set_ortho(dw, w, h); + glbits_first_prepare(dw); + + gdk_gl_drawable_gl_end(gldrawable); + + return 0; + +} + -- cgit v1.2.3