/*
- * 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
#ifndef __GIS_VIEWER_H__
#define __GIS_VIEWER_H__
+#include <gtk/gtk.h>
#include <glib-object.h>
+/* Rendering levels */
+#define GIS_LEVEL_BACKGROUND -100
+#define GIS_LEVEL_WORLD 0
+#define GIS_LEVEL_OVERLAY 100
+#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;
+typedef gdouble (*GisHeightFunc)(gdouble lat, gdouble lon, gpointer user_data);
+
+#include "gis-tile.h"
+#include "gis-plugin.h"
+#include "gis-object.h"
+
struct _GisViewer {
- GObject parent_instance;
+ GtkDrawingArea parent_instance;
/* instance members */
- gchar *time;
- gchar *site;
- gdouble location[3];
- gdouble rotation[3];
- gboolean offline;
+ GisPlugins *plugins;
+ gchar *time;
+ gdouble location[3];
+ gdouble rotation[3];
+ gboolean offline;
};
struct _GisViewerClass {
- GObjectClass parent_class;
+ GtkDrawingAreaClass parent_class;
/* class members */
+ void (*center_position) (GisViewer *viewer,
+ gdouble lat, gdouble lon, gdouble elev);
+
+ void (*project) (GisViewer *viewer,
+ 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,
+ 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);
};
GType gis_viewer_get_type(void);
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);
gboolean gis_viewer_get_offline(GisViewer *viewer);
+/* To be implemented by subclasses */
+void gis_viewer_center_position(GisViewer *viewer,
+ gdouble lat, gdouble lon, gdouble elev);
+
+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,
+ 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,
+ gint level, gboolean sort);
+void gis_viewer_remove(GisViewer *self, gpointer ref);
+
#endif