00001 /* 00002 ----------------------------------------------------------------------------- 00003 This source file is part of OGRE 00004 (Object-oriented Graphics Rendering Engine) 00005 For the latest info, see http://www.ogre3d.org 00006 00007 Copyright (c) 2000-2012 Torus Knot Software Ltd 00008 00009 Permission is hereby granted, free of charge, to any person obtaining a copy 00010 of this software and associated documentation files (the "Software"), to deal 00011 in the Software without restriction, including without limitation the rights 00012 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 00013 copies of the Software, and to permit persons to whom the Software is 00014 furnished to do so, subject to the following conditions: 00015 00016 The above copyright notice and this permission notice shall be included in 00017 all copies or substantial portions of the Software. 00018 00019 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 00020 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 00021 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 00022 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 00023 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 00024 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 00025 THE SOFTWARE. 00026 ----------------------------------------------------------------------------- 00027 */ 00028 #ifndef __Camera_H__ 00029 #define __Camera_H__ 00030 00031 // Default options 00032 #include "OgrePrerequisites.h" 00033 00034 #include "OgreString.h" 00035 #include "OgreMovableObject.h" 00036 00037 // Matrices & Vectors 00038 #include "OgreMatrix4.h" 00039 #include "OgreVector3.h" 00040 #include "OgrePlane.h" 00041 #include "OgreQuaternion.h" 00042 #include "OgreCommon.h" 00043 #include "OgreFrustum.h" 00044 #include "OgreRay.h" 00045 #include "OgrePlaneBoundedVolume.h" 00046 00047 00048 namespace Ogre { 00049 00085 class _OgreExport Camera : public Frustum 00086 { 00087 public: 00090 class _OgreExport Listener 00091 { 00092 public: 00093 Listener() {} 00094 virtual ~Listener() {} 00095 00097 virtual void cameraPreRenderScene(Camera* cam) 00098 { (void)cam; } 00099 00101 virtual void cameraPostRenderScene(Camera* cam) 00102 { (void)cam; } 00103 00105 virtual void cameraDestroyed(Camera* cam) 00106 { (void)cam; } 00107 00108 }; 00109 protected: 00111 SceneManager *mSceneMgr; 00112 00114 Quaternion mOrientation; 00115 00117 Vector3 mPosition; 00118 00120 mutable Quaternion mDerivedOrientation; 00121 mutable Vector3 mDerivedPosition; 00122 00124 mutable Quaternion mRealOrientation; 00125 mutable Vector3 mRealPosition; 00126 00128 bool mYawFixed; 00130 Vector3 mYawFixedAxis; 00131 00133 PolygonMode mSceneDetail; 00134 00136 unsigned int mVisFacesLastRender; 00137 00139 unsigned int mVisBatchesLastRender; 00140 00142 static String msMovableType; 00143 00145 SceneNode* mAutoTrackTarget; 00147 Vector3 mAutoTrackOffset; 00148 00149 // Scene LOD factor used to adjust overall LOD 00150 Real mSceneLodFactor; 00152 Real mSceneLodFactorInv; 00153 00154 00159 Real mWLeft, mWTop, mWRight, mWBottom; 00161 bool mWindowSet; 00163 mutable vector<Plane>::type mWindowClipPlanes; 00164 // Was viewing window changed. 00165 mutable bool mRecalcWindow; 00167 Viewport* mLastViewport; 00171 bool mAutoAspectRatio; 00173 Frustum *mCullFrustum; 00175 bool mUseRenderingDistance; 00177 const Camera* mLodCamera; 00178 00180 bool mUseMinPixelSize; 00182 Real mPixelDisplayRatio; 00183 00184 typedef vector<Listener*>::type ListenerList; 00185 ListenerList mListeners; 00186 00187 00188 // Internal functions for calcs 00189 bool isViewOutOfDate(void) const; 00191 void invalidateFrustum(void) const; 00193 void invalidateView(void) const; 00194 00195 00200 virtual void setWindowImpl(void) const; 00201 00203 virtual vector<Vector4>::type getRayForwardIntersect(const Vector3& anchor, const Vector3 *dir, Real planeOffset) const; 00204 00205 public: 00208 Camera( const String& name, SceneManager* sm); 00209 00212 virtual ~Camera(); 00213 00215 virtual void addListener(Listener* l); 00217 virtual void removeListener(Listener* l); 00218 00221 SceneManager* getSceneManager(void) const; 00222 00230 void setPolygonMode(PolygonMode sd); 00231 00234 PolygonMode getPolygonMode(void) const; 00235 00238 void setPosition(Real x, Real y, Real z); 00239 00242 void setPosition(const Vector3& vec); 00243 00246 const Vector3& getPosition(void) const; 00247 00250 void move(const Vector3& vec); 00251 00254 void moveRelative(const Vector3& vec); 00255 00261 void setDirection(Real x, Real y, Real z); 00262 00265 void setDirection(const Vector3& vec); 00266 00267 /* Gets the camera's direction. 00268 */ 00269 Vector3 getDirection(void) const; 00270 00273 Vector3 getUp(void) const; 00274 00277 Vector3 getRight(void) const; 00278 00287 void lookAt( const Vector3& targetPoint ); 00300 void lookAt(Real x, Real y, Real z); 00301 00304 void roll(const Radian& angle); 00305 00308 void yaw(const Radian& angle); 00309 00312 void pitch(const Radian& angle); 00313 00316 void rotate(const Vector3& axis, const Radian& angle); 00317 00320 void rotate(const Quaternion& q); 00321 00341 void setFixedYawAxis( bool useFixed, const Vector3& fixedAxis = Vector3::UNIT_Y ); 00342 00343 00346 const Quaternion& getOrientation(void) const; 00347 00350 void setOrientation(const Quaternion& q); 00351 00356 void _renderScene(Viewport *vp, bool includeOverlays); 00357 00360 _OgreExport friend std::ostream& operator<<(std::ostream& o, const Camera& c); 00361 00364 void _notifyRenderedFaces(unsigned int numfaces); 00365 00368 void _notifyRenderedBatches(unsigned int numbatches); 00369 00372 unsigned int _getNumRenderedFaces(void) const; 00373 00376 unsigned int _getNumRenderedBatches(void) const; 00377 00380 const Quaternion& getDerivedOrientation(void) const; 00383 const Vector3& getDerivedPosition(void) const; 00386 Vector3 getDerivedDirection(void) const; 00389 Vector3 getDerivedUp(void) const; 00392 Vector3 getDerivedRight(void) const; 00393 00396 const Quaternion& getRealOrientation(void) const; 00399 const Vector3& getRealPosition(void) const; 00402 Vector3 getRealDirection(void) const; 00405 Vector3 getRealUp(void) const; 00408 Vector3 getRealRight(void) const; 00409 00411 void getWorldTransforms(Matrix4* mat) const; 00412 00414 const String& getMovableType(void) const; 00415 00435 void setAutoTracking(bool enabled, SceneNode* const target = 0, 00436 const Vector3& offset = Vector3::ZERO); 00437 00438 00454 void setLodBias(Real factor = 1.0); 00455 00460 Real getLodBias(void) const; 00461 00474 virtual void setLodCamera(const Camera* lodCam); 00475 00482 virtual const Camera* getLodCamera() const; 00483 00484 00489 Ray getCameraToViewportRay(Real screenx, Real screeny) const; 00495 void getCameraToViewportRay(Real screenx, Real screeny, Ray* outRay) const; 00496 00507 PlaneBoundedVolume getCameraToViewportBoxVolume(Real screenLeft, 00508 Real screenTop, Real screenRight, Real screenBottom, bool includeFarPlane = false); 00509 00521 void getCameraToViewportBoxVolume(Real screenLeft, 00522 Real screenTop, Real screenRight, Real screenBottom, 00523 PlaneBoundedVolume* outVolume, bool includeFarPlane = false); 00524 00526 Real _getLodBiasInverse(void) const; 00527 00528 00530 void _autoTrack(void); 00531 00532 00542 virtual void setWindow (Real Left, Real Top, Real Right, Real Bottom); 00544 virtual void resetWindow (void); 00546 virtual bool isWindowSet(void) const { return mWindowSet; } 00548 const vector<Plane>::type& getWindowPlanes(void) const; 00549 00551 Real getBoundingRadius(void) const; 00553 SceneNode* getAutoTrackTarget(void) const { return mAutoTrackTarget; } 00555 const Vector3& getAutoTrackOffset(void) const { return mAutoTrackOffset; } 00556 00562 Viewport* getViewport(void) const {return mLastViewport;} 00564 void _notifyViewport(Viewport* viewport) {mLastViewport = viewport;} 00565 00573 void setAutoAspectRatio(bool autoratio); 00574 00577 bool getAutoAspectRatio(void) const; 00578 00590 void setCullingFrustum(Frustum* frustum) { mCullFrustum = frustum; } 00592 Frustum* getCullingFrustum(void) const { return mCullFrustum; } 00593 00598 virtual void forwardIntersect(const Plane& worldPlane, vector<Vector4>::type* intersect3d) const; 00599 00601 bool isVisible(const AxisAlignedBox& bound, FrustumPlane* culledBy = 0) const; 00603 bool isVisible(const Sphere& bound, FrustumPlane* culledBy = 0) const; 00605 bool isVisible(const Vector3& vert, FrustumPlane* culledBy = 0) const; 00607 const Vector3* getWorldSpaceCorners(void) const; 00609 const Plane& getFrustumPlane( unsigned short plane ) const; 00611 bool projectSphere(const Sphere& sphere, 00612 Real* left, Real* top, Real* right, Real* bottom) const; 00614 Real getNearClipDistance(void) const; 00616 Real getFarClipDistance(void) const; 00618 const Matrix4& getViewMatrix(void) const; 00627 const Matrix4& getViewMatrix(bool ownFrustumOnly) const; 00633 virtual void setUseRenderingDistance(bool use) { mUseRenderingDistance = use; } 00637 virtual bool getUseRenderingDistance(void) const { return mUseRenderingDistance; } 00638 00645 virtual void synchroniseBaseSettingsWith(const Camera* cam); 00646 00648 const Vector3& getPositionForViewUpdate(void) const; 00650 const Quaternion& getOrientationForViewUpdate(void) const; 00651 00657 void setUseMinPixelSize(bool enable) { mUseMinPixelSize = enable; } 00661 bool getUseMinPixelSize() const { return mUseMinPixelSize; } 00662 00673 Real getPixelDisplayRatio() const { return mPixelDisplayRatio; } 00674 00675 }; 00679 } // namespace Ogre 00680 #endif
Copyright © 2012 Torus Knot Software Ltd
This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.
Last modified Fri May 25 23:36:23 2012