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-2006 Torus Knot Software Ltd 00008 Also see acknowledgements in Readme.html 00009 00010 This program is free software; you can redistribute it and/or modify it under 00011 the terms of the GNU Lesser General Public License as published by the Free Software 00012 Foundation; either version 2 of the License, or (at your option) any later 00013 version. 00014 00015 This program is distributed in the hope that it will be useful, but WITHOUT 00016 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 00017 FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. 00018 00019 You should have received a copy of the GNU Lesser General Public License along with 00020 this program; if not, write to the Free Software Foundation, Inc., 59 Temple 00021 Place - Suite 330, Boston, MA 02111-1307, USA, or go to 00022 http://www.gnu.org/copyleft/lesser.txt. 00023 00024 You may alternatively use this source under the terms of a specific version of 00025 the OGRE Unrestricted License provided you have obtained such a license from 00026 Torus Knot Software Ltd. 00027 ----------------------------------------------------------------------------- 00028 */ 00029 #ifndef __Entity_H__ 00030 #define __Entity_H__ 00031 00032 #include "OgrePrerequisites.h" 00033 #include "OgreCommon.h" 00034 00035 #include "OgreString.h" 00036 #include "OgreMovableObject.h" 00037 #include "OgreQuaternion.h" 00038 #include "OgreVector3.h" 00039 #include "OgreHardwareBufferManager.h" 00040 #include "OgreMesh.h" 00041 #include "OgreRenderable.h" 00042 00043 namespace Ogre { 00075 class _OgreExport Entity: public MovableObject, public Resource::Listener 00076 { 00077 // Allow EntityFactory full access 00078 friend class EntityFactory; 00079 friend class SubEntity; 00080 public: 00081 typedef std::set<Entity*> EntitySet; 00082 00083 protected: 00084 00087 Entity(); 00090 Entity( const String& name, const MeshPtr& mesh); 00091 00094 MeshPtr mMesh; 00095 00098 typedef std::vector<SubEntity*> SubEntityList; 00099 SubEntityList mSubEntityList; 00100 00101 00103 AnimationStateSet* mAnimationState; 00104 00105 00107 TempBlendedBufferInfo mTempSkelAnimInfo; 00109 VertexData* mSkelAnimVertexData; 00111 TempBlendedBufferInfo mTempVertexAnimInfo; 00113 VertexData* mSoftwareVertexAnimVertexData; 00117 VertexData* mHardwareVertexAnimVertexData; 00119 bool mVertexAnimationAppliedThisFrame; 00121 bool mPreparedForShadowVolumes; 00122 00125 const VertexData* findBlendedVertexData(const VertexData* orig); 00128 SubEntity* findSubEntityForVertexData(const VertexData* orig); 00129 00132 void extractTempBufferInfo(VertexData* sourceData, TempBlendedBufferInfo* info); 00134 VertexData* cloneVertexDataRemoveBlendInfo(const VertexData* source); 00136 void prepareTempBlendBuffers(void); 00139 void markBuffersUnusedForAnimation(void); 00143 void restoreBuffersForUnusedAnimation(bool hardwareAnimation); 00144 00150 void bindMissingHardwarePoseBuffers(const VertexData* srcData, 00151 VertexData* destData); 00152 00154 Matrix4 *mBoneWorldMatrices; 00156 Matrix4 *mBoneMatrices; 00157 unsigned short mNumBoneMatrices; 00159 unsigned long mFrameAnimationLastUpdated; 00160 00162 void updateAnimation(void); 00163 00167 unsigned long *mFrameBonesLastUpdated; 00168 00174 EntitySet* mSharedSkeletonEntities; 00175 00177 void cacheBoneMatrices(void); 00178 00180 bool mDisplaySkeleton; 00182 bool mHardwareAnimation; 00184 ushort mHardwarePoseCount; 00186 bool mVertexProgramInUse; 00188 int mSoftwareAnimationRequests; 00190 int mSoftwareAnimationNormalsRequests; 00191 00192 00194 ushort mMeshLodIndex; 00195 00197 Real mMeshLodFactorInv; 00199 ushort mMinMeshLodIndex; 00201 ushort mMaxMeshLodIndex; 00202 00204 Real mMaterialLodFactorInv; 00206 ushort mMinMaterialLodIndex; 00208 ushort mMaxMaterialLodIndex; 00209 00215 typedef std::vector<Entity*> LODEntityList; 00216 LODEntityList mLodEntityList; 00217 00220 SkeletonInstance* mSkeletonInstance; 00221 00223 bool mInitialised; 00224 00226 Matrix4 mLastParentXform; 00227 00229 size_t mMeshStateCount; 00230 00232 void buildSubEntityList(MeshPtr& mesh, SubEntityList* sublist); 00233 00235 void attachObjectImpl(MovableObject *pMovable, TagPoint *pAttachingPoint); 00236 00238 void detachObjectImpl(MovableObject* pObject); 00239 00241 void detachAllObjectsImpl(void); 00242 00244 void reevaluateVertexProcessing(void); 00245 00247 void applyVertexAnimation(bool hardwareAnimation, bool stencilShadows); 00249 void initHardwareAnimationElements(VertexData* vdata, 00250 ushort numberOfElements); 00252 bool tempVertexAnimBuffersBound(void) const; 00254 bool tempSkelAnimBuffersBound(bool requestNormals) const; 00255 00256 public: 00258 typedef std::map<String, MovableObject*> ChildObjectList; 00259 protected: 00260 ChildObjectList mChildObjectList; 00261 00262 00264 mutable AxisAlignedBox mFullBoundingBox; 00265 00266 ShadowRenderableList mShadowRenderables; 00267 00269 class _OgreExport EntityShadowRenderable : public ShadowRenderable 00270 { 00271 protected: 00272 Entity* mParent; 00273 // Shared link to position buffer 00274 HardwareVertexBufferSharedPtr mPositionBuffer; 00275 // Shared link to w-coord buffer (optional) 00276 HardwareVertexBufferSharedPtr mWBuffer; 00277 // Link to current vertex data used to bind (maybe changes) 00278 const VertexData* mCurrentVertexData; 00279 // Original position buffer source binding 00280 unsigned short mOriginalPosBufferBinding; 00282 SubEntity* mSubEntity; 00283 00284 00285 public: 00286 EntityShadowRenderable(Entity* parent, 00287 HardwareIndexBufferSharedPtr* indexBuffer, const VertexData* vertexData, 00288 bool createSeparateLightCap, SubEntity* subent, bool isLightCap = false); 00289 ~EntityShadowRenderable(); 00291 void getWorldTransforms(Matrix4* xform) const; 00292 HardwareVertexBufferSharedPtr getPositionBuffer(void) { return mPositionBuffer; } 00293 HardwareVertexBufferSharedPtr getWBuffer(void) { return mWBuffer; } 00295 void rebindPositionBuffer(const VertexData* vertexData, bool force); 00297 bool isVisible(void) const; 00298 00299 }; 00300 public: 00303 ~Entity(); 00304 00307 const MeshPtr& getMesh(void) const; 00308 00311 SubEntity* getSubEntity(unsigned int index) const; 00312 00316 SubEntity* getSubEntity( const String& name ) const; 00317 00320 unsigned int getNumSubEntities(void) const; 00321 00331 Entity* clone( const String& newName ) const; 00332 00341 void setMaterialName(const String& name); 00342 00343 00352 void setMaterial(const MaterialPtr& material); 00353 00356 void _notifyCurrentCamera(Camera* cam); 00357 00359 void setRenderQueueGroup(uint8 queueID); 00360 00363 const AxisAlignedBox& getBoundingBox(void) const; 00364 00366 AxisAlignedBox getChildObjectsBoundingBox(void) const; 00367 00370 void _updateRenderQueue(RenderQueue* queue); 00371 00373 const String& getMovableType(void) const; 00374 00381 AnimationState* getAnimationState(const String& name) const; 00391 AnimationStateSet* getAllAnimationStates(void) const; 00392 00395 void setDisplaySkeleton(bool display); 00396 00399 bool getDisplaySkeleton(void) const; 00400 00401 00407 Entity* getManualLodLevel(size_t index) const; 00408 00414 size_t getNumManualLodLevels(void) const; 00415 00418 ushort getCurrentLodIndex() { return mMeshLodIndex; } 00419 00446 void setMeshLodBias(Real factor, ushort maxDetailIndex = 0, ushort minDetailIndex = 99); 00447 00474 void setMaterialLodBias(Real factor, ushort maxDetailIndex = 0, ushort minDetailIndex = 99); 00475 00479 void setPolygonModeOverrideable(bool PolygonModeOverrideable); 00494 TagPoint* attachObjectToBone(const String &boneName, 00495 MovableObject *pMovable, 00496 const Quaternion &offsetOrientation = Quaternion::IDENTITY, 00497 const Vector3 &offsetPosition = Vector3::ZERO); 00498 00503 MovableObject* detachObjectFromBone(const String &movableName); 00504 00511 void detachObjectFromBone(MovableObject* obj); 00512 00514 void detachAllObjectsFromBone(void); 00515 00516 typedef MapIterator<ChildObjectList> ChildObjectListIterator; 00518 ChildObjectListIterator getAttachedObjectIterator(void); 00520 Real getBoundingRadius(void) const; 00521 00523 const AxisAlignedBox& getWorldBoundingBox(bool derive = false) const; 00525 const Sphere& getWorldBoundingSphere(bool derive = false) const; 00526 00528 EdgeData* getEdgeList(void); 00530 bool hasEdgeList(void); 00532 ShadowRenderableListIterator getShadowVolumeRenderableIterator( 00533 ShadowTechnique shadowTechnique, const Light* light, 00534 HardwareIndexBufferSharedPtr* indexBuffer, 00535 bool extrudeVertices, Real extrusionDistance, unsigned long flags = 0 ); 00536 00538 const Matrix4* _getBoneMatrices(void) const { return mBoneMatrices;} 00540 unsigned short _getNumBoneMatrices(void) const { return mNumBoneMatrices; } 00542 bool hasSkeleton(void) const { return mSkeletonInstance != 0; } 00544 SkeletonInstance* getSkeleton(void) const { return mSkeletonInstance; } 00556 bool isHardwareAnimationEnabled(void) const { return mHardwareAnimation; } 00557 00559 void _notifyAttached(Node* parent, bool isTagPoint = false); 00567 int getSoftwareAnimationRequests(void) const { return mSoftwareAnimationRequests; } 00579 int getSoftwareAnimationNormalsRequests(void) const { return mSoftwareAnimationNormalsRequests; } 00595 void addSoftwareAnimationRequest(bool normalsAlso); 00604 void removeSoftwareAnimationRequest(bool normalsAlso); 00605 00610 void shareSkeletonInstanceWith(Entity* entity); 00611 00614 bool hasVertexAnimation(void) const; 00615 00616 00619 void stopSharingSkeletonInstance(); 00620 00621 00625 inline bool sharesSkeletonInstance() const { return mSharedSkeletonEntities != NULL; } 00626 00631 inline const EntitySet* getSkeletonInstanceSharingSet() const { return mSharedSkeletonEntities; } 00632 00643 void refreshAvailableAnimationState(void); 00644 00652 void _updateAnimation(void); 00653 00659 bool _isAnimated(void) const; 00660 00663 bool _isSkeletonAnimated(void) const; 00664 00674 VertexData* _getSkelAnimVertexData(void) const; 00683 VertexData* _getSoftwareVertexAnimVertexData(void) const; 00688 VertexData* _getHardwareVertexAnimVertexData(void) const; 00692 TempBlendedBufferInfo* _getSkelAnimTempBufferInfo(void); 00696 TempBlendedBufferInfo* _getVertexAnimTempBufferInfo(void); 00698 uint32 getTypeFlags(void) const; 00700 VertexData* getVertexDataForBinding(void); 00701 00703 enum VertexDataBindChoice 00704 { 00705 BIND_ORIGINAL, 00706 BIND_SOFTWARE_SKELETAL, 00707 BIND_SOFTWARE_MORPH, 00708 BIND_HARDWARE_MORPH 00709 }; 00711 VertexDataBindChoice chooseVertexDataForBinding(bool hasVertexAnim) const; 00712 00714 bool _getBuffersMarkedForAnimation(void) const { return mVertexAnimationAppliedThisFrame; } 00717 void _markBuffersUsedForAnimation(void); 00718 00727 bool isInitialised(void) const { return mInitialised; } 00728 00739 void _initialise(bool forceReinitialise = false); 00741 void _deinitialise(void); 00742 00746 void backgroundLoadingComplete(Resource* res); 00747 00749 void visitRenderables(Renderable::Visitor* visitor, 00750 bool debugRenderables = false); 00751 00752 00753 00754 00755 }; 00756 00758 class _OgreExport EntityFactory : public MovableObjectFactory 00759 { 00760 protected: 00761 MovableObject* createInstanceImpl( const String& name, const NameValuePairList* params); 00762 public: 00763 EntityFactory() {} 00764 ~EntityFactory() {} 00765 00766 static String FACTORY_TYPE_NAME; 00767 00768 const String& getType(void) const; 00769 void destroyInstance( MovableObject* obj); 00770 00771 }; 00772 00773 } // namespace 00774 00775 #endif
Copyright © 2008 Torus Knot Software Ltd
This work is licensed under a Creative Commons Attribution-ShareAlike 2.5 License.
Last modified Sun Sep 27 22:02:23 2009