]> Pileus Git - grits/blobdiff - src/gis-opengl.c
Add preliminary support for points/markers
[grits] / src / gis-opengl.c
index 1b219904a0f1b0ea33295d6c5db776be8a1f1b47..0352fce0a75ba8713390b46a165052af0fd9a93a 100644 (file)
@@ -85,6 +85,7 @@ static void set_visuals(GisOpenGL *self)
        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);
+       glColor4f(1, 1, 1, 1);
 
        glDisable(GL_ALPHA_TEST);
 
@@ -104,6 +105,8 @@ static void set_visuals(GisOpenGL *self)
 
        glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
        //glShadeModel(GL_FLAT);
+
+       roam_sphere_update_view(self->sphere);
 }
 
 
@@ -285,6 +288,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)
@@ -409,7 +425,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)
 {
@@ -449,7 +464,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);
@@ -471,9 +487,13 @@ 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);