X-Git-Url: http://pileus.org/git/?p=grits;a=blobdiff_plain;f=src%2Fgis-opengl.c;h=7263ef4e7ad646aa2c109d10969a8f9beefdc00e;hp=0fff2bf4a57dfd2460363cac5f42841d718822bc;hb=72ae2b9bd30e518fa1539424ad0d994aa8d8a6de;hpb=37170f3b0fe9625d75a294eeef1b4442fa63a7f1 diff --git a/src/gis-opengl.c b/src/gis-opengl.c index 0fff2bf..7263ef4 100644 --- a/src/gis-opengl.c +++ b/src/gis-opengl.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2009 Andy Spencer + * Copyright (C) 2009-2010 Andy Spencer * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -88,7 +88,7 @@ static void _set_visuals(GisOpenGL *self) 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.0, 0.0, 0.0, 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); @@ -102,12 +102,6 @@ static void _set_visuals(GisOpenGL *self) glRotatef(lat, 1, 0, 0); glRotatef(-lon, 0, 1, 0); - /* Misc */ - gdouble rg = MAX(0, 1-(elev/20000)); - gdouble blue = MAX(0, 1-(elev/50000)); - glClearColor(MIN(0.65,rg), MIN(0.65,rg), MIN(1,blue), 1.0f); - glColor4f(1, 1, 1, 1); - glDisable(GL_ALPHA_TEST); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); @@ -194,15 +188,10 @@ static void _draw_object(GisOpenGL *self, GisObject *object) glMatrixMode(GL_PROJECTION); glPushMatrix(); glMatrixMode(GL_MODELVIEW); glPushMatrix(); glPushAttrib(GL_ALL_ATTRIB_BITS); - switch (object->type) { - case GIS_TYPE_MARKER: + if (GIS_IS_MARKER(object)) { _draw_marker(self, GIS_MARKER(object)); - break; - case GIS_TYPE_CALLBACK: + } else if (GIS_IS_CALLBACK(object)) { _draw_callback(self, GIS_CALLBACK(object)); - break; - default: - break; } glPopAttrib(); glMatrixMode(GL_PROJECTION); glPopMatrix(); @@ -212,8 +201,7 @@ static void _draw_object(GisOpenGL *self, GisObject *object) static void _load_object(GisOpenGL *self, GisObject *object) { g_debug("GisOpenGL: load_object"); - switch (object->type) { - case GIS_TYPE_MARKER: { + if (GIS_IS_MARKER(object)) { GisMarker *marker = GIS_MARKER(object); cairo_surface_t *surface = cairo_get_target(marker->cairo); gdouble width = cairo_image_surface_get_width(surface); @@ -232,25 +220,16 @@ static void _load_object(GisOpenGL *self, GisObject *object) 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 _unload_object(GisOpenGL *self, GisObject *object) { g_debug("GisOpenGL: unload_object"); - switch (object->type) { - case GIS_TYPE_MARKER: { + if (GIS_IS_MARKER(object)) { GisMarker *marker = GIS_MARKER(object); g_debug("delete_texture: %d", marker->tex); glDeleteTextures(1, &marker->tex); - break; - } - default: - break; } } @@ -315,7 +294,8 @@ static gboolean _draw_level(gpointer key, gpointer value, gpointer user_data) /* Freeze depth buffer and draw transparent objects sorted */ /* TODO: sorting */ - glDepthMask(FALSE); + //glDepthMask(FALSE); + glAlphaFunc(GL_GREATER, 0.1); for (cur = level->sorted.next; cur; cur = cur->next, nsorted++) _draw_object(self, GIS_OBJECT(cur->data)); @@ -419,11 +399,11 @@ static gboolean on_idle(GisOpenGL *self) /********************* * GisViewer methods * *********************/ -GisViewer *gis_opengl_new(GisPlugins *plugins) +GisViewer *gis_opengl_new(GisPlugins *plugins, GisPrefs *prefs) { g_debug("GisOpenGL: new"); GisViewer *self = g_object_new(GIS_TYPE_OPENGL, NULL); - self->plugins = plugins; + gis_viewer_setup(self, plugins, prefs); return self; }