X-Git-Url: http://pileus.org/git/?a=blobdiff_plain;f=src%2Fgrits-viewer.c;h=f7d70e9fa427836d79f054f0950e156226d1e60a;hb=7138d9be203921e2eaa3168932c463ed790456c0;hp=767b9191203d579463ef39ff2ea99aa6900c120a;hpb=d8948985b467a5cfd0447ae413ed1c5d01afb024;p=grits diff --git a/src/grits-viewer.c b/src/grits-viewer.c index 767b919..f7d70e9 100644 --- a/src/grits-viewer.c +++ b/src/grits-viewer.c @@ -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,10 +16,10 @@ */ /** - * SECTION:gis-viewer + * SECTION:grits-viewer * @short_description: Virtual globe base class * - * #GisViewer is the base class for the virtual globe widget. It handles + * #GritsViewer is the base class for the virtual globe widget. It handles * everything not directly related to drawing the globe. Plugins and * applications using the viewer should normally talk to the viewer and not care * how it is implemented. @@ -52,7 +52,7 @@ static guint signals[NUM_SIGNALS]; * Helpers * ***********/ /* Misc helpers */ -static void _gis_viewer_fix_location(GisViewer *viewer) +static void _grits_viewer_fix_location(GritsViewer *viewer) { while (viewer->location[0] < -90) viewer->location[0] += 180; while (viewer->location[0] > 90) viewer->location[0] -= 180; @@ -62,30 +62,30 @@ static void _gis_viewer_fix_location(GisViewer *viewer) } /* Signal helpers */ -static void _gis_viewer_emit_location_changed(GisViewer *viewer) +static void _grits_viewer_emit_location_changed(GritsViewer *viewer) { g_signal_emit(viewer, signals[SIG_LOCATION_CHANGED], 0, viewer->location[0], viewer->location[1], viewer->location[2]); } -static void _gis_viewer_emit_rotation_changed(GisViewer *viewer) +static void _grits_viewer_emit_rotation_changed(GritsViewer *viewer) { g_signal_emit(viewer, signals[SIG_ROTATION_CHANGED], 0, viewer->rotation[0], viewer->rotation[1], viewer->rotation[2]); } -static void _gis_viewer_emit_time_changed(GisViewer *viewer) +static void _grits_viewer_emit_time_changed(GritsViewer *viewer) { g_signal_emit(viewer, signals[SIG_TIME_CHANGED], 0, viewer->time); } -static void _gis_viewer_emit_refresh(GisViewer *viewer) +static void _grits_viewer_emit_refresh(GritsViewer *viewer) { g_signal_emit(viewer, signals[SIG_REFRESH], 0); } -static void _gis_viewer_emit_offline(GisViewer *viewer) +static void _grits_viewer_emit_offline(GritsViewer *viewer) { g_signal_emit(viewer, signals[SIG_OFFLINE], 0, viewer->offline); @@ -94,92 +94,93 @@ static void _gis_viewer_emit_offline(GisViewer *viewer) /************* * Callbacks * *************/ -static gboolean on_key_press(GisViewer *viewer, GdkEventKey *event, gpointer _) +static gboolean on_key_press(GritsViewer *viewer, GdkEventKey *event, gpointer _) { - g_debug("GisViewer: on_key_press - key=%x, state=%x, plus=%x", + g_debug("GritsViewer: on_key_press - key=%x, state=%x, plus=%x", event->keyval, event->state, GDK_plus); double lat, lon, elev, pan; - gis_viewer_get_location(viewer, &lat, &lon, &elev); + grits_viewer_get_location(viewer, &lat, &lon, &elev); pan = MIN(elev/(EARTH_R/2), 30); switch (event->keyval) { - case GDK_Left: case GDK_h: gis_viewer_pan(viewer, 0, -pan, 0); break; - case GDK_Down: case GDK_j: gis_viewer_pan(viewer, -pan, 0, 0); break; - case GDK_Up: case GDK_k: gis_viewer_pan(viewer, pan, 0, 0); break; - case GDK_Right: case GDK_l: gis_viewer_pan(viewer, 0, pan, 0); break; - case GDK_minus: case GDK_o: gis_viewer_zoom(viewer, 10./9); break; - case GDK_plus: case GDK_i: gis_viewer_zoom(viewer, 9./10); break; - case GDK_H: gis_viewer_rotate(viewer, 0, 0, -2); break; - case GDK_J: gis_viewer_rotate(viewer, 2, 0, 0); break; - case GDK_K: gis_viewer_rotate(viewer, -2, 0, 0); break; - case GDK_L: gis_viewer_rotate(viewer, 0, 0, 2); break; + case GDK_Left: case GDK_h: grits_viewer_pan(viewer, 0, -pan, 0); break; + case GDK_Down: case GDK_j: grits_viewer_pan(viewer, -pan, 0, 0); break; + case GDK_Up: case GDK_k: grits_viewer_pan(viewer, pan, 0, 0); break; + case GDK_Right: case GDK_l: grits_viewer_pan(viewer, 0, pan, 0); break; + case GDK_minus: case GDK_o: grits_viewer_zoom(viewer, 10./9); break; + case GDK_plus: case GDK_i: grits_viewer_zoom(viewer, 9./10); break; + case GDK_H: grits_viewer_rotate(viewer, 0, 0, -2); break; + case GDK_J: grits_viewer_rotate(viewer, 2, 0, 0); break; + case GDK_K: grits_viewer_rotate(viewer, -2, 0, 0); break; + case GDK_L: grits_viewer_rotate(viewer, 0, 0, 2); break; } return FALSE; } -static gboolean on_scroll(GisViewer *viewer, GdkEventScroll *event, gpointer _) +static gboolean on_scroll(GritsViewer *viewer, GdkEventScroll *event, gpointer _) { switch (event->direction) { - case GDK_SCROLL_DOWN: gis_viewer_zoom(viewer, 10./9); break; - case GDK_SCROLL_UP: gis_viewer_zoom(viewer, 9./10); break; + case GDK_SCROLL_DOWN: grits_viewer_zoom(viewer, 10./9); break; + case GDK_SCROLL_UP: grits_viewer_zoom(viewer, 9./10); break; default: break; } return FALSE; } enum { - GIS_DRAG_NONE, - GIS_DRAG_PAN, - GIS_DRAG_ZOOM, - GIS_DRAG_TILT, + GRITS_DRAG_NONE, + GRITS_DRAG_PAN, + GRITS_DRAG_ZOOM, + GRITS_DRAG_TILT, }; -static gboolean on_button_press(GisViewer *viewer, GdkEventButton *event, gpointer _) +static gboolean on_button_press(GritsViewer *viewer, GdkEventButton *event, gpointer _) { - g_debug("GisViewer: on_button_press - %d", event->button); + g_debug("GritsViewer: on_button_press - %d", event->button); gtk_widget_grab_focus(GTK_WIDGET(viewer)); switch (event->button) { - case 1: viewer->drag_mode = GIS_DRAG_PAN; break; - case 2: viewer->drag_mode = GIS_DRAG_ZOOM; break; - case 3: viewer->drag_mode = GIS_DRAG_TILT; break; - default: viewer->drag_mode = GIS_DRAG_NONE; break; + case 1: viewer->drag_mode = GRITS_DRAG_PAN; break; + case 2: viewer->drag_mode = GRITS_DRAG_ZOOM; break; + case 3: viewer->drag_mode = GRITS_DRAG_TILT; break; + default: viewer->drag_mode = GRITS_DRAG_NONE; break; } viewer->drag_x = event->x; viewer->drag_y = event->y; return FALSE; } -static gboolean on_button_release(GisViewer *viewer, GdkEventButton *event, gpointer _) +static gboolean on_button_release(GritsViewer *viewer, GdkEventButton *event, gpointer _) { - g_debug("GisViewer: on_button_release"); - viewer->drag_mode = GIS_DRAG_NONE; + g_debug("GritsViewer: on_button_release"); + viewer->drag_mode = GRITS_DRAG_NONE; return FALSE; } -static gboolean on_motion_notify(GisViewer *viewer, GdkEventMotion *event, gpointer _) +static gboolean on_motion_notify(GritsViewer *viewer, GdkEventMotion *event, gpointer _) { gdouble x = viewer->drag_x - event->x; gdouble y = viewer->drag_y - event->y; - gdouble lat, lon, elev, scale; - gis_viewer_get_location(GIS_VIEWER(viewer), &lat, &lon, &elev); - scale = elev/EARTH_R/15; + gdouble lat, lon, elev, scale, rx, ry, rz; + grits_viewer_get_location(GRITS_VIEWER(viewer), &lat, &lon, &elev); + grits_viewer_get_rotation(GRITS_VIEWER(viewer), &rx, &ry, &rz); + scale = (elev/EARTH_R/14.1) * (sin(deg2rad(ABS(rx)))*4+1); switch (viewer->drag_mode) { - case GIS_DRAG_PAN: gis_viewer_pan(viewer, -y*scale, x*scale, 0); break; - case GIS_DRAG_ZOOM: gis_viewer_zoom(viewer, pow(2, -y/500)); break; - case GIS_DRAG_TILT: gis_viewer_rotate(viewer, y/10, 0, x/10); break; + case GRITS_DRAG_PAN: grits_viewer_pan(viewer, -y*scale*0.782, x*scale, 0); break; + case GRITS_DRAG_ZOOM: grits_viewer_zoom(viewer, pow(2, -y/500)); break; + case GRITS_DRAG_TILT: grits_viewer_rotate(viewer, y/10, 0, x/10); break; } viewer->drag_x = event->x; viewer->drag_y = event->y; return FALSE; } -static void on_view_changed(GisViewer *viewer, +static void on_view_changed(GritsViewer *viewer, gdouble _1, gdouble _2, gdouble _3) { gtk_widget_queue_draw(GTK_WIDGET(viewer)); } -static void on_realize(GisViewer *viewer) +static void on_realize(GritsViewer *viewer) { GdkCursor *cursor = gdk_cursor_new(GDK_FLEUR); GdkWindow *window = gtk_widget_get_window(GTK_WIDGET(viewer)); @@ -190,53 +191,53 @@ static void on_realize(GisViewer *viewer) * Methods * ***********/ /** - * gis_viewer_setup: + * grits_viewer_setup: * @viewer: the viewer * @plugins: a plugins store * @prefs: a prefs store * - * This should be called by objects which implement GisViewer somewhere in their + * This should be called by objects which implement GritsViewer somewhere in their * constructor. */ -void gis_viewer_setup(GisViewer *viewer, GisPlugins *plugins, GisPrefs *prefs) +void grits_viewer_setup(GritsViewer *viewer, GritsPlugins *plugins, GritsPrefs *prefs) { viewer->plugins = plugins; viewer->prefs = prefs; - viewer->offline = gis_prefs_get_boolean(prefs, "gis/offline", NULL); + viewer->offline = grits_prefs_get_boolean(prefs, "grits/offline", NULL); } /** - * gis_viewer_set_time: + * grits_viewer_set_time: * @viewer: the viewer * @time: the time to set the view to * * Set the current time for the view */ -void gis_viewer_set_time(GisViewer *viewer, time_t time) +void grits_viewer_set_time(GritsViewer *viewer, time_t time) { - g_assert(GIS_IS_VIEWER(viewer)); - g_debug("GisViewer: set_time - time=%ld", time); + g_assert(GRITS_IS_VIEWER(viewer)); + g_debug("GritsViewer: set_time - time=%ld", time); viewer->time = time; - _gis_viewer_emit_time_changed(viewer); + _grits_viewer_emit_time_changed(viewer); } /** - * gis_viewer_get_time: + * grits_viewer_get_time: * @viewer: the viewer * * Get the time that is being viewed * * Returns: the current time */ -time_t gis_viewer_get_time(GisViewer *viewer) +time_t grits_viewer_get_time(GritsViewer *viewer) { - g_assert(GIS_IS_VIEWER(viewer)); - g_debug("GisViewer: get_time"); + g_assert(GRITS_IS_VIEWER(viewer)); + g_debug("GritsViewer: get_time"); return viewer->time; } /** - * gis_viewer_set_location: + * grits_viewer_set_location: * @viewer: the viewer * @lat: the new latitude * @lon: the new longitude @@ -244,19 +245,19 @@ time_t gis_viewer_get_time(GisViewer *viewer) * * Set the location for the camera */ -void gis_viewer_set_location(GisViewer *viewer, gdouble lat, gdouble lon, gdouble elev) +void grits_viewer_set_location(GritsViewer *viewer, gdouble lat, gdouble lon, gdouble elev) { - g_assert(GIS_IS_VIEWER(viewer)); - g_debug("GisViewer: set_location"); + g_assert(GRITS_IS_VIEWER(viewer)); + g_debug("GritsViewer: set_location"); viewer->location[0] = lat; viewer->location[1] = lon; viewer->location[2] = elev; - _gis_viewer_fix_location(viewer); - _gis_viewer_emit_location_changed(viewer); + _grits_viewer_fix_location(viewer); + _grits_viewer_emit_location_changed(viewer); } /** - * gis_viewer_get_location: + * grits_viewer_get_location: * @viewer: the viewer * @lat: the location to store the latitude * @lon: the location to store the longitude @@ -264,17 +265,17 @@ void gis_viewer_set_location(GisViewer *viewer, gdouble lat, gdouble lon, gdoubl * * Get the location of the camera */ -void gis_viewer_get_location(GisViewer *viewer, gdouble *lat, gdouble *lon, gdouble *elev) +void grits_viewer_get_location(GritsViewer *viewer, gdouble *lat, gdouble *lon, gdouble *elev) { - g_assert(GIS_IS_VIEWER(viewer)); - //g_debug("GisViewer: get_location"); + g_assert(GRITS_IS_VIEWER(viewer)); + //g_debug("GritsViewer: get_location"); *lat = viewer->location[0]; *lon = viewer->location[1]; *elev = viewer->location[2]; } /** - * gis_viewer_pan: + * grits_viewer_pan: * @viewer: the viewer * @forward: distance to move forward in meters * @right: distance to move right in meters @@ -285,10 +286,10 @@ void gis_viewer_get_location(GisViewer *viewer, gdouble *lat, gdouble *lon, gdou * Bugs: the distances are not in meters * Bugs: panning does not move in strait lines */ -void gis_viewer_pan(GisViewer *viewer, gdouble forward, gdouble sideways, gdouble up) +void grits_viewer_pan(GritsViewer *viewer, gdouble forward, gdouble sideways, gdouble up) { - g_assert(GIS_IS_VIEWER(viewer)); - g_debug("GisViewer: pan - forward=%8.3f, sideways=%8.3f, up=%8.3f", + g_assert(GRITS_IS_VIEWER(viewer)); + g_debug("GritsViewer: pan - forward=%8.3f, sideways=%8.3f, up=%8.3f", forward, sideways, up); gdouble dist = sqrt(forward*forward + sideways*sideways); gdouble angle1 = deg2rad(viewer->rotation[2]); @@ -298,27 +299,27 @@ void gis_viewer_pan(GisViewer *viewer, gdouble forward, gdouble sideways, gdoubl viewer->location[0] += dist*cos(angle); viewer->location[1] += dist*sin(angle); viewer->location[2] += up; - _gis_viewer_fix_location(viewer); - _gis_viewer_emit_location_changed(viewer); + _grits_viewer_fix_location(viewer); + _grits_viewer_emit_location_changed(viewer); } /** - * gis_viewer_zoom: + * grits_viewer_zoom: * @viewer: the viewer * @scale: the scale to multiple the elevation by * * Multiple the elevation by a scale. */ -void gis_viewer_zoom(GisViewer *viewer, gdouble scale) +void grits_viewer_zoom(GritsViewer *viewer, gdouble scale) { - g_assert(GIS_IS_VIEWER(viewer)); - g_debug("GisViewer: zoom"); + g_assert(GRITS_IS_VIEWER(viewer)); + g_debug("GritsViewer: zoom"); viewer->location[2] *= scale; - _gis_viewer_emit_location_changed(viewer); + _grits_viewer_emit_location_changed(viewer); } /** - * gis_viewer_set_rotation: + * grits_viewer_set_rotation: * @viewer: the viewer * @x: rotation new around the x axes * @y: rotation new around the y axes @@ -326,18 +327,18 @@ void gis_viewer_zoom(GisViewer *viewer, gdouble scale) * * Set the rotations in degrees around the x, y, and z axes. */ -void gis_viewer_set_rotation(GisViewer *viewer, gdouble x, gdouble y, gdouble z) +void grits_viewer_set_rotation(GritsViewer *viewer, gdouble x, gdouble y, gdouble z) { - g_assert(GIS_IS_VIEWER(viewer)); - g_debug("GisViewer: set_rotation"); + g_assert(GRITS_IS_VIEWER(viewer)); + g_debug("GritsViewer: set_rotation"); viewer->rotation[0] = x; viewer->rotation[1] = y; viewer->rotation[2] = z; - _gis_viewer_emit_rotation_changed(viewer); + _grits_viewer_emit_rotation_changed(viewer); } /** - * gis_viewer_get_rotation: + * grits_viewer_get_rotation: * @viewer: the viewer * @x: rotation around the x axes * @y: rotation around the y axes @@ -345,17 +346,17 @@ void gis_viewer_set_rotation(GisViewer *viewer, gdouble x, gdouble y, gdouble z) * * Get the rotations in degrees around the x, y, and z axes. */ -void gis_viewer_get_rotation(GisViewer *viewer, gdouble *x, gdouble *y, gdouble *z) +void grits_viewer_get_rotation(GritsViewer *viewer, gdouble *x, gdouble *y, gdouble *z) { - g_assert(GIS_IS_VIEWER(viewer)); - g_debug("GisViewer: get_rotation"); + g_assert(GRITS_IS_VIEWER(viewer)); + //g_debug("GritsViewer: get_rotation"); *x = viewer->rotation[0]; *y = viewer->rotation[1]; *z = viewer->rotation[2]; } /** - * gis_viewer_rotate: + * grits_viewer_rotate: * @viewer: the viewer * @x: rotation around the x axes * @y: rotation around the y axes @@ -363,58 +364,58 @@ void gis_viewer_get_rotation(GisViewer *viewer, gdouble *x, gdouble *y, gdouble * * Add to the rotation around the x, y, and z axes. */ -void gis_viewer_rotate(GisViewer *viewer, gdouble x, gdouble y, gdouble z) +void grits_viewer_rotate(GritsViewer *viewer, gdouble x, gdouble y, gdouble z) { - g_assert(GIS_IS_VIEWER(viewer)); - g_debug("GisViewer: rotate - x=%.0f, y=%.0f, z=%.0f", x, y, z); + g_assert(GRITS_IS_VIEWER(viewer)); + g_debug("GritsViewer: rotate - x=%.0f, y=%.0f, z=%.0f", x, y, z); viewer->rotation[0] += x; viewer->rotation[1] += y; viewer->rotation[2] += z; - _gis_viewer_emit_rotation_changed(viewer); + _grits_viewer_emit_rotation_changed(viewer); } /** - * gis_viewer_refresh: + * grits_viewer_refresh: * @viewer: the viewer * * Trigger the refresh signal. This will cause any remote data to be checked for * updates. */ -void gis_viewer_refresh(GisViewer *viewer) +void grits_viewer_refresh(GritsViewer *viewer) { - g_debug("GisViewer: refresh"); - _gis_viewer_emit_refresh(viewer); + g_debug("GritsViewer: refresh"); + _grits_viewer_emit_refresh(viewer); } /** - * gis_viewer_set_offline: + * grits_viewer_set_offline: * @viewer: the viewer * @offline: %TRUE to enter offline mode * * Set the offline mode. If @offline is %TRUE, only locally cached data will be * used. */ -void gis_viewer_set_offline(GisViewer *viewer, gboolean offline) +void grits_viewer_set_offline(GritsViewer *viewer, gboolean offline) { - g_assert(GIS_IS_VIEWER(viewer)); - g_debug("GisViewer: set_offline - %d", offline); - gis_prefs_set_boolean(viewer->prefs, "gis/offline", offline); + g_assert(GRITS_IS_VIEWER(viewer)); + g_debug("GritsViewer: set_offline - %d", offline); + grits_prefs_set_boolean(viewer->prefs, "grits/offline", offline); viewer->offline = offline; - _gis_viewer_emit_offline(viewer); + _grits_viewer_emit_offline(viewer); } /** - * gis_viewer_get_offline: + * grits_viewer_get_offline: * @viewer: the viewer * * Check if the viewer is in offline mode. * * Returns: %TRUE if the viewer is in offline mode. */ -gboolean gis_viewer_get_offline(GisViewer *viewer) +gboolean grits_viewer_get_offline(GritsViewer *viewer) { - g_assert(GIS_IS_VIEWER(viewer)); - g_debug("GisViewer: get_offline - %d", viewer->offline); + g_assert(GRITS_IS_VIEWER(viewer)); + g_debug("GritsViewer: get_offline - %d", viewer->offline); return viewer->offline; } @@ -422,7 +423,7 @@ gboolean gis_viewer_get_offline(GisViewer *viewer) * To be implemented by subclasses * ***********************************/ /** - * gis_viewer_center_position: + * grits_viewer_center_position: * @viewer: the viewer * @lat: the latitude * @lon: the longitude @@ -431,56 +432,81 @@ gboolean gis_viewer_get_offline(GisViewer *viewer) * Center the viewer on a point. This can be used before drawing operations to * center the items a particular location. */ -void gis_viewer_center_position(GisViewer *viewer, +void grits_viewer_center_position(GritsViewer *viewer, gdouble lat, gdouble lon, gdouble elev) { - GisViewerClass *klass = GIS_VIEWER_GET_CLASS(viewer); + GritsViewerClass *klass = GRITS_VIEWER_GET_CLASS(viewer); if (!klass->center_position) - g_warning("GisViewer: center_position - Unimplemented"); + g_warning("GritsViewer: center_position - Unimplemented"); klass->center_position(viewer, lat, lon, elev); } /** - * gis_viewer_project: + * grits_viewer_project: * @viewer: the viewer * @lat: the latitude - * @lon: the latitude - * @elev: the latitude + * @lon: the longitude + * @elev: the elevation * @px: the project x coordinate * @py: the project y coordinate * @pz: the project z coordinate * * Project a latitude, longitude, elevation point to to x, y, and z coordinates * in screen space. Useful for drawing orthographic data over a particular point - * in space. E.g. #GisMarker. + * in space. E.g. #GritsMarker. */ -void gis_viewer_project(GisViewer *viewer, +void grits_viewer_project(GritsViewer *viewer, gdouble lat, gdouble lon, gdouble elev, gdouble *px, gdouble *py, gdouble *pz) { - GisViewerClass *klass = GIS_VIEWER_GET_CLASS(viewer); + GritsViewerClass *klass = GRITS_VIEWER_GET_CLASS(viewer); if (!klass->project) - g_warning("GisViewer: project - Unimplemented"); + g_warning("GritsViewer: project - Unimplemented"); klass->project(viewer, lat, lon, elev, px, py, pz); } /** - * gis_viewer_clear_height_func: + * grits_viewer_unproject: + * @viewer: the viewer + * @x: x coordinate in screen space + * @y: y coordinate in screen space + * @z: z coordinate in screen space, or -1 to use the value + * from the depth buffer at x and y as the z value + * @lat: the latitude + * @lon: the longitude + * @elev: the elevation + * + * Project a x, y point in screen space to a latitude, longitude, and elevation + * point. Useful for finding the position of the cursor or another on-screen + * object in world coordinates. + */ +void grits_viewer_unproject(GritsViewer *viewer, + gdouble px, gdouble py, gdouble pz, + gdouble *lat, gdouble *lon, gdouble *elev) +{ + GritsViewerClass *klass = GRITS_VIEWER_GET_CLASS(viewer); + if (!klass->unproject) + g_warning("GritsViewer: unproject - Unimplemented"); + klass->unproject(viewer, px, py, pz, lat, lon, elev); +} + +/** + * grits_viewer_clear_height_func: * @viewer: the viewer * * Clears the height function for the entire viewer. Useful when an elevation * plugin is unloaded. */ -void gis_viewer_clear_height_func(GisViewer *viewer) +void grits_viewer_clear_height_func(GritsViewer *viewer) { - GisViewerClass *klass = GIS_VIEWER_GET_CLASS(viewer); + GritsViewerClass *klass = GRITS_VIEWER_GET_CLASS(viewer); if (!klass->clear_height_func) - g_warning("GisViewer: clear_height_func - Unimplemented"); + g_warning("GritsViewer: clear_height_func - Unimplemented"); klass->clear_height_func(viewer); } /** - * gis_viewer_set_height_func: + * grits_viewer_set_height_func: * @viewer: the viewer * @bounds: the area to set the height function for * @height_func: the height function @@ -489,18 +515,18 @@ void gis_viewer_clear_height_func(GisViewer *viewer) * * Set the height function to be used for a given part of the surface.. */ -void gis_viewer_set_height_func(GisViewer *viewer, GisBounds *bounds, - GisHeightFunc height_func, gpointer user_data, +void grits_viewer_set_height_func(GritsViewer *viewer, GritsBounds *bounds, + GritsHeightFunc height_func, gpointer user_data, gboolean update) { - GisViewerClass *klass = GIS_VIEWER_GET_CLASS(viewer); + GritsViewerClass *klass = GRITS_VIEWER_GET_CLASS(viewer); if (!klass->set_height_func) - g_warning("GisViewer: set_height_func - Unimplemented"); + g_warning("GritsViewer: set_height_func - Unimplemented"); klass->set_height_func(viewer, bounds, height_func, user_data, update); } /** - * gis_viewer_add: + * grits_viewer_add: * @viewer: the viewer * @object: the object to add * @level: the level to add the object to @@ -518,47 +544,50 @@ void gis_viewer_set_height_func(GisViewer *viewer, GisBounds *bounds, * The viewer steals the objects reference. Call g_object_ref if you plan on * holding a reference as well. * - * Returns: a handle to be pass to gis_viewer_remove() + * Returns: a handle to be pass to grits_viewer_remove() */ -gpointer gis_viewer_add(GisViewer *viewer, GisObject *object, +gpointer grits_viewer_add(GritsViewer *viewer, GritsObject *object, gint level, gboolean sort) { - GisViewerClass *klass = GIS_VIEWER_GET_CLASS(viewer); + GritsViewerClass *klass = GRITS_VIEWER_GET_CLASS(viewer); if (!klass->add) - g_warning("GisViewer: add - Unimplemented"); - return klass->add(viewer, object, level, sort); + g_warning("GritsViewer: add - Unimplemented"); + object->ref = klass->add(viewer, object, level, sort); + object->viewer = viewer; + return object; } /** - * gis_viewer_remove: + * grits_viewer_remove: * @viewer: the viewer - * @ref: the handle obtained from gis_viewer_add() + * @ref: the handle obtained from grits_viewer_add() * * Remove an object from the viewer. The objects reference count is decremented * prior to being removed. * - * Returns: the #GisObject referenced by the handle + * Returns: the #GritsObject referenced by the handle */ -GisObject *gis_viewer_remove(GisViewer *viewer, gpointer ref) +GritsObject *grits_viewer_remove(GritsViewer *viewer, GritsObject *object) { - GisViewerClass *klass = GIS_VIEWER_GET_CLASS(viewer); + GritsViewerClass *klass = GRITS_VIEWER_GET_CLASS(viewer); if (!klass->remove) - g_warning("GisViewer: remove - Unimplemented"); - return klass->remove(viewer, ref); + g_warning("GritsViewer: remove - Unimplemented"); + klass->remove(viewer, object); + return object; } /**************** * GObject code * ****************/ -G_DEFINE_ABSTRACT_TYPE(GisViewer, gis_viewer, GTK_TYPE_DRAWING_AREA); -static void gis_viewer_init(GisViewer *viewer) +G_DEFINE_ABSTRACT_TYPE(GritsViewer, grits_viewer, GTK_TYPE_DRAWING_AREA); +static void grits_viewer_init(GritsViewer *viewer) { - g_debug("GisViewer: init"); + g_debug("GritsViewer: init"); /* Default values */ viewer->time = time(NULL); viewer->location[0] = 40; viewer->location[1] = -100; - viewer->location[2] = 1.5*EARTH_R; + viewer->location[2] = EARTH_R; viewer->rotation[0] = 0; viewer->rotation[1] = 0; viewer->rotation[2] = 0; @@ -582,19 +611,20 @@ static void gis_viewer_init(GisViewer *viewer) g_signal_connect(viewer, "realize", G_CALLBACK(on_realize), NULL); } -static void gis_viewer_finalize(GObject *gobject) +static void grits_viewer_finalize(GObject *gobject) { - g_debug("GisViewer: finalize"); - G_OBJECT_CLASS(gis_viewer_parent_class)->finalize(gobject); + g_debug("GritsViewer: finalize"); + G_OBJECT_CLASS(grits_viewer_parent_class)->finalize(gobject); + g_debug("GritsViewer: finalize - done"); } -static void gis_viewer_class_init(GisViewerClass *klass) +static void grits_viewer_class_init(GritsViewerClass *klass) { - g_debug("GisViewer: class_init"); + g_debug("GritsViewer: class_init"); GObjectClass *gobject_class = G_OBJECT_CLASS(klass); - gobject_class->finalize = gis_viewer_finalize; + gobject_class->finalize = grits_viewer_finalize; /** - * GisViewer::time-changed: + * GritsViewer::time-changed: * @viewer: the viewer. * @time: the new time. * @@ -614,7 +644,7 @@ static void gis_viewer_class_init(GisViewerClass *klass) G_TYPE_LONG); /** - * GisViewer::location-changed: + * GritsViewer::location-changed: * @viewer: the viewer. * @lat: the new latitude. * @lon: the new longitude. @@ -638,7 +668,7 @@ static void gis_viewer_class_init(GisViewerClass *klass) G_TYPE_DOUBLE); /** - * GisViewer::rotation-changed: + * GritsViewer::rotation-changed: * @viewer: the viewer. * @x: rotation new around the x axes. * @y: rotation new around the y axes. @@ -662,7 +692,7 @@ static void gis_viewer_class_init(GisViewerClass *klass) G_TYPE_DOUBLE); /** - * GisViewer::refresh: + * GritsViewer::refresh: * @viewer: the viewer. * * The ::refresh signal is emitted when a refresh is needed. If you are @@ -681,7 +711,7 @@ static void gis_viewer_class_init(GisViewerClass *klass) 0); /** - * GisViewer::offline: + * GritsViewer::offline: * @viewer: the viewer. * @offline: %TRUE if the viewer going offline. *