glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
//glShadeModel(GL_FLAT);
+ g_mutex_lock(opengl->sphere_lock);
roam_sphere_update_view(opengl->sphere);
+ g_mutex_unlock(opengl->sphere_lock);
}
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);
} else if (GIS_IS_TILE(object)) {
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LESS);
+ g_mutex_lock(opengl->sphere_lock);
_draw_tiles(opengl, GIS_TILE(object));
+ g_mutex_unlock(opengl->sphere_lock);
}
glPopAttrib();
glMatrixMode(GL_PROJECTION); glPopMatrix();
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
double ang = atan(height/FOV_DIST);
- gluPerspective(rad2deg(ang)*2, width/height, 1, 10*EARTH_R);
+ gluPerspective(rad2deg(ang)*2, width/height, 1000, 10*EARTH_R);
#ifndef ROAM_DEBUG
g_mutex_lock(opengl->sphere_lock);
roam_sphere_draw(opengl->sphere);
//roam_sphere_draw_normals(opengl->sphere);
#else
+ g_mutex_lock(opengl->objects_lock);
g_tree_foreach(opengl->objects, _draw_level, opengl);
+ g_mutex_unlock(opengl->objects_lock);
if (opengl->wireframe) {
glClear(GL_DEPTH_BUFFER_BIT);
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
event->keyval, event->state, GDK_plus);
guint kv = event->keyval;
- gdk_threads_leave();
/* Testing */
if (kv == GDK_w) {
opengl->wireframe = !opengl->wireframe;
else if (kv == GDK_p) roam_sphere_merge_one(opengl->sphere);
else if (kv == GDK_r) roam_sphere_split_merge(opengl->sphere);
else if (kv == GDK_u) roam_sphere_update_errors(opengl->sphere);
- gdk_threads_enter();
gtk_widget_queue_draw(GTK_WIDGET(opengl));
-#else
- gdk_threads_enter();
#endif
return FALSE;
}
static gboolean _update_errors_cb(gpointer _opengl)
{
GisOpenGL *opengl = _opengl;
+ g_mutex_lock(opengl->sphere_lock);
roam_sphere_update_errors(opengl->sphere);
+ g_mutex_unlock(opengl->sphere_lock);
opengl->ue_source = 0;
return FALSE;
}
static gboolean on_idle(GisOpenGL *opengl)
{
//g_debug("GisOpenGL: on_idle");
- gdk_threads_enter();
g_mutex_lock(opengl->sphere_lock);
if (roam_sphere_split_merge(opengl->sphere))
gtk_widget_queue_draw(GTK_WIDGET(opengl));
g_mutex_unlock(opengl->sphere_lock);
- gdk_threads_leave();
return TRUE;
}
{
g_assert(GIS_IS_OPENGL(_opengl));
GisOpenGL *opengl = GIS_OPENGL(_opengl);
+ g_mutex_lock(opengl->objects_lock);
_load_object(opengl, object);
struct RenderLevel *level = g_tree_lookup(opengl->objects, (gpointer)key);
if (!level) {
}
GList *list = sort ? &level->sorted : &level->unsorted;
/* Put the link in the list */
- GList *next = g_new0(GList, 1);
- next->data = object;
- next->prev = list;
- next->next = list->next;
- list->next = next;
- return next;
+ GList *link = g_new0(GList, 1);
+ link->data = object;
+ link->prev = list;
+ link->next = list->next;
+ if (list->next)
+ list->next->prev = link;
+ list->next = link;
+ g_mutex_unlock(opengl->objects_lock);
+ return link;
}
static GisObject *gis_opengl_remove(GisViewer *_opengl, gpointer _link)
{
g_assert(GIS_IS_OPENGL(_opengl));
GisOpenGL *opengl = GIS_OPENGL(_opengl);
+ g_mutex_lock(opengl->objects_lock);
GList *link = _link;
GisObject *object = link->data;
_unload_object(opengl, object);
link->next->prev = link->prev;
g_free(link);
g_object_unref(object);
+ g_mutex_unlock(opengl->objects_lock);
return object;
}
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();
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);
}