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
22class 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();
100    ~RenderingWidget() { }
101
102    QWidget* createNavigationControlWidget();
103};
104
105class 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