+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+
+ /* Camera 1 */
+ double lat, lon, elev, rx, ry, rz;
+ gis_viewer_get_location(GIS_VIEWER(self), &lat, &lon, &elev);
+ gis_viewer_get_rotation(GIS_VIEWER(self), &rx, &ry, &rz);
+ glRotatef(rx, 1, 0, 0);
+ glRotatef(rz, 0, 0, 1);
+
+ /* Lighting */
+#ifdef ROAM_DEBUG
+ float light_ambient[] = {0.7f, 0.7f, 0.7f, 1.0f};
+ float light_diffuse[] = {2.0f, 2.0f, 2.0f, 1.0f};
+#else
+ float light_ambient[] = {0.2f, 0.2f, 0.2f, 1.0f};
+ float light_diffuse[] = {5.0f, 5.0f, 5.0f, 1.0f};
+#endif
+ float light_position[] = {-13*EARTH_R, 1*EARTH_R, 3*EARTH_R, 1.0f};
+ glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient);
+ glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse);
+ glLightfv(GL_LIGHT0, GL_POSITION, light_position);
+ glEnable(GL_LIGHT0);
+ glEnable(GL_LIGHTING);
+
+ float material_ambient[] = {0.2, 0.2, 0.2, 1.0};
+ float material_diffuse[] = {0.8, 0.8, 0.8, 1.0};
+ float material_specular[] = {0.1, 0.1, 0.1, 1.0};
+ float material_emission[] = {0.0, 0.0, 0.0, 1.0};
+ glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, material_ambient);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, material_diffuse);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, material_specular);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_EMISSION, material_emission);
+ glDisable(GL_TEXTURE_2D);
+ glDisable(GL_COLOR_MATERIAL);
+
+ /* Camera 2 */
+ glTranslatef(0, 0, -elev2rad(elev));
+ glRotatef(lat, 1, 0, 0);
+ glRotatef(-lon, 0, 1, 0);
+
+ glDisable(GL_ALPHA_TEST);
+
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ glEnable(GL_BLEND);
+
+#ifndef ROAM_DEBUG
+ glCullFace(GL_BACK);
+ glEnable(GL_CULL_FACE);
+#endif
+
+ glClearDepth(1.0);
+ glDepthFunc(GL_LEQUAL);
+ glEnable(GL_DEPTH_TEST);
+
+ glEnable(GL_LINE_SMOOTH);
+
+ glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
+ //glShadeModel(GL_FLAT);
+
+ roam_sphere_update_view(self->sphere);
+}
+
+
+/********************
+ * Object handleing *
+ ********************/
+static void _draw_marker(GisOpenGL *self, GisMarker *marker)
+{
+ GisPoint *point = gis_object_center(GIS_OBJECT(marker));
+ gdouble px, py, pz;
+ gis_viewer_project(GIS_VIEWER(self),
+ point->lat, point->lon, point->elev,
+ &px, &py, &pz);
+ if (pz > 1)
+ return;
+
+ //g_debug("GisOpenGL: draw_marker - %s pz=%f ", marker->label, pz);
+
+ cairo_surface_t *surface = cairo_get_target(marker->cairo);
+ gdouble width = cairo_image_surface_get_width(surface);
+ gdouble height = cairo_image_surface_get_height(surface);
+
+ glMatrixMode(GL_PROJECTION); glLoadIdentity();
+ glMatrixMode(GL_MODELVIEW); glLoadIdentity();
+ glOrtho(0, GTK_WIDGET(self)->allocation.width,
+ 0, GTK_WIDGET(self)->allocation.height, -1, 1);
+ glTranslated(px - marker->xoff,
+ py - marker->yoff, 0);
+
+ glDisable(GL_LIGHTING);
+ glDisable(GL_COLOR_MATERIAL);
+ glDisable(GL_DEPTH_TEST);
+ glEnable(GL_TEXTURE_2D);
+ glBindTexture(GL_TEXTURE_2D, marker->tex);
+ glBegin(GL_QUADS);
+ glTexCoord2f(1, 1); glVertex3f(width, 0 , 0);
+ glTexCoord2f(1, 0); glVertex3f(width, height, 0);
+ glTexCoord2f(0, 0); glVertex3f(0 , height, 0);
+ glTexCoord2f(0, 1); glVertex3f(0 , 0 , 0);
+ glEnd();
+}
+
+static void _draw_callback(GisOpenGL *self, GisCallback *callback)
+{
+ callback->callback(callback, callback->user_data);
+}
+
+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;