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