diff options
author | taw27 <taw27@bf6ca9ba-c028-0410-8290-897cf20841d1> | 2008-06-06 13:24:03 +0000 |
---|---|---|
committer | taw27 <taw27@bf6ca9ba-c028-0410-8290-897cf20841d1> | 2008-06-06 13:24:03 +0000 |
commit | 7274b3f1f8ca746fbf3f5224df2b7fae3710d525 (patch) | |
tree | 21503e760d237080fda59ac2f21dead18ad1fe0f /src/glbits.c | |
parent | 0772a4fa2344d228f78541e320627c487a5ee4d3 (diff) |
Use GLEW
git-svn-id: svn://cook.msm.cam.ac.uk:745/diff-tomo/dtr@283 bf6ca9ba-c028-0410-8290-897cf20841d1
Diffstat (limited to 'src/glbits.c')
-rw-r--r-- | src/glbits.c | 165 |
1 files changed, 88 insertions, 77 deletions
diff --git a/src/glbits.c b/src/glbits.c index b489ea6..d32fc0c 100644 --- a/src/glbits.c +++ b/src/glbits.c @@ -13,13 +13,10 @@ #include <config.h> #endif +#include <glew.h> #include <gtk/gtk.h> #include <gdk/gdkgl.h> #include <gtk/gtkgl.h> -#define GL_GLEXT_PROTOTYPES 1 -#include <GL/gl.h> -#include <GL/glext.h> -#include <GL/glu.h> #include <math.h> #include <stdlib.h> @@ -30,25 +27,35 @@ #include "utils.h" /* Utility function to load and compile a shader, checking the info log */ -static GLhandleARB glbits_load_shader(const char *filename, GLenum type) { +static GLuint glbits_load_shader(const char *filename, GLenum type) { - GLhandleARB shader; + GLuint shader; char text[4096]; size_t len; FILE *fh; int l; + GLint status; fh = fopen(filename, "r"); + if ( fh == NULL ) { + fprintf(stderr, "Couldn't load shader '%s'\n", filename); + return 0; + } 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); + const GLchar *source = text; + shader = glCreateShader(type); + glShaderSource(shader, 1, &source, NULL); + glCompileShader(shader); + glGetShaderiv(shader, GL_COMPILE_STATUS, &status); + if ( status == GL_FALSE ) { + glGetShaderInfoLog(shader, 4095, &l, text); + if ( l > 0 ) { + printf("%s\n", text); fflush(stdout); + } else { + printf("Shader compilation failed.\n"); + } } return shader; @@ -58,21 +65,21 @@ static GLhandleARB glbits_load_shader(const char *filename, GLenum type) { static void glbits_load_shaders(DisplayWindow *dw) { /* Lighting-per-fragment */ - 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); + dw->gl_vshader_lightpp = glbits_load_shader(DATADIR"/dtr/light-pp.vert", GL_VERTEX_SHADER); + dw->gl_fshader_lightpp = glbits_load_shader(DATADIR"/dtr/light-pp.frag", GL_FRAGMENT_SHADER); + dw->gl_program_lightpp = glCreateProgram(); + glAttachShader(dw->gl_program_lightpp, dw->gl_vshader_lightpp); + glAttachShader(dw->gl_program_lightpp, dw->gl_fshader_lightpp); + glLinkProgram(dw->gl_program_lightpp); } static void glbits_delete_shaders(DisplayWindow *dw) { - glDetachObjectARB(dw->gl_program_lightpp, dw->gl_fshader_lightpp); - glDetachObjectARB(dw->gl_program_lightpp, dw->gl_vshader_lightpp); - glDeleteObjectARB(dw->gl_fshader_lightpp); - glDeleteObjectARB(dw->gl_program_lightpp); + glDetachShader(dw->gl_program_lightpp, dw->gl_fshader_lightpp); + glDetachShader(dw->gl_program_lightpp, dw->gl_vshader_lightpp); + glDeleteShader(dw->gl_fshader_lightpp); + glDeleteShader(dw->gl_program_lightpp); } @@ -160,8 +167,8 @@ void glbits_prepare(DisplayWindow *dw) { /* "Measured" reflections */ if ( dw->gl_use_buffers ) { - glGenBuffersARB(1, &dw->gl_ref_vertex_buffer); - glGenBuffersARB(1, &dw->gl_ref_normal_buffer); + glGenBuffers(1, &dw->gl_ref_vertex_buffer); + glGenBuffers(1, &dw->gl_ref_normal_buffer); } reflection = ctx->reflectionlist->reflections; i = 0; @@ -188,11 +195,11 @@ void glbits_prepare(DisplayWindow *dw) { reflection = reflection->next; }; if ( dw->gl_use_buffers ) { - glBindBufferARB(GL_ARRAY_BUFFER, dw->gl_ref_vertex_buffer); - glBufferDataARB(GL_ARRAY_BUFFER, 3*dw->gl_ref_num_vertices*sizeof(GLfloat), vertices, GL_STATIC_DRAW); + glBindBuffer(GL_ARRAY_BUFFER, dw->gl_ref_vertex_buffer); + glBufferData(GL_ARRAY_BUFFER, 3*dw->gl_ref_num_vertices*sizeof(GLfloat), vertices, GL_STATIC_DRAW); free(vertices); - glBindBufferARB(GL_ARRAY_BUFFER, dw->gl_ref_normal_buffer); - glBufferDataARB(GL_ARRAY_BUFFER, 3*dw->gl_ref_num_vertices*sizeof(GLfloat), normals, GL_STATIC_DRAW); + glBindBuffer(GL_ARRAY_BUFFER, dw->gl_ref_normal_buffer); + glBufferData(GL_ARRAY_BUFFER, 3*dw->gl_ref_num_vertices*sizeof(GLfloat), normals, GL_STATIC_DRAW); free(normals); } else { dw->gl_ref_vertex_array = vertices; @@ -202,8 +209,8 @@ void glbits_prepare(DisplayWindow *dw) { /* Marker "reflections" */ if ( dw->gl_use_buffers ) { - glGenBuffersARB(1, &dw->gl_marker_vertex_buffer); - glGenBuffersARB(1, &dw->gl_marker_normal_buffer); + glGenBuffers(1, &dw->gl_marker_vertex_buffer); + glGenBuffers(1, &dw->gl_marker_normal_buffer); } reflection = ctx->reflectionlist->reflections; i = 0; @@ -225,11 +232,11 @@ void glbits_prepare(DisplayWindow *dw) { reflection = reflection->next; }; if ( dw->gl_use_buffers ) { - glBindBufferARB(GL_ARRAY_BUFFER, dw->gl_marker_vertex_buffer); - glBufferDataARB(GL_ARRAY_BUFFER, 3*dw->gl_marker_num_vertices*sizeof(GLfloat), vertices, GL_STATIC_DRAW); + glBindBuffer(GL_ARRAY_BUFFER, dw->gl_marker_vertex_buffer); + glBufferData(GL_ARRAY_BUFFER, 3*dw->gl_marker_num_vertices*sizeof(GLfloat), vertices, GL_STATIC_DRAW); free(vertices); - glBindBufferARB(GL_ARRAY_BUFFER, dw->gl_marker_normal_buffer); - glBufferDataARB(GL_ARRAY_BUFFER, 3*dw->gl_marker_num_vertices*sizeof(GLfloat), normals, GL_STATIC_DRAW); + glBindBuffer(GL_ARRAY_BUFFER, dw->gl_marker_normal_buffer); + glBufferData(GL_ARRAY_BUFFER, 3*dw->gl_marker_num_vertices*sizeof(GLfloat), normals, GL_STATIC_DRAW); free(normals); } else { dw->gl_marker_vertex_array = vertices; @@ -239,8 +246,8 @@ void glbits_prepare(DisplayWindow *dw) { /* Generated reflections */ if ( dw->gl_use_buffers ) { - glGenBuffersARB(1, &dw->gl_gen_vertex_buffer); - glGenBuffersARB(1, &dw->gl_gen_normal_buffer); + glGenBuffers(1, &dw->gl_gen_vertex_buffer); + glGenBuffers(1, &dw->gl_gen_normal_buffer); } if ( ctx->integrated != NULL ) { reflection = ctx->integrated->reflections; @@ -261,13 +268,13 @@ void glbits_prepare(DisplayWindow *dw) { reflection = reflection->next; }; if ( dw->gl_use_buffers ) { - glBindBufferARB(GL_ARRAY_BUFFER, dw->gl_gen_vertex_buffer); - glBufferDataARB(GL_ARRAY_BUFFER, 3*dw->gl_gen_num_vertices*sizeof(GLfloat), vertices, GL_STATIC_DRAW); + glBindBuffer(GL_ARRAY_BUFFER, dw->gl_gen_vertex_buffer); + glBufferData(GL_ARRAY_BUFFER, 3*dw->gl_gen_num_vertices*sizeof(GLfloat), vertices, GL_STATIC_DRAW); free(vertices); - glBindBufferARB(GL_ARRAY_BUFFER, dw->gl_gen_normal_buffer); - glBufferDataARB(GL_ARRAY_BUFFER, 3*dw->gl_gen_num_vertices*sizeof(GLfloat), normals, GL_STATIC_DRAW); + glBindBuffer(GL_ARRAY_BUFFER, dw->gl_gen_normal_buffer); + glBufferData(GL_ARRAY_BUFFER, 3*dw->gl_gen_num_vertices*sizeof(GLfloat), normals, GL_STATIC_DRAW); free(normals); - glBindBufferARB(GL_ARRAY_BUFFER, 0); /* ************* */ + glBindBuffer(GL_ARRAY_BUFFER, 0); /* ************* */ } else { dw->gl_gen_vertex_array = vertices; dw->gl_gen_normal_array = normals; @@ -288,7 +295,7 @@ void glbits_prepare(DisplayWindow *dw) { dw->gl_line_num_vertices = 3*2*((2*1+1)*(2*1+1)); if ( dw->gl_use_buffers ) { - glGenBuffersARB(1, &dw->gl_line_vertex_buffer); + glGenBuffers(1, &dw->gl_line_vertex_buffer); } reflection = ctx->reflectionlist->reflections; vertices = malloc(3*dw->gl_line_num_vertices*sizeof(GLfloat)); @@ -336,8 +343,8 @@ void glbits_prepare(DisplayWindow *dw) { } if ( dw->gl_use_buffers ) { - glBindBufferARB(GL_ARRAY_BUFFER, dw->gl_line_vertex_buffer); - glBufferDataARB(GL_ARRAY_BUFFER, 3*dw->gl_line_num_vertices*sizeof(GLfloat), vertices, GL_STATIC_DRAW); + glBindBuffer(GL_ARRAY_BUFFER, dw->gl_line_vertex_buffer); + glBufferData(GL_ARRAY_BUFFER, 3*dw->gl_line_num_vertices*sizeof(GLfloat), vertices, GL_STATIC_DRAW); free(vertices); } else { dw->gl_line_vertex_array = vertices; @@ -714,7 +721,8 @@ gint glbits_expose(GtkWidget *widget, GdkEventExpose *event, DisplayWindow *dw) glTranslatef(dw->x_pos, -dw->y_pos, 400.0-dw->distance); build_rotmatrix(m, dw->view_quat); glMultMatrixf(&m[0][0]); - + + /* begin suspect block */ glPushClientAttrib(GL_CLIENT_VERTEX_ARRAY_BIT); glEnableClientState(GL_VERTEX_ARRAY); glEnableClientState(GL_NORMAL_ARRAY); @@ -726,7 +734,7 @@ gint glbits_expose(GtkWidget *widget, GdkEventExpose *event, DisplayWindow *dw) GLfloat att[] = {1.0, 1.0, 0.0}; - glPointParameterfvARB(GL_POINT_DISTANCE_ATTENUATION, att); + glPointParameterfv(GL_POINT_DISTANCE_ATTENUATION, att); glPointSize(20.0); glEnable(GL_POINT_SMOOTH); @@ -737,12 +745,12 @@ gint glbits_expose(GtkWidget *widget, GdkEventExpose *event, DisplayWindow *dw) glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, 0.0); if ( dw->gl_use_buffers ) { - glBindBufferARB(GL_ARRAY_BUFFER, dw->gl_ref_vertex_buffer); + glBindBuffer(GL_ARRAY_BUFFER, dw->gl_ref_vertex_buffer); glVertexPointer(3, GL_FLOAT, 0, NULL); - glBindBufferARB(GL_ARRAY_BUFFER, dw->gl_ref_normal_buffer); + glBindBuffer(GL_ARRAY_BUFFER, dw->gl_ref_normal_buffer); glNormalPointer(GL_FLOAT, 0, NULL); glDrawArrays(GL_POINTS, 0, dw->gl_ref_num_vertices); - glBindBufferARB(GL_ARRAY_BUFFER, 0); + glBindBuffer(GL_ARRAY_BUFFER, 0); } else { glVertexPointer(3, GL_FLOAT, 0, dw->gl_ref_vertex_array); glNormalPointer(GL_FLOAT, 0, dw->gl_ref_normal_array); @@ -763,12 +771,12 @@ gint glbits_expose(GtkWidget *widget, GdkEventExpose *event, DisplayWindow *dw) glColor3f(0.0, 0.0, 1.0); if ( dw->gl_use_buffers ) { - glBindBufferARB(GL_ARRAY_BUFFER, dw->gl_marker_vertex_buffer); + glBindBuffer(GL_ARRAY_BUFFER, dw->gl_marker_vertex_buffer); glVertexPointer(3, GL_FLOAT, 0, NULL); - glBindBufferARB(GL_ARRAY_BUFFER, dw->gl_marker_normal_buffer); + glBindBuffer(GL_ARRAY_BUFFER, dw->gl_marker_normal_buffer); glNormalPointer(GL_FLOAT, 0, NULL); glDrawArrays(GL_QUADS, 0, dw->gl_marker_num_vertices); - glBindBufferARB(GL_ARRAY_BUFFER, 0); + glBindBuffer(GL_ARRAY_BUFFER, 0); } else { glVertexPointer(3, GL_FLOAT, 0, dw->gl_marker_vertex_array); glNormalPointer(GL_FLOAT, 0, dw->gl_marker_normal_array); @@ -788,25 +796,24 @@ gint glbits_expose(GtkWidget *widget, GdkEventExpose *event, DisplayWindow *dw) glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, 100.0); glColor3f(0.7, 0.7, 0.0); - glUseProgramObjectARB(dw->gl_program_lightpp); + if ( dw->gl_use_shaders ) glUseProgram(dw->gl_program_lightpp); if ( dw->gl_use_buffers ) { - glBindBufferARB(GL_ARRAY_BUFFER, dw->gl_gen_vertex_buffer); + glBindBuffer(GL_ARRAY_BUFFER, dw->gl_gen_vertex_buffer); glVertexPointer(3, GL_FLOAT, 0, NULL); - glBindBufferARB(GL_ARRAY_BUFFER, dw->gl_gen_normal_buffer); + glBindBuffer(GL_ARRAY_BUFFER, dw->gl_gen_normal_buffer); glNormalPointer(GL_FLOAT, 0, NULL); glDrawArrays(GL_QUADS, 0, dw->gl_gen_num_vertices); - glBindBufferARB(GL_ARRAY_BUFFER, 0); + glBindBuffer(GL_ARRAY_BUFFER, 0); } else { glVertexPointer(3, GL_FLOAT, 0, dw->gl_gen_vertex_array); glNormalPointer(GL_FLOAT, 0, dw->gl_gen_normal_array); glDrawArrays(GL_QUADS, 0, dw->gl_gen_num_vertices); } - glUseProgramObjectARB(0); + if ( dw->gl_use_shaders ) glUseProgram(0); } } - glDisable(GL_NORMAL_ARRAY); /* Draw indexing lines */ @@ -817,10 +824,10 @@ gint glbits_expose(GtkWidget *widget, GdkEventExpose *event, DisplayWindow *dw) glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, black); if ( dw->gl_use_buffers ) { - glBindBufferARB(GL_ARRAY_BUFFER, dw->gl_line_vertex_buffer); + glBindBuffer(GL_ARRAY_BUFFER, dw->gl_line_vertex_buffer); glVertexPointer(3, GL_FLOAT, 0, NULL); glDrawArrays(GL_LINES, 0, dw->gl_line_num_vertices); - glBindBufferARB(GL_ARRAY_BUFFER, 0); + glBindBuffer(GL_ARRAY_BUFFER, 0); } else { glVertexPointer(3, GL_FLOAT, 0, dw->gl_line_vertex_array); glDrawArrays(GL_LINES, 0, dw->gl_line_num_vertices); @@ -880,21 +887,21 @@ gboolean glbits_configure(GtkWidget *widget, GdkEventConfigure *event, DisplayWi void glbits_free_resources(DisplayWindow *dw) { if ( dw->gl_use_buffers ) { - glDeleteBuffersARB(1, &dw->gl_ref_vertex_buffer); - glDeleteBuffersARB(1, &dw->gl_ref_normal_buffer); - glDeleteBuffersARB(1, &dw->gl_marker_vertex_buffer); - glDeleteBuffersARB(1, &dw->gl_marker_normal_buffer); - glDeleteBuffersARB(1, &dw->gl_gen_vertex_buffer); - glDeleteBuffersARB(1, &dw->gl_gen_normal_buffer); - glDeleteBuffersARB(1, &dw->gl_line_vertex_buffer); + glDeleteBuffers(1, &dw->gl_ref_vertex_buffer); + glDeleteBuffers(1, &dw->gl_ref_normal_buffer); + glDeleteBuffers(1, &dw->gl_marker_vertex_buffer); + glDeleteBuffers(1, &dw->gl_marker_normal_buffer); + glDeleteBuffers(1, &dw->gl_gen_vertex_buffer); + glDeleteBuffers(1, &dw->gl_gen_normal_buffer); + glDeleteBuffers(1, &dw->gl_line_vertex_buffer); } else { - free(dw->gl_ref_vertex_array); - free(dw->gl_ref_normal_array); - free(dw->gl_marker_vertex_array); - free(dw->gl_marker_normal_array); - free(dw->gl_gen_vertex_array); - free(dw->gl_gen_normal_array); - free(dw->gl_line_vertex_array); + if ( dw->gl_ref_vertex_array != NULL ) free(dw->gl_ref_vertex_array); + if ( dw->gl_ref_normal_array != NULL ) free(dw->gl_ref_normal_array); + if ( dw->gl_marker_vertex_array != NULL ) free(dw->gl_marker_vertex_array); + if ( dw->gl_marker_normal_array != NULL ) free(dw->gl_marker_normal_array); + if ( dw->gl_gen_vertex_array != NULL ) free(dw->gl_gen_vertex_array); + if ( dw->gl_gen_normal_array != NULL ) free(dw->gl_gen_normal_array); + if ( dw->gl_line_vertex_array != NULL ) free(dw->gl_line_vertex_array); } glDeleteLists(dw->gl_list_id, 1); @@ -902,12 +909,12 @@ void glbits_free_resources(DisplayWindow *dw) { void glbits_final_free_resources(DisplayWindow *dw) { glbits_free_resources(dw); - glbits_delete_shaders(dw); + if ( dw->gl_use_shaders ) glbits_delete_shaders(dw); } static void glbits_first_prepare(DisplayWindow *dw) { glbits_prepare(dw); - glbits_load_shaders(dw); + if ( dw->gl_use_shaders ) glbits_load_shaders(dw); } gint glbits_realise(GtkWidget *widget, DisplayWindow *dw) { @@ -921,6 +928,10 @@ gint glbits_realise(GtkWidget *widget, DisplayWindow *dw) { return 0; } + /* This has to be done once an OpenGL context has been created */ + GLenum glew_err = glewInit(); + if (glew_err != GLEW_OK) fprintf(stderr, "GLEW initialisation error: %s\n", glewGetErrorString(glew_err)); + glbits_set_ortho(dw, w, h); glbits_first_prepare(dw); |