-/* gltrackball, Copyright (c) 2002 Jamie Zawinski <jwz@jwz.org>
+/* gltrackball, Copyright (c) 2002-2008 Jamie Zawinski <jwz@jwz.org>
* GL-flavored wrapper for trackball.c
*
* Permission to use, copy, modify, distribute, and sell this software and its
* implied warranty.
*/
-#include "config.h"
-#include <stdlib.h>
#include <math.h>
-#include <GL/gl.h>
+#include <stdlib.h>
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#ifdef HAVE_COCOA
+# include <OpenGL/gl.h>
+#else
+# include <GL/gl.h>
+#endif
+
#include "trackball.h"
#include "gltrackball.h"
build_rotmatrix (m, ts->q);
glMultMatrixf (&m[0][0]);
}
+
+
+# define Button4 4 /* X11/Xlib.h */
+# define Button5 5
+# define Button6 6
+# define Button7 7
+
+/* Call this when a mouse-wheel click is detected.
+ Clicks act like horizontal or vertical drags.
+ Percent is the length of the drag as a percentage of the screen size.
+ Button is 'Button4' or 'Button5' (for the vertical wheel)
+ or 'Button5' or 'Button6' (for the horizontal wheel).
+ If `flip_p' is true, swap the horizontal and vertical axes.
+ */
+void
+gltrackball_mousewheel (trackball_state *ts,
+ int button, int percent, int flip_p)
+{
+ int up_p;
+ double move;
+ int horizontal_p;
+
+#ifdef HAVE_COCOA
+ flip_p = 0; /* MacOS has already handled this. */
+#endif
+
+ switch (button) {
+ case Button4: up_p = 1; horizontal_p = 0; break;
+ case Button5: up_p = 0; horizontal_p = 0; break;
+ case Button6: up_p = 1; horizontal_p = 1; break;
+ case Button7: up_p = 0; horizontal_p = 1; break;
+ default: abort(); break;
+ }
+
+ if (flip_p)
+ {
+ horizontal_p = !horizontal_p;
+ up_p = !up_p;
+ }
+
+ move = (up_p
+ ? 1.0 - (percent / 100.0)
+ : 1.0 + (percent / 100.0));
+
+ gltrackball_start (ts, 50, 50, 100, 100);
+ if (horizontal_p)
+ gltrackball_track (ts, 50*move, 50, 100, 100);
+ else
+ gltrackball_track (ts, 50, 50*move, 100, 100);
+}
+
+void
+gltrackball_get_quaternion (trackball_state *ts, float q[4])
+{
+ int i;
+ for (i=0; i<4; i++)
+ q[i] = ts->q[i];
+}