]> Pileus Git - grits/blobdiff - src/gis-opengl.c
Add horizon test
[grits] / src / gis-opengl.c
index 34e4c8d7349d6f02298e07278612f9cea5e90602..a70c6a8ebb3e251fda82c3a24ab2b711a514d5af 100644 (file)
@@ -233,6 +233,7 @@ static void _draw_marker(GisOpenGL *opengl, GisMarker *marker)
        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;
@@ -275,14 +276,23 @@ static void _draw_object(GisOpenGL *opengl, GisObject *object)
        //g_debug("GisOpenGL: draw_object");
        /* Skip out of range objects */
        if (object->lod > 0) {
+               /* LOD test */
                gdouble eye[3], obj[3];
                gis_viewer_get_location(GIS_VIEWER(opengl), &eye[0], &eye[1], &eye[2]);
+               gdouble elev = 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;
+
+               /* Horizon testing */
+               gdouble c = EARTH_R+elev;
+               gdouble a = EARTH_R;
+               gdouble horizon = sqrt(c*c - a*a);
+               if (dist > horizon)
+                       return;
        }
 
        /* Draw */
@@ -465,9 +475,11 @@ static gboolean on_key_press(GisOpenGL *opengl, GdkEventKey *event, gpointer _)
        return FALSE;
 }
 
-static gboolean _update_errors_cb(gpointer sphere)
+static gboolean _update_errors_cb(gpointer _opengl)
 {
-       roam_sphere_update_errors(sphere);
+       GisOpenGL *opengl = _opengl;
+       roam_sphere_update_errors(opengl->sphere);
+       opengl->ue_source = 0;
        return FALSE;
 }
 static void on_view_changed(GisOpenGL *opengl,
@@ -476,8 +488,9 @@ static void on_view_changed(GisOpenGL *opengl,
        g_debug("GisOpenGL: on_view_changed");
        _set_visuals(opengl);
 #ifndef ROAM_DEBUG
-       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);
        //roam_sphere_update_errors(opengl->sphere);
 #endif
 }