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 _draw_object(GisOpenGL *opengl, GisObject *object)
{
//g_debug("GisOpenGL: draw_object");
+ /* Skip hidden objects */
+ if (object->hidden)
+ return;
+
/* Skip out of range objects */
if (object->lod > 0) {
/* LOD test */
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);
static void gis_opengl_center_position(GisViewer *_opengl, gdouble lat, gdouble lon, gdouble elev)
{
- GisOpenGL *opengl = GIS_OPENGL(_opengl);
glRotatef(lon, 0, 1, 0);
glRotatef(-lat, 1, 0, 0);
glTranslatef(0, 0, elev2rad(elev));