1 /* gltrackball, Copyright (c) 2002-2012 Jamie Zawinski <jwz@jwz.org>
2 * GL-flavored wrapper for trackball.c
4 * Permission to use, copy, modify, distribute, and sell this software and its
5 * documentation for any purpose is hereby granted without fee, provided that
6 * the above copyright notice appear in all copies and that both that
7 * copyright notice and this permission notice appear in supporting
8 * documentation. No representations are made about the suitability of this
9 * software for any purpose. It is provided "as is" without express or
27 #endif /* HAVE_JWZGLES */
29 #include "trackball.h"
30 #include "gltrackball.h"
32 extern double current_device_rotation (void); /* Bah, it's in fps.h */
34 struct trackball_state {
39 /* Returns a trackball_state object, which encapsulates the stuff necessary
40 to make dragging the mouse on the window of a GL program do the right thing.
43 gltrackball_init (void)
45 trackball_state *ts = (trackball_state *) calloc (1, sizeof (*ts));
47 trackball (ts->q, 0, 0, 0, 0);
51 /* Reset the trackball to the default unrotated state.
54 gltrackball_reset (trackball_state *ts)
56 memset (ts, 0, sizeof(*ts));
57 trackball (ts->q, 0, 0, 0, 0);
61 /* Begin tracking the mouse: Call this when the mouse button goes down.
62 x and y are the mouse position relative to the window.
63 w and h are the size of the window.
66 gltrackball_start (trackball_state *ts, int x, int y, int w, int h)
72 /* Track the mouse: Call this each time the mouse moves with the button down.
73 x and y are the new mouse position relative to the window.
74 w and h are the size of the window.
77 gltrackball_track (trackball_state *ts, int x, int y, int w, int h)
81 (2.0 * ts->x - w) / w,
82 (h - 2.0 * ts->y) / h,
87 add_quats (q2, ts->q, ts->q);
90 /* Execute the rotations current encapsulated in the trackball_state:
91 this does something analagous to glRotatef().
94 gltrackball_rotate (trackball_state *ts)
97 build_rotmatrix (m, ts->q);
98 glMultMatrixf (&m[0][0]);
102 # define Button4 4 /* X11/Xlib.h */
107 /* Call this when a mouse-wheel click is detected.
108 Clicks act like horizontal or vertical drags.
109 Percent is the length of the drag as a percentage of the screen size.
110 Button is 'Button4' or 'Button5' (for the vertical wheel)
111 or 'Button5' or 'Button6' (for the horizontal wheel).
112 If `flip_p' is true, swap the horizontal and vertical axes.
115 gltrackball_mousewheel (trackball_state *ts,
116 int button, int percent, int flip_p)
123 flip_p = 0; /* MacOS has already handled this. */
127 case Button4: up_p = 1; horizontal_p = 0; break;
128 case Button5: up_p = 0; horizontal_p = 0; break;
129 case Button6: up_p = 1; horizontal_p = 1; break;
130 case Button7: up_p = 0; horizontal_p = 1; break;
131 default: abort(); break;
136 horizontal_p = !horizontal_p;
141 ? 1.0 - (percent / 100.0)
142 : 1.0 + (percent / 100.0));
144 gltrackball_start (ts, 50, 50, 100, 100);
146 gltrackball_track (ts, 50*move, 50, 100, 100);
148 gltrackball_track (ts, 50, 50*move, 100, 100);
152 gltrackball_get_quaternion (trackball_state *ts, float q[4])