X-Git-Url: http://pileus.org/git/?p=grits;a=blobdiff_plain;f=src%2Fgrits-viewer.c;h=92f6e863617940792d2c532074218ef82110bb1b;hp=08d73bbf29c45ea2d748aa903e4475d144513ada;hb=e8af1dabca07d2b7a26369d845a81efeae3e08a0;hpb=98eee86d69c0ee2aa198270e55b8b815c1914567 diff --git a/src/grits-viewer.c b/src/grits-viewer.c index 08d73bb..92f6e86 100644 --- a/src/grits-viewer.c +++ b/src/grits-viewer.c @@ -163,9 +163,9 @@ static gboolean on_motion_notify(GritsViewer *viewer, GdkEventMotion *event, gpo 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/15) * (sin(deg2rad(ABS(rx)))*4+1); + 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; } @@ -180,13 +180,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 * ***********/ @@ -445,8 +438,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 @@ -465,6 +458,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 @@ -562,7 +580,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; @@ -583,8 +601,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) {