1 /* gltrackball, Copyright (c) 2002 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
17 #include "trackball.h"
18 #include "gltrackball.h"
20 struct trackball_state {
25 /* Returns a trackball_state object, which encapsulates the stuff necessary
26 to make dragging the mouse on the window of a GL program do the right thing.
29 gltrackball_init (void)
31 trackball_state *ts = (trackball_state *) calloc (1, sizeof (*ts));
33 trackball (ts->q, 0, 0, 0, 0);
37 /* Begin tracking the mouse: Call this when the mouse button goes down.
38 x and y are the mouse position relative to the window.
39 w and h are the size of the window.
42 gltrackball_start (trackball_state *ts, int x, int y, int w, int h)
48 /* Track the mouse: Call this each time the mouse moves with the button down.
49 x and y are the new mouse position relative to the window.
50 w and h are the size of the window.
53 gltrackball_track (trackball_state *ts, int x, int y, int w, int h)
57 (2.0 * ts->x - w) / w,
58 (h - 2.0 * ts->y) / h,
63 add_quats (q2, ts->q, ts->q);
66 /* Execute the rotations current encapsulated in the trackball_state:
67 this does something analagous to glRotatef().
70 gltrackball_rotate (trackball_state *ts)
73 build_rotmatrix (m, ts->q);
74 glMultMatrixf (&m[0][0]);