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);
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);
gis_viewer_project(GIS_VIEWER(opengl),
point->lat, point->lon, point->elev,
&px, &py, &pz);
gis_viewer_project(GIS_VIEWER(opengl),
point->lat, point->lon, point->elev,
&px, &py, &pz);
gint win_width = GTK_WIDGET(opengl)->allocation.width;
gint win_height = GTK_WIDGET(opengl)->allocation.height;
py = win_height - py;
gint win_width = GTK_WIDGET(opengl)->allocation.width;
gint win_height = GTK_WIDGET(opengl)->allocation.height;
py = win_height - py;
gdouble eye[3], obj[3];
gis_viewer_get_location(GIS_VIEWER(opengl), &eye[0], &eye[1], &eye[2]);
gdouble eye[3], obj[3];
gis_viewer_get_location(GIS_VIEWER(opengl), &eye[0], &eye[1], &eye[2]);
lle2xyz(eye[0], eye[1], eye[2], &eye[0], &eye[1], &eye[2]);
lle2xyz(object->center.lat, object->center.lon, object->center.elev,
&obj[0], &obj[1], &obj[2]);
gdouble dist = distd(obj, eye);
if (object->lod < dist)
return;
lle2xyz(eye[0], eye[1], eye[2], &eye[0], &eye[1], &eye[2]);
lle2xyz(object->center.lat, object->center.lon, object->center.elev,
&obj[0], &obj[1], &obj[2]);
gdouble dist = distd(obj, eye);
if (object->lod < dist)
return;
- roam_sphere_update_errors(sphere);
+ 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;
- opengl->ue_source = g_idle_add_full(G_PRIORITY_HIGH_IDLE+30,
- _update_errors_cb, opengl->sphere, NULL);
+ if (!opengl->ue_source)
+ opengl->ue_source = g_idle_add_full(G_PRIORITY_HIGH_IDLE+30,
+ _update_errors_cb, opengl, NULL);
g_assert(GIS_IS_OPENGL(_opengl));
GisOpenGL *opengl = GIS_OPENGL(_opengl);
_load_object(opengl, object);
g_assert(GIS_IS_OPENGL(_opengl));
GisOpenGL *opengl = GIS_OPENGL(_opengl);
_load_object(opengl, object);
struct RenderLevel *level = g_tree_lookup(opengl->objects, (gpointer)key);
if (!level) {
level = g_new0(struct RenderLevel, 1);
struct RenderLevel *level = g_tree_lookup(opengl->objects, (gpointer)key);
if (!level) {
level = g_new0(struct RenderLevel, 1);
GList *link = _link;
GisObject *object = link->data;
_unload_object(opengl, object);
GList *link = _link;
GisObject *object = link->data;
_unload_object(opengl, object);
/* 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);
/* 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_object_unref(glconfig);
opengl->objects = g_tree_new_full(_objects_cmp, NULL, NULL, _objects_free);
g_object_unref(glconfig);
opengl->objects = g_tree_new_full(_objects_cmp, NULL, NULL, _objects_free);
GisOpenGL *opengl = GIS_OPENGL(_opengl);
roam_sphere_free(opengl->sphere);
g_tree_destroy(opengl->objects);
GisOpenGL *opengl = GIS_OPENGL(_opengl);
roam_sphere_free(opengl->sphere);
g_tree_destroy(opengl->objects);