]> Pileus Git - grits/commitdiff
Refactor GisViewer and GisOpenGL
authorAndy Spencer <andy753421@gmail.com>
Sat, 14 Nov 2009 13:38:33 +0000 (13:38 +0000)
committerAndy Spencer <andy753421@gmail.com>
Sat, 14 Nov 2009 13:38:33 +0000 (13:38 +0000)
- GisViewer is an abstract type that extends GtkDrawingArea
- GisOpenGL extends GisViewer and is the core of the library.
  It is always accessed though the GisViewer API

15 files changed:
src/Makefile.am
src/gis-opengl.c
src/gis-opengl.h
src/gis-plugin.c
src/gis-plugin.h
src/gis-prefs.c
src/gis-viewer.c
src/gis-viewer.h
src/gis_test.c
src/plugins/bmng.c
src/plugins/bmng.h
src/plugins/srtm.c
src/plugins/srtm.h
src/plugins/test.c
src/plugins/test.h

index b10656547e2e2bb5707d0bcc19a740742191191c..81258ff512a835cbbc71359bb2f5f735537df0d7 100644 (file)
@@ -46,6 +46,7 @@ bin_PROGRAMS = gis_test wms_test
 
 gis_test_SOURCES  = gis_test.c gis.h
 gis_test_LDADD    = $(AM_LDADD) libgis.la
 
 gis_test_SOURCES  = gis_test.c gis.h
 gis_test_LDADD    = $(AM_LDADD) libgis.la
+gis_test_LDFLAGS  = -static
 
 wms_test_SOURCES  = wms_test.c gis-util.c gis-util.h gis-wms.c gis-wms.h gis-tile.c gis-tile.h
 wms_test_LDADD    = $(AM_LDADD)
 
 wms_test_SOURCES  = wms_test.c gis-util.c gis-util.h gis-wms.c gis-wms.h gis-tile.c gis-tile.h
 wms_test_LDADD    = $(AM_LDADD)
index f186f5faec9719e52290daaa397bc7d9a7fdaefc..ec703371ada11008f5d027f6020d6b7c175cff41 100644 (file)
 
 // #define ROAM_DEBUG
 
 
 // #define ROAM_DEBUG
 
+/***********
+ * Helpers *
+ ***********/
+static void _gis_opengl_begin(GisOpenGL *self)
+{
+       g_assert(GIS_IS_OPENGL(self));
+
+       GdkGLContext   *glcontext  = gtk_widget_get_gl_context(GTK_WIDGET(self));
+       GdkGLDrawable  *gldrawable = gtk_widget_get_gl_drawable(GTK_WIDGET(self));
+
+       if (!gdk_gl_drawable_gl_begin(gldrawable, glcontext))
+               g_assert_not_reached();
+}
+
+static void _gis_opengl_end(GisOpenGL *self)
+{
+       g_assert(GIS_IS_OPENGL(self));
+       GdkGLDrawable *gldrawable = gtk_widget_get_gl_drawable(GTK_WIDGET(self));
+       gdk_gl_drawable_gl_end(gldrawable);
+}
+
 /*************
  * ROAM Code *
  *************/
 /*************
  * ROAM Code *
  *************/
-static void set_visuals(GisOpenGL *self)
+static void _set_visuals(GisOpenGL *self)
 {
        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();
 
        /* Camera 1 */
        double lat, lon, elev, rx, ry, rz;
 {
        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();
 
        /* Camera 1 */
        double lat, lon, elev, rx, ry, rz;
-       gis_viewer_get_location(self->viewer, &lat, &lon, &elev);
-       gis_viewer_get_rotation(self->viewer, &rx, &ry, &rz);
+       gis_viewer_get_location(GIS_VIEWER(self), &lat, &lon, &elev);
+       gis_viewer_get_rotation(GIS_VIEWER(self), &rx, &ry, &rz);
        glRotatef(rx, 1, 0, 0);
        glRotatef(rz, 0, 0, 1);
 
        glRotatef(rx, 1, 0, 0);
        glRotatef(rz, 0, 0, 1);
 
@@ -117,13 +138,13 @@ static void set_visuals(GisOpenGL *self)
 static void on_realize(GisOpenGL *self, gpointer _)
 {
        g_debug("GisOpenGL: on_realize");
 static void on_realize(GisOpenGL *self, gpointer _)
 {
        g_debug("GisOpenGL: on_realize");
-       set_visuals(self);
+       _set_visuals(self);
        roam_sphere_update_errors(self->sphere);
 }
 static gboolean on_configure(GisOpenGL *self, GdkEventConfigure *event, gpointer _)
 {
        g_debug("GisOpenGL: on_configure");
        roam_sphere_update_errors(self->sphere);
 }
 static gboolean on_configure(GisOpenGL *self, GdkEventConfigure *event, gpointer _)
 {
        g_debug("GisOpenGL: on_configure");
-       gis_opengl_begin(self);
+       _gis_opengl_begin(self);
 
        double width  = GTK_WIDGET(self)->allocation.width;
        double height = GTK_WIDGET(self)->allocation.height;
 
        double width  = GTK_WIDGET(self)->allocation.width;
        double height = GTK_WIDGET(self)->allocation.height;
@@ -138,13 +159,13 @@ static gboolean on_configure(GisOpenGL *self, GdkEventConfigure *event, gpointer
        roam_sphere_update_errors(self->sphere);
 #endif
 
        roam_sphere_update_errors(self->sphere);
 #endif
 
-       gis_opengl_end(self);
+       _gis_opengl_end(self);
        return FALSE;
 }
 
 static void on_expose_plugin(GisPlugin *plugin, gchar *name, GisOpenGL *self)
 {
        return FALSE;
 }
 
 static void on_expose_plugin(GisPlugin *plugin, gchar *name, GisOpenGL *self)
 {
-       set_visuals(self);
+       _set_visuals(self);
        glMatrixMode(GL_PROJECTION); glPushMatrix();
        glMatrixMode(GL_MODELVIEW);  glPushMatrix();
        gis_plugin_expose(plugin);
        glMatrixMode(GL_PROJECTION); glPushMatrix();
        glMatrixMode(GL_MODELVIEW);  glPushMatrix();
        gis_plugin_expose(plugin);
@@ -154,20 +175,20 @@ static void on_expose_plugin(GisPlugin *plugin, gchar *name, GisOpenGL *self)
 static gboolean on_expose(GisOpenGL *self, GdkEventExpose *event, gpointer _)
 {
        g_debug("GisOpenGL: on_expose - begin");
 static gboolean on_expose(GisOpenGL *self, GdkEventExpose *event, gpointer _)
 {
        g_debug("GisOpenGL: on_expose - begin");
-       gis_opengl_begin(self);
+       _gis_opengl_begin(self);
 
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
 
 #ifndef ROAM_DEBUG
 
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
 
 #ifndef ROAM_DEBUG
-       gis_plugins_foreach(self->plugins, G_CALLBACK(on_expose_plugin), self);
+       gis_plugins_foreach(GIS_VIEWER(self)->plugins, G_CALLBACK(on_expose_plugin), self);
 
        if (self->wireframe) {
 
        if (self->wireframe) {
-               set_visuals(self);
+               _set_visuals(self);
                glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
                roam_sphere_draw(self->sphere);
        }
 #else
                glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
                roam_sphere_draw(self->sphere);
        }
 #else
-       set_visuals(self);
+       _set_visuals(self);
        glColor4f(0.0, 0.0, 9.0, 0.6);
        glDisable(GL_TEXTURE_2D);
        glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
        glColor4f(0.0, 0.0, 9.0, 0.6);
        glDisable(GL_TEXTURE_2D);
        glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
@@ -176,43 +197,26 @@ static gboolean on_expose(GisOpenGL *self, GdkEventExpose *event, gpointer _)
        //roam_sphere_draw_normals(self->sphere);
 #endif
 
        //roam_sphere_draw_normals(self->sphere);
 #endif
 
-       set_visuals(self);
-       gis_opengl_end(self);
-       gis_opengl_flush(self);
+       GdkGLDrawable *gldrawable = gtk_widget_get_gl_drawable(GTK_WIDGET(self));
+       gdk_gl_drawable_swap_buffers(gldrawable);
+
+       _gis_opengl_end(self);
        g_debug("GisOpenGL: on_expose - end\n");
        return FALSE;
 }
 
        g_debug("GisOpenGL: on_expose - end\n");
        return FALSE;
 }
 
-static gboolean on_button_press(GisOpenGL *self, GdkEventButton *event, gpointer _)
-{
-       g_debug("GisOpenGL: on_button_press - Grabbing focus");
-       gtk_widget_grab_focus(GTK_WIDGET(self));
-       return TRUE;
-}
-
 static gboolean on_key_press(GisOpenGL *self, GdkEventKey *event, gpointer _)
 {
        g_debug("GisOpenGL: on_key_press - key=%x, state=%x, plus=%x",
                        event->keyval, event->state, GDK_plus);
 
 static gboolean on_key_press(GisOpenGL *self, GdkEventKey *event, gpointer _)
 {
        g_debug("GisOpenGL: on_key_press - key=%x, state=%x, plus=%x",
                        event->keyval, event->state, GDK_plus);
 
-       double lat, lon, elev, pan;
-       gis_viewer_get_location(self->viewer, &lat, &lon, &elev);
-       pan = MIN(elev/(EARTH_R/2), 30);
        guint kv = event->keyval;
        gdk_threads_leave();
        guint kv = event->keyval;
        gdk_threads_leave();
-       if      (kv == GDK_Left  || kv == GDK_h) gis_viewer_pan(self->viewer,  0,  -pan, 0);
-       else if (kv == GDK_Down  || kv == GDK_j) gis_viewer_pan(self->viewer, -pan, 0,   0);
-       else if (kv == GDK_Up    || kv == GDK_k) gis_viewer_pan(self->viewer,  pan, 0,   0);
-       else if (kv == GDK_Right || kv == GDK_l) gis_viewer_pan(self->viewer,  0,   pan, 0);
-       else if (kv == GDK_minus || kv == GDK_o) gis_viewer_zoom(self->viewer, 10./9);
-       else if (kv == GDK_plus  || kv == GDK_i) gis_viewer_zoom(self->viewer, 9./10);
-       else if (kv == GDK_H) gis_viewer_rotate(self->viewer,  0, 0, -2);
-       else if (kv == GDK_J) gis_viewer_rotate(self->viewer,  2, 0,  0);
-       else if (kv == GDK_K) gis_viewer_rotate(self->viewer, -2, 0,  0);
-       else if (kv == GDK_L) gis_viewer_rotate(self->viewer,  0, 0,  2);
-
        /* Testing */
        /* Testing */
-       else if (kv == GDK_w) {self->wireframe = !self->wireframe; gtk_widget_queue_draw(GTK_WIDGET(self));}
+       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);
 #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);
@@ -232,19 +236,18 @@ static gboolean _update_errors_cb(gpointer sphere)
        roam_sphere_update_errors(sphere);
        return FALSE;
 }
        roam_sphere_update_errors(sphere);
        return FALSE;
 }
-static void on_view_changed(GisViewer *viewer,
-               gdouble _1, gdouble _2, gdouble _3, GisOpenGL *self)
+static void on_view_changed(GisOpenGL *self,
+               gdouble _1, gdouble _2, gdouble _3)
 {
        g_debug("GisOpenGL: on_view_changed");
        gdk_threads_enter();
 {
        g_debug("GisOpenGL: on_view_changed");
        gdk_threads_enter();
-       gis_opengl_begin(self);
-       set_visuals(self);
+       _gis_opengl_begin(self);
+       _set_visuals(self);
 #ifndef ROAM_DEBUG
        g_idle_add_full(G_PRIORITY_HIGH_IDLE+30, _update_errors_cb, self->sphere, NULL);
        //roam_sphere_update_errors(self->sphere);
 #endif
 #ifndef ROAM_DEBUG
        g_idle_add_full(G_PRIORITY_HIGH_IDLE+30, _update_errors_cb, self->sphere, NULL);
        //roam_sphere_update_errors(self->sphere);
 #endif
-       gis_opengl_redraw(self);
-       gis_opengl_end(self);
+       _gis_opengl_end(self);
        gdk_threads_leave();
 }
 
        gdk_threads_leave();
 }
 
@@ -252,45 +255,39 @@ static gboolean on_idle(GisOpenGL *self)
 {
        //g_debug("GisOpenGL: on_idle");
        gdk_threads_enter();
 {
        //g_debug("GisOpenGL: on_idle");
        gdk_threads_enter();
-       gis_opengl_begin(self);
+       _gis_opengl_begin(self);
        if (roam_sphere_split_merge(self->sphere))
        if (roam_sphere_split_merge(self->sphere))
-               gis_opengl_redraw(self);
-       gis_opengl_end(self);
+               gtk_widget_queue_draw(GTK_WIDGET(self));
+       _gis_opengl_end(self);
        gdk_threads_leave();
        return TRUE;
 }
 
 
        gdk_threads_leave();
        return TRUE;
 }
 
 
-/***********
- * Methods *
- ***********/
-GisOpenGL *gis_opengl_new(GisViewer *viewer, GisPlugins *plugins)
+/*********************
+ * GisViewer methods *
+ *********************/
+GisViewer *gis_opengl_new(GisPlugins *plugins)
 {
        g_debug("GisOpenGL: new");
 {
        g_debug("GisOpenGL: new");
-       GisOpenGL *self = g_object_new(GIS_TYPE_OPENGL, NULL);
-       self->viewer  = viewer;
+       GisViewer *self = g_object_new(GIS_TYPE_OPENGL, NULL);
        self->plugins = plugins;
        self->plugins = plugins;
-       g_object_ref(viewer);
-
-       g_signal_connect(self->viewer, "location-changed", G_CALLBACK(on_view_changed), self);
-       g_signal_connect(self->viewer, "rotation-changed", G_CALLBACK(on_view_changed), self);
-
-       self->sphere = roam_sphere_new(self);
-
-       return g_object_ref(self);
+       return self;
 }
 
 }
 
-void gis_opengl_center_position(GisOpenGL *self, gdouble lat, gdouble lon, gdouble elev)
+static void gis_opengl_center_position(GisViewer *_self, gdouble lat, gdouble lon, gdouble elev)
 {
 {
+       GisOpenGL *self = GIS_OPENGL(_self);
        glRotatef(lon, 0, 1, 0);
        glRotatef(-lat, 1, 0, 0);
        glTranslatef(0, 0, elev2rad(elev));
 }
 
        glRotatef(lon, 0, 1, 0);
        glRotatef(-lat, 1, 0, 0);
        glTranslatef(0, 0, elev2rad(elev));
 }
 
-void gis_opengl_project(GisOpenGL *self,
+static void gis_opengl_project(GisViewer *_self,
                gdouble lat, gdouble lon, gdouble elev,
                gdouble *px, gdouble *py, gdouble *pz)
 {
                gdouble lat, gdouble lon, gdouble elev,
                gdouble *px, gdouble *py, gdouble *pz)
 {
+       GisOpenGL *self = GIS_OPENGL(_self);
        gdouble x, y, z;
        lle2xyz(lat, lon, elev, &x, &y, &z);
        gluProject(x, y, z,
        gdouble x, y, z;
        lle2xyz(lat, lon, elev, &x, &y, &z);
        gluProject(x, y, z,
@@ -300,8 +297,9 @@ void gis_opengl_project(GisOpenGL *self,
                px, py, pz);
 }
 
                px, py, pz);
 }
 
-void gis_opengl_render_tile(GisOpenGL *self, GisTile *tile)
+static void gis_opengl_render_tile(GisViewer *_self, GisTile *tile)
 {
 {
+       GisOpenGL *self = GIS_OPENGL(_self);
        if (!tile || !tile->data)
                return;
        GList *triangles = roam_sphere_get_intersect(self->sphere,
        if (!tile || !tile->data)
                return;
        GList *triangles = roam_sphere_get_intersect(self->sphere,
@@ -348,8 +346,9 @@ void gis_opengl_render_tile(GisOpenGL *self, GisTile *tile)
        g_list_free(triangles);
 }
 
        g_list_free(triangles);
 }
 
-void gis_opengl_render_tiles(GisOpenGL *opengl, GisTile *tile)
+static void gis_opengl_render_tiles(GisViewer *_self, GisTile *tile)
 {
 {
+       GisOpenGL *self = GIS_OPENGL(_self);
        /* Only render children if possible */
        gboolean has_children = TRUE;
        GisTile *child;
        /* Only render children if possible */
        gboolean has_children = TRUE;
        GisTile *child;
@@ -359,15 +358,16 @@ void gis_opengl_render_tiles(GisOpenGL *opengl, GisTile *tile)
        if (has_children)
                /* Only render children */
                gis_tile_foreach(tile, child)
        if (has_children)
                /* Only render children */
                gis_tile_foreach(tile, child)
-                       gis_opengl_render_tiles(opengl, child);
+                       gis_opengl_render_tiles(_self, child);
        else
                /* No children, render this tile */
        else
                /* No children, render this tile */
-               gis_opengl_render_tile(opengl, tile);
+               gis_opengl_render_tile(_self, tile);
 }
 
 }
 
-void gis_opengl_set_height_func(GisOpenGL *self, GisTile *tile,
+static void gis_opengl_set_height_func(GisViewer *_self, GisTile *tile,
                RoamHeightFunc height_func, gpointer user_data, gboolean update)
 {
                RoamHeightFunc height_func, gpointer user_data, gboolean update)
 {
+       GisOpenGL *self = GIS_OPENGL(_self);
        if (!tile)
                return;
        /* TODO: get points? */
        if (!tile)
                return;
        /* TODO: get points? */
@@ -398,49 +398,30 @@ static void _gis_opengl_clear_height_func_rec(RoamTriangle *root)
        _gis_opengl_clear_height_func_rec(root->kids[0]);
        _gis_opengl_clear_height_func_rec(root->kids[1]);
 }
        _gis_opengl_clear_height_func_rec(root->kids[0]);
        _gis_opengl_clear_height_func_rec(root->kids[1]);
 }
-void gis_opengl_clear_height_func(GisOpenGL *self)
+
+static void gis_opengl_clear_height_func(GisViewer *_self)
 {
 {
+       GisOpenGL *self = GIS_OPENGL(_self);
        for (int i = 0; i < G_N_ELEMENTS(self->sphere->roots); i++)
                _gis_opengl_clear_height_func_rec(self->sphere->roots[i]);
 }
 
        for (int i = 0; i < G_N_ELEMENTS(self->sphere->roots); i++)
                _gis_opengl_clear_height_func_rec(self->sphere->roots[i]);
 }
 
-void gis_opengl_redraw(GisOpenGL *self)
+static void gis_opengl_begin(GisViewer *_self)
 {
 {
-       g_debug("GisOpenGL: redraw");
-       gtk_widget_queue_draw(GTK_WIDGET(self));
+       g_assert(GIS_IS_OPENGL(_self));
+       _gis_opengl_begin(GIS_OPENGL(_self));
 }
 }
-void gis_opengl_begin(GisOpenGL *self)
-{
-       g_assert(GIS_IS_OPENGL(self));
 
 
-       GdkGLContext   *glcontext  = gtk_widget_get_gl_context(GTK_WIDGET(self));
-       GdkGLDrawable  *gldrawable = gtk_widget_get_gl_drawable(GTK_WIDGET(self));
-
-       if (!gdk_gl_drawable_gl_begin(gldrawable, glcontext))
-               g_assert_not_reached();
-}
-void gis_opengl_end(GisOpenGL *self)
+static void gis_opengl_end(GisViewer *_self)
 {
 {
-       g_assert(GIS_IS_OPENGL(self));
-       GdkGLDrawable *gldrawable = gtk_widget_get_gl_drawable(GTK_WIDGET(self));
-       gdk_gl_drawable_gl_end(gldrawable);
-}
-void gis_opengl_flush(GisOpenGL *self)
-{
-       g_assert(GIS_IS_OPENGL(self));
-       GdkGLDrawable *gldrawable = gtk_widget_get_gl_drawable(GTK_WIDGET(self));
-       if (gdk_gl_drawable_is_double_buffered(gldrawable))
-               gdk_gl_drawable_swap_buffers(gldrawable);
-       else
-               glFlush();
-       gdk_gl_drawable_gl_end(gldrawable);
+       g_assert(GIS_IS_OPENGL(_self));
+       _gis_opengl_end(GIS_OPENGL(_self));
 }
 
 }
 
-
 /****************
  * GObject code *
  ****************/
 /****************
  * GObject code *
  ****************/
-G_DEFINE_TYPE(GisOpenGL, gis_opengl, GTK_TYPE_DRAWING_AREA);
+G_DEFINE_TYPE(GisOpenGL, gis_opengl, GIS_TYPE_VIEWER);
 static void gis_opengl_init(GisOpenGL *self)
 {
        g_debug("GisOpenGL: init");
 static void gis_opengl_init(GisOpenGL *self)
 {
        g_debug("GisOpenGL: init");
@@ -462,6 +443,8 @@ static void gis_opengl_init(GisOpenGL *self)
                        GDK_KEY_PRESS_MASK);
        g_object_set(self, "can-focus", TRUE, NULL);
 
                        GDK_KEY_PRESS_MASK);
        g_object_set(self, "can-focus", TRUE, NULL);
 
+       self->sphere = roam_sphere_new(self);
+
 #ifndef ROAM_DEBUG
        self->sm_source[0] = g_timeout_add_full(G_PRIORITY_HIGH_IDLE+30, 33,  (GSourceFunc)on_idle, self, NULL);
        self->sm_source[1] = g_timeout_add_full(G_PRIORITY_HIGH_IDLE+10, 500, (GSourceFunc)on_idle, self, NULL);
 #ifndef ROAM_DEBUG
        self->sm_source[0] = g_timeout_add_full(G_PRIORITY_HIGH_IDLE+30, 33,  (GSourceFunc)on_idle, self, NULL);
        self->sm_source[1] = g_timeout_add_full(G_PRIORITY_HIGH_IDLE+10, 500, (GSourceFunc)on_idle, self, NULL);
@@ -471,16 +454,10 @@ static void gis_opengl_init(GisOpenGL *self)
        g_signal_connect(self, "configure-event",    G_CALLBACK(on_configure),    NULL);
        g_signal_connect(self, "expose-event",       G_CALLBACK(on_expose),       NULL);
 
        g_signal_connect(self, "configure-event",    G_CALLBACK(on_configure),    NULL);
        g_signal_connect(self, "expose-event",       G_CALLBACK(on_expose),       NULL);
 
-       g_signal_connect(self, "button-press-event", G_CALLBACK(on_button_press), NULL);
-       g_signal_connect(self, "enter-notify-event", G_CALLBACK(on_button_press), NULL);
        g_signal_connect(self, "key-press-event",    G_CALLBACK(on_key_press),    NULL);
        g_signal_connect(self, "key-press-event",    G_CALLBACK(on_key_press),    NULL);
-}
-static GObject *gis_opengl_constructor(GType gtype, guint n_properties,
-               GObjectConstructParam *properties)
-{
-       g_debug("GisOpengl: constructor");
-       GObjectClass *parent_class = G_OBJECT_CLASS(gis_opengl_parent_class);
-       return parent_class->constructor(gtype, n_properties, properties);
+
+       g_signal_connect(self, "location-changed",   G_CALLBACK(on_view_changed), NULL);
+       g_signal_connect(self, "rotation-changed",   G_CALLBACK(on_view_changed), NULL);
 }
 static void gis_opengl_dispose(GObject *_self)
 {
 }
 static void gis_opengl_dispose(GObject *_self)
 {
@@ -498,23 +475,21 @@ static void gis_opengl_dispose(GObject *_self)
                roam_sphere_free(self->sphere);
                self->sphere = NULL;
        }
                roam_sphere_free(self->sphere);
                self->sphere = NULL;
        }
-       if (self->viewer) {
-               g_object_unref(self->viewer);
-               self->viewer = NULL;
-       }
        G_OBJECT_CLASS(gis_opengl_parent_class)->dispose(_self);
 }
        G_OBJECT_CLASS(gis_opengl_parent_class)->dispose(_self);
 }
-static void gis_opengl_finalize(GObject *_self)
-{
-       g_debug("GisOpenGL: finalize");
-       GisOpenGL *self = GIS_OPENGL(_self);
-       G_OBJECT_CLASS(gis_opengl_parent_class)->finalize(_self);
-}
 static void gis_opengl_class_init(GisOpenGLClass *klass)
 {
        g_debug("GisOpenGL: class_init");
        GObjectClass *gobject_class = G_OBJECT_CLASS(klass);
 static void gis_opengl_class_init(GisOpenGLClass *klass)
 {
        g_debug("GisOpenGL: class_init");
        GObjectClass *gobject_class = G_OBJECT_CLASS(klass);
-       gobject_class->constructor  = gis_opengl_constructor;
-       gobject_class->dispose      = gis_opengl_dispose;
-       gobject_class->finalize     = gis_opengl_finalize;
+       gobject_class->dispose     = gis_opengl_dispose;
+
+       GisViewerClass *viewer_class = GIS_VIEWER_CLASS(klass);
+       viewer_class->center_position   = gis_opengl_center_position;
+       viewer_class->project           = gis_opengl_project;
+       viewer_class->clear_height_func = gis_opengl_clear_height_func;
+       viewer_class->set_height_func   = gis_opengl_set_height_func;
+       viewer_class->render_tile       = gis_opengl_render_tile;
+       viewer_class->render_tiles      = gis_opengl_render_tiles;
+       viewer_class->begin             = gis_opengl_begin;
+       viewer_class->end               = gis_opengl_end;
 }
 }
index a0f612596e0a8541458f7911cd3e09ee5ace0f2b..0ef682df6a243fdebe7429b8c775eedbcf6f3bba 100644 (file)
@@ -18,8 +18,6 @@
 #ifndef __GIS_OPENGL_H__
 #define __GIS_OPENGL_H__
 
 #ifndef __GIS_OPENGL_H__
 #define __GIS_OPENGL_H__
 
-#include <gtk/gtk.h>
-#include <gtk/gtkgl.h>
 #include <glib-object.h>
 
 /* Type macros */
 #include <glib-object.h>
 
 /* Type macros */
@@ -34,16 +32,12 @@ typedef struct _GisOpenGL      GisOpenGL;
 typedef struct _GisOpenGLClass GisOpenGLClass;
 
 #include "gis-viewer.h"
 typedef struct _GisOpenGLClass GisOpenGLClass;
 
 #include "gis-viewer.h"
-#include "gis-plugin.h"
-#include "gis-tile.h"
 #include "roam.h"
 
 struct _GisOpenGL {
 #include "roam.h"
 
 struct _GisOpenGL {
-       GtkDrawingArea parent_instance;
+       GisViewer parent_instance;
 
        /* instance members */
 
        /* instance members */
-       GisViewer  *viewer;
-       GisPlugins *plugins;
        RoamSphere *sphere;
        guint       sm_source[2];
 
        RoamSphere *sphere;
        guint       sm_source[2];
 
@@ -52,7 +46,7 @@ struct _GisOpenGL {
 };
 
 struct _GisOpenGLClass {
 };
 
 struct _GisOpenGLClass {
-       GtkDrawingAreaClass parent_class;
+       GisViewerClass parent_class;
 
        /* class members */
 };
 
        /* class members */
 };
@@ -60,28 +54,6 @@ struct _GisOpenGLClass {
 GType gis_opengl_get_type(void);
 
 /* Methods */
 GType gis_opengl_get_type(void);
 
 /* Methods */
-GisOpenGL *gis_opengl_new(GisViewer *viewer, GisPlugins *plugins);
-
-void gis_opengl_center_position(GisOpenGL *opengl,
-               gdouble lat, gdouble lon, gdouble elev);
-
-void gis_opengl_project(GisOpenGL *opengl,
-               gdouble lat, gdouble lon, gdouble elev,
-               gdouble *px, gdouble *py, gdouble *pz);
-
-void gis_opengl_render_tile(GisOpenGL *opengl, GisTile *tile);
-
-void gis_opengl_render_tiles(GisOpenGL *opengl, GisTile *root);
-
-void gis_opengl_set_height_func(GisOpenGL *self, GisTile *tile,
-               RoamHeightFunc height_func, gpointer user_data, gboolean update);
-
-void gis_opengl_clear_height_func(GisOpenGL *self);
-
-void gis_opengl_redraw(GisOpenGL *opengl);
-
-void gis_opengl_begin(GisOpenGL *opengl);
-void gis_opengl_end(GisOpenGL *opengl);
-void gis_opengl_flush(GisOpenGL *opengl);
+GisViewer *gis_opengl_new(GisPlugins *plugins);
 
 #endif
 
 #endif
index f87b09a6ba50d860558fecb126af919ca8e35118..2e0ef1bdf8b0a802fd4b226f4b1e2a58eeb916f7 100644 (file)
@@ -119,7 +119,7 @@ GList *gis_plugins_available(GisPlugins *self)
 }
 
 GisPlugin *gis_plugins_load(GisPlugins *self, const char *name,
 }
 
 GisPlugin *gis_plugins_load(GisPlugins *self, const char *name,
-               GisViewer *viewer, GisOpenGL *opengl, GisPrefs *prefs)
+               GisViewer *viewer, GisPrefs *prefs)
 {
        g_debug("GisPlugins: load %s", name);
        gchar *path = g_strdup_printf("%s/%s.%s", self->dir, name, G_MODULE_SUFFIX);
 {
        g_debug("GisPlugins: load %s", name);
        gchar *path = g_strdup_printf("%s/%s.%s", self->dir, name, G_MODULE_SUFFIX);
@@ -155,7 +155,7 @@ GisPlugin *gis_plugins_load(GisPlugins *self, const char *name,
 
        GisPluginStore *store = g_new0(GisPluginStore, 1);
        store->name = g_strdup(name);
 
        GisPluginStore *store = g_new0(GisPluginStore, 1);
        store->name = g_strdup(name);
-       store->plugin = constructor(viewer, opengl, prefs);
+       store->plugin = constructor(viewer, prefs);
        g_ptr_array_add(self->plugins, store);
        return store->plugin;
 }
        g_ptr_array_add(self->plugins, store);
        return store->plugin;
 }
@@ -177,6 +177,8 @@ gboolean gis_plugins_unload(GisPlugins *self, const char *name)
 void gis_plugins_foreach(GisPlugins *self, GCallback _callback, gpointer user_data)
 {
        g_debug("GisPlugins: foreach");
 void gis_plugins_foreach(GisPlugins *self, GCallback _callback, gpointer user_data)
 {
        g_debug("GisPlugins: foreach");
+       if (self == NULL)
+               return;
        typedef void (*CBFunc)(GisPlugin *, const gchar *, gpointer);
        CBFunc callback = (CBFunc)_callback;
        for (int i = 0; i < self->plugins->len; i++) {
        typedef void (*CBFunc)(GisPlugin *, const gchar *, gpointer);
        CBFunc callback = (CBFunc)_callback;
        for (int i = 0; i < self->plugins->len; i++) {
index c142cdb8bf1b0b4414f414c55754d04c13757257..2feb8745178a4269ca470e5ad8618cc0f0837257 100644 (file)
@@ -47,7 +47,6 @@ GtkWidget *gis_plugin_get_config(GisPlugin *self);
 
 /* Plugins API */
 #include "gis-viewer.h"
 
 /* Plugins API */
 #include "gis-viewer.h"
-#include "gis-opengl.h"
 #include "gis-prefs.h"
 
 struct _GisPlugins {
 #include "gis-prefs.h"
 
 struct _GisPlugins {
@@ -55,13 +54,13 @@ struct _GisPlugins {
        GPtrArray *plugins;
 };
 
        GPtrArray *plugins;
 };
 
-typedef GisPlugin *(*GisPluginConstructor)(GisViewer *viewer, GisOpenGL *opengl, GisPrefs *prefs);
+typedef GisPlugin *(*GisPluginConstructor)(GisViewer *viewer, GisPrefs *prefs);
 
 GisPlugins *gis_plugins_new(gchar *dir);
 void        gis_plugins_free();
 GList      *gis_plugins_available(GisPlugins *plugins);
 GisPlugin  *gis_plugins_load(GisPlugins *plugins, const char *name,
 
 GisPlugins *gis_plugins_new(gchar *dir);
 void        gis_plugins_free();
 GList      *gis_plugins_available(GisPlugins *plugins);
 GisPlugin  *gis_plugins_load(GisPlugins *plugins, const char *name,
-               GisViewer *viewer, GisOpenGL *opengl, GisPrefs *prefs);
+               GisViewer *viewer, GisPrefs *prefs);
 gboolean    gis_plugins_unload(GisPlugins *plugins, const char *name);
 void        gis_plugins_foreach(GisPlugins *plugins, GCallback callback, gpointer user_data);
 
 gboolean    gis_plugins_unload(GisPlugins *plugins, const char *name);
 void        gis_plugins_foreach(GisPlugins *plugins, GCallback callback, gpointer user_data);
 
index 113393d5b9a57b824bb4a616531ae66ded6dc73e..9659a6e8b143d4e7c5eb24cd2eb08963dcff10a9 100644 (file)
@@ -115,13 +115,6 @@ static void gis_prefs_init(GisPrefs *self)
        g_debug("GisPrefs: init");
        self->key_file = g_key_file_new();
 }
        g_debug("GisPrefs: init");
        self->key_file = g_key_file_new();
 }
-static GObject *gis_prefs_constructor(GType gtype, guint n_properties,
-               GObjectConstructParam *properties)
-{
-       g_debug("GisPrefs: constructor");
-       GObjectClass *parent_class = G_OBJECT_CLASS(gis_prefs_parent_class);
-       return  parent_class->constructor(gtype, n_properties, properties);
-}
 static void gis_prefs_dispose(GObject *_self)
 {
        g_debug("GisPrefs: dispose");
 static void gis_prefs_dispose(GObject *_self)
 {
        g_debug("GisPrefs: dispose");
@@ -140,18 +133,11 @@ static void gis_prefs_dispose(GObject *_self)
        }
        G_OBJECT_CLASS(gis_prefs_parent_class)->dispose(_self);
 }
        }
        G_OBJECT_CLASS(gis_prefs_parent_class)->dispose(_self);
 }
-static void gis_prefs_finalize(GObject *_self)
-{
-       g_debug("GisPrefs: finalize");
-       G_OBJECT_CLASS(gis_prefs_parent_class)->finalize(_self);
-}
 static void gis_prefs_class_init(GisPrefsClass *klass)
 {
        g_debug("GisPrefs: class_init");
        GObjectClass *gobject_class = G_OBJECT_CLASS(klass);
 static void gis_prefs_class_init(GisPrefsClass *klass)
 {
        g_debug("GisPrefs: class_init");
        GObjectClass *gobject_class = G_OBJECT_CLASS(klass);
-       gobject_class->constructor  = gis_prefs_constructor;
        gobject_class->dispose      = gis_prefs_dispose;
        gobject_class->dispose      = gis_prefs_dispose;
-       gobject_class->finalize     = gis_prefs_finalize;
        signals[SIG_PREF_CHANGED] = g_signal_new(
                        "pref-changed",
                        G_TYPE_FROM_CLASS(gobject_class),
        signals[SIG_PREF_CHANGED] = g_signal_new(
                        "pref-changed",
                        G_TYPE_FROM_CLASS(gobject_class),
index 078d98a335744cacae8f65275ef60e404be53876..79dab10648f80edee73789802a3abb75830c4846 100644 (file)
@@ -15,7 +15,9 @@
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-#include <glib.h>
+#include <config.h>
+#include <gtk/gtk.h>
+#include <gdk/gdkkeysyms.h>
 
 #include "gis-marshal.h"
 #include "gis-viewer.h"
 
 #include "gis-marshal.h"
 #include "gis-viewer.h"
@@ -42,6 +44,9 @@ enum {
 static guint signals[NUM_SIGNALS];
 
 
 static guint signals[NUM_SIGNALS];
 
 
+/***********
+ * Helpers *
+ ***********/
 /* Misc helpers */
 static void _gis_viewer_fix_location(GisViewer *self)
 {
 /* Misc helpers */
 static void _gis_viewer_fix_location(GisViewer *self)
 {
@@ -87,16 +92,46 @@ static void _gis_viewer_emit_offline(GisViewer *self)
                        self->offline);
 }
 
                        self->offline);
 }
 
+/*************
+ * Callbacks *
+ *************/
+static gboolean on_button_press(GisViewer *self, GdkEventButton *event, gpointer _)
+{
+       g_debug("GisViewer: on_button_press - Grabbing focus");
+       gtk_widget_grab_focus(GTK_WIDGET(self));
+       return TRUE;
+}
+static gboolean on_key_press(GisViewer *self, GdkEventKey *event, gpointer _)
+{
+       g_debug("GisViewer: on_key_press - key=%x, state=%x, plus=%x",
+                       event->keyval, event->state, GDK_plus);
 
 
-/***********
- * Methods *
- ***********/
-GisViewer *gis_viewer_new()
+       double lat, lon, elev, pan;
+       gis_viewer_get_location(self, &lat, &lon, &elev);
+       pan = MIN(elev/(EARTH_R/2), 30);
+       guint kv = event->keyval;
+       gdk_threads_leave();
+       if      (kv == GDK_Left  || kv == GDK_h) gis_viewer_pan(self,  0,  -pan, 0);
+       else if (kv == GDK_Down  || kv == GDK_j) gis_viewer_pan(self, -pan, 0,   0);
+       else if (kv == GDK_Up    || kv == GDK_k) gis_viewer_pan(self,  pan, 0,   0);
+       else if (kv == GDK_Right || kv == GDK_l) gis_viewer_pan(self,  0,   pan, 0);
+       else if (kv == GDK_minus || kv == GDK_o) gis_viewer_zoom(self, 10./9);
+       else if (kv == GDK_plus  || kv == GDK_i) gis_viewer_zoom(self, 9./10);
+       else if (kv == GDK_H) gis_viewer_rotate(self,  0, 0, -2);
+       else if (kv == GDK_J) gis_viewer_rotate(self,  2, 0,  0);
+       else if (kv == GDK_K) gis_viewer_rotate(self, -2, 0,  0);
+       else if (kv == GDK_L) gis_viewer_rotate(self,  0, 0,  2);
+       return TRUE;
+}
+static void on_view_changed(GisViewer *self,
+               gdouble _1, gdouble _2, gdouble _3)
 {
 {
-       g_debug("GisViewer: new");
-       return g_object_new(GIS_TYPE_VIEWER, NULL);
+       gtk_widget_queue_draw(GTK_WIDGET(self));
 }
 
 }
 
+/***********
+ * Methods *
+ ***********/
 void gis_viewer_set_time(GisViewer *self, const char *time)
 {
        g_assert(GIS_IS_VIEWER(self));
 void gis_viewer_set_time(GisViewer *self, const char *time)
 {
        g_assert(GIS_IS_VIEWER(self));
@@ -219,11 +254,80 @@ gboolean gis_viewer_get_offline(GisViewer *self)
        return self->offline;
 }
 
        return self->offline;
 }
 
+/* To be implemented by subclasses */
+void gis_viewer_center_position(GisViewer *self,
+               gdouble lat, gdouble lon, gdouble elev)
+{
+       GisViewerClass *klass = GIS_VIEWER_GET_CLASS(self);
+       if (!klass->center_position)
+               g_warning("GisViewer: center_position - Unimplemented");
+       klass->center_position(self, lat, lon, elev);
+}
+
+void gis_viewer_project(GisViewer *self,
+               gdouble lat, gdouble lon, gdouble elev,
+               gdouble *px, gdouble *py, gdouble *pz)
+{
+       GisViewerClass *klass = GIS_VIEWER_GET_CLASS(self);
+       if (!klass->project)
+               g_warning("GisViewer: project - Unimplemented");
+       klass->project(self, lat, lon, elev, px, py, pz);
+}
+
+void gis_viewer_clear_height_func(GisViewer *self)
+{
+       GisViewerClass *klass = GIS_VIEWER_GET_CLASS(self);
+       if (!klass->clear_height_func)
+               g_warning("GisViewer: clear_height_func - Unimplemented");
+       klass->clear_height_func(self);
+}
+
+void gis_viewer_set_height_func(GisViewer *self, GisTile *tile,
+               GisHeightFunc height_func, gpointer user_data,
+               gboolean update)
+{
+       GisViewerClass *klass = GIS_VIEWER_GET_CLASS(self);
+       if (!klass->set_height_func)
+               g_warning("GisViewer: set_height_func - Unimplemented");
+       klass->set_height_func(self, tile, height_func, user_data, update);
+}
+
+void gis_viewer_render_tile(GisViewer *self, GisTile *tile)
+{
+       GisViewerClass *klass = GIS_VIEWER_GET_CLASS(self);
+       if (!klass->render_tile)
+               g_warning("GisViewer: render_tile - Unimplemented");
+       klass->render_tile(self, tile);
+}
+
+void gis_viewer_render_tiles(GisViewer *self, GisTile *root)
+{
+       GisViewerClass *klass = GIS_VIEWER_GET_CLASS(self);
+       if (!klass->render_tiles)
+               g_warning("GisViewer: render_tiles - Unimplemented");
+       klass->render_tiles(self, root);
+}
+
+void gis_viewer_begin(GisViewer *self)
+{
+       GisViewerClass *klass = GIS_VIEWER_GET_CLASS(self);
+       if (!klass->begin)
+               g_warning("GisViewer: begin - Unimplemented");
+       klass->begin(self);
+}
+
+void gis_viewer_end(GisViewer *self)
+{
+       GisViewerClass *klass = GIS_VIEWER_GET_CLASS(self);
+       if (!klass->end)
+               g_warning("GisViewer: end - Unimplemented");
+       klass->end(self);
+}
 
 /****************
  * GObject code *
  ****************/
 
 /****************
  * GObject code *
  ****************/
-G_DEFINE_TYPE(GisViewer, gis_viewer, G_TYPE_OBJECT);
+G_DEFINE_ABSTRACT_TYPE(GisViewer, gis_viewer, GTK_TYPE_DRAWING_AREA);
 static void gis_viewer_init(GisViewer *self)
 {
        g_debug("GisViewer: init");
 static void gis_viewer_init(GisViewer *self)
 {
        g_debug("GisViewer: init");
@@ -236,12 +340,12 @@ static void gis_viewer_init(GisViewer *self)
        self->rotation[0] = 0;
        self->rotation[1] = 0;
        self->rotation[2] = 0;
        self->rotation[0] = 0;
        self->rotation[1] = 0;
        self->rotation[2] = 0;
-}
-static void gis_viewer_dispose(GObject *gobject)
-{
-       g_debug("GisViewer: dispose");
-       /* Drop references to other GObjects */
-       G_OBJECT_CLASS(gis_viewer_parent_class)->dispose(gobject);
+
+       g_signal_connect(self, "key-press-event",    G_CALLBACK(on_key_press),    NULL);
+       g_signal_connect(self, "button-press-event", G_CALLBACK(on_button_press), NULL);
+
+       g_signal_connect(self, "location-changed",   G_CALLBACK(on_view_changed), NULL);
+       g_signal_connect(self, "rotation-changed",   G_CALLBACK(on_view_changed), NULL);
 }
 static void gis_viewer_finalize(GObject *gobject)
 {
 }
 static void gis_viewer_finalize(GObject *gobject)
 {
@@ -279,7 +383,6 @@ static void gis_viewer_class_init(GisViewerClass *klass)
 {
        g_debug("GisViewer: class_init");
        GObjectClass *gobject_class = G_OBJECT_CLASS(klass);
 {
        g_debug("GisViewer: class_init");
        GObjectClass *gobject_class = G_OBJECT_CLASS(klass);
-       gobject_class->dispose      = gis_viewer_dispose;
        gobject_class->finalize     = gis_viewer_finalize;
        gobject_class->get_property = gis_viewer_get_property;
        gobject_class->set_property = gis_viewer_set_property;
        gobject_class->finalize     = gis_viewer_finalize;
        gobject_class->get_property = gis_viewer_get_property;
        gobject_class->set_property = gis_viewer_set_property;
index b6eb0f7d04ca117e15fade3c961b9bb5fb93be90..999d3d11e60ea94245e63c6d47aa03fd9160325a 100644 (file)
@@ -18,6 +18,7 @@
 #ifndef __GIS_VIEWER_H__
 #define __GIS_VIEWER_H__
 
 #ifndef __GIS_VIEWER_H__
 #define __GIS_VIEWER_H__
 
+#include <gtk/gtk.h>
 #include <glib-object.h>
 
 /* Type macros */
 #include <glib-object.h>
 
 /* Type macros */
 typedef struct _GisViewer      GisViewer;
 typedef struct _GisViewerClass GisViewerClass;
 
 typedef struct _GisViewer      GisViewer;
 typedef struct _GisViewerClass GisViewerClass;
 
+typedef gdouble (*GisHeightFunc)(gdouble lat, gdouble lon, gpointer user_data);
+
+#include "gis-tile.h"
+#include "gis-plugin.h"
+
 struct _GisViewer {
 struct _GisViewer {
-       GObject parent_instance;
+       GtkDrawingArea parent_instance;
 
        /* instance members */
 
        /* instance members */
-       gchar   *time;
-       gchar   *site;
-       gdouble  location[3];
-       gdouble  rotation[3];
-       gboolean offline;
+       GisPlugins *plugins;
+       gchar      *time;
+       gchar      *site;
+       gdouble     location[3];
+       gdouble     rotation[3];
+       gboolean    offline;
 };
 
 struct _GisViewerClass {
 };
 
 struct _GisViewerClass {
-       GObjectClass parent_class;
+       GtkDrawingAreaClass parent_class;
 
        /* class members */
 
        /* class members */
+       void (*center_position)  (GisViewer *viewer,
+                                 gdouble lat, gdouble lon, gdouble elev);
+
+       void (*project)          (GisViewer *viewer,
+                                 gdouble lat, gdouble lon, gdouble elev,
+                                 gdouble *px, gdouble *py, gdouble *pz);
+
+       void (*clear_height_func)(GisViewer *self);
+       void (*set_height_func)  (GisViewer *self, GisTile *tile,
+                                 GisHeightFunc height_func, gpointer user_data,
+                                 gboolean update);
+
+       void (*render_tile)      (GisViewer *viewer, GisTile *tile);
+       void (*render_tiles)     (GisViewer *viewer, GisTile *root);
+
+       void (*begin)            (GisViewer *viewer);
+       void (*end)              (GisViewer *viewer);
 };
 
 GType gis_viewer_get_type(void);
 };
 
 GType gis_viewer_get_type(void);
@@ -74,4 +98,23 @@ void gis_viewer_refresh(GisViewer *viewer);
 void gis_viewer_set_offline(GisViewer *viewer, gboolean offline);
 gboolean gis_viewer_get_offline(GisViewer *viewer);
 
 void gis_viewer_set_offline(GisViewer *viewer, gboolean offline);
 gboolean gis_viewer_get_offline(GisViewer *viewer);
 
+/* To be implemented by subclasses */
+void gis_viewer_center_position(GisViewer *viewer,
+               gdouble lat, gdouble lon, gdouble elev);
+
+void gis_viewer_project(GisViewer *viewer,
+               gdouble lat, gdouble lon, gdouble elev,
+               gdouble *px, gdouble *py, gdouble *pz);
+
+void gis_viewer_clear_height_func(GisViewer *self);
+void gis_viewer_set_height_func(GisViewer *self, GisTile *tile,
+               GisHeightFunc height_func, gpointer user_data,
+               gboolean update);
+
+void gis_viewer_render_tile (GisViewer *viewer, GisTile *tile);
+void gis_viewer_render_tiles(GisViewer *viewer, GisTile *root);
+
+void gis_viewer_begin(GisViewer *viewer);
+void gis_viewer_end  (GisViewer *viewer);
+
 #endif
 #endif
index 124ed5389e28f22922a37d763a35c92dafce456d..0cc2f0b18a845221ec2a13975e619d7823fcdab5 100644 (file)
@@ -47,20 +47,19 @@ int main(int argc, char **argv)
 
        GisPrefs   *prefs   = gis_prefs_new(NULL, NULL);
        GisPlugins *plugins = gis_plugins_new(NULL);
 
        GisPrefs   *prefs   = gis_prefs_new(NULL, NULL);
        GisPlugins *plugins = gis_plugins_new(NULL);
-       GisViewer  *viewer  = gis_viewer_new();
-       GisOpenGL  *opengl  = gis_opengl_new(viewer, plugins);
+       GisViewer  *viewer  = gis_opengl_new(plugins);
 
        gdk_threads_enter();
        GtkWidget  *window  = gtk_window_new(GTK_WINDOW_TOPLEVEL);
        g_signal_connect(window,  "destroy",         G_CALLBACK(gtk_main_quit), NULL);
        g_signal_connect(window,  "key-press-event", G_CALLBACK(on_key_press),  NULL);
 
        gdk_threads_enter();
        GtkWidget  *window  = gtk_window_new(GTK_WINDOW_TOPLEVEL);
        g_signal_connect(window,  "destroy",         G_CALLBACK(gtk_main_quit), NULL);
        g_signal_connect(window,  "key-press-event", G_CALLBACK(on_key_press),  NULL);
-       gtk_container_add(GTK_CONTAINER(window), GTK_WIDGET(opengl));
+       gtk_container_add(GTK_CONTAINER(window), GTK_WIDGET(viewer));
        gtk_widget_show_all(window);
        gdk_threads_leave();
 
        gtk_widget_show_all(window);
        gdk_threads_leave();
 
-       gis_plugins_load(plugins, "bmng", viewer, opengl, prefs);
-       //gis_plugins_load(plugins, "srtm", viewer, opengl, prefs);
-       gis_plugins_load(plugins, "test", viewer, opengl, prefs);
+       gis_plugins_load(plugins, "bmng", viewer, prefs);
+       gis_plugins_load(plugins, "srtm", viewer, prefs);
+       gis_plugins_load(plugins, "test", viewer, prefs);
 
        gis_viewer_set_site(viewer, "KLSX");
 
 
        gis_viewer_set_site(viewer, "KLSX");
 
@@ -69,7 +68,6 @@ int main(int argc, char **argv)
 
        g_object_unref(prefs);
        g_object_unref(viewer);
 
        g_object_unref(prefs);
        g_object_unref(viewer);
-       g_object_unref(opengl);
        gis_plugins_free(plugins);
        gdk_threads_leave();
        return 0;
        gis_plugins_free(plugins);
        gdk_threads_leave();
        return 0;
index 57b81a64d6f44309ff32d4abcbfac377d68fb940..2d463c3175bbd12f693a93958937e7a40e71e0ed 100644 (file)
@@ -47,7 +47,7 @@ static gboolean _load_tile_cb(gpointer _data)
        gint      height = gdk_pixbuf_get_height(pixbuf);
 
        guint *tex = g_new0(guint, 1);
        gint      height = gdk_pixbuf_get_height(pixbuf);
 
        guint *tex = g_new0(guint, 1);
-       gis_opengl_begin(self->opengl);
+       gis_viewer_begin(self->viewer);
        glGenTextures(1, tex);
        glBindTexture(GL_TEXTURE_2D, *tex);
 
        glGenTextures(1, tex);
        glBindTexture(GL_TEXTURE_2D, *tex);
 
@@ -60,10 +60,10 @@ static gboolean _load_tile_cb(gpointer _data)
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER);
        glFlush();
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER);
        glFlush();
-       gis_opengl_end(self->opengl);
+       gis_viewer_end(self->viewer);
 
        tile->data = tex;
 
        tile->data = tex;
-       gis_opengl_redraw(self->opengl);
+       gtk_widget_queue_draw(GTK_WIDGET(self->viewer));
        g_object_unref(pixbuf);
        return FALSE;
 }
        g_object_unref(pixbuf);
        return FALSE;
 }
@@ -126,12 +126,11 @@ static void _on_location_changed(GisViewer *viewer,
 /***********
  * Methods *
  ***********/
 /***********
  * Methods *
  ***********/
-GisPluginBmng *gis_plugin_bmng_new(GisViewer *viewer, GisOpenGL *opengl)
+GisPluginBmng *gis_plugin_bmng_new(GisViewer *viewer)
 {
        g_debug("GisPluginBmng: new");
        GisPluginBmng *self = g_object_new(GIS_TYPE_PLUGIN_BMNG, NULL);
        self->viewer = viewer;
 {
        g_debug("GisPluginBmng: new");
        GisPluginBmng *self = g_object_new(GIS_TYPE_PLUGIN_BMNG, NULL);
        self->viewer = viewer;
-       self->opengl = opengl;
 
        /* Load initial tiles */
        _load_tile(self->tiles, self);
 
        /* Load initial tiles */
        _load_tile(self->tiles, self);
@@ -147,9 +146,9 @@ GisPluginBmng *gis_plugin_bmng_new(GisViewer *viewer, GisOpenGL *opengl)
 static void gis_plugin_bmng_expose(GisPlugin *_self)
 {
        GisPluginBmng *self = GIS_PLUGIN_BMNG(_self);
 static void gis_plugin_bmng_expose(GisPlugin *_self)
 {
        GisPluginBmng *self = GIS_PLUGIN_BMNG(_self);
-       g_debug("GisPluginBmng: expose opengl=%p tiles=%p,%p",
-                       self->opengl, self->tiles, self->tiles->data);
-       gis_opengl_render_tiles(self->opengl, self->tiles);
+       g_debug("GisPluginBmng: expose viewer=%p tiles=%p,%p",
+                       self->viewer, self->tiles, self->tiles->data);
+       gis_viewer_render_tiles(self->viewer, self->tiles);
 }
 
 
 }
 
 
index 083f6e68263b20d39994d7ae68818a7762fb770f..5c4a5cf807c305b0de355d735e575ab2b5d23a27 100644 (file)
@@ -35,7 +35,6 @@ struct _GisPluginBmng {
 
        /* instance members */
        GisViewer *viewer;
 
        /* instance members */
        GisViewer *viewer;
-       GisOpenGL *opengl;
        GisTile   *tiles;
        GisWms    *wms;
        GMutex    *mutex;
        GisTile   *tiles;
        GisWms    *wms;
        GMutex    *mutex;
@@ -49,6 +48,6 @@ struct _GisPluginBmngClass {
 GType gis_plugin_bmng_get_type();
 
 /* Methods */
 GType gis_plugin_bmng_get_type();
 
 /* Methods */
-GisPluginBmng *gis_plugin_bmng_new(GisViewer *viewer, GisOpenGL *opengl);
+GisPluginBmng *gis_plugin_bmng_new(GisViewer *viewer);
 
 #endif
 
 #endif
index 61c17e7a87c29995f898b3311be9bc33b5c7e217..d0e474041e5079ef4adb5c54176c087646ac9caf 100644 (file)
@@ -162,7 +162,7 @@ static gboolean _load_tile_cb(gpointer _load)
        /* Do necessasairy processing */
        /* TODO: Lock this and move to thread, can remove self from _load then */
        if (LOAD_BIL)
        /* Do necessasairy processing */
        /* TODO: Lock this and move to thread, can remove self from _load then */
        if (LOAD_BIL)
-               gis_opengl_set_height_func(self->opengl, tile, _height_func, self, TRUE);
+               gis_viewer_set_height_func(self->viewer, tile, _height_func, self, TRUE);
 
        /* Cleanup unneeded things */
        if (!LOAD_BIL)
 
        /* Cleanup unneeded things */
        if (!LOAD_BIL)
@@ -237,12 +237,11 @@ static void _on_location_changed(GisViewer *viewer,
 /***********
  * Methods *
  ***********/
 /***********
  * Methods *
  ***********/
-GisPluginSrtm *gis_plugin_srtm_new(GisViewer *viewer, GisOpenGL *opengl)
+GisPluginSrtm *gis_plugin_srtm_new(GisViewer *viewer)
 {
        g_debug("GisPluginSrtm: new");
        GisPluginSrtm *self = g_object_new(GIS_TYPE_PLUGIN_SRTM, NULL);
        self->viewer = viewer;
 {
        g_debug("GisPluginSrtm: new");
        GisPluginSrtm *self = g_object_new(GIS_TYPE_PLUGIN_SRTM, NULL);
        self->viewer = viewer;
-       self->opengl = opengl;
 
        /* Load initial tiles */
        _load_tile(self->tiles, self);
 
        /* Load initial tiles */
        _load_tile(self->tiles, self);
@@ -261,7 +260,7 @@ static void gis_plugin_srtm_expose(GisPlugin *_self)
        g_debug("GisPluginSrtm: expose tiles=%p data=%p",
                self->tiles, self->tiles->data);
        if (LOAD_OPENGL)
        g_debug("GisPluginSrtm: expose tiles=%p data=%p",
                self->tiles, self->tiles->data);
        if (LOAD_OPENGL)
-               gis_opengl_render_tiles(self->opengl, self->tiles);
+               gis_viewer_render_tiles(self->viewer, self->tiles);
 }
 
 
 }
 
 
@@ -297,7 +296,7 @@ static void gis_plugin_srtm_dispose(GObject *gobject)
        /* Drop references */
        g_signal_handler_disconnect(self->viewer, self->sigid);
        if (LOAD_BIL)
        /* Drop references */
        g_signal_handler_disconnect(self->viewer, self->sigid);
        if (LOAD_BIL)
-               gis_opengl_clear_height_func(self->opengl);
+               gis_viewer_clear_height_func(self->viewer);
        G_OBJECT_CLASS(gis_plugin_srtm_parent_class)->dispose(gobject);
 }
 static void gis_plugin_srtm_finalize(GObject *gobject)
        G_OBJECT_CLASS(gis_plugin_srtm_parent_class)->dispose(gobject);
 }
 static void gis_plugin_srtm_finalize(GObject *gobject)
index 37825cef4ab5da185c64599b413bd913a4c18589..4d8ca53961bcf829568ebf571b72727a59da7518 100644 (file)
@@ -35,7 +35,6 @@ struct _GisPluginSrtm {
 
        /* instance members */
        GisViewer *viewer;
 
        /* instance members */
        GisViewer *viewer;
-       GisOpenGL *opengl;
        GisTile   *tiles;
        GisWms    *wms;
        GMutex    *mutex;
        GisTile   *tiles;
        GisWms    *wms;
        GMutex    *mutex;
@@ -49,6 +48,6 @@ struct _GisPluginSrtmClass {
 GType gis_plugin_srtm_get_type();
 
 /* Methods */
 GType gis_plugin_srtm_get_type();
 
 /* Methods */
-GisPluginSrtm *gis_plugin_srtm_new(GisViewer *viewer, GisOpenGL *opengl);
+GisPluginSrtm *gis_plugin_srtm_new(GisViewer *viewer);
 
 #endif
 
 #endif
index 81b1f6073a61bfd407a425b75eebd2c1e5a6caa4..94995b01f7979623922b38ff8fb1bba8c80d51c4 100644 (file)
 /***********
  * Methods *
  ***********/
 /***********
  * Methods *
  ***********/
-GisPluginTest *gis_plugin_test_new(GisViewer *viewer, GisOpenGL *opengl)
+GisPluginTest *gis_plugin_test_new(GisViewer *viewer)
 {
        g_debug("GisPluginTest: new");
        GisPluginTest *self = g_object_new(GIS_TYPE_PLUGIN_TEST, NULL);
        self->viewer = viewer;
 {
        g_debug("GisPluginTest: new");
        GisPluginTest *self = g_object_new(GIS_TYPE_PLUGIN_TEST, NULL);
        self->viewer = viewer;
-       self->opengl = opengl;
        return self;
 }
 
        return self;
 }
 
@@ -40,14 +39,14 @@ static void gis_plugin_test_expose(GisPlugin *_self)
        GisPluginTest *self = GIS_PLUGIN_TEST(_self);
        g_debug("GisPluginTest: expose");
 
        GisPluginTest *self = GIS_PLUGIN_TEST(_self);
        g_debug("GisPluginTest: expose");
 
-       double width  = GTK_WIDGET(self->opengl)->allocation.width;
-       double height = GTK_WIDGET(self->opengl)->allocation.height;
+       double width  = GTK_WIDGET(self->viewer)->allocation.width;
+       double height = GTK_WIDGET(self->viewer)->allocation.height;
 
        // St. Charles
        // lat =  38.841847
        // lon = -90.491982
        gdouble px, py, pz;
 
        // St. Charles
        // lat =  38.841847
        // lon = -90.491982
        gdouble px, py, pz;
-       gis_opengl_project(self->opengl,
+       gis_viewer_project(self->viewer,
                38.841847, -90.491982, 0, &px, &py, &pz);
        py = height-py;
 
                38.841847, -90.491982, 0, &px, &py, &pz);
        py = height-py;
 
@@ -104,35 +103,14 @@ static void gis_plugin_test_plugin_init(GisPluginInterface *iface)
 {
        g_debug("GisPluginTest: plugin_init");
        /* Add methods to the interface */
 {
        g_debug("GisPluginTest: plugin_init");
        /* Add methods to the interface */
-       iface->expose     = gis_plugin_test_expose;
+       iface->expose = gis_plugin_test_expose;
 }
 /* Class/Object init */
 static void gis_plugin_test_init(GisPluginTest *self)
 {
        g_debug("GisPluginTest: init");
 }
 /* Class/Object init */
 static void gis_plugin_test_init(GisPluginTest *self)
 {
        g_debug("GisPluginTest: init");
-       /* Set defaults */
-       self->viewer = NULL;
-       self->opengl = NULL;
-}
-static void gis_plugin_test_dispose(GObject *gobject)
-{
-       g_debug("GisPluginTest: dispose");
-       GisPluginTest *self = GIS_PLUGIN_TEST(gobject);
-       /* Drop references */
-       G_OBJECT_CLASS(gis_plugin_test_parent_class)->dispose(gobject);
-}
-static void gis_plugin_test_finalize(GObject *gobject)
-{
-       g_debug("GisPluginTest: finalize");
-       GisPluginTest *self = GIS_PLUGIN_TEST(gobject);
-       /* Free data */
-       G_OBJECT_CLASS(gis_plugin_test_parent_class)->finalize(gobject);
-
 }
 static void gis_plugin_test_class_init(GisPluginTestClass *klass)
 {
        g_debug("GisPluginTest: class_init");
 }
 static void gis_plugin_test_class_init(GisPluginTestClass *klass)
 {
        g_debug("GisPluginTest: class_init");
-       GObjectClass *gobject_class = (GObjectClass*)klass;
-       gobject_class->dispose  = gis_plugin_test_dispose;
-       gobject_class->finalize = gis_plugin_test_finalize;
 }
 }
index 3a3797b71c896602b78c337536fec6e5f658e7fe..1bfc440ae577a1fbbef090505401e5968ab80a2c 100644 (file)
@@ -35,7 +35,6 @@ struct _GisPluginTest {
 
        /* instance members */
        GisViewer *viewer;
 
        /* instance members */
        GisViewer *viewer;
-       GisOpenGL *opengl;
 };
 
 struct _GisPluginTestClass {
 };
 
 struct _GisPluginTestClass {
@@ -45,6 +44,6 @@ struct _GisPluginTestClass {
 GType gis_plugin_test_get_type();
 
 /* Methods */
 GType gis_plugin_test_get_type();
 
 /* Methods */
-GisPluginTest *gis_plugin_test_new(GisViewer *viewer, GisOpenGL *opengl);
+GisPluginTest *gis_plugin_test_new(GisViewer *viewer);
 
 #endif
 
 #endif