-static void _draw_objects(GisOpenGL *self)
-{
- g_debug("GisOpenGL: draw_objects");
- /* Draw objects */
- for (GList *cur = self->objects; cur; cur = cur->next) {
- glMatrixMode(GL_PROJECTION); glPushMatrix();
- glMatrixMode(GL_MODELVIEW); glPushMatrix();
- GisObject *object = cur->data;
- switch (object->type) {
- case GIS_TYPE_MARKER:
- _draw_marker(self, GIS_MARKER(object));
- break;
- default:
- break;
- }
- glMatrixMode(GL_PROJECTION); glPopMatrix();
- glMatrixMode(GL_MODELVIEW); glPopMatrix();
+static void _draw_object(GisOpenGL *self, GisObject *object)
+{
+ //g_debug("GisOpenGL: draw_object");
+ /* Skip out of range objects */
+ if (object->lod > 0) {
+ gdouble eye[3], obj[3];
+ gis_viewer_get_location(GIS_VIEWER(self), &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;
+ }
+
+ /* Draw */
+ glMatrixMode(GL_PROJECTION); glPushMatrix();
+ glMatrixMode(GL_MODELVIEW); glPushMatrix();
+ glPushAttrib(GL_ALL_ATTRIB_BITS);
+ switch (object->type) {
+ case GIS_TYPE_MARKER:
+ _draw_marker(self, GIS_MARKER(object));
+ break;
+ case GIS_TYPE_CALLBACK:
+ _draw_callback(self, GIS_CALLBACK(object));
+ break;
+ default:
+ break;