From 7274b3f1f8ca746fbf3f5224df2b7fae3710d525 Mon Sep 17 00:00:00 2001 From: taw27 Date: Fri, 6 Jun 2008 13:24:03 +0000 Subject: Use GLEW git-svn-id: svn://cook.msm.cam.ac.uk:745/diff-tomo/dtr@283 bf6ca9ba-c028-0410-8290-897cf20841d1 --- configure.ac | 5 +- src/Makefile.am | 2 +- src/control.h | 1 - src/displaywindow.c | 7 +-- src/displaywindow.h | 9 +-- src/glbits.c | 165 ++++++++++++++++++++++++++++------------------------ src/main.c | 1 + 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 #include -#include 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 #include #include -#define GL_GLEXT_PROTOTYPES 1 -#include -#include -#include +#include #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 -#include +#include #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 #endif +#include #include #include #include -#define GL_GLEXT_PROTOTYPES 1 -#include -#include -#include #include #include @@ -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 #include #include +#include #include "displaywindow.h" #include "reflections.h" -- cgit v1.2.3