tile->edge.n, tile->edge.s, tile->edge.e, tile->edge.w);
//g_message("drawing %4d triangles for tile edges=%7.2f,%7.2f,%7.2f,%7.2f",
// g_list_length(triangles), tile->edge.n, tile->edge.s, tile->edge.e, tile->edge.w);
+ gdouble n = tile->edge.n;
+ gdouble s = tile->edge.s;
+ gdouble e = tile->edge.e;
+ gdouble w = tile->edge.w;
+
+ gdouble londist = e - w;
+ gdouble latdist = n - s;
+
+ gdouble xscale = tile->coords.e - tile->coords.w;
+ gdouble yscale = tile->coords.s - tile->coords.n;
+
for (GList *cur = triangles; cur; cur = cur->next) {
RoamTriangle *tri = cur->data;
if (lon[2] > 90) lon[2] -= 360;
}
- gdouble n = tile->edge.n;
- gdouble s = tile->edge.s;
- gdouble e = tile->edge.e;
- gdouble w = tile->edge.w;
-
- gdouble londist = e - w;
- gdouble latdist = n - s;
-
gdouble xy[3][2] = {
{(lon[0]-w)/londist, 1-(lat[0]-s)/latdist},
{(lon[1]-w)/londist, 1-(lat[1]-s)/latdist},
if (lat[1] == 90 || lat[1] == -90) xy[1][0] = 0.5;
if (lat[2] == 90 || lat[2] == -90) xy[2][0] = 0.5;
+ /* Scale to tile coords */
+ for (int i = 0; i < 3; i++) {
+ xy[i][0] = tile->coords.w + xy[i][0]*xscale;
+ xy[i][1] = tile->coords.n + xy[i][1]*yscale;
+ }
+
glEnable(GL_TEXTURE_2D);
glEnable(GL_POLYGON_OFFSET_FILL);
glBindTexture(GL_TEXTURE_2D, *(guint*)tile->data);
glNormal3dv(tri->p.l->norm); glTexCoord2dv(xy[2]); glVertex3dv((double*)tri->p.l);
glEnd();
}
- g_list_free(triangles);
}
static void _draw_tiles(GisOpenGL *opengl, GisTile *tile)
const gdouble s = tile->edge.n-(lat_step*(row+1));
const gdouble e = tile->edge.w+(lon_step*(col+1));
const gdouble w = tile->edge.w+(lon_step*(col+0));
- GList *these = roam_sphere_get_intersect(opengl->sphere, FALSE, n, s, e, w);
+ GList *these = roam_sphere_get_intersect(opengl->sphere,
+ FALSE, n, s, e, w);
triangles = g_list_concat(triangles, these);
}
}
}
if (triangles)
_draw_tile(opengl, tile, triangles);
+ g_list_free(triangles);
}
static void _draw_marker(GisOpenGL *opengl, GisMarker *marker)
static void _load_object(GisOpenGL *opengl, GisObject *object)
{
- g_debug("GisOpenGL: load_object");
+ //g_debug("GisOpenGL: load_object");
if (GIS_IS_MARKER(object)) {
GisMarker *marker = GIS_MARKER(object);
cairo_surface_t *surface = cairo_get_target(marker->cairo);
cairo_image_surface_get_data(surface));
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
- g_debug("load_texture: %d", marker->tex);
+ //g_debug("load_texture: %d", marker->tex);
}
}
static void _unload_object(GisOpenGL *opengl, GisObject *object)
{
- g_debug("GisOpenGL: unload_object");
+ //g_debug("GisOpenGL: unload_object");
if (GIS_IS_MARKER(object)) {
GisMarker *marker = GIS_MARKER(object);
glDeleteTextures(1, &marker->tex);
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 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);
- _load_object(opengl, object);
g_mutex_lock(opengl->objects_lock);
+ _load_object(opengl, object);
struct RenderLevel *level = g_tree_lookup(opengl->objects, (gpointer)key);
if (!level) {
level = g_new0(struct RenderLevel, 1);
}
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;
+ 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 next;
+ 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);
- g_mutex_lock(opengl->objects_lock);
/* Just unlink and free it, link->prev is assured */
link->prev->next = link->next;
if (link->next)