// This file is part of Eigen, a lightweight C++ template library
// for linear algebra.
//
// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud@inria.fr>
//
// This Source Code Form is subject to the terms of the Mozilla
// Public License v. 2.0. If a copy of the MPL was not distributed
// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.

#ifndef EIGEN_QUATERNION_DEMO_H
#define EIGEN_QUATERNION_DEMO_H

#include "gpuhelper.h"
#include "camera.h"
#include "trackball.h"
#include <map>
#include <QTimer>
#include <QtGui/QApplication>
#include <QtOpenGL/QGLWidget>
#include <QtGui/QMainWindow>

class RenderingWidget : public QGLWidget {
  Q_OBJECT

  typedef std::map<float, Frame> TimeLine;
  TimeLine m_timeline;
  Frame lerpFrame(float t);

  Frame mInitFrame;
  bool mAnimate;
  float m_alpha;

  enum TrackMode { TM_NO_TRACK = 0, TM_ROTATE_AROUND, TM_ZOOM, TM_LOCAL_ROTATE, TM_FLY_Z, TM_FLY_PAN };

  enum NavMode { NavTurnAround, NavFly };

  enum LerpMode { LerpQuaternion, LerpEulerAngles };

  enum RotationMode { RotationStable, RotationStandard };

  Camera mCamera;
  TrackMode mCurrentTrackingMode;
  NavMode mNavMode;
  LerpMode mLerpMode;
  RotationMode mRotationMode;
  Vector2i mMouseCoords;
  Trackball mTrackball;

  QTimer m_timer;

  void setupCamera();

  std::vector<Vector3f> mVertices;
  std::vector<Vector3f> mNormals;
  std::vector<int> mIndices;

 protected slots:

  virtual void animate(void);
  virtual void drawScene(void);

  virtual void grabFrame(void);
  virtual void stopAnimation();

  virtual void setNavMode(int);
  virtual void setLerpMode(int);
  virtual void setRotationMode(int);
  virtual void resetCamera();

 protected:
  virtual void initializeGL();
  virtual void resizeGL(int width, int height);
  virtual void paintGL();

  //--------------------------------------------------------------------------------
  virtual void mousePressEvent(QMouseEvent* e);
  virtual void mouseReleaseEvent(QMouseEvent* e);
  virtual void mouseMoveEvent(QMouseEvent* e);
  virtual void keyPressEvent(QKeyEvent* e);
  //--------------------------------------------------------------------------------

 public:
  EIGEN_MAKE_ALIGNED_OPERATOR_NEW

  RenderingWidget();
  ~RenderingWidget() {}

  QWidget* createNavigationControlWidget();
};

class QuaternionDemo : public QMainWindow {
  Q_OBJECT
 public:
  QuaternionDemo();

 protected:
  RenderingWidget* mRenderingWidget;
};

#endif  // EIGEN_QUATERNION_DEMO_H
