]> Pileus Git - grits/blobdiff - src/gis-opengl.c
Use GisBounds for height_func instead of GisTile
[grits] / src / gis-opengl.c
index fc0c55e05cf6062fcd6a14cc8e137f66fa546cc0..8b711426e123c7e76c60bc0b8d4c01af0de3662d 100644 (file)
@@ -41,6 +41,7 @@
 #include "roam.h"
 
 #include "objects/gis-object.h"
+#include "objects/gis-tile.h"
 #include "objects/gis-marker.h"
 #include "objects/gis-callback.h"
 
@@ -133,6 +134,17 @@ static void _draw_tile(GisOpenGL *opengl, GisTile *tile, GList *triangles)
                        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;
 
@@ -145,14 +157,6 @@ static void _draw_tile(GisOpenGL *opengl, GisTile *tile, GList *triangles)
                        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},
@@ -177,6 +181,12 @@ static void _draw_tile(GisOpenGL *opengl, GisTile *tile, GList *triangles)
                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);
@@ -279,6 +289,10 @@ static void _draw_callback(GisOpenGL *opengl, GisCallback *callback)
 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 */
@@ -535,7 +549,6 @@ GisViewer *gis_opengl_new(GisPlugins *plugins, GisPrefs *prefs)
 
 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));
@@ -555,22 +568,20 @@ static void gis_opengl_project(GisViewer *_opengl,
                px, py, pz);
 }
 
-static void gis_opengl_set_height_func(GisViewer *_opengl, GisTile *tile,
+static void gis_opengl_set_height_func(GisViewer *_opengl, GisBounds *bounds,
                RoamHeightFunc height_func, gpointer user_data, gboolean update)
 {
        GisOpenGL *opengl = GIS_OPENGL(_opengl);
-       if (!tile)
-               return;
        /* TODO: get points? */
        g_mutex_lock(opengl->sphere_lock);
        GList *triangles = roam_sphere_get_intersect(opengl->sphere, TRUE,
-                       tile->edge.n, tile->edge.s, tile->edge.e, tile->edge.w);
+                       bounds->n, bounds->s, bounds->e, bounds->w);
        for (GList *cur = triangles; cur; cur = cur->next) {
                RoamTriangle *tri = cur->data;
                RoamPoint *points[] = {tri->p.l, tri->p.m, tri->p.r, tri->split};
                for (int i = 0; i < G_N_ELEMENTS(points); i++) {
-                       if (tile->edge.n >= points[i]->lat && points[i]->lat >= tile->edge.s &&
-                           tile->edge.e >= points[i]->lon && points[i]->lon >= tile->edge.w) {
+                       if (bounds->n >= points[i]->lat && points[i]->lat >= bounds->s &&
+                           bounds->e >= points[i]->lon && points[i]->lon >= bounds->w) {
                                points[i]->height_func = height_func;
                                points[i]->height_data = user_data;
                                roam_point_update_height(points[i]);