Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Namespace Members | Class Members | File Members | Related Pages

OgreEntity.h

Go to the documentation of this file.
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 
00042 namespace Ogre {
00074     class _OgreExport Entity: public MovableObject, public Resource::Listener
00075     {
00076         // Allow EntityFactory full access
00077         friend class EntityFactory;
00078         friend class SubEntity;
00079     public:
00080         typedef std::set<Entity*> EntitySet;
00081 
00082     protected:
00083 
00086         Entity();
00089         Entity( const String& name, MeshPtr& mesh);
00090 
00093         MeshPtr mMesh;
00094 
00097         typedef std::vector<SubEntity*> SubEntityList;
00098         SubEntityList mSubEntityList;
00099 
00100 
00102         AnimationStateSet* mAnimationState;
00103 
00104 
00106         TempBlendedBufferInfo mTempSkelAnimInfo;
00108         VertexData* mSkelAnimVertexData;
00110         TempBlendedBufferInfo mTempVertexAnimInfo;
00112         VertexData* mSoftwareVertexAnimVertexData;
00116         VertexData* mHardwareVertexAnimVertexData;
00118         bool mVertexAnimationAppliedThisFrame;
00120         bool mPreparedForShadowVolumes;
00121 
00124         const VertexData* findBlendedVertexData(const VertexData* orig);
00127         SubEntity* findSubEntityForVertexData(const VertexData* orig);
00128 
00131         void extractTempBufferInfo(VertexData* sourceData, TempBlendedBufferInfo* info);
00133         VertexData* cloneVertexDataRemoveBlendInfo(const VertexData* source);
00135         void prepareTempBlendBuffers(void);
00138         void markBuffersUnusedForAnimation(void);
00142         void restoreBuffersForUnusedAnimation(bool hardwareAnimation);
00143 
00149         void bindMissingHardwarePoseBuffers(const VertexData* srcData, 
00150             VertexData* destData);
00151 
00153         Matrix4 *mBoneWorldMatrices;
00155         Matrix4 *mBoneMatrices;
00156         unsigned short mNumBoneMatrices;
00158         unsigned long mFrameAnimationLastUpdated;
00159 
00161         void updateAnimation(void);
00162 
00166         unsigned long *mFrameBonesLastUpdated;
00167 
00173         EntitySet* mSharedSkeletonEntities;
00174 
00176         void cacheBoneMatrices(void);
00177 
00179         bool mDisplaySkeleton;
00181         bool mHardwareAnimation;
00183         ushort mHardwarePoseCount;
00185         bool mVertexProgramInUse;
00187         int mSoftwareAnimationRequests;
00189         int mSoftwareAnimationNormalsRequests;
00190 
00191 
00193         ushort mMeshLodIndex;
00194 
00196         Real mMeshLodFactorInv;
00198         ushort mMinMeshLodIndex;
00200         ushort mMaxMeshLodIndex;
00201 
00203         Real mMaterialLodFactorInv;
00205         ushort mMinMaterialLodIndex;
00207         ushort mMaxMaterialLodIndex;
00208 
00214         typedef std::vector<Entity*> LODEntityList;
00215         LODEntityList mLodEntityList;
00216 
00219         SkeletonInstance* mSkeletonInstance;
00220 
00222         bool mInitialised;
00223 
00225         Matrix4 mLastParentXform;
00226 
00228         void buildSubEntityList(MeshPtr& mesh, SubEntityList* sublist);
00229 
00231         void attachObjectImpl(MovableObject *pMovable, TagPoint *pAttachingPoint);
00232 
00234         void detachObjectImpl(MovableObject* pObject);
00235 
00237         void detachAllObjectsImpl(void);
00238 
00240         void reevaluateVertexProcessing(void);
00241 
00243         void applyVertexAnimation(bool hardwareAnimation, bool stencilShadows);
00245         void initHardwareAnimationElements(VertexData* vdata,
00246             ushort numberOfElements);
00248         bool tempVertexAnimBuffersBound(void) const;
00250         bool tempSkelAnimBuffersBound(bool requestNormals) const;
00251 
00252     public:
00254         typedef std::map<String, MovableObject*> ChildObjectList;
00255     protected:
00256         ChildObjectList mChildObjectList;
00257 
00258 
00260         mutable AxisAlignedBox mFullBoundingBox;
00261 
00262         bool mNormaliseNormals;
00263 
00264         ShadowRenderableList mShadowRenderables;
00265 
00267         class _OgreExport EntityShadowRenderable : public ShadowRenderable
00268         {
00269         protected:
00270             Entity* mParent;
00271             // Shared link to position buffer
00272             HardwareVertexBufferSharedPtr mPositionBuffer;
00273             // Shared link to w-coord buffer (optional)
00274             HardwareVertexBufferSharedPtr mWBuffer;
00275             // Link to current vertex data used to bind (maybe changes)
00276             const VertexData* mCurrentVertexData;
00277             // Original position buffer source binding
00278             unsigned short mOriginalPosBufferBinding;
00280             SubEntity* mSubEntity;
00281 
00282 
00283         public:
00284             EntityShadowRenderable(Entity* parent,
00285                 HardwareIndexBufferSharedPtr* indexBuffer, const VertexData* vertexData,
00286                 bool createSeparateLightCap, SubEntity* subent, bool isLightCap = false);
00287             ~EntityShadowRenderable();
00289             void getWorldTransforms(Matrix4* xform) const;
00291             const Quaternion& getWorldOrientation(void) const;
00293             const Vector3& getWorldPosition(void) const;
00294             HardwareVertexBufferSharedPtr getPositionBuffer(void) { return mPositionBuffer; }
00295             HardwareVertexBufferSharedPtr getWBuffer(void) { return mWBuffer; }
00297             void rebindPositionBuffer(const VertexData* vertexData, bool force);
00299             bool isVisible(void) const;
00300 
00301         };
00302     public:
00305         ~Entity();
00306 
00309         const MeshPtr& getMesh(void) const;
00310 
00313         SubEntity* getSubEntity(unsigned int index) const;
00314 
00318         SubEntity* getSubEntity( const String& name ) const;
00319 
00322         unsigned int getNumSubEntities(void) const;
00323 
00333         Entity* clone( const String& newName ) const;
00334 
00343         void setMaterialName(const String& name);
00344 
00347         void _notifyCurrentCamera(Camera* cam);
00348 
00350         void setRenderQueueGroup(uint8 queueID);
00351 
00354         const AxisAlignedBox& getBoundingBox(void) const;
00355 
00357         AxisAlignedBox getChildObjectsBoundingBox(void) const;
00358 
00361         void _updateRenderQueue(RenderQueue* queue);
00362 
00364         const String& getMovableType(void) const;
00365 
00372         AnimationState* getAnimationState(const String& name) const;
00382         AnimationStateSet* getAllAnimationStates(void) const;
00383 
00386         void setDisplaySkeleton(bool display);
00387 
00390         bool getDisplaySkeleton(void) const;
00391 
00392 
00398         Entity* getManualLodLevel(size_t index) const;
00399 
00405         size_t getNumManualLodLevels(void) const;
00406 
00433         void setMeshLodBias(Real factor, ushort maxDetailIndex = 0, ushort minDetailIndex = 99);
00434 
00461         void setMaterialLodBias(Real factor, ushort maxDetailIndex = 0, ushort minDetailIndex = 99);
00462 
00466         void setPolygonModeOverrideable(bool PolygonModeOverrideable);
00481         TagPoint* attachObjectToBone(const String &boneName,
00482             MovableObject *pMovable,
00483             const Quaternion &offsetOrientation = Quaternion::IDENTITY,
00484             const Vector3 &offsetPosition = Vector3::ZERO);
00485 
00490         MovableObject* detachObjectFromBone(const String &movableName);
00491 
00498         void detachObjectFromBone(MovableObject* obj);
00499 
00501         void detachAllObjectsFromBone(void);
00502 
00503         typedef MapIterator<ChildObjectList> ChildObjectListIterator;
00505         ChildObjectListIterator getAttachedObjectIterator(void);
00507         Real getBoundingRadius(void) const;
00508 
00510         const AxisAlignedBox& getWorldBoundingBox(bool derive = false) const;
00512         const Sphere& getWorldBoundingSphere(bool derive = false) const;
00513 
00522         void setNormaliseNormals(bool normalise) { mNormaliseNormals = normalise; }
00523 
00525         bool getNormaliseNormals(void) const {return mNormaliseNormals; }
00526 
00527 
00529         EdgeData* getEdgeList(void);
00531         bool hasEdgeList(void);
00533         ShadowRenderableListIterator getShadowVolumeRenderableIterator(
00534             ShadowTechnique shadowTechnique, const Light* light,
00535             HardwareIndexBufferSharedPtr* indexBuffer,
00536             bool extrudeVertices, Real extrusionDistance, unsigned long flags = 0 );
00537 
00539         const Matrix4* _getBoneMatrices(void) const { return mBoneMatrices;}
00541         unsigned short _getNumBoneMatrices(void) const { return mNumBoneMatrices; }
00543         bool hasSkeleton(void) const { return mSkeletonInstance != 0; }
00545         SkeletonInstance* getSkeleton(void) const { return mSkeletonInstance; }
00557         bool isHardwareAnimationEnabled(void) const { return mHardwareAnimation; }
00558 
00560         void _notifyAttached(Node* parent, bool isTagPoint = false);
00568         int getSoftwareAnimationRequests(void) const { return mSoftwareAnimationRequests; }
00580         int getSoftwareAnimationNormalsRequests(void) const { return mSoftwareAnimationNormalsRequests; }
00596         void addSoftwareAnimationRequest(bool normalsAlso);
00605         void removeSoftwareAnimationRequest(bool normalsAlso);
00606 
00611         void shareSkeletonInstanceWith(Entity* entity);
00612 
00615         bool hasVertexAnimation(void) const;
00616 
00617 
00620         void stopSharingSkeletonInstance();
00621 
00622 
00626         inline bool sharesSkeletonInstance() const { return mSharedSkeletonEntities != NULL; }
00627 
00632         inline const EntitySet* getSkeletonInstanceSharingSet() const { return mSharedSkeletonEntities; }
00633 
00644         void refreshAvailableAnimationState(void);
00645 
00653         void _updateAnimation(void);
00654 
00660         bool _isAnimated(void) const;
00661 
00664         bool _isSkeletonAnimated(void) const;
00665 
00675         VertexData* _getSkelAnimVertexData(void) const;
00684         VertexData* _getSoftwareVertexAnimVertexData(void) const;
00689         VertexData* _getHardwareVertexAnimVertexData(void) const;
00693         TempBlendedBufferInfo* _getSkelAnimTempBufferInfo(void);
00697         TempBlendedBufferInfo* _getVertexAnimTempBufferInfo(void);
00699         uint32 getTypeFlags(void) const;
00701         VertexData* getVertexDataForBinding(void);
00702 
00704         enum VertexDataBindChoice
00705         {
00706             BIND_ORIGINAL,
00707             BIND_SOFTWARE_SKELETAL,
00708             BIND_SOFTWARE_MORPH,
00709             BIND_HARDWARE_MORPH
00710         };
00712         VertexDataBindChoice chooseVertexDataForBinding(bool hasVertexAnim) const;
00713 
00715         bool _getBuffersMarkedForAnimation(void) const { return mVertexAnimationAppliedThisFrame; }
00718         void _markBuffersUsedForAnimation(void);
00719 
00728         bool isInitialised(void) const { return mInitialised; }
00729 
00740         void _initialise(bool forceReinitialise = false);
00742         void _deinitialise(void);
00743 
00747         void backgroundLoadingComplete(Resource* res);
00748 
00749 
00750 
00751     };
00752 
00754     class _OgreExport EntityFactory : public MovableObjectFactory
00755     {
00756     protected:
00757         MovableObject* createInstanceImpl( const String& name, const NameValuePairList* params);
00758     public:
00759         EntityFactory() {}
00760         ~EntityFactory() {}
00761 
00762         static String FACTORY_TYPE_NAME;
00763 
00764         const String& getType(void) const;
00765         void destroyInstance( MovableObject* obj);
00766 
00767     };
00768 
00769 } // namespace
00770 
00771 #endif

Copyright © 2000-2005 by The OGRE Team
Creative Commons License
This work is licensed under a Creative Commons Attribution-ShareAlike 2.5 License.
Last modified Sun Sep 30 10:50:56 2007