X-Git-Url: http://pileus.org/git/?p=grits;a=blobdiff_plain;f=src%2Fgrits-viewer.h;h=581751edfa10369763e18bda7637c9252ef8c8e1;hp=8e50b81c54720ac42e797ba82e537475ca0762bb;hb=HEAD;hpb=d8948985b467a5cfd0447ae413ed1c5d01afb024 diff --git a/src/grits-viewer.h b/src/grits-viewer.h index 8e50b81..581751e 100644 --- a/src/grits-viewer.h +++ b/src/grits-viewer.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2009-2010 Andy Spencer + * Copyright (C) 2009-2011 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 @@ -16,76 +16,81 @@ */ /** - * 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 + * Hack alert: grits-opengl.h needs to be included before grits-viewer + * - GritsViewer depends on GritsObject for add/remove functions + * - GritsObject depends on GritsOpenGL for load/unload functions + * - GritsOpenGL depends on GritsViewer 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 + * The problem here is that GritsOpenGL needs the GritsViewer definition but + * GritsViewer only needs the typedefs (through GritsObject), so GritsViewer + * needs to be included after the GritsOpenGL typedefs but before the + * GritsOpenGL definition. This is handled internally by grits-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. + * This should probably be fixed, but making a GritsGLObject interface seems + * like too much work. Merging GritsViewer and GritsOpenGL would also work, but + * I like the separate that that's provided by having two. */ #include "grits-opengl.h" -#ifndef __GIS_VIEWER_H__ -#define __GIS_VIEWER_H__ +#ifndef __GRITS_VIEWER_H__ +#define __GRITS_VIEWER_H__ #include #include +/* Projections */ +typedef enum { + GRITS_PROJ_LATLON, + GRITS_PROJ_MERCATOR, +} GritsProj; + /* Rendering levels */ /** - * GIS_LEVEL_BACKGROUND: + * GRITS_LEVEL_BACKGROUND: * * The level used to draw background objects (stars, atmosphere, etc). */ -#define GIS_LEVEL_BACKGROUND -100 +#define GRITS_LEVEL_BACKGROUND -100 /** - * GIS_LEVEL_WORLD: + * GRITS_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; + * %GRITS_LEVEL_WORLD; */ -#define GIS_LEVEL_WORLD 0 +#define GRITS_LEVEL_WORLD 0 /** - * GIS_LEVEL_OVERLAY: + * GRITS_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. + * of ther objects. Text and markers should use %GRITS_LEVEL_OVERLAY. */ -#define GIS_LEVEL_OVERLAY 100 +#define GRITS_LEVEL_OVERLAY 100 /** - * GIS_LEVEL_HUD: + * GRITS_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 +#define GRITS_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)) -#define GIS_IS_VIEWER(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), GIS_TYPE_VIEWER)) -#define GIS_VIEWER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GIS_TYPE_VIEWER, GisViewerClass)) -#define GIS_IS_VIEWER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GIS_TYPE_VIEWER)) -#define GIS_VIEWER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GIS_TYPE_VIEWER, GisViewerClass)) +#define GRITS_TYPE_VIEWER (grits_viewer_get_type()) +#define GRITS_VIEWER(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), GRITS_TYPE_VIEWER, GritsViewer)) +#define GRITS_IS_VIEWER(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), GRITS_TYPE_VIEWER)) +#define GRITS_VIEWER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GRITS_TYPE_VIEWER, GritsViewerClass)) +#define GRITS_IS_VIEWER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GRITS_TYPE_VIEWER)) +#define GRITS_VIEWER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GRITS_TYPE_VIEWER, GritsViewerClass)) -typedef struct _GisViewer GisViewer; -typedef struct _GisViewerClass GisViewerClass; +typedef struct _GritsViewer GritsViewer; +typedef struct _GritsViewerClass GritsViewerClass; /** - * GisHeightFunc: + * GritsHeightFunc: * @lat: the target latitude * @lon: the target longitude * @user_data: user data passed to the function @@ -94,18 +99,18 @@ typedef struct _GisViewerClass GisViewerClass; * * Returns: the elevation in meters above sea level */ -typedef gdouble (*GisHeightFunc)(gdouble lat, gdouble lon, gpointer user_data); +typedef gdouble (*GritsHeightFunc)(gdouble lat, gdouble lon, gpointer user_data); #include "grits-plugin.h" #include "grits-prefs.h" #include "objects/grits-object.h" -struct _GisViewer { +struct _GritsViewer { GtkDrawingArea parent_instance; /* instance members */ - GisPlugins *plugins; - GisPrefs *prefs; + GritsPlugins *plugins; + GritsPrefs *prefs; time_t time; gdouble location[3]; gdouble rotation[3]; @@ -114,66 +119,78 @@ struct _GisViewer { /* For dragging */ gint drag_mode; gdouble drag_x, drag_y; + + /* For queue_draw */ + guint draw_source; + GMutex draw_lock; }; -struct _GisViewerClass { +struct _GritsViewerClass { GtkDrawingAreaClass parent_class; /* class members */ - void (*center_position) (GisViewer *viewer, + void (*center_position) (GritsViewer *viewer, gdouble lat, gdouble lon, gdouble elev); - void (*project) (GisViewer *viewer, + void (*project) (GritsViewer *viewer, gdouble lat, gdouble lon, gdouble elev, gdouble *px, gdouble *py, gdouble *pz); + void (*unproject) (GritsViewer *viewer, + gdouble px, gdouble py,gdouble pz, + gdouble *lat, gdouble *lon, gdouble *elev); - void (*clear_height_func)(GisViewer *viewer); - void (*set_height_func) (GisViewer *viewer, GisBounds *bounds, - GisHeightFunc height_func, gpointer user_data, + void (*clear_height_func)(GritsViewer *viewer); + void (*set_height_func) (GritsViewer *viewer, GritsBounds *bounds, + GritsHeightFunc height_func, gpointer user_data, gboolean update); - gpointer (*add) (GisViewer *viewer, GisObject *object, + void (*add) (GritsViewer *viewer, GritsObject *object, gint level, gboolean sort); - GisObject *(*remove) (GisViewer *viewer, gpointer ref); + void (*remove) (GritsViewer *viewer, GritsObject *object); }; -GType gis_viewer_get_type(void); +GType grits_viewer_get_type(void); /* Methods */ -void gis_viewer_setup(GisViewer *viewer, GisPlugins *plugins, GisPrefs *prefs); +void grits_viewer_setup(GritsViewer *viewer, GritsPlugins *plugins, GritsPrefs *prefs); -void gis_viewer_set_time(GisViewer *viewer, time_t time); -time_t gis_viewer_get_time(GisViewer *viewer); +void grits_viewer_set_time(GritsViewer *viewer, time_t time); +time_t grits_viewer_get_time(GritsViewer *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 forward, gdouble right, gdouble up); -void gis_viewer_zoom(GisViewer *viewer, gdouble scale); +void grits_viewer_set_location(GritsViewer *viewer, gdouble lat, gdouble lon, gdouble elev); +void grits_viewer_get_location(GritsViewer *viewer, gdouble *lat, gdouble *lon, gdouble *elev); +void grits_viewer_pan(GritsViewer *viewer, gdouble forward, gdouble right, gdouble up); +void grits_viewer_zoom(GritsViewer *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); +void grits_viewer_set_rotation(GritsViewer *viewer, gdouble x, gdouble y, gdouble z); +void grits_viewer_get_rotation(GritsViewer *viewer, gdouble *x, gdouble *y, gdouble *z); +void grits_viewer_rotate (GritsViewer *viewer, gdouble x, gdouble y, gdouble z); -void gis_viewer_refresh(GisViewer *viewer); +void grits_viewer_refresh(GritsViewer *viewer); -void gis_viewer_set_offline(GisViewer *viewer, gboolean offline); -gboolean gis_viewer_get_offline(GisViewer *viewer); +void grits_viewer_set_offline(GritsViewer *viewer, gboolean offline); +gboolean grits_viewer_get_offline(GritsViewer *viewer); /* To be implemented by subclasses */ -void gis_viewer_center_position(GisViewer *viewer, +void grits_viewer_center_position(GritsViewer *viewer, gdouble lat, gdouble lon, gdouble elev); -void gis_viewer_project(GisViewer *viewer, +void grits_viewer_project(GritsViewer *viewer, gdouble lat, gdouble lon, gdouble elev, gdouble *px, gdouble *py, gdouble *pz); +void grits_viewer_unproject(GritsViewer *viewer, + gdouble px, gdouble py, gdouble pz, + gdouble *lat, gdouble *lon, gdouble *elev); -void gis_viewer_clear_height_func(GisViewer *viewer); -void gis_viewer_set_height_func(GisViewer *viewer, GisBounds *bounds, - GisHeightFunc height_func, gpointer user_data, +void grits_viewer_clear_height_func(GritsViewer *viewer); +void grits_viewer_set_height_func(GritsViewer *viewer, GritsBounds *bounds, + GritsHeightFunc height_func, gpointer user_data, gboolean update); -gpointer gis_viewer_add(GisViewer *viewer, GisObject *object, +void grits_viewer_add(GritsViewer *viewer, GritsObject *object, gint level, gboolean sort); -GisObject *gis_viewer_remove(GisViewer *viewer, gpointer ref); +void grits_viewer_remove(GritsViewer *viewer, GritsObject *object); + +void grits_viewer_queue_draw(GritsViewer *viewer); #endif