]> Pileus Git - grits/blobdiff - src/gis-opengl.c
Fix naming for the GisView/GisWorld -> GisViewer merge
[grits] / src / gis-opengl.c
index 60ed8218304af8c790a2160d55c95272155bff8b..f186f5faec9719e52290daaa397bc7d9a7fdaefc 100644 (file)
@@ -28,6 +28,7 @@
 #include <GL/glu.h>
 
 #include "gis-opengl.h"
+#include "gis-util.h"
 #include "roam.h"
 
 #define FOV_DIST   2000.0
@@ -45,8 +46,8 @@ static void set_visuals(GisOpenGL *self)
 
        /* 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);
+       gis_viewer_get_location(self->viewer, &lat, &lon, &elev);
+       gis_viewer_get_rotation(self->viewer, &rx, &ry, &rz);
        glRotatef(rx, 1, 0, 0);
        glRotatef(rz, 0, 0, 1);
 
@@ -105,6 +106,8 @@ static void set_visuals(GisOpenGL *self)
 
        glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
        //glShadeModel(GL_FLAT);
+
+       roam_sphere_update_view(self->sphere);
 }
 
 
@@ -193,20 +196,20 @@ static gboolean on_key_press(GisOpenGL *self, GdkEventKey *event, gpointer _)
                        event->keyval, event->state, GDK_plus);
 
        double lat, lon, elev, pan;
-       gis_view_get_location(self->view, &lat, &lon, &elev);
+       gis_viewer_get_location(self->viewer, &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_view_pan(self->view,  0,  -pan, 0);
-       else if (kv == GDK_Down  || kv == GDK_j) gis_view_pan(self->view, -pan, 0,   0);
-       else if (kv == GDK_Up    || kv == GDK_k) gis_view_pan(self->view,  pan, 0,   0);
-       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, -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);
+       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 */
        else if (kv == GDK_w) {self->wireframe = !self->wireframe; gtk_widget_queue_draw(GTK_WIDGET(self));}
@@ -229,7 +232,7 @@ static gboolean _update_errors_cb(gpointer sphere)
        roam_sphere_update_errors(sphere);
        return FALSE;
 }
-static void on_view_changed(GisView *view,
+static void on_view_changed(GisViewer *viewer,
                gdouble _1, gdouble _2, gdouble _3, GisOpenGL *self)
 {
        g_debug("GisOpenGL: on_view_changed");
@@ -261,18 +264,16 @@ static gboolean on_idle(GisOpenGL *self)
 /***********
  * Methods *
  ***********/
-GisOpenGL *gis_opengl_new(GisWorld *world, GisView *view, GisPlugins *plugins)
+GisOpenGL *gis_opengl_new(GisViewer *viewer, GisPlugins *plugins)
 {
        g_debug("GisOpenGL: new");
        GisOpenGL *self = g_object_new(GIS_TYPE_OPENGL, NULL);
-       self->world   = world;
-       self->view    = view;
+       self->viewer  = viewer;
        self->plugins = plugins;
-       g_object_ref(world);
-       g_object_ref(view);
+       g_object_ref(viewer);
 
-       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);
+       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);
 
@@ -286,6 +287,19 @@ void gis_opengl_center_position(GisOpenGL *self, gdouble lat, gdouble lon, gdoub
        glTranslatef(0, 0, elev2rad(elev));
 }
 
+void gis_opengl_project(GisOpenGL *self,
+               gdouble lat, gdouble lon, gdouble elev,
+               gdouble *px, gdouble *py, gdouble *pz)
+{
+       gdouble x, y, z;
+       lle2xyz(lat, lon, elev, &x, &y, &z);
+       gluProject(x, y, z,
+               self->sphere->view->model,
+               self->sphere->view->proj,
+               self->sphere->view->view,
+               px, py, pz);
+}
+
 void gis_opengl_render_tile(GisOpenGL *self, GisTile *tile)
 {
        if (!tile || !tile->data)
@@ -410,7 +424,6 @@ 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);
-       gdk_threads_leave();
 }
 void gis_opengl_flush(GisOpenGL *self)
 {
@@ -450,7 +463,8 @@ static void gis_opengl_init(GisOpenGL *self)
        g_object_set(self, "can-focus", TRUE, NULL);
 
 #ifndef ROAM_DEBUG
-       self->sm_source = g_timeout_add_full(G_PRIORITY_HIGH_IDLE+30, 33,  (GSourceFunc)on_idle, self, NULL);
+       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);
 #endif
 
        g_signal_connect(self, "realize",            G_CALLBACK(on_realize),      NULL);
@@ -472,21 +486,21 @@ static void gis_opengl_dispose(GObject *_self)
 {
        g_debug("GisOpenGL: dispose");
        GisOpenGL *self = GIS_OPENGL(_self);
-       if (self->sm_source) {
-               g_source_remove(self->sm_source);
-               self->sm_source = 0;
+       if (self->sm_source[0]) {
+               g_source_remove(self->sm_source[0]);
+               self->sm_source[0] = 0;
+       }
+       if (self->sm_source[1]) {
+               g_source_remove(self->sm_source[1]);
+               self->sm_source[1] = 0;
        }
        if (self->sphere) {
                roam_sphere_free(self->sphere);
                self->sphere = NULL;
        }
-       if (self->world) {
-               g_object_unref(self->world);
-               self->world = NULL;
-       }
-       if (self->view) {
-               g_object_unref(self->view);
-               self->view = NULL;
+       if (self->viewer) {
+               g_object_unref(self->viewer);
+               self->viewer = NULL;
        }
        G_OBJECT_CLASS(gis_opengl_parent_class)->dispose(_self);
 }