X-Git-Url: http://pileus.org/git/?p=grits;a=blobdiff_plain;f=src%2Fgis-opengl.c;h=9501781f586336dea6faa1e262edef008a5eb6ad;hp=9f1940bdfdb5d33d177f5e81114546a81a3345fe;hb=5e97f4c0721a5481afbb2d005538e896ac8baf5a;hpb=40c0e86e4e3b25f840242f02fac6def52b9e9d4c diff --git a/src/gis-opengl.c b/src/gis-opengl.c index 9f1940b..9501781 100644 --- a/src/gis-opengl.c +++ b/src/gis-opengl.c @@ -178,7 +178,9 @@ static void _draw_tile(GisOpenGL *opengl, GisTile *tile, GList *triangles) if (lat[2] == 90 || lat[2] == -90) xy[2][0] = 0.5; glEnable(GL_TEXTURE_2D); + glEnable(GL_POLYGON_OFFSET_FILL); glBindTexture(GL_TEXTURE_2D, *(guint*)tile->data); + glPolygonOffset(0, -tile->zindex); glBegin(GL_TRIANGLES); glNormal3dv(tri->p.r->norm); glTexCoord2dv(xy[0]); glVertex3dv((double*)tri->p.r); glNormal3dv(tri->p.m->norm); glTexCoord2dv(xy[1]); glVertex3dv((double*)tri->p.m); @@ -609,6 +611,7 @@ static gpointer gis_opengl_add(GisViewer *_opengl, GisObject *object, g_assert(GIS_IS_OPENGL(_opengl)); GisOpenGL *opengl = GIS_OPENGL(_opengl); _load_object(opengl, object); + g_mutex_lock(opengl->objects_lock); struct RenderLevel *level = g_tree_lookup(opengl->objects, (gpointer)key); if (!level) { level = g_new0(struct RenderLevel, 1); @@ -621,6 +624,7 @@ static gpointer gis_opengl_add(GisViewer *_opengl, GisObject *object, next->prev = list; next->next = list->next; list->next = next; + g_mutex_unlock(opengl->objects_lock); return next; } @@ -631,12 +635,14 @@ static GisObject *gis_opengl_remove(GisViewer *_opengl, gpointer _link) GList *link = _link; GisObject *object = link->data; _unload_object(opengl, object); + g_mutex_lock(opengl->objects_lock); /* Just unlink and free it, link->prev is assured */ link->prev->next = link->next; if (link->next) link->next->prev = link->prev; g_free(link); g_object_unref(object); + g_mutex_unlock(opengl->objects_lock); return object; } @@ -675,6 +681,7 @@ static void gis_opengl_init(GisOpenGL *opengl) g_object_unref(glconfig); opengl->objects = g_tree_new_full(_objects_cmp, NULL, NULL, _objects_free); + opengl->objects_lock = g_mutex_new(); opengl->sphere = roam_sphere_new(opengl); opengl->sphere_lock = g_mutex_new(); @@ -717,6 +724,7 @@ static void gis_opengl_finalize(GObject *_opengl) GisOpenGL *opengl = GIS_OPENGL(_opengl); roam_sphere_free(opengl->sphere); g_tree_destroy(opengl->objects); + g_mutex_free(opengl->objects_lock); g_mutex_free(opengl->sphere_lock); G_OBJECT_CLASS(gis_opengl_parent_class)->finalize(_opengl); }