aboutsummaryrefslogtreecommitdiff
path: root/src/glbits.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/glbits.c')
-rw-r--r--src/glbits.c165
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);