aboutsummaryrefslogtreecommitdiff
path: root/src/glbits.c
diff options
context:
space:
mode:
authortaw27 <taw27@bf6ca9ba-c028-0410-8290-897cf20841d1>2007-12-21 21:36:52 +0000
committertaw27 <taw27@bf6ca9ba-c028-0410-8290-897cf20841d1>2007-12-21 21:36:52 +0000
commit2660887cf21229a888c5b1c02a6f07e653d1a55b (patch)
tree84868e33064cc9a7c61aaceb898971b66986e9b8 /src/glbits.c
parenta956795a03969c5aec307474400be402388c1430 (diff)
Fun with shaders
git-svn-id: svn://cook.msm.cam.ac.uk:745/diff-tomo/dtr@235 bf6ca9ba-c028-0410-8290-897cf20841d1
Diffstat (limited to 'src/glbits.c')
-rw-r--r--src/glbits.c80
1 files changed, 79 insertions, 1 deletions
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;
+
+}
+