X-Git-Url: http://pileus.org/git/?a=blobdiff_plain;f=src%2Fgis-opengl.c;h=7114dfa3de942ea29e68eeaf416b2270a4a867ec;hb=8060da4427ab86674362a745e9d4af15b8e48f95;hp=f0ac518586734f5fda07364f002504e827418860;hpb=ac7156bd84aef88b712f117f7e2f3d847d371719;p=grits diff --git a/src/gis-opengl.c b/src/gis-opengl.c index f0ac518..7114dfa 100644 --- a/src/gis-opengl.c +++ b/src/gis-opengl.c @@ -34,35 +34,24 @@ #define FOV_DIST 2000.0 #define MPPX(dist) (4*dist/FOV_DIST) -//#define ROAM_DEBUG +// #define ROAM_DEBUG /************* * 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); @@ -124,12 +113,13 @@ static void set_visuals(GisOpenGL *self) *************/ static void on_realize(GisOpenGL *self, gpointer _) { + g_debug("GisOpenGL: on_realize"); set_visuals(self); roam_sphere_update_errors(self->sphere); } static gboolean on_configure(GisOpenGL *self, GdkEventConfigure *event, gpointer _) { - g_debug("GisOpenGL: on_confiure"); + g_debug("GisOpenGL: on_configure"); gis_opengl_begin(self); double width = GTK_WIDGET(self)->allocation.width; @@ -166,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); @@ -180,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); @@ -211,12 +202,13 @@ static gboolean on_key_press(GisOpenGL *self, GdkEventKey *event, gpointer _) else if (kv == GDK_Right || kv == GDK_l) gis_view_pan(self->view, 0, pan, 0); else if (kv == GDK_minus || kv == GDK_o) gis_view_zoom(self->view, 10./9); else if (kv == GDK_plus || kv == GDK_i) gis_view_zoom(self->view, 9./10); - else if (kv == GDK_H) gis_view_rotate(self->view, 0, 0, -10); - else if (kv == GDK_J) gis_view_rotate(self->view, 10, 0, 0); - else if (kv == GDK_K) gis_view_rotate(self->view, -10, 0, 0); - else if (kv == GDK_L) gis_view_rotate(self->view, 0, 0, 10); + else if (kv == GDK_H) gis_view_rotate(self->view, 0, 0, -2); + else if (kv == GDK_J) gis_view_rotate(self->view, 2, 0, 0); + else if (kv == GDK_K) gis_view_rotate(self->view, -2, 0, 0); + 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); @@ -231,6 +223,7 @@ static gboolean on_key_press(GisOpenGL *self, GdkEventKey *event, gpointer _) static void on_view_changed(GisView *view, gdouble _1, gdouble _2, gdouble _3, GisOpenGL *self) { + g_debug("GisOpenGL: on_view_changed"); gis_opengl_begin(self); set_visuals(self); #ifndef ROAM_DEBUG @@ -242,6 +235,7 @@ static void on_view_changed(GisView *view, static gboolean on_idle(GisOpenGL *self) { + //g_debug("GisOpenGL: on_idle"); gis_opengl_begin(self); if (roam_sphere_split_merge(self->sphere)) gis_opengl_redraw(self); @@ -266,7 +260,6 @@ GisOpenGL *gis_opengl_new(GisWorld *world, GisView *view, GisPlugins *plugins) g_signal_connect(self->view, "location-changed", G_CALLBACK(on_view_changed), self); g_signal_connect(self->view, "rotation-changed", G_CALLBACK(on_view_changed), self); - /* TODO: update point eights sometime later so we have heigh-res heights for them */ self->sphere = roam_sphere_new(self); return g_object_ref(self); @@ -274,7 +267,6 @@ GisOpenGL *gis_opengl_new(GisWorld *world, GisView *view, GisPlugins *plugins) void gis_opengl_center_position(GisOpenGL *self, gdouble lat, gdouble lon, gdouble elev) { - set_camera(self); glRotatef(lon, 0, 1, 0); glRotatef(-lat, 1, 0, 0); glTranslatef(0, 0, elev2rad(elev)); @@ -282,7 +274,7 @@ void gis_opengl_center_position(GisOpenGL *self, gdouble lat, gdouble lon, gdoub void gis_opengl_redraw(GisOpenGL *self) { - g_debug("GisOpenGL: gl_redraw"); + g_debug("GisOpenGL: redraw"); gtk_widget_queue_draw(GTK_WIDGET(self)); } void gis_opengl_begin(GisOpenGL *self) @@ -320,9 +312,6 @@ G_DEFINE_TYPE(GisOpenGL, gis_opengl, GTK_TYPE_DRAWING_AREA); static void gis_opengl_init(GisOpenGL *self) { g_debug("GisOpenGL: init"); - self->bmng = wms_info_new_for_bmng(NULL, NULL); - self->srtm = wms_info_new_for_srtm(NULL, NULL); - /* OpenGL setup */ GdkGLConfig *glconfig = gdk_gl_config_new_by_mode( GDK_GL_MODE_RGBA | GDK_GL_MODE_DEPTH | @@ -386,8 +375,6 @@ static void gis_opengl_finalize(GObject *_self) { g_debug("GisOpenGL: finalize"); GisOpenGL *self = GIS_OPENGL(_self); - wms_info_free(self->bmng); - wms_info_free(self->srtm); G_OBJECT_CLASS(gis_opengl_parent_class)->finalize(_self); } static void gis_opengl_class_init(GisOpenGLClass *klass)