+static int mbstate[3];
+static int prev_x, prev_y;
+
+static void mouse(int bn, int st, int x, int y)
+{
+ int bidx = bn - GLUT_LEFT_BUTTON;
+ int press = st == GLUT_DOWN ? 1 : 0;
+
+ if(bidx < 3) {
+ mbstate[bidx] = press;
+ }
+ prev_x = x;
+ prev_y = y;
+}
+
+static void motion(int x, int y)
+{
+ int dx, dy;
+
+ dx = x - prev_x;
+ dy = y - prev_y;
+ prev_x = x;
+ prev_y = y;
+
+ if(!(dx | dy)) return;
+
+ if(mbstate[0]) {
+ view_dtheta -= dx * 0x100;
+ view_dphi -= dy * 0x100;
+ }
+ if(mbstate[2]) {
+ view_zoom += dy * 0x100;
+ if(view_zoom < 0) view_zoom = 0;
+ }
+}
+