From 49726a9c5be3b5868c443b1fca7f8e18515b795b Mon Sep 17 00:00:00 2001 From: Andy Spencer Date: Mon, 9 Nov 2009 10:51:05 +0000 Subject: [PATCH] Simple updates to rendering code Update GisOpengl * Reorder lighting and rotation/transations * Add "Wireframe" mode Update Roam * Switch to a tetrahedron instead of cube --- src/gis-opengl.c | 39 ++++++++++++------------------ src/gis-opengl.h | 3 +++ src/roam.c | 63 +++++++++++++++++++++--------------------------- src/roam.h | 3 +++ 4 files changed, 49 insertions(+), 59 deletions(-) diff --git a/src/gis-opengl.c b/src/gis-opengl.c index 9e24969..7114dfa 100644 --- a/src/gis-opengl.c +++ b/src/gis-opengl.c @@ -39,30 +39,19 @@ /************* * ROAM Code * *************/ -void roam_queue_draw(WmsCacheNode *node, gpointer _self) -{ - gtk_widget_queue_draw(GTK_WIDGET(_self)); -} - -static void set_camera(GisOpenGL *self) +static void set_visuals(GisOpenGL *self) { glMatrixMode(GL_MODELVIEW); glLoadIdentity(); + + /* Camera 1 */ double lat, lon, elev, rx, ry, rz; gis_view_get_location(self->view, &lat, &lon, &elev); gis_view_get_rotation(self->view, &rx, &ry, &rz); glRotatef(rx, 1, 0, 0); glRotatef(rz, 0, 0, 1); - glTranslatef(0, 0, -elev2rad(elev)); - glRotatef(lat, 1, 0, 0); - glRotatef(-lon, 0, 1, 0); -} -static void set_visuals(GisOpenGL *self) -{ /* Lighting */ - glMatrixMode(GL_MODELVIEW); - glLoadIdentity(); #ifdef ROAM_DEBUG float light_ambient[] = {0.7f, 0.7f, 0.7f, 1.0f}; float light_diffuse[] = {2.0f, 2.0f, 2.0f, 1.0f}; @@ -88,12 +77,12 @@ static void set_visuals(GisOpenGL *self) glDisable(GL_TEXTURE_2D); glDisable(GL_COLOR_MATERIAL); - /* Camera */ - set_camera(self); + /* Camera 2 */ + glTranslatef(0, 0, -elev2rad(elev)); + glRotatef(lat, 1, 0, 0); + glRotatef(-lon, 0, 1, 0); /* Misc */ - gdouble lat, lon, elev; - gis_view_get_location(self->view, &lat, &lon, &elev); gdouble rg = MAX(0, 1-(elev/20000)); gdouble blue = MAX(0, 1-(elev/50000)); glClearColor(MIN(0.65,rg), MIN(0.65,rg), MIN(1,blue), 1.0f); @@ -167,10 +156,13 @@ static gboolean on_expose(GisOpenGL *self, GdkEventExpose *event, gpointer _) glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); #ifndef ROAM_DEBUG - set_visuals(self); - glEnable(GL_TEXTURE_2D); - glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); - roam_sphere_draw(self->sphere); + gis_plugins_foreach(self->plugins, G_CALLBACK(on_expose_plugin), self); + + if (self->wireframe) { + set_visuals(self); + glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); + roam_sphere_draw(self->sphere); + } #else set_visuals(self); glColor4f(0.0, 0.0, 9.0, 0.6); @@ -181,8 +173,6 @@ static gboolean on_expose(GisOpenGL *self, GdkEventExpose *event, gpointer _) //roam_sphere_draw_normals(self->sphere); #endif - gis_plugins_foreach(self->plugins, G_CALLBACK(on_expose_plugin), self); - set_visuals(self); gis_opengl_end(self); gis_opengl_flush(self); @@ -218,6 +208,7 @@ static gboolean on_key_press(GisOpenGL *self, GdkEventKey *event, gpointer _) else if (kv == GDK_L) gis_view_rotate(self->view, 0, 0, 2); /* Testing */ + else if (kv == GDK_w) {self->wireframe = !self->wireframe; gtk_widget_queue_draw(GTK_WIDGET(self));} #ifdef ROAM_DEBUG else if (kv == GDK_n) roam_sphere_split_one(self->sphere); else if (kv == GDK_p) roam_sphere_merge_one(self->sphere); diff --git a/src/gis-opengl.h b/src/gis-opengl.h index 2c88d6b..f370c98 100644 --- a/src/gis-opengl.h +++ b/src/gis-opengl.h @@ -48,6 +48,9 @@ struct _GisOpenGL { GisPlugins *plugins; RoamSphere *sphere; guint sm_source; + + /* for testing */ + gboolean wireframe; }; struct _GisOpenGLClass { diff --git a/src/roam.c b/src/roam.c index d25bd3d..aab62b1 100644 --- a/src/roam.c +++ b/src/roam.c @@ -139,6 +139,7 @@ RoamTriangle *roam_triangle_new(RoamPoint *l, RoamPoint *m, RoamPoint *r) { RoamTriangle *self = g_new0(RoamTriangle, 1); + self->error = 0; self->p.l = l; self->p.m = m; self->p.r = r; @@ -147,7 +148,6 @@ RoamTriangle *roam_triangle_new(RoamPoint *l, RoamPoint *m, RoamPoint *r) (l->y + r->y)/2, (l->z + r->z)/2); - self->error = 0; /* Update normal */ double pa[3]; @@ -239,12 +239,12 @@ void roam_triangle_update_errors(RoamTriangle *self, RoamSphere *sphere) roam_point_update_projection(self->p.l, sphere); roam_point_update_projection(self->p.m, sphere); roam_point_update_projection(self->p.r, sphere); - roam_point_update_projection(self->split, sphere); /* Not exactly correct, could be out on both sides (middle in) */ if (!roam_triangle_visible(self, sphere)) { self->error = -1; } else { + roam_point_update_projection(self->split, sphere); RoamPoint *l = self->p.l; RoamPoint *m = self->p.m; RoamPoint *r = self->p.r; @@ -262,6 +262,8 @@ void roam_triangle_update_errors(RoamTriangle *self, RoamSphere *sphere) r->px * (l->py - m->py) ) / 2.0; /* Size < 0 == backface */ + //if (size < 0) + // self->error *= -1; self->error *= size; } } @@ -444,51 +446,42 @@ RoamSphere *roam_sphere_new(gpointer user_data) { RoamSphere *self = g_new0(RoamSphere, 1); self->user_data = user_data; - self->polys = 12; + self->polys = 8; self->triangles = g_pqueue_new((GCompareDataFunc)tri_cmp, NULL); self->diamonds = g_pqueue_new((GCompareDataFunc)dia_cmp, NULL); RoamPoint *vertexes[] = { - roam_point_new( 1, 1, 1), // 0 - roam_point_new( 1, 1,-1), // 1 - roam_point_new( 1,-1, 1), // 2 - roam_point_new( 1,-1,-1), // 3 - roam_point_new(-1, 1, 1), // 4 - roam_point_new(-1, 1,-1), // 5 - roam_point_new(-1,-1, 1), // 6 - roam_point_new(-1,-1,-1), // 7 + roam_point_new( 0, 1, 0), // 0 + roam_point_new( 0,-1, 0), // 1 + roam_point_new( 0, 0, 1), // 2 + roam_point_new( 1, 0, 0), // 3 + roam_point_new( 0, 0,-1), // 4 + roam_point_new(-1, 0, 0), // 5 }; int _triangles[][2][3] = { /*lv mv rv ln, bn, rn */ - {{3,2,0}, {10, 1, 7}}, // 0 - {{0,1,3}, { 9, 0, 2}}, // 1 - {{7,3,1}, {11, 3, 1}}, // 2 - {{1,5,7}, { 8, 2, 4}}, // 3 - {{6,7,5}, {11, 5, 3}}, // 4 - {{5,4,6}, { 8, 4, 6}}, // 5 - {{2,6,4}, {10, 7, 5}}, // 6 - {{4,0,2}, { 9, 6, 0}}, // 7 - {{4,5,1}, { 5, 9, 3}}, // 8 - {{1,0,4}, { 1, 8, 7}}, // 9 - {{6,2,3}, { 6,11, 0}}, // 10 - {{3,7,6}, { 2,10, 4}}, // 11 + {{2,0,3}, {3, 4, 1}}, // 0 + {{3,0,4}, {0, 5, 2}}, // 1 + {{4,0,5}, {1, 6, 3}}, // 2 + {{5,0,2}, {2, 7, 0}}, // 3 + {{3,1,2}, {5, 0, 7}}, // 4 + {{4,1,3}, {6, 1, 4}}, // 5 + {{5,1,4}, {7, 2, 5}}, // 6 + {{2,1,5}, {4, 3, 6}}, // 7 }; - RoamTriangle *triangles[12]; - for (int i = 0; i < 8; i++) + for (int i = 0; i < 6; i++) roam_point_update_height(vertexes[i], self); - for (int i = 0; i < 12; i++) - triangles[i] = roam_triangle_new( + for (int i = 0; i < 8; i++) + self->roots[i] = roam_triangle_new( vertexes[_triangles[i][0][0]], vertexes[_triangles[i][0][1]], vertexes[_triangles[i][0][2]]); - for (int i = 0; i < 12; i++) - roam_point_update_height(triangles[i]->split, self); - for (int i = 0; i < 12; i++) - roam_triangle_add(triangles[i], - triangles[_triangles[i][1][0]], - triangles[_triangles[i][1][1]], - triangles[_triangles[i][1][2]], + for (int i = 0; i < 8; i++) + roam_triangle_add(self->roots[i], + self->roots[_triangles[i][1][0]], + self->roots[_triangles[i][1][1]], + self->roots[_triangles[i][1][2]], self); return self; @@ -586,7 +579,7 @@ void roam_sphere_free_tri(RoamTriangle *tri) void roam_sphere_free(RoamSphere *self) { /* Slow method, but it should work */ - while (self->polys > 12) + while (self->polys > 8) roam_sphere_merge_one(self); /* TODO: free points */ g_pqueue_foreach(self->triangles, (GFunc)roam_sphere_free_tri, NULL); diff --git a/src/roam.h b/src/roam.h index c4a0898..ebcc3a3 100644 --- a/src/roam.h +++ b/src/roam.h @@ -108,6 +108,9 @@ struct _RoamSphere { RoamHeightFunc height_func; gpointer user_data; gint polys; + + /* For get_intersect */ + RoamTriangle *roots[8]; }; RoamSphere *roam_sphere_new(gpointer user_data); void roam_sphere_update_errors(RoamSphere *sphere); -- 2.43.2