From b92087ed5280da4c84ea927a73a8d7bb461e7d47 Mon Sep 17 00:00:00 2001 From: Andy Spencer Date: Tue, 26 Jan 2010 01:58:28 +0000 Subject: [PATCH] Stub out an environment plugin. TODO: do a halfway decent sky and stars rendering. --- src/gis-opengl.c | 8 +-- src/gis_test.c | 1 + src/plugins/Makefile.am | 3 +- src/plugins/env.c | 123 ++++++++++++++++++++++++++++++++++++++++ src/plugins/env.h | 49 ++++++++++++++++ 5 files changed, 176 insertions(+), 8 deletions(-) create mode 100644 src/plugins/env.c create mode 100644 src/plugins/env.h diff --git a/src/gis-opengl.c b/src/gis-opengl.c index d5f9cf0..e18a309 100644 --- a/src/gis-opengl.c +++ b/src/gis-opengl.c @@ -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); diff --git a/src/gis_test.c b/src/gis_test.c index 4c0785a..83252e0 100644 --- a/src/gis_test.c +++ b/src/gis_test.c @@ -61,6 +61,7 @@ int main(int argc, char **argv) gis_plugins_load(plugins, "bmng", viewer, prefs); gis_plugins_load(plugins, "srtm", viewer, prefs); + gis_plugins_load(plugins, "env", viewer, prefs); gis_plugins_load(plugins, "test", viewer, prefs); gdk_threads_enter(); diff --git a/src/plugins/Makefile.am b/src/plugins/Makefile.am index 905bfd7..d0fd720 100644 --- a/src/plugins/Makefile.am +++ b/src/plugins/Makefile.am @@ -7,9 +7,10 @@ LIBS = $(top_srcdir)/src/libgis.la pluginsdir = "$(libdir)/gis" -plugins_LTLIBRARIES = bmng.la srtm.la test.la +plugins_LTLIBRARIES = bmng.la srtm.la env.la test.la bmng_la_SOURCES = bmng.c bmng.h srtm_la_SOURCES = srtm.c srtm.h +env_la_SOURCES = env.c env.h test_la_SOURCES = test.c test.h noinst_LTLIBRARIES = teapot.la diff --git a/src/plugins/env.c b/src/plugins/env.c new file mode 100644 index 0000000..7deea1f --- /dev/null +++ b/src/plugins/env.c @@ -0,0 +1,123 @@ +/* + * Copyright (C) 2009 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 + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include +#include +#include + +#include + +#include "env.h" + +/*********** + * Helpers * + ***********/ +static gpointer expose(GisCallback *callback, gpointer _self) +{ + GisPluginEnv *self = GIS_PLUGIN_ENV(_self); + g_debug("GisPluginEnv: expose"); + + gdouble lat, lon, elev; + gis_viewer_get_location(self->viewer, &lat, &lon, &elev); + + /* 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); + glClear(GL_COLOR_BUFFER_BIT); + + /* Attempt to render an atmosphere */ + /* + glEnable(GL_COLOR_MATERIAL); + glDisable(GL_CULL_FACE); + glDisable(GL_LIGHTING); + + glBlendFunc(GL_ONE, GL_ONE); + + glMatrixMode(GL_MODELVIEW); + + elev = -EARTH_R; + for (elev = -EARTH_R; elev < 0; elev += EARTH_R/10) { + glPushMatrix(); + glColor4f(0.3, 0.3, 1.0, 0.2); + gis_viewer_center_position(self->viewer, lat, lon, elev); + + glBegin(GL_TRIANGLE_FAN); + glVertex3f(0, 0, 0); + for (gdouble i = 0; i <= 2*G_PI; i += G_PI/10) { + gint rad = 1*EARTH_R + 300000; + glVertex3f(rad*sin(i), rad*cos(i), 0); + g_message("%f %f %f", 3*EARTH_R*sin(i), 3*EARTH_R*cos(i), 0.); + } + glEnd(); + glPopMatrix(); + } + */ + + return NULL; +} + + +/*********** + * Methods * + ***********/ +GisPluginEnv *gis_plugin_env_new(GisViewer *viewer, GisPrefs *prefs) +{ + g_debug("GisPluginEnv: new"); + GisPluginEnv *self = g_object_new(GIS_TYPE_PLUGIN_ENV, NULL); + self->viewer = viewer; + + /* Add renderers */ + GisCallback *callback = gis_callback_new(expose, self); + gis_viewer_add(viewer, GIS_OBJECT(callback), GIS_LEVEL_BACKGROUND, 0); + + return self; +} + + +/**************** + * GObject code * + ****************/ +/* Plugin init */ +static void gis_plugin_env_plugin_init(GisPluginInterface *iface); +G_DEFINE_TYPE_WITH_CODE(GisPluginEnv, gis_plugin_env, G_TYPE_OBJECT, + G_IMPLEMENT_INTERFACE(GIS_TYPE_PLUGIN, + gis_plugin_env_plugin_init)); +static void gis_plugin_env_plugin_init(GisPluginInterface *iface) +{ + g_debug("GisPluginEnv: plugin_init"); + /* Add methods to the interface */ +} +/* Class/Object init */ +static void gis_plugin_env_init(GisPluginEnv *self) +{ + g_debug("GisPluginEnv: init"); + /* Set defaults */ +} +static void gis_plugin_env_dispose(GObject *gobject) +{ + g_debug("GisPluginEnv: dispose"); + GisPluginEnv *self = GIS_PLUGIN_ENV(gobject); + /* Drop references */ + G_OBJECT_CLASS(gis_plugin_env_parent_class)->dispose(gobject); +} +static void gis_plugin_env_class_init(GisPluginEnvClass *klass) +{ + g_debug("GisPluginEnv: class_init"); + GObjectClass *gobject_class = (GObjectClass*)klass; + gobject_class->dispose = gis_plugin_env_dispose; +} diff --git a/src/plugins/env.h b/src/plugins/env.h new file mode 100644 index 0000000..dc59ded --- /dev/null +++ b/src/plugins/env.h @@ -0,0 +1,49 @@ +/* + * Copyright (C) 2009 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 + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#ifndef __ENV_H__ +#define __ENV_H__ + +#include + +#define GIS_TYPE_PLUGIN_ENV (gis_plugin_env_get_type ()) +#define GIS_PLUGIN_ENV(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), GIS_TYPE_PLUGIN_ENV, GisPluginEnv)) +#define GIS_IS_PLUGIN_ENV(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), GIS_TYPE_PLUGIN_ENV)) +#define GIS_PLUGIN_ENV_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GIS_TYPE_PLUGIN_ENV, GisPluginEnvClass)) +#define GIS_IS_PLUGIN_ENV_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GIS_TYPE_PLUGIN_ENV)) +#define GIS_PLUGIN_ENV_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GIS_TYPE_PLUGIN_ENV, GisPluginEnvClass)) + +typedef struct _GisPluginEnv GisPluginEnv; +typedef struct _GisPluginEnvClass GisPluginEnvClass; + +struct _GisPluginEnv { + GObject parent_instance; + + /* instance members */ + GisViewer *viewer; +}; + +struct _GisPluginEnvClass { + GObjectClass parent_class; +}; + +GType gis_plugin_env_get_type(); + +/* Methods */ +GisPluginEnv *gis_plugin_env_new(GisViewer *viewer, GisPrefs *prefs); + +#endif -- 2.43.2