]> Pileus Git - grits/blobdiff - src/gis-opengl.c
Cleanup memory on exit
[grits] / src / gis-opengl.c
index dc26348c3dccce5cd8bb9eb02ee2040dff1345c6..bf6086204778f1977cf9177f5a5c980f058f25c8 100644 (file)
@@ -270,7 +270,9 @@ static void on_realize(GisOpenGL *self, gpointer _)
 {
        g_debug("GisOpenGL: on_realize");
        _set_visuals(self);
+       g_mutex_lock(self->sphere_lock);
        roam_sphere_update_errors(self->sphere);
+       g_mutex_unlock(self->sphere_lock);
 }
 static gboolean on_configure(GisOpenGL *self, GdkEventConfigure *event, gpointer _)
 {
@@ -288,7 +290,9 @@ static gboolean on_configure(GisOpenGL *self, GdkEventConfigure *event, gpointer
        gluPerspective(rad2deg(ang)*2, width/height, 1, 10*EARTH_R);
 
 #ifndef ROAM_DEBUG
+       g_mutex_lock(self->sphere_lock);
        roam_sphere_update_errors(self->sphere);
+       g_mutex_unlock(self->sphere_lock);
 #endif
 
        _gis_opengl_end(self);
@@ -402,8 +406,10 @@ static gboolean on_idle(GisOpenGL *self)
        //g_debug("GisOpenGL: on_idle");
        gdk_threads_enter();
        _gis_opengl_begin(self);
+       g_mutex_lock(self->sphere_lock);
        if (roam_sphere_split_merge(self->sphere))
                gtk_widget_queue_draw(GTK_WIDGET(self));
+       g_mutex_unlock(self->sphere_lock);
        _gis_opengl_end(self);
        gdk_threads_leave();
        return TRUE;
@@ -448,7 +454,7 @@ 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,
+       GList *triangles = roam_sphere_get_intersect(self->sphere, FALSE,
                        tile->edge.n, tile->edge.s, tile->edge.e, tile->edge.w);
        if (!triangles)
                g_warning("GisOpenGL: render_tiles - No triangles to draw: edges=%f,%f,%f,%f",
@@ -517,18 +523,23 @@ static void gis_opengl_set_height_func(GisViewer *_self, GisTile *tile,
        if (!tile)
                return;
        /* TODO: get points? */
-       GList *triangles = roam_sphere_get_intersect(self->sphere,
+       g_mutex_lock(self->sphere_lock);
+       GList *triangles = roam_sphere_get_intersect(self->sphere, TRUE,
                        tile->edge.n, tile->edge.s, tile->edge.e, tile->edge.w);
        for (GList *cur = triangles; cur; cur = cur->next) {
                RoamTriangle *tri = cur->data;
                RoamPoint *points[] = {tri->p.l, tri->p.m, tri->p.r, tri->split};
                for (int i = 0; i < G_N_ELEMENTS(points); i++) {
-                       points[i]->height_func = height_func;
-                       points[i]->height_data = user_data;
-                       roam_point_update_height(points[i]);
+                       if (tile->edge.n >= points[i]->lat && points[i]->lat >= tile->edge.s &&
+                           tile->edge.e >= points[i]->lon && points[i]->lon >= tile->edge.w) {
+                               points[i]->height_func = height_func;
+                               points[i]->height_data = user_data;
+                               roam_point_update_height(points[i]);
+                       }
                }
        }
        g_list_free(triangles);
+       g_mutex_unlock(self->sphere_lock);
 }
 
 static void _gis_opengl_clear_height_func_rec(RoamTriangle *root)
@@ -624,6 +635,7 @@ static void gis_opengl_init(GisOpenGL *self)
 
        self->objects = g_tree_new(_objects_cmp);
        self->sphere = roam_sphere_new(self);
+       self->sphere_lock = g_mutex_new();
 
 #ifndef ROAM_DEBUG
        self->sm_source[0] = g_timeout_add_full(G_PRIORITY_HIGH_IDLE+30, 33,  (GSourceFunc)on_idle, self, NULL);
@@ -651,10 +663,6 @@ static void gis_opengl_dispose(GObject *_self)
                g_source_remove(self->sm_source[1]);
                self->sm_source[1] = 0;
        }
-       if (self->sphere) {
-               roam_sphere_free(self->sphere);
-               self->sphere = NULL;
-       }
        /* TODO: Cleanup/free objects tree */
        G_OBJECT_CLASS(gis_opengl_parent_class)->dispose(_self);
 }
@@ -662,13 +670,15 @@ static void gis_opengl_finalize(GObject *_self)
 {
        g_debug("GisViewer: finalize");
        GisOpenGL *self = GIS_OPENGL(_self);
+       roam_sphere_free(self->sphere);
+       g_mutex_free(self->sphere_lock);
        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);
-       gobject_class->dispose     = gis_opengl_dispose;
+       gobject_class->dispose = gis_opengl_dispose;
 
        GisViewerClass *viewer_class = GIS_VIEWER_CLASS(klass);
        viewer_class->center_position   = gis_opengl_center_position;