vcglib/wrap/gui/trackball.h

195 lines
5.6 KiB
C
Raw Normal View History

2004-03-25 15:55:25 +01:00
/****************************************************************************
* VCGLib o o *
* Visual and Computer Graphics Library o o *
* _ O _ *
* Copyright(C) 2004
\/)\/ *
2004-03-25 15:55:25 +01:00
* Visual Computing Lab /\/| *
* ISTI - Italian National Research Council | *
* \ *
* All rights reserved. *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This program 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 General Public License (http://www.gnu.org/licenses/gpl.txt) *
* for more details. *
* *
****************************************************************************/
/****************************************************************************
History
$Log: not supported by cvs2svn $
2004-07-12 00:06:56 +02:00
Revision 1.7 2004/06/09 14:01:13 cignoni
Heavily restructured. To be completed only rotation works...
Revision 1.6 2004/05/14 03:15:09 ponchio
Redesigned partial version.
2004-05-14 05:15:09 +02:00
Revision 1.5 2004/05/12 20:55:18 ponchio
*** empty log message ***
2004-05-12 22:55:18 +02:00
Revision 1.4 2004/05/07 12:46:08 cignoni
Restructured and adapted in a better way to opengl
Revision 1.3 2004/04/07 10:54:10 cignoni
Commented out unused parameter names and other minor warning related issues
Revision 1.2 2004/03/25 14:55:25 ponchio
Adding copyright.
2004-03-25 15:55:25 +01:00
****************************************************************************/
2004-03-25 15:50:08 +01:00
#ifndef TRACKBALL_H
#define TRACKBALL_H
#include <vcg/math/similarity.h>
#include <wrap/gui/view.h>
#include <wrap/gui/trackmode.h>
#include <list>
#include <vector>
2004-03-25 15:50:08 +01:00
#include <map>
namespace vcg {
/* A trackball stores a transformation called 'track' that effectively rotate the object.
the rotation center, and size are kept in center and radius.
2004-05-14 05:15:09 +02:00
*/
class Transform {
public:
Transform();
Similarityf track;
/// la posizione della track nello spazio di modello. il defgault e' 000
Point3f center;
/// size of the widget in spazio di modello.
float radius;
};
Transform interpolate(const Transform &a, const Transform &b, float t);
class TrackMode;
2004-07-12 00:06:56 +02:00
class Trackball: public Transform {
2004-05-14 05:15:09 +02:00
public:
2004-07-12 00:06:56 +02:00
class DrawingHint
{
public:
DrawingHint() { CircleStep=32; }
int CircleStep;
};
DrawingHint DH;
2004-05-14 05:15:09 +02:00
enum Button { BUTTON_NONE = 0x0000,
BUTTON_LEFT = 0x0001,
BUTTON_MIDDLE = 0x0002,
BUTTON_RIGHT = 0x0004,
WHEEL = 0x0008,
KEY_SHIFT = 0x0010,
KEY_CTRL = 0x0020,
KEY_ALT = 0x0040,
HANDLE = 0x0080 };
Trackball();
~Trackball();
void SetIdentity();
void SetPosition(const Point3f &c, int millisec = 0);
void SetScale(const float s) {radius=s;};
void SetTransform(const Transform &transform, int miilisec = 0);
//operating
2004-07-12 00:06:56 +02:00
void GetView();\
2004-05-14 05:15:09 +02:00
void Apply();
void ApplyInverse();
2004-05-14 05:15:09 +02:00
void Draw();
void ApplynDraw() { Apply(); Draw(); }
void Reset();
// Internal Drawing stuff
2004-07-12 00:06:56 +02:00
void DrawCircle ();
void DrawPlane();
void DrawPlaneHandle();
2004-05-14 05:15:09 +02:00
//interface
void MouseDown(int x, int y, /*Button*/ int button);
2004-05-14 05:15:09 +02:00
void MouseMove(int x, int y);
void MouseUp(int x, int y, /*Button */ int button);
2004-07-12 00:06:56 +02:00
void MouseWheel(float notch); // it assumes that a notch of 1.0 is a single step of the wheel
2004-05-14 05:15:09 +02:00
void ButtonUp(Button button);
void ButtonDown(Button button);
//default sensitivity 1
void SetSensitivity(float s);
//spinning interface
void SetSpinnable(bool on);
bool IsSpinnable();
void SetSpinning(Quaternionf &spin);
void StopSpinning();
bool IsSpinning();
//interfaccia navigation:
void Back();
void Forward();
void Home();
void Store();
void HistorySize(int lenght);
//internals
enum Action { NONE = 0,
VIEW_ROTATE = 1,
// Axis Constrained Rotation
TRACK_ROTATE_X = 3, TRACK_ROTATE_Y = 4, TRACK_ROTATE_Z = 5,
// Drag constrained to an axis (trackball axis)
DRAG_X = 6, DRAG_Y = 7, DRAG_Z = 8,
// Drag constrained to a plane
DRAG_XY = 9, DRAG_YZ = 10, DRAG_XZ = 11,
//scale model respect to center of trackball
VIEW_SCALE = 12,
//scale trackball and model
TRACK_SCALE = 13
};
2004-03-25 15:50:08 +01:00
2004-05-14 05:15:09 +02:00
//protected:
View<float> camera;
void SetCurrentAction();
2004-05-14 05:15:09 +02:00
int current_button;
TrackMode *current_mode;
2004-07-12 00:06:56 +02:00
2004-05-14 05:15:09 +02:00
std::map<int, TrackMode *> modes;
2004-03-25 15:50:08 +01:00
2004-05-14 05:15:09 +02:00
Similarityf last_track;
Similarityf last_view;
Point3f last_point;
std::vector<Point3f> Hits;
2004-05-14 05:15:09 +02:00
bool dragging;
int button_mask;
2004-03-25 15:50:08 +01:00
2004-05-14 05:15:09 +02:00
Quaternionf spin;
bool spinnable;
bool spinning;
2004-03-25 15:50:08 +01:00
2004-05-14 05:15:09 +02:00
std::list<Transform> history;
int history_size;
2004-03-25 15:50:08 +01:00
2004-05-14 05:15:09 +02:00
friend class TrackMode;
};
2004-03-25 15:50:08 +01:00
}//namespace
2004-05-14 05:15:09 +02:00
#endif