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)
{
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;
}
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 *
***********/
viewer->rotation[0] = x;
viewer->rotation[1] = y;
viewer->rotation[2] = z;
+ _grits_viewer_fix_rotation(viewer);
_grits_viewer_emit_rotation_changed(viewer);
}
viewer->rotation[0] += x;
viewer->rotation[1] += y;
viewer->rotation[2] += z;
+ _grits_viewer_fix_rotation(viewer);
_grits_viewer_emit_rotation_changed(viewer);
}
*
* 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 grits_viewer_remove()
*/
-gpointer grits_viewer_add(GritsViewer *viewer, GritsObject *object,
+void grits_viewer_add(GritsViewer *viewer, GritsObject *object,
gint level, gboolean sort)
{
GritsViewerClass *klass = GRITS_VIEWER_GET_CLASS(viewer);
if (!klass->add)
g_warning("GritsViewer: add - Unimplemented");
- object->ref = klass->add(viewer, object, level, sort);
object->viewer = viewer;
- return object;
+ klass->add(viewer, object, level, sort);
}
/**
* grits_viewer_remove:
* @viewer: the viewer
- * @ref: the handle obtained from grits_viewer_add()
+ * @object: the object to remove
*
- * Remove an object from the viewer. The objects reference count is decremented
- * prior to being removed.
- *
- * Returns: the #GritsObject referenced by the handle
+ * Remove an object from the viewer.
+ * The objects reference count is decremented.
*/
-GritsObject *grits_viewer_remove(GritsViewer *viewer, GritsObject *object)
+void grits_viewer_remove(GritsViewer *viewer, GritsObject *object)
{
GritsViewerClass *klass = GRITS_VIEWER_GET_CLASS(viewer);
+ if (!object->viewer)
+ return;
if (!klass->remove)
g_warning("GritsViewer: remove - Unimplemented");
+ object->viewer = NULL;
klass->remove(viewer, object);
- return object;
+ g_object_unref(object);
}
/****************
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;
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)
{