aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authortaw27 <taw27@bf6ca9ba-c028-0410-8290-897cf20841d1>2008-06-06 13:24:03 +0000
committertaw27 <taw27@bf6ca9ba-c028-0410-8290-897cf20841d1>2008-06-06 13:24:03 +0000
commit7274b3f1f8ca746fbf3f5224df2b7fae3710d525 (patch)
tree21503e760d237080fda59ac2f21dead18ad1fe0f
parent0772a4fa2344d228f78541e320627c487a5ee4d3 (diff)
Use GLEW
git-svn-id: svn://cook.msm.cam.ac.uk:745/diff-tomo/dtr@283 bf6ca9ba-c028-0410-8290-897cf20841d1
-rw-r--r--configure.ac5
-rw-r--r--src/Makefile.am2
-rw-r--r--src/control.h1
-rw-r--r--src/displaywindow.c7
-rw-r--r--src/displaywindow.h9
-rw-r--r--src/glbits.c165
-rw-r--r--src/main.c1
7 files changed, 102 insertions, 88 deletions
diff --git a/configure.ac b/configure.ac
index 254bb61..832498b 100644
--- a/configure.ac
+++ b/configure.ac
@@ -68,6 +68,9 @@ AM_PATH_GTKGLEXT_1_0(1.0.0,[echo "$GTKGLEXT_LIBS"],AC_MSG_ERROR([
*** gtkglext is required to build dtr; please make sure you have the
*** gtkglext development headers installed.]))
+AC_CHECK_LIB(GLEW, main, [GLEW_LIBS=-lGLEW; GLEW], AC_MSG_ERROR([
+*** GLEW not found. Do you have 'libglew-dev' or similar installed?]))
+
AC_MSG_CHECKING([Cairo version 1.2.0])
if $PKG_CONFIG --atleast-version 1.2.0 cairo ; then
CAIRO_VERSION=`$PKG_CONFIG --modversion cairo`
@@ -80,7 +83,7 @@ else
fi
CFLAGS="$CFLAGS $CAIRO_CFLAGS $LIBPNG_CLAGS"
-LIBS="$LIBS $CAIRO_LIBS $LIBPNG_LIBS"
+LIBS="$LIBS $CAIRO_LIBS $LIBPNG_LIBS $GLEW_LIBS"
AC_OUTPUT(Makefile src/Makefile data/Makefile)
diff --git a/src/Makefile.am b/src/Makefile.am
index 5b99a9f..117b738 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -12,5 +12,5 @@ refinetest3d_SOURCES = refinetest3d.c reflections.c basis.c utils.c reproject.c
refinetest3d_LDADD = @LIBS@ @GTK_LIBS@ -lm -lgsl -lgslcblas -lutil
AM_CFLAGS = -Wall -g @CFLAGS@ @GTK_CFLAGS@ @GTKGLEXT_CFLAGS@
-AM_CPPFLAGS = -DDATADIR=\""$(datadir)"\"
+AM_CPPFLAGS = -DDATADIR=\""$(datadir)"\" -I/usr/include/GL
diff --git a/src/control.h b/src/control.h
index 2893d5c..4b97970 100644
--- a/src/control.h
+++ b/src/control.h
@@ -18,7 +18,6 @@
#include <gtk/gtk.h>
#include <inttypes.h>
-#include <GL/gl.h>
typedef enum ift_enum {
INPUT_NONE,
diff --git a/src/displaywindow.c b/src/displaywindow.c
index 5bd00fc..a038c8c 100644
--- a/src/displaywindow.c
+++ b/src/displaywindow.c
@@ -20,10 +20,7 @@
#include <math.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 <glew.h>
#include "trackball.h"
#include "reflections.h"
@@ -558,6 +555,7 @@ DisplayWindow *displaywindow_open(ControlContext *ctx) {
ctx->dw = dw;
dw->gl_use_buffers = 1;
+ dw->gl_use_shaders = 1;
dw->view = DW_ORTHO;
dw->mode = DW_MAPPED;
dw->distance = 150;
@@ -594,6 +592,7 @@ DisplayWindow *displaywindow_open(ControlContext *ctx) {
fprintf(stderr, "Can't find double-buffered visual.\n");
exit(1);
}
+
gtk_container_set_reallocate_redraws(GTK_CONTAINER(dw->window), TRUE);
dw->drawing_area = gtk_drawing_area_new();
gtk_widget_set_size_request(dw->drawing_area, 640, 640);
diff --git a/src/displaywindow.h b/src/displaywindow.h
index baab13d..d0173f4 100644
--- a/src/displaywindow.h
+++ b/src/displaywindow.h
@@ -17,7 +17,7 @@
#define DISPLAYWINDOW_H
#include <gtk/gtk.h>
-#include <GL/gl.h>
+#include <glew.h>
#include "control.h"
@@ -46,6 +46,7 @@ typedef struct dw_struct {
/* Low-level OpenGL stuff */
GLuint gl_list_id; /* Display list for "everything else" */
int gl_use_buffers; /* 0=use vertex arrays only, otherwise use VBOs */
+ int gl_use_shaders; /* 1 = use shaders */
GLuint gl_ref_vertex_buffer; /* "Measured reflection" stuff */
GLfloat *gl_ref_vertex_array;
GLuint gl_ref_normal_buffer;
@@ -64,9 +65,9 @@ typedef struct dw_struct {
GLuint gl_line_vertex_buffer; /* Indexing line stuff */
GLfloat *gl_line_vertex_array;
GLsizei gl_line_num_vertices;
- GLhandleARB gl_vshader_lightpp;
- GLhandleARB gl_fshader_lightpp;
- GLhandleARB gl_program_lightpp;
+ GLuint gl_vshader_lightpp;
+ GLuint gl_fshader_lightpp;
+ GLuint gl_program_lightpp;
/* Display parameters */
DisplayWindowView view;
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);
diff --git a/src/main.c b/src/main.c
index b83e209..6259818 100644
--- a/src/main.c
+++ b/src/main.c
@@ -23,6 +23,7 @@
#include <gdk/gdkgl.h>
#include <gtk/gtkgl.h>
#include <sys/stat.h>
+#include <glew.h>
#include "displaywindow.h"
#include "reflections.h"