X-Git-Url: http://pileus.org/git/?a=blobdiff_plain;f=src%2Fgis-opengl.c;h=bf6086204778f1977cf9177f5a5c980f058f25c8;hb=4d15133ec35119c875d132d48d6944661b4621ff;hp=dc26348c3dccce5cd8bb9eb02ee2040dff1345c6;hpb=72daafe41e061d981a69bc26c656f3e7da1ededa;p=grits diff --git a/src/gis-opengl.c b/src/gis-opengl.c index dc26348..bf60862 100644 --- a/src/gis-opengl.c +++ b/src/gis-opengl.c @@ -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;