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