+static void sball_motion(int x, int y, int z)
+{
+ sball_pos.x += (float)x * 0.001;
+ sball_pos.y += (float)y * 0.001;
+ sball_pos.z -= (float)z * 0.001;
+ sball_update_pending = true;
+}
+
+static void sball_rotate(int x, int y, int z)
+{
+ Vec3 axis = Vec3(x, y, -z);
+ float axis_len = length(axis);
+ if(axis_len > 0.0f) {
+ Quat q;
+ q.set_rotation(axis / axis_len, axis_len * 0.001);
+ sball_rot = q * sball_rot;
+ sball_update_pending = true;
+ }
+}
+
+static void sball_button(int bn, int st)
+{
+ if(st != GLUT_DOWN) return;
+
+ sball_pos = Vec3(0, 0, 0);
+ sball_rot = Quat::identity;
+ sball_xform = Mat4::identity;
+}
+