98 lines
3.3 KiB
C
98 lines
3.3 KiB
C
|
/**********************************************************************
|
||
|
|
||
|
arcball.h
|
||
|
|
||
|
GLUI User Interface Toolkit (LGPL)
|
||
|
Copyright (c) 1998 Paul Rademacher
|
||
|
Feb 1998, Paul Rademacher (rademach@cs.unc.edu)
|
||
|
Oct 2003, Nigel Stewart - GLUI Code Cleaning
|
||
|
|
||
|
|
||
|
WWW: http://sourceforge.net/projects/glui/
|
||
|
Forums: http://sourceforge.net/forum/?group_id=92496
|
||
|
|
||
|
This library is free software; you can redistribute it and/or
|
||
|
modify it under the terms of the GNU Lesser General Public
|
||
|
License as published by the Free Software Foundation; either
|
||
|
version 2.1 of the License, or (at your option) any later version.
|
||
|
|
||
|
This library is distributed in the hope that it will be useful,
|
||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||
|
Lesser General Public License for more details.
|
||
|
|
||
|
You should have received a copy of the GNU Lesser General Public
|
||
|
License along with this library; if not, write to the Free Software
|
||
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||
|
|
||
|
---------------------------------------------------------------------
|
||
|
|
||
|
A C++ class that implements the Arcball, as described by Ken
|
||
|
Shoemake in Graphics Gems IV.
|
||
|
This class takes as input mouse events (mouse down, mouse drag,
|
||
|
mouse up), and creates the appropriate quaternions and 4x4 matrices
|
||
|
to represent the rotation given by the mouse.
|
||
|
|
||
|
This class is used as follows:
|
||
|
- initialize [either in the constructor or with set_params()], the
|
||
|
center position (x,y) of the arcball on the screen, and the radius
|
||
|
- on mouse down, call mouse_down(x,y) with the mouse position
|
||
|
- as the mouse is dragged, repeatedly call mouse_motion() with the
|
||
|
current x and y positions. One can optionally pass in the current
|
||
|
state of the SHIFT, ALT, and CONTROL keys (passing zero if keys
|
||
|
are not pressed, non-zero otherwise), which constrains
|
||
|
the rotation to certain axes (X for CONTROL, Y for ALT).
|
||
|
- when the mouse button is released, call mouse_up()
|
||
|
|
||
|
Axis constraints can also be explicitly set with the
|
||
|
set_constraints() function.
|
||
|
|
||
|
The current rotation is stored in the 4x4 float matrix 'rot'.
|
||
|
It is also stored in the quaternion 'q_now'.
|
||
|
|
||
|
**********************************************************************/
|
||
|
|
||
|
#ifndef GLUI_ARCBALL_H
|
||
|
#define GLUI_ARCBALL_H
|
||
|
|
||
|
#include "glui_internal.h"
|
||
|
#include "algebra3.h"
|
||
|
#include "quaternion.h"
|
||
|
|
||
|
class Arcball
|
||
|
{
|
||
|
public:
|
||
|
Arcball();
|
||
|
Arcball(mat4 *mtx);
|
||
|
Arcball(const vec2 ¢er, float radius);
|
||
|
|
||
|
void set_damping(float d);
|
||
|
void idle();
|
||
|
void mouse_down(int x, int y);
|
||
|
void mouse_up();
|
||
|
void mouse_motion(int x, int y, int shift, int ctrl, int alt);
|
||
|
void mouse_motion(int x, int y);
|
||
|
void set_constraints(bool constrain_x, bool constrain_y);
|
||
|
void set_params(const vec2 ¢er, float radius);
|
||
|
void reset_mouse();
|
||
|
void init();
|
||
|
|
||
|
vec3 constrain_vector(const vec3 &vector, const vec3 &axis);
|
||
|
vec3 mouse_to_sphere(const vec2 &p);
|
||
|
|
||
|
//public:
|
||
|
int is_mouse_down; /* true for down, false for up */
|
||
|
int is_spinning;
|
||
|
quat q_now, q_down, q_drag, q_increment;
|
||
|
vec2 down_pt;
|
||
|
mat4 rot, rot_increment;
|
||
|
mat4 *rot_ptr;
|
||
|
|
||
|
bool constraint_x, constraint_y;
|
||
|
vec2 center;
|
||
|
float radius, damp_factor;
|
||
|
int zero_increment;
|
||
|
};
|
||
|
|
||
|
#endif
|