]> Pileus Git - grits/blobdiff - src/gis-viewer.h
Move OpenGL code from GisOpenGL to objects
[grits] / src / gis-viewer.h
index 90f13e92a6a03b109a706c0d8e66aa5adcc118ec..a4da4fc6a591fa2172699a23626e0724ccef9324 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2009 Andy Spencer <spenceal@rose-hulman.edu>
+ * Copyright (C) 2009-2010 Andy Spencer <andy753421@gmail.com>
  *
  * 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
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
+/**
+ * Hack alert: gis-opengl.h needs to be included before gis-viewer
+ *   - GisViewer depends on GisObject for add/remove functions
+ *   - GisObject depends on GisOpenGL for load/unload functions
+ *   - GisOpenGL depends on GisViewer for inheritance
+ *
+ * The problem here is that GisOpenGL needs the GisViewer definition
+ * but GisViewer only needs the typedefs (through GisObject),
+ * so GisViewer needs to be included after the GisOpenGL typedefs but
+ * before the GisOpenGL definition. This is handled internally by
+ * gis-opengl.h
+ *
+ * This should probably be fixed, but making a GisGLObject interface
+ * seems like too much work. Merging GisViewer and GisOpenGL would also work,
+ * but I like the separate that that's provided by having two.
+ */
+#include "gis-opengl.h"
+
 #ifndef __GIS_VIEWER_H__
 #define __GIS_VIEWER_H__
 
 #include <glib-object.h>
 
 /* Rendering levels */
+/**
+ * GIS_LEVEL_BACKGROUND: 
+ *
+ * The level used to draw background objects (stars, atmosphere, etc).
+ */
 #define GIS_LEVEL_BACKGROUND -100
+
+/**
+ * GIS_LEVEL_WORLD: 
+ *
+ * The level used to draw world objects. This is for both surface data as well
+ * as things in the air or underground. Most objects should use
+ * %GIS_LEVEL_WORLD;
+ */
 #define GIS_LEVEL_WORLD         0
+
+/**
+ * GIS_LEVEL_OVERLAY: 
+ *
+ * The level used to draw screen overlays. These will be drawn in front of most
+ * of ther objects. Text and markers should use %GIS_LEVEL_OVERLAY.
+ */
 #define GIS_LEVEL_OVERLAY     100
+
+/**
+ * GIS_LEVEL_HUD: 
+ *
+ * The level used to draw the Heads Up Display. This is for things that are not
+ * anchored at all the the world. They should be drawn in front of everything
+ * else.
+ */
 #define GIS_LEVEL_HUD         200
 
 /* Type macros */
 typedef struct _GisViewer      GisViewer;
 typedef struct _GisViewerClass GisViewerClass;
 
+/**
+ * GisHeightFunc:
+ * @lat:       the target latitude
+ * @lon:       the target longitude
+ * @user_data: user data passed to the function
+ *
+ * Determine the surface elevation (ground level) at a given point.
+ *
+ * Returns: the elevation in meters above sea level
+ */
 typedef gdouble (*GisHeightFunc)(gdouble lat, gdouble lon, gpointer user_data);
 
-#include "gis-tile.h"
 #include "gis-plugin.h"
-#include "gis-object.h"
+#include "gis-prefs.h"
+#include "objects/gis-object.h"
 
 struct _GisViewer {
        GtkDrawingArea parent_instance;
 
        /* instance members */
        GisPlugins *plugins;
-       gchar      *time;
+       GisPrefs   *prefs;
+       time_t      time;
        gdouble     location[3];
        gdouble     rotation[3];
        gboolean    offline;
+
+       /* For dragging */
+       gint    drag_mode;
+       gdouble drag_x, drag_y;
 };
 
 struct _GisViewerClass {
@@ -66,34 +127,28 @@ struct _GisViewerClass {
                                  gdouble lat, gdouble lon, gdouble elev,
                                  gdouble *px, gdouble *py, gdouble *pz);
 
-       void (*clear_height_func)(GisViewer *self);
-       void (*set_height_func)  (GisViewer *self, GisTile *tile,
+       void (*clear_height_func)(GisViewer *viewer);
+       void (*set_height_func)  (GisViewer *viewer, GisBounds *bounds,
                                  GisHeightFunc height_func, gpointer user_data,
                                  gboolean update);
 
-       void (*render_tile)      (GisViewer *viewer, GisTile *tile);
-       void (*render_tiles)     (GisViewer *viewer, GisTile *root);
-
-       void (*begin)            (GisViewer *viewer);
-       void (*end)              (GisViewer *viewer);
-
        gpointer (*add)          (GisViewer *viewer, GisObject *object,
                                  gint level, gboolean sort);
-       void (*remove)           (GisViewer *viewer, gpointer ref);
+       GisObject *(*remove)     (GisViewer *viewer, gpointer ref);
 };
 
 GType gis_viewer_get_type(void);
 
 /* Methods */
-GisViewer *gis_viewer_new();
+void gis_viewer_setup(GisViewer *viewer, GisPlugins *plugins, GisPrefs *prefs);
 
-void gis_viewer_set_time(GisViewer *viewer, const gchar *time);
-gchar *gis_viewer_get_time(GisViewer *viewer);
+void gis_viewer_set_time(GisViewer *viewer, time_t time);
+time_t gis_viewer_get_time(GisViewer *viewer);
 
 void gis_viewer_set_location(GisViewer *viewer, gdouble  lat, gdouble  lon, gdouble  elev);
 void gis_viewer_get_location(GisViewer *viewer, gdouble *lat, gdouble *lon, gdouble *elev);
-void gis_viewer_pan         (GisViewer *viewer, gdouble  lat, gdouble  lon, gdouble  elev);
-void gis_viewer_zoom        (GisViewer *viewer, gdouble  scale);
+void gis_viewer_pan(GisViewer *viewer, gdouble forward, gdouble right, gdouble up);
+void gis_viewer_zoom(GisViewer *viewer, gdouble  scale);
 
 void gis_viewer_set_rotation(GisViewer *viewer, gdouble  x, gdouble  y, gdouble  z);
 void gis_viewer_get_rotation(GisViewer *viewer, gdouble *x, gdouble *y, gdouble *z);
@@ -112,19 +167,13 @@ void gis_viewer_project(GisViewer *viewer,
                gdouble lat, gdouble lon, gdouble elev,
                gdouble *px, gdouble *py, gdouble *pz);
 
-void gis_viewer_clear_height_func(GisViewer *self);
-void gis_viewer_set_height_func(GisViewer *self, GisTile *tile,
+void gis_viewer_clear_height_func(GisViewer *viewer);
+void gis_viewer_set_height_func(GisViewer *viewer, GisBounds *bounds,
                GisHeightFunc height_func, gpointer user_data,
                gboolean update);
 
-void gis_viewer_render_tile (GisViewer *viewer, GisTile *tile);
-void gis_viewer_render_tiles(GisViewer *viewer, GisTile *root);
-
-void gis_viewer_begin(GisViewer *viewer);
-void gis_viewer_end  (GisViewer *viewer);
-
-gpointer gis_viewer_add(GisViewer *self, GisObject *object,
+gpointer gis_viewer_add(GisViewer *viewer, GisObject *object,
                gint level, gboolean sort);
-void gis_viewer_remove(GisViewer *self, gpointer ref);
+GisObject *gis_viewer_remove(GisViewer *viewer, gpointer ref);
 
 #endif