X-Git-Url: http://pileus.org/git/?a=blobdiff_plain;f=src%2Fgrits-viewer.c;h=79765e12a6933080f5efded6dd20a4ed02fe6e50;hb=461ca7ead68c77f2745e747f89e29b242a192f4a;hp=bfc704b35baeeeacf63c604aaa585404c8e326e2;hpb=032ddbf6f1d5abbfc96e236e3a9f22b867f009f1;p=grits diff --git a/src/grits-viewer.c b/src/grits-viewer.c index bfc704b..79765e1 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 @@ -61,6 +61,16 @@ static void _grits_viewer_fix_location(GritsViewer *viewer) viewer->location[2] = ABS(viewer->location[2]); } +static void _grits_viewer_fix_rotation(GritsViewer *viewer) +{ + while (viewer->rotation[0] < -180) viewer->rotation[0] += 360; + while (viewer->rotation[0] > 180) viewer->rotation[0] -= 360; + while (viewer->rotation[1] < -180) viewer->rotation[1] += 360; + while (viewer->rotation[1] > 180) viewer->rotation[1] -= 360; + while (viewer->rotation[2] < -180) viewer->rotation[2] += 360; + while (viewer->rotation[2] > 180) viewer->rotation[2] -= 360; +} + /* Signal helpers */ static void _grits_viewer_emit_location_changed(GritsViewer *viewer) { @@ -160,11 +170,12 @@ static gboolean on_motion_notify(GritsViewer *viewer, GdkEventMotion *event, gpo { gdouble x = viewer->drag_x - event->x; gdouble y = viewer->drag_y - event->y; - gdouble lat, lon, elev, scale; + gdouble lat, lon, elev, scale, rx, ry, rz; grits_viewer_get_location(GRITS_VIEWER(viewer), &lat, &lon, &elev); - scale = elev/EARTH_R/15; + 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 GRITS_DRAG_PAN: grits_viewer_pan(viewer, -y*scale, x*scale, 0); 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; } @@ -179,13 +190,6 @@ static void on_view_changed(GritsViewer *viewer, gtk_widget_queue_draw(GTK_WIDGET(viewer)); } -static void on_realize(GritsViewer *viewer) -{ - GdkCursor *cursor = gdk_cursor_new(GDK_FLEUR); - GdkWindow *window = gtk_widget_get_window(GTK_WIDGET(viewer)); - gdk_window_set_cursor(window, cursor); -} - /*********** * Methods * ***********/ @@ -333,6 +337,7 @@ void grits_viewer_set_rotation(GritsViewer *viewer, gdouble x, gdouble y, gdoubl viewer->rotation[0] = x; viewer->rotation[1] = y; viewer->rotation[2] = z; + _grits_viewer_fix_rotation(viewer); _grits_viewer_emit_rotation_changed(viewer); } @@ -348,7 +353,7 @@ void grits_viewer_set_rotation(GritsViewer *viewer, gdouble x, gdouble y, gdoubl void grits_viewer_get_rotation(GritsViewer *viewer, gdouble *x, gdouble *y, gdouble *z) { g_assert(GRITS_IS_VIEWER(viewer)); - g_debug("GritsViewer: get_rotation"); + //g_debug("GritsViewer: get_rotation"); *x = viewer->rotation[0]; *y = viewer->rotation[1]; *z = viewer->rotation[2]; @@ -370,6 +375,7 @@ void grits_viewer_rotate(GritsViewer *viewer, gdouble x, gdouble y, gdouble z) viewer->rotation[0] += x; viewer->rotation[1] += y; viewer->rotation[2] += z; + _grits_viewer_fix_rotation(viewer); _grits_viewer_emit_rotation_changed(viewer); } @@ -444,8 +450,8 @@ void grits_viewer_center_position(GritsViewer *viewer, * 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 @@ -464,6 +470,31 @@ void grits_viewer_project(GritsViewer *viewer, klass->project(viewer, lat, lon, elev, px, py, pz); } +/** + * 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 @@ -541,15 +572,12 @@ gpointer grits_viewer_add(GritsViewer *viewer, GritsObject *object, * * Returns: the #GritsObject referenced by the handle */ -GritsObject *grits_viewer_remove(GritsViewer *viewer, gpointer _object) +GritsObject *grits_viewer_remove(GritsViewer *viewer, GritsObject *object) { - GritsObject *object = _object; GritsViewerClass *klass = GRITS_VIEWER_GET_CLASS(viewer); if (!klass->remove) g_warning("GritsViewer: remove - Unimplemented"); - klass->remove(viewer, object->ref); - object->ref = NULL; - object->viewer = NULL; + klass->remove(viewer, object); return object; } @@ -564,7 +592,7 @@ static void grits_viewer_init(GritsViewer *viewer) 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; @@ -585,8 +613,6 @@ static void grits_viewer_init(GritsViewer *viewer) g_signal_connect(viewer, "location-changed", G_CALLBACK(on_view_changed), NULL); g_signal_connect(viewer, "rotation-changed", G_CALLBACK(on_view_changed), NULL); - - g_signal_connect(viewer, "realize", G_CALLBACK(on_realize), NULL); } static void grits_viewer_finalize(GObject *gobject) {