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 __Frustum_H__ 00029 #define __Frustum_H__ 00030 00031 #include "OgrePrerequisites.h" 00032 #include "OgreMovableObject.h" 00033 #include "OgreRenderable.h" 00034 #include "OgreAxisAlignedBox.h" 00035 #include "OgreVertexIndexData.h" 00036 #include "OgreMovablePlane.h" 00037 00038 namespace Ogre 00039 { 00048 enum OrientationMode 00049 { 00050 OR_DEGREE_0 = 0, 00051 OR_DEGREE_90 = 1, 00052 OR_DEGREE_180 = 2, 00053 OR_DEGREE_270 = 3, 00054 00055 OR_PORTRAIT = OR_DEGREE_0, 00056 OR_LANDSCAPERIGHT = OR_DEGREE_90, 00057 OR_LANDSCAPELEFT = OR_DEGREE_270 00058 }; 00059 00062 enum ProjectionType 00063 { 00064 PT_ORTHOGRAPHIC, 00065 PT_PERSPECTIVE 00066 }; 00067 00070 enum FrustumPlane 00071 { 00072 FRUSTUM_PLANE_NEAR = 0, 00073 FRUSTUM_PLANE_FAR = 1, 00074 FRUSTUM_PLANE_LEFT = 2, 00075 FRUSTUM_PLANE_RIGHT = 3, 00076 FRUSTUM_PLANE_TOP = 4, 00077 FRUSTUM_PLANE_BOTTOM = 5 00078 }; 00079 00084 class _OgreExport Frustum : public MovableObject, public Renderable 00085 { 00086 protected: 00088 ProjectionType mProjType; 00089 00091 Radian mFOVy; 00093 Real mFarDist; 00095 Real mNearDist; 00097 Real mAspect; 00099 Real mOrthoHeight; 00101 Vector2 mFrustumOffset; 00103 Real mFocalLength; 00104 00106 mutable Plane mFrustumPlanes[6]; 00107 00109 mutable Quaternion mLastParentOrientation; 00110 mutable Vector3 mLastParentPosition; 00111 00113 mutable Matrix4 mProjMatrixRS; 00115 mutable Matrix4 mProjMatrixRSDepth; 00117 mutable Matrix4 mProjMatrix; 00119 mutable Matrix4 mViewMatrix; 00121 mutable bool mRecalcFrustum; 00123 mutable bool mRecalcView; 00125 mutable bool mRecalcFrustumPlanes; 00127 mutable bool mRecalcWorldSpaceCorners; 00129 mutable bool mRecalcVertexData; 00131 bool mCustomViewMatrix; 00133 bool mCustomProjMatrix; 00135 bool mFrustumExtentsManuallySet; 00137 mutable Real mLeft, mRight, mTop, mBottom; 00139 mutable OrientationMode mOrientationMode; 00140 00141 // Internal functions for calcs 00142 virtual void calcProjectionParameters(Real& left, Real& right, Real& bottom, Real& top) const; 00144 virtual void updateFrustum(void) const; 00146 virtual void updateView(void) const; 00148 virtual void updateFrustumImpl(void) const; 00150 virtual void updateViewImpl(void) const; 00151 virtual void updateFrustumPlanes(void) const; 00153 virtual void updateFrustumPlanesImpl(void) const; 00154 virtual void updateWorldSpaceCorners(void) const; 00156 virtual void updateWorldSpaceCornersImpl(void) const; 00157 virtual void updateVertexData(void) const; 00158 virtual bool isViewOutOfDate(void) const; 00159 virtual bool isFrustumOutOfDate(void) const; 00161 virtual void invalidateFrustum(void) const; 00163 virtual void invalidateView(void) const; 00164 00166 static String msMovableType; 00167 00168 mutable AxisAlignedBox mBoundingBox; 00169 mutable VertexData mVertexData; 00170 00171 MaterialPtr mMaterial; 00172 mutable Vector3 mWorldSpaceCorners[8]; 00173 00175 bool mReflect; 00177 mutable Matrix4 mReflectMatrix; 00179 mutable Plane mReflectPlane; 00181 const MovablePlane* mLinkedReflectPlane; 00183 mutable Plane mLastLinkedReflectionPlane; 00184 00186 bool mObliqueDepthProjection; 00188 mutable Plane mObliqueProjPlane; 00190 const MovablePlane* mLinkedObliqueProjPlane; 00192 mutable Plane mLastLinkedObliqueProjPlane; 00193 00194 public: 00195 00197 Frustum(const String& name = StringUtil::BLANK); 00198 00199 virtual ~Frustum(); 00212 virtual void setFOVy(const Radian& fovy); 00213 00216 virtual const Radian& getFOVy(void) const; 00217 00229 virtual void setNearClipDistance(Real nearDist); 00230 00233 virtual Real getNearClipDistance(void) const; 00234 00255 virtual void setFarClipDistance(Real farDist); 00256 00259 virtual Real getFarClipDistance(void) const; 00260 00269 virtual void setAspectRatio(Real ratio); 00270 00273 virtual Real getAspectRatio(void) const; 00274 00286 virtual void setFrustumOffset(const Vector2& offset); 00287 00301 virtual void setFrustumOffset(Real horizontal = 0.0, Real vertical = 0.0); 00302 00305 virtual const Vector2& getFrustumOffset() const; 00306 00311 virtual void setFocalLength(Real focalLength = 1.0); 00312 00315 virtual Real getFocalLength() const; 00316 00321 virtual void setFrustumExtents(Real left, Real right, Real top, Real bottom); 00323 virtual void resetFrustumExtents(); 00325 virtual void getFrustumExtents(Real& outleft, Real& outright, Real& outtop, Real& outbottom) const; 00326 00327 00337 virtual const Matrix4& getProjectionMatrixRS(void) const; 00349 virtual const Matrix4& getProjectionMatrixWithRSDepth(void) const; 00359 virtual const Matrix4& getProjectionMatrix(void) const; 00360 00363 virtual const Matrix4& getViewMatrix(void) const; 00364 00369 virtual void calcViewMatrixRelative(const Vector3& relPos, Matrix4& matToUpdate) const; 00370 00388 virtual void setCustomViewMatrix(bool enable, 00389 const Matrix4& viewMatrix = Matrix4::IDENTITY); 00391 virtual bool isCustomViewMatrixEnabled(void) const 00392 { return mCustomViewMatrix; } 00393 00413 virtual void setCustomProjectionMatrix(bool enable, 00414 const Matrix4& projectionMatrix = Matrix4::IDENTITY); 00416 virtual bool isCustomProjectionMatrixEnabled(void) const 00417 { return mCustomProjMatrix; } 00418 00423 virtual const Plane* getFrustumPlanes(void) const; 00424 00429 virtual const Plane& getFrustumPlane( unsigned short plane ) const; 00430 00442 virtual bool isVisible(const AxisAlignedBox& bound, FrustumPlane* culledBy = 0) const; 00443 00455 virtual bool isVisible(const Sphere& bound, FrustumPlane* culledBy = 0) const; 00456 00468 virtual bool isVisible(const Vector3& vert, FrustumPlane* culledBy = 0) const; 00469 00471 uint32 getTypeFlags(void) const; 00472 00474 const AxisAlignedBox& getBoundingBox(void) const; 00475 00477 Real getBoundingRadius(void) const; 00478 00480 void _updateRenderQueue(RenderQueue* queue); 00481 00483 const String& getMovableType(void) const; 00484 00486 void _notifyCurrentCamera(Camera* cam); 00487 00489 const MaterialPtr& getMaterial(void) const; 00490 00492 void getRenderOperation(RenderOperation& op); 00493 00495 void getWorldTransforms(Matrix4* xform) const; 00496 00498 Real getSquaredViewDepth(const Camera* cam) const; 00499 00501 const LightList& getLights(void) const; 00502 00509 virtual const Vector3* getWorldSpaceCorners(void) const; 00510 00513 virtual void setProjectionType(ProjectionType pt); 00514 00517 virtual ProjectionType getProjectionType(void) const; 00518 00526 virtual void setOrthoWindow(Real w, Real h); 00531 virtual void setOrthoWindowHeight(Real h); 00536 virtual void setOrthoWindowWidth(Real w); 00539 virtual Real getOrthoWindowHeight() const; 00543 virtual Real getOrthoWindowWidth() const; 00544 00550 virtual void enableReflection(const Plane& p); 00559 virtual void enableReflection(const MovablePlane* p); 00560 00562 virtual void disableReflection(void); 00563 00565 virtual bool isReflected(void) const { return mReflect; } 00567 virtual const Matrix4& getReflectionMatrix(void) const { return mReflectMatrix; } 00569 virtual const Plane& getReflectionPlane(void) const { return mReflectPlane; } 00570 00580 virtual bool projectSphere(const Sphere& sphere, 00581 Real* left, Real* top, Real* right, Real* bottom) const; 00582 00583 00609 virtual void enableCustomNearClipPlane(const MovablePlane* plane); 00630 virtual void enableCustomNearClipPlane(const Plane& plane); 00632 virtual void disableCustomNearClipPlane(void); 00634 virtual bool isCustomNearClipPlaneEnabled(void) const 00635 { return mObliqueDepthProjection; } 00636 00638 void visitRenderables(Renderable::Visitor* visitor, 00639 bool debugRenderables = false); 00640 00642 static const Real INFINITE_FAR_PLANE_ADJUST; 00643 00645 virtual const Vector3& getPositionForViewUpdate(void) const; 00647 virtual const Quaternion& getOrientationForViewUpdate(void) const; 00648 00651 PlaneBoundedVolume getPlaneBoundedVolume(); 00657 void setOrientationMode(OrientationMode orientationMode); 00658 00664 OrientationMode getOrientationMode() const; 00665 00666 }; 00667 00671 } 00672 00673 #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:24 2012