+
+static void passive_motion(int x, int y)
+{
+ prev_mx = x;
+ prev_my = y;
+}
+
+static Gear *pick_gear(int x, int y)
+{
+ double pt[3];
+ double viewmat[16], projmat[16];
+ int vp[4];
+ Ray ray;
+
+ y = win_height - y;
+
+ glGetDoublev(GL_MODELVIEW_MATRIX, viewmat);
+ glGetDoublev(GL_PROJECTION_MATRIX, projmat);
+ glGetIntegerv(GL_VIEWPORT, vp);
+
+ gluUnProject(x, y, 0, viewmat, projmat, vp, pt, pt + 1, pt + 2);
+ ray.origin = Vec3(pt[0], pt[1], pt[2]) * 1000.0f;
+
+ gluUnProject(x, y, 1, viewmat, projmat, vp, pt, pt + 1, pt + 2);
+ ray.dir = Vec3(pt[0], pt[1], pt[2]) * 1000.0f - ray.origin;
+
+ return machine->intersect_gear(ray, &pick_hit);
+}