diff options
author | taw27 <taw27@bf6ca9ba-c028-0410-8290-897cf20841d1> | 2007-10-03 17:37:13 +0000 |
---|---|---|
committer | taw27 <taw27@bf6ca9ba-c028-0410-8290-897cf20841d1> | 2007-10-03 17:37:13 +0000 |
commit | 2314f19f1502e713cf9aa54330273820e652e6f6 (patch) | |
tree | 1c75d2fa9687dd2053d15e0b61a2b8cfe76df562 /src | |
parent | 4712ae776093d645e85e2280153976191227c4f3 (diff) |
Fix muppetry
git-svn-id: svn://cook.msm.cam.ac.uk:745/diff-tomo/dtr@150 bf6ca9ba-c028-0410-8290-897cf20841d1
Diffstat (limited to 'src')
-rw-r--r-- | src/displaywindow.c | 254 | ||||
-rw-r--r-- | src/displaywindow.h | 26 |
2 files changed, 149 insertions, 131 deletions
diff --git a/src/displaywindow.c b/src/displaywindow.c index 92e3b0a..8e99411 100644 --- a/src/displaywindow.c +++ b/src/displaywindow.c @@ -238,7 +238,7 @@ static void displaywindow_gl_create_list(DisplayWindow *dw) { /* "Measured" reflections */ if ( dw->gl_use_buffers ) { glGenBuffersARB(1, &dw->gl_ref_vertex_buffer); - glGenBuffersARB(1, &dw->gl_marker_normal_buffer); + glGenBuffersARB(1, &dw->gl_ref_normal_buffer); } reflection = ctx->reflectionlist->reflections; i = 0; @@ -247,32 +247,36 @@ static void displaywindow_gl_create_list(DisplayWindow *dw) { reflection = reflection->next; }; dw->gl_ref_num_vertices = i; - i = 0; - reflection = ctx->reflectionlist->reflections; - vertices = malloc(3*dw->gl_ref_num_vertices*sizeof(GLfloat)); - normals = malloc(3*dw->gl_ref_num_vertices*sizeof(GLfloat)); - while ( reflection != NULL ) { - if ( reflection->type == REFLECTION_NORMAL ) { - vertices[3*i + 0] = reflection->x/1e9; - vertices[3*i + 1] = reflection->y/1e9; - vertices[3*i + 2] = reflection->z/1e9; - normals[3*i + 0] = reflection->x/1e9; - normals[3*i + 1] = reflection->y/1e9; - normals[3*i + 2] = reflection->z/1e9; - i++; + if ( dw->gl_ref_num_vertices ) { + i = 0; + reflection = ctx->reflectionlist->reflections; + vertices = malloc(3*dw->gl_ref_num_vertices*sizeof(GLfloat)); + normals = malloc(3*dw->gl_ref_num_vertices*sizeof(GLfloat)); + while ( reflection != NULL ) { + if ( reflection->type == REFLECTION_NORMAL ) { + vertices[3*i + 0] = reflection->x/1e9; + vertices[3*i + 1] = reflection->y/1e9; + vertices[3*i + 2] = reflection->z/1e9; + normals[3*i + 0] = reflection->x/1e9; + normals[3*i + 1] = reflection->y/1e9; + normals[3*i + 2] = reflection->z/1e9; + i++; + } + 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); + 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); + free(normals); + } else { + dw->gl_ref_vertex_array = vertices; + dw->gl_ref_normal_array = normals; } - 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); - 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); - free(normals); } else { - dw->gl_ref_vertex_array = vertices; - dw->gl_ref_normal_array = normals; + printf("Drawing no 'measured' reflections\n"); } /* Marker "reflections" */ @@ -287,26 +291,28 @@ static void displaywindow_gl_create_list(DisplayWindow *dw) { reflection = reflection->next; }; dw->gl_marker_num_vertices = i*VERTICES_IN_A_BLOB; - i = 0; - reflection = ctx->reflectionlist->reflections; - vertices = malloc(3*dw->gl_marker_num_vertices*sizeof(GLfloat)); - normals = malloc(3*dw->gl_marker_num_vertices*sizeof(GLfloat)); - while ( reflection != NULL ) { - if ( reflection->type == REFLECTION_MARKER ) { - DRAW_BLOB + if ( dw->gl_marker_num_vertices ) { + i = 0; + reflection = ctx->reflectionlist->reflections; + vertices = malloc(3*dw->gl_marker_num_vertices*sizeof(GLfloat)); + normals = malloc(3*dw->gl_marker_num_vertices*sizeof(GLfloat)); + while ( reflection != NULL ) { + if ( reflection->type == REFLECTION_MARKER ) { + DRAW_BLOB + } + 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); + 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); + free(normals); + } else { + dw->gl_marker_vertex_array = vertices; + dw->gl_marker_normal_array = normals; } - 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); - 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); - free(normals); - } else { - dw->gl_marker_vertex_array = vertices; - dw->gl_marker_normal_array = normals; } /* Generated reflections */ @@ -321,27 +327,29 @@ static void displaywindow_gl_create_list(DisplayWindow *dw) { reflection = reflection->next; }; dw->gl_gen_num_vertices = i*VERTICES_IN_A_BLOB; - i = 0; - reflection = ctx->reflectionlist->reflections; - vertices = malloc(3*dw->gl_gen_num_vertices*sizeof(GLfloat)); - normals = malloc(3*dw->gl_gen_num_vertices*sizeof(GLfloat)); - while ( reflection != NULL ) { - if ( reflection->type == REFLECTION_GENERATED ) { - DRAW_BLOB + if ( dw->gl_gen_num_vertices ) { + i = 0; + reflection = ctx->reflectionlist->reflections; + vertices = malloc(3*dw->gl_gen_num_vertices*sizeof(GLfloat)); + normals = malloc(3*dw->gl_gen_num_vertices*sizeof(GLfloat)); + while ( reflection != NULL ) { + if ( reflection->type == REFLECTION_GENERATED ) { + DRAW_BLOB + } + 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); + 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); + free(normals); + glBindBufferARB(GL_ARRAY_BUFFER, 0); /* ************* */ + } else { + dw->gl_gen_vertex_array = vertices; + dw->gl_gen_normal_array = normals; } - 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); - 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); - free(normals); - glBindBufferARB(GL_ARRAY_BUFFER, 0); /* ************* */ - } else { - dw->gl_gen_vertex_array = vertices; - dw->gl_gen_normal_array = normals; } dw->gl_list_id = glGenLists(1); @@ -600,68 +608,76 @@ static gint displaywindow_gl_expose(GtkWidget *widget, GdkEventExpose *event, Di glLightfv(GL_LIGHT1, GL_SPECULAR, light1_specular); /* Draw the "measured" reflections */ - glPushClientAttrib(GL_CLIENT_VERTEX_ARRAY_BIT); - glEnableClientState(GL_VERTEX_ARRAY); - glEnableClientState(GL_NORMAL_ARRAY); - glMaterialfv(GL_FRONT_AND_BACK, GL_EMISSION, black); - glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, green); - glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, black); - glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, 0.0); - if ( dw->gl_use_buffers ) { - glBindBufferARB(GL_ARRAY_BUFFER, dw->gl_ref_vertex_buffer); - glVertexPointer(3, GL_FLOAT, 0, NULL); - glBindBufferARB(GL_ARRAY_BUFFER, dw->gl_ref_normal_buffer); - glNormalPointer(GL_FLOAT, 0, NULL); - glDrawArrays(GL_POINTS, 0, dw->gl_ref_num_vertices); - } else { - glVertexPointer(3, GL_FLOAT, 0, dw->gl_ref_vertex_array); - glNormalPointer(GL_FLOAT, 0, dw->gl_ref_normal_array); - glDrawArrays(GL_POINTS, 0, dw->gl_ref_num_vertices); + if ( dw->gl_ref_num_vertices ) { + glPushClientAttrib(GL_CLIENT_VERTEX_ARRAY_BIT); + glEnableClientState(GL_VERTEX_ARRAY); + glEnableClientState(GL_NORMAL_ARRAY); + glMaterialfv(GL_FRONT_AND_BACK, GL_EMISSION, black); + glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, green); + glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, black); + glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, 0.0); + if ( dw->gl_use_buffers ) { + glBindBufferARB(GL_ARRAY_BUFFER, dw->gl_ref_vertex_buffer); + glVertexPointer(3, GL_FLOAT, 0, NULL); + glBindBufferARB(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); + } else { + glVertexPointer(3, GL_FLOAT, 0, dw->gl_ref_vertex_array); + glNormalPointer(GL_FLOAT, 0, dw->gl_ref_normal_array); + glDrawArrays(GL_POINTS, 0, dw->gl_ref_num_vertices); + } + glPopClientAttrib(); } - glPopClientAttrib(); /* Draw marker points */ - glPushClientAttrib(GL_CLIENT_VERTEX_ARRAY_BIT); - glEnableClientState(GL_VERTEX_ARRAY); - glEnableClientState(GL_NORMAL_ARRAY); - glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, blue); - glMaterialfv(GL_FRONT_AND_BACK, GL_EMISSION, black); - glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, blue_spec); - glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, 50.0); - if ( dw->gl_use_buffers ) { - glBindBufferARB(GL_ARRAY_BUFFER, dw->gl_marker_vertex_buffer); - glVertexPointer(3, GL_FLOAT, 0, NULL); - glBindBufferARB(GL_ARRAY_BUFFER, dw->gl_marker_normal_buffer); - glNormalPointer(GL_FLOAT, 0, NULL); - glDrawArrays(GL_QUADS, 0, dw->gl_marker_num_vertices); - } else { - glVertexPointer(3, GL_FLOAT, 0, dw->gl_marker_vertex_array); - glNormalPointer(GL_FLOAT, 0, dw->gl_marker_normal_array); - glDrawArrays(GL_QUADS, 0, dw->gl_marker_num_vertices); + if ( dw->gl_marker_num_vertices ) { + glPushClientAttrib(GL_CLIENT_VERTEX_ARRAY_BIT); + glEnableClientState(GL_VERTEX_ARRAY); + glEnableClientState(GL_NORMAL_ARRAY); + glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, blue); + glMaterialfv(GL_FRONT_AND_BACK, GL_EMISSION, black); + glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, blue_spec); + glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, 50.0); + if ( dw->gl_use_buffers ) { + glBindBufferARB(GL_ARRAY_BUFFER, dw->gl_marker_vertex_buffer); + glVertexPointer(3, GL_FLOAT, 0, NULL); + glBindBufferARB(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); + } else { + glVertexPointer(3, GL_FLOAT, 0, dw->gl_marker_vertex_array); + glNormalPointer(GL_FLOAT, 0, dw->gl_marker_normal_array); + glDrawArrays(GL_QUADS, 0, dw->gl_marker_num_vertices); + } + glPopClientAttrib(); } - glPopClientAttrib(); /* Draw generated reflections */ - glPushClientAttrib(GL_CLIENT_VERTEX_ARRAY_BIT); - glEnableClientState(GL_VERTEX_ARRAY); - glEnableClientState(GL_NORMAL_ARRAY); - glMaterialfv(GL_FRONT_AND_BACK, GL_EMISSION, black); - 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); - if ( dw->gl_use_buffers ) { - glBindBufferARB(GL_ARRAY_BUFFER, dw->gl_gen_vertex_buffer); - glVertexPointer(3, GL_FLOAT, 0, NULL); - glBindBufferARB(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); /* NOTE THIS PLZKTHX */ - } 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); + if ( dw->gl_gen_num_vertices ) { + glPushClientAttrib(GL_CLIENT_VERTEX_ARRAY_BIT); + glEnableClientState(GL_VERTEX_ARRAY); + glEnableClientState(GL_NORMAL_ARRAY); + glMaterialfv(GL_FRONT_AND_BACK, GL_EMISSION, black); + 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); + if ( dw->gl_use_buffers ) { + glBindBufferARB(GL_ARRAY_BUFFER, dw->gl_gen_vertex_buffer); + glVertexPointer(3, GL_FLOAT, 0, NULL); + glBindBufferARB(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); + } 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); + } + glPopClientAttrib(); } - glPopClientAttrib(); /* Draw everything else */ glCallList(dw->gl_list_id); diff --git a/src/displaywindow.h b/src/displaywindow.h index f53e19f..fa49faf 100644 --- a/src/displaywindow.h +++ b/src/displaywindow.h @@ -24,7 +24,7 @@ typedef struct dw_struct { ControlContext *ctx; - + GtkUIManager *ui; GtkActionGroup *action_group; GtkWidget *window; @@ -32,20 +32,12 @@ typedef struct dw_struct { GtkWidget *status_bar; int view; GtkWidget *drawing_area; - - /* OpenGL stuff */ - GLfloat distance; - GLfloat x_pos; - GLfloat y_pos; - float x_start; - float y_start; - float view_quat[4]; - int cube; + //int pad1; + /* 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 */ GLuint gl_ref_vertex_buffer; /* "Measured reflection" stuff */ GLfloat *gl_ref_vertex_array; - int lines; GLuint gl_ref_normal_buffer; GLfloat *gl_ref_normal_array; GLsizei gl_ref_num_vertices; @@ -59,7 +51,17 @@ typedef struct dw_struct { GLfloat *gl_gen_vertex_array; GLfloat *gl_gen_normal_array; GLsizei gl_gen_num_vertices; - + + /* Display parameters */ + GLfloat distance; + GLfloat x_pos; + GLfloat y_pos; + float view_quat[4]; + int cube; + int lines; + float x_start; + float y_start; + } DisplayWindow; extern DisplayWindow *displaywindow_open(ControlContext *ctx); |