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