manipulatedFrame.h
1 /****************************************************************************
2 
3  Copyright (C) 2002-2013 Gilles Debunne. All rights reserved.
4 
5  This file is part of the QGLViewer library version 2.5.2.
6 
7  http://www.libqglviewer.com - contact@libqglviewer.com
8 
9  This file may be used under the terms of the GNU General Public License
10  versions 2.0 or 3.0 as published by the Free Software Foundation and
11  appearing in the LICENSE file included in the packaging of this file.
12  In addition, as a special exception, Gilles Debunne gives you certain
13  additional rights, described in the file GPL_EXCEPTION in this package.
14 
15  libQGLViewer uses dual licensing. Commercial/proprietary software must
16  purchase a libQGLViewer Commercial License.
17 
18  This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
19  WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
20 
21 *****************************************************************************/
22 
23 #ifndef QGLVIEWER_MANIPULATED_FRAME_H
24 #define QGLVIEWER_MANIPULATED_FRAME_H
25 
26 #include "frame.h"
27 #include "mouseGrabber.h"
28 #include "qglviewer.h"
29 
30 #include <QString>
31 #include <QTimer>
32 #include <QDateTime>
33 
34 namespace qglviewer {
95 class QGLVIEWER_EXPORT ManipulatedFrame : public Frame, public MouseGrabber
96 {
97 #ifndef DOXYGEN
98  friend class Camera;
99  friend class ::QGLViewer;
100 #endif
101 
102  Q_OBJECT
103 
104 public:
107  virtual ~ManipulatedFrame() {}
108 
110  ManipulatedFrame& operator=(const ManipulatedFrame& mf);
111 
112 Q_SIGNALS:
124  void manipulated();
125 
136  void spun();
137 
140 public Q_SLOTS:
142  void setRotationSensitivity(float sensitivity) { rotationSensitivity_ = sensitivity; }
144  void setTranslationSensitivity(float sensitivity) { translationSensitivity_ = sensitivity; }
146  void setSpinningSensitivity(float sensitivity) { spinningSensitivity_ = sensitivity; }
148  void setWheelSensitivity(float sensitivity) { wheelSensitivity_ = sensitivity; }
150  void setZoomSensitivity(float sensitivity) { zoomSensitivity_ = sensitivity; }
151 
152 public:
161  float rotationSensitivity() const { return rotationSensitivity_; }
180  float translationSensitivity() const { return translationSensitivity_; }
192  float spinningSensitivity() const { return spinningSensitivity_; }
193 
201  float zoomSensitivity() const { return zoomSensitivity_; }
209  float wheelSensitivity() const { return wheelSensitivity_; }
211 
212 
215 public:
222  bool isSpinning() const { return isSpinning_; }
231  Quaternion spinningQuaternion() const { return spinningQuaternion_; }
232 public Q_SLOTS:
235  void setSpinningQuaternion(const Quaternion& spinningQuaternion) { spinningQuaternion_ = spinningQuaternion; }
236  virtual void startSpinning(int updateInterval);
239  virtual void stopSpinning() { spinningTimer_.stop(); isSpinning_ = false; }
240 protected Q_SLOTS:
241  virtual void spin();
242 private Q_SLOTS:
243  void spinUpdate();
245 
248 protected:
249  virtual void mousePressEvent (QMouseEvent* const event, Camera* const camera);
250  virtual void mouseMoveEvent (QMouseEvent* const event, Camera* const camera);
251  virtual void mouseReleaseEvent (QMouseEvent* const event, Camera* const camera);
252  virtual void mouseDoubleClickEvent(QMouseEvent* const event, Camera* const camera);
253  virtual void wheelEvent (QWheelEvent* const event, Camera* const camera);
255 
256 public:
259  bool isManipulated() const;
268  QGLViewer::MouseAction currentMouseAction() const { return action_; }
270 
273 public:
274  virtual void checkIfGrabsMouse(int x, int y, const Camera* const camera);
276 
279 public:
280  virtual QDomElement domElement(const QString& name, QDomDocument& document) const;
281 public Q_SLOTS:
282  virtual void initFromDOMElement(const QDomElement& element);
284 
285 #ifndef DOXYGEN
286 protected:
287  Quaternion deformedBallQuaternion(int x, int y, float cx, float cy, const Camera* const camera);
288 
289  QGLViewer::MouseAction action_;
290  Constraint* previousConstraint_; // When manipulation is without Contraint.
291 
292  virtual void startAction(int ma, bool withConstraint=true); // int is really a QGLViewer::MouseAction
293  void computeMouseSpeed(const QMouseEvent* const e);
294  int mouseOriginalDirection(const QMouseEvent* const e);
295 
298  float deltaWithPrevPos(QMouseEvent* const event, Camera* const camera) const;
300  float wheelDelta(const QWheelEvent* event) const;
301 
302  // Previous mouse position (used for incremental updates) and mouse press position.
303  QPoint prevPos_, pressPos_;
304 
305 private:
306  void zoom(float delta, const Camera * const camera);
307 
308 #endif // DOXYGEN
309 
310 private:
311  // Sensitivity
312  float rotationSensitivity_;
313  float translationSensitivity_;
314  float spinningSensitivity_;
315  float wheelSensitivity_;
316  float zoomSensitivity_;
317 
318  // Mouse speed and spinning
319  QTime last_move_time;
320  float mouseSpeed_;
321  int delay_;
322  bool isSpinning_;
323  QTimer spinningTimer_;
324  Quaternion spinningQuaternion_;
325 
326  // Whether the SCREEN_TRANS direction (horizontal or vertical) is fixed or not.
327  bool dirIsFixed_;
328 
329  // MouseGrabber
330  bool keepsGrabbingMouse_;
331 };
332 
333 } // namespace qglviewer
334 
335 #endif // QGLVIEWER_MANIPULATED_FRAME_H
virtual ~ManipulatedFrame()
Virtual destructor.
A ManipulatedFrame is a Frame that can be rotated and translated using the mouse. ...
bool isSpinning() const
Returns true when the ManipulatedFrame is spinning.
MouseAction
Defines the possible actions that can be binded to a mouse action (a click, followed by a mouse displ...
Definition: qglviewer.h:969
Quaternion spinningQuaternion() const
Returns the incremental rotation that is applied by spin() to the ManipulatedFrame orientation when i...
float wheelSensitivity() const
Returns the mouse wheel sensitivity.
Abstract class for objects that grab mouse focus in a QGLViewer.
Definition: mouseGrabber.h:130
float rotationSensitivity() const
Returns the influence of a mouse displacement on the ManipulatedFrame rotation.
void setSpinningSensitivity(float sensitivity)
Defines the spinningSensitivity(), in pixels per milliseconds.
void setRotationSensitivity(float sensitivity)
Defines the rotationSensitivity().
void setWheelSensitivity(float sensitivity)
Defines the wheelSensitivity().
float translationSensitivity() const
Returns the influence of a mouse displacement on the ManipulatedFrame translation.
QGLViewer::MouseAction currentMouseAction() const
Returns the MouseAction currently applied to this ManipulatedFrame.
void setSpinningQuaternion(const Quaternion &spinningQuaternion)
Defines the spinningQuaternion().
float zoomSensitivity() const
Returns the zoom sensitivity.
A perspective or orthographic camera.
Definition: camera.h:84
void setZoomSensitivity(float sensitivity)
Defines the zoomSensitivity().
The Quaternion class represents 3D rotations and orientations.
Definition: quaternion.h:66
virtual void stopSpinning()
Stops the spinning motion started using startSpinning().
The Frame class represents a coordinate system, defined by a position and an orientation.
Definition: frame.h:121
void setTranslationSensitivity(float sensitivity)
Defines the translationSensitivity().
An interface class for Frame constraints.
Definition: constraint.h:117
float spinningSensitivity() const
Returns the minimum mouse speed required (at button release) to make the ManipulatedFrame spin()...