/*
- * 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
#include <gtk/gtk.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 */
#define GIS_TYPE_VIEWER (gis_viewer_get_type())
#define GIS_VIEWER(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), GIS_TYPE_VIEWER, GisViewer))
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"
+#include "objects/gis-tile.h"
struct _GisViewer {
GtkDrawingArea parent_instance;
/* instance members */
GisPlugins *plugins;
- gchar *time;
- gchar *site;
+ 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 {
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, GisTile *tile,
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);
-
- void (*add) (GisViewer *viewer, GisObject *object);
- void (*remove) (GisViewer *viewer, GisObject *object);
+ gpointer (*add) (GisViewer *viewer, GisObject *object,
+ gint level, gboolean sort);
+ 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);
void gis_viewer_rotate (GisViewer *viewer, gdouble x, gdouble y, gdouble z);
-/* To be deprecated, use {get,set}_location */
-void gis_viewer_set_site(GisViewer *viewer, const gchar *site);
-gchar *gis_viewer_get_site(GisViewer *viewer);
-
void gis_viewer_refresh(GisViewer *viewer);
void gis_viewer_set_offline(GisViewer *viewer, gboolean offline);
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, GisTile *tile,
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);
-
-void gis_viewer_add(GisViewer *self, GisObject *object);
-void gis_viewer_remove(GisViewer *self, GisObject *object);
+gpointer gis_viewer_add(GisViewer *viewer, GisObject *object,
+ gint level, gboolean sort);
+GisObject *gis_viewer_remove(GisViewer *viewer, gpointer ref);
#endif