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_CAMERA_H
11c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#define EIGEN_CAMERA_H
12c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
13c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#include <Eigen/Geometry>
14c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#include <QObject>
15c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// #include <frame.h>
16c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
17c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathclass Frame
18c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
19c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  public:
20c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    EIGEN_MAKE_ALIGNED_OPERATOR_NEW
21c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
22c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    inline Frame(const Eigen::Vector3f& pos = Eigen::Vector3f::Zero(),
23c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                 const Eigen::Quaternionf& o = Eigen::Quaternionf())
24c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      : orientation(o), position(pos)
25c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    {}
26c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    Frame lerp(float alpha, const Frame& other) const
27c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    {
28c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      return Frame((1.f-alpha)*position + alpha * other.position,
29c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                   orientation.slerp(alpha,other.orientation));
30c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
31c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
32c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    Eigen::Quaternionf orientation;
33c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    Eigen::Vector3f position;
34c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath};
35c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
36c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathclass Camera
37c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
38c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  public:
39c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    EIGEN_MAKE_ALIGNED_OPERATOR_NEW
40c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
41c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    Camera(void);
42c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
43c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    Camera(const Camera& other);
44c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
45c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    virtual ~Camera();
46c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
47c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    Camera& operator=(const Camera& other);
48c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
49c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    void setViewport(uint offsetx, uint offsety, uint width, uint height);
50c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    void setViewport(uint width, uint height);
51c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
52c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    inline uint vpX(void) const { return mVpX; }
53c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    inline uint vpY(void) const { return mVpY; }
54c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    inline uint vpWidth(void) const { return mVpWidth; }
55c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    inline uint vpHeight(void) const { return mVpHeight; }
56c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
57c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    inline float fovY(void) const { return mFovY; }
58c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    void setFovY(float value);
59c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
60c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    void setPosition(const Eigen::Vector3f& pos);
61c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    inline const Eigen::Vector3f& position(void) const { return mFrame.position; }
62c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
63c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    void setOrientation(const Eigen::Quaternionf& q);
64c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    inline const Eigen::Quaternionf& orientation(void) const { return mFrame.orientation; }
65c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
66c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    void setFrame(const Frame& f);
67c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    const Frame& frame(void) const { return mFrame; }
68c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
69c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    void setDirection(const Eigen::Vector3f& newDirection);
70c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    Eigen::Vector3f direction(void) const;
71c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    void setUp(const Eigen::Vector3f& vectorUp);
72c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    Eigen::Vector3f up(void) const;
73c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    Eigen::Vector3f right(void) const;
74c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
75c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    void setTarget(const Eigen::Vector3f& target);
76c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    inline const Eigen::Vector3f& target(void) { return mTarget; }
77c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
78c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    const Eigen::Affine3f& viewMatrix(void) const;
79c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    const Eigen::Matrix4f& projectionMatrix(void) const;
80c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
81c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    void rotateAroundTarget(const Eigen::Quaternionf& q);
82c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    void localRotate(const Eigen::Quaternionf& q);
83c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    void zoom(float d);
84c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
85c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    void localTranslate(const Eigen::Vector3f& t);
86c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
87c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    /** Setup OpenGL matrices and viewport */
88c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    void activateGL(void);
89c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
90c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    Eigen::Vector3f unProject(const Eigen::Vector2f& uv, float depth, const Eigen::Matrix4f& invModelview) const;
91c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    Eigen::Vector3f unProject(const Eigen::Vector2f& uv, float depth) const;
92c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
93c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  protected:
94c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    void updateViewMatrix(void) const;
95c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    void updateProjectionMatrix(void) const;
96c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
97c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  protected:
98c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
99c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    uint mVpX, mVpY;
100c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    uint mVpWidth, mVpHeight;
101c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
102c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    Frame mFrame;
103c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
104c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    mutable Eigen::Affine3f mViewMatrix;
105c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    mutable Eigen::Matrix4f mProjectionMatrix;
106c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
107c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    mutable bool mViewIsUptodate;
108c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    mutable bool mProjIsUptodate;
109c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
110c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    // used by rotateAroundTarget
111c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    Eigen::Vector3f mTarget;
112c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
113c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    float mFovY;
114c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    float mNearDist;
115c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    float mFarDist;
116c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath};
117c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
118c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif // EIGEN_CAMERA_H
119