-static void _gis_opengl_begin(GisOpenGL *self)
-{
- g_assert(GIS_IS_OPENGL(self));
-
- GdkGLContext *glcontext = gtk_widget_get_gl_context(GTK_WIDGET(self));
- GdkGLDrawable *gldrawable = gtk_widget_get_gl_drawable(GTK_WIDGET(self));
-
- if (!gdk_gl_drawable_gl_begin(gldrawable, glcontext))
- g_assert_not_reached();
-}
-
-static void _gis_opengl_end(GisOpenGL *self)
-{
- g_assert(GIS_IS_OPENGL(self));
- GdkGLDrawable *gldrawable = gtk_widget_get_gl_drawable(GTK_WIDGET(self));
- gdk_gl_drawable_gl_end(gldrawable);
-}
-
-
-/********************
- * 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);
-
- g_debug("GisOpenGL: draw_marker - texture=%d", marker->tex);
-
- 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);
- g_debug("bind_texture: %d", 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_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 _load_object(GisOpenGL *self, GisObject *object)
-{
- g_debug("GisOpenGL: load_object");
- switch (object->type) {
- case GIS_TYPE_MARKER: {
- GisMarker *marker = GIS_MARKER(object);
- 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);
-
- _gis_opengl_begin(self);
- glEnable(GL_TEXTURE_2D);
- glGenTextures(1, &marker->tex);
- glBindTexture(GL_TEXTURE_2D, marker->tex);
-
- glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
- glPixelStorei(GL_PACK_ALIGNMENT, 1);
- glTexImage2D(GL_TEXTURE_2D, 0, 4, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE,
- 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);
- _gis_opengl_end(self);
- break;
- }
- default:
- break;
- }
-}
-
-static void _free_object(GisOpenGL *self, GisObject *object)
-{
- g_debug("GisOpenGL: free_object");
- switch (object->type) {
- case GIS_TYPE_MARKER: {
- GisMarker *marker = GIS_MARKER(object);
- g_debug("delete_texture: %d", marker->tex);
- glDeleteTextures(1, &marker->tex);
- break;
- }
- default:
- break;
- }
-}
-
-/*************
- * ROAM Code *
- *************/
-static void _set_visuals(GisOpenGL *self)