1 // This file is part of Eigen, a lightweight C++ template library
2 // for linear algebra.
3 //
4 // Copyright (C) 2008 Gael Guennebaud <gael.guennebaud@inria.fr>
5 //
6 // This Source Code Form is subject to the terms of the Mozilla
7 // Public License v. 2.0. If a copy of the MPL was not distributed
8 // with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
9 
10 #ifndef EIGEN_QUATERNION_DEMO_H
11 #define EIGEN_QUATERNION_DEMO_H
12 
13 #include "gpuhelper.h"
14 #include "camera.h"
15 #include "trackball.h"
16 #include <map>
17 #include <QTimer>
18 #include <QtGui/QApplication>
19 #include <QtOpenGL/QGLWidget>
20 #include <QtGui/QMainWindow>
21 
22 class RenderingWidget : public QGLWidget
23 {
24   Q_OBJECT
25 
26     typedef std::map<float,Frame> TimeLine;
27     TimeLine m_timeline;
28     Frame lerpFrame(float t);
29 
30     Frame mInitFrame;
31     bool mAnimate;
32     float m_alpha;
33 
34     enum TrackMode {
35       TM_NO_TRACK=0, TM_ROTATE_AROUND, TM_ZOOM,
36       TM_LOCAL_ROTATE, TM_FLY_Z, TM_FLY_PAN
37     };
38 
39     enum NavMode {
40       NavTurnAround,
41       NavFly
42     };
43 
44     enum LerpMode {
45       LerpQuaternion,
46       LerpEulerAngles
47     };
48 
49     enum RotationMode {
50       RotationStable,
51       RotationStandard
52     };
53 
54     Camera mCamera;
55     TrackMode mCurrentTrackingMode;
56     NavMode mNavMode;
57     LerpMode mLerpMode;
58     RotationMode mRotationMode;
59     Vector2i mMouseCoords;
60     Trackball mTrackball;
61 
62     QTimer m_timer;
63 
64     void setupCamera();
65 
66     std::vector<Vector3f> mVertices;
67     std::vector<Vector3f> mNormals;
68     std::vector<int> mIndices;
69 
70   protected slots:
71 
72     virtual void animate(void);
73     virtual void drawScene(void);
74 
75     virtual void grabFrame(void);
76     virtual void stopAnimation();
77 
78     virtual void setNavMode(int);
79     virtual void setLerpMode(int);
80     virtual void setRotationMode(int);
81     virtual void resetCamera();
82 
83   protected:
84 
85     virtual void initializeGL();
86     virtual void resizeGL(int width, int height);
87     virtual void paintGL();
88 
89     //--------------------------------------------------------------------------------
90     virtual void mousePressEvent(QMouseEvent * e);
91     virtual void mouseReleaseEvent(QMouseEvent * e);
92     virtual void mouseMoveEvent(QMouseEvent * e);
93     virtual void keyPressEvent(QKeyEvent * e);
94     //--------------------------------------------------------------------------------
95 
96   public:
97     EIGEN_MAKE_ALIGNED_OPERATOR_NEW
98 
99     RenderingWidget();
~RenderingWidget()100     ~RenderingWidget() { }
101 
102     QWidget* createNavigationControlWidget();
103 };
104 
105 class QuaternionDemo : public QMainWindow
106 {
107   Q_OBJECT
108   public:
109     QuaternionDemo();
110   protected:
111     RenderingWidget* mRenderingWidget;
112 };
113 
114 #endif // EIGEN_QUATERNION_DEMO_H
115