# 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://ogre.sourceforge.net/
    00006
    00007 Copyright (c) 2000-2005 The OGRE Team
    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 */
    00025 #ifndef __Entity_H__
    00026 #define __Entity_H__
    00027
    00028 #include "OgrePrerequisites.h"
    00029 #include "OgreCommon.h"
    00030
    00031 #include "OgreString.h"
    00032 #include "OgreMovableObject.h"
    00033 #include "OgreQuaternion.h"
    00034 #include "OgreVector3.h"
    00035 #include "OgreHardwareBufferManager.h"
    00036 #include "OgreMesh.h"
    00037
    00038 namespace Ogre {
    00070     class _OgreExport Entity: public MovableObject
    00071     {
    00072         // Allow EntityFactory full access
    00073         friend class EntityFactory;
    00074         friend class SubEntity;
    00075     public:
    00076         typedef std::set<Entity*> EntitySet;
    00077
    00078     protected:
    00079
    00082         Entity();
    00085         Entity( const String& name, MeshPtr& mesh);
    00086
    00089         MeshPtr mMesh;
    00090
    00093         typedef std::vector<SubEntity*> SubEntityList;
    00094         SubEntityList mSubEntityList;
    00095
    00096
    00098         AnimationStateSet* mAnimationState;
    00099
    00100
    00102         TempBlendedBufferInfo mTempSkelAnimInfo;
    00104         VertexData* mSkelAnimVertexData;
    00106         TempBlendedBufferInfo mTempVertexAnimInfo;
    00108         VertexData* mSoftwareVertexAnimVertexData;
    00112         VertexData* mHardwareVertexAnimVertexData;
    00114         bool mVertexAnimationAppliedThisFrame;
    00116         bool mPreparedForShadowVolumes;
    00117
    00120         const VertexData* findBlendedVertexData(const VertexData* orig);
    00123         SubEntity* findSubEntityForVertexData(const VertexData* orig);
    00124
    00127         void extractTempBufferInfo(VertexData* sourceData, TempBlendedBufferInfo* info);
    00129         VertexData* cloneVertexDataRemoveBlendInfo(const VertexData* source);
    00131         void prepareTempBlendBuffers(void);
    00134         void markBuffersUnusedForAnimation(void);
    00138         void restoreBuffersForUnusedAnimation(bool hardwareAnimation);
    00139
    00141         Matrix4 *mBoneWorldMatrices;
    00143         Matrix4 *mBoneMatrices;
    00144         unsigned short mNumBoneMatrices;
    00146         unsigned long mFrameAnimationLastUpdated;
    00147
    00149         void updateAnimation(void);
    00150
    00154         unsigned long *mFrameBonesLastUpdated;
    00155
    00161         EntitySet* mSharedSkeletonEntities;
    00162
    00164         void cacheBoneMatrices(void);
    00165
    00167         bool mDisplaySkeleton;
    00169         bool mHardwareAnimation;
    00171         ushort mHardwarePoseCount;
    00173         bool mVertexProgramInUse;
    00175         int mSoftwareAnimationRequests;
    00177         int mSoftwareAnimationNormalsRequests;
    00178
    00179
    00181         ushort mMeshLodIndex;
    00182
    00184         Real mMeshLodFactorInv;
    00186         ushort mMinMeshLodIndex;
    00188         ushort mMaxMeshLodIndex;
    00189
    00191         Real mMaterialLodFactorInv;
    00193         ushort mMinMaterialLodIndex;
    00195         ushort mMaxMaterialLodIndex;
    00196
    00202         typedef std::vector<Entity*> LODEntityList;
    00203         LODEntityList mLodEntityList;
    00204
    00207         SkeletonInstance* mSkeletonInstance;
    00208
    00210         Matrix4 mLastParentXform;
    00211
    00213         void buildSubEntityList(MeshPtr& mesh, SubEntityList* sublist);
    00214
    00216         void attachObjectImpl(MovableObject *pMovable, TagPoint *pAttachingPoint);
    00217
    00219         void detachObjectImpl(MovableObject* pObject);
    00220
    00222         void detachAllObjectsImpl(void);
    00223
    00225         void reevaluateVertexProcessing(void);
    00226
    00228         void applyVertexAnimation(bool hardwareAnimation, bool stencilShadows);
    00230         void initHardwareAnimationElements(VertexData* vdata,
    00231             ushort numberOfElements);
    00233         bool tempVertexAnimBuffersBound(void) const;
    00235         bool tempSkelAnimBuffersBound(bool requestNormals) const;
    00236
    00237     public:
    00239         typedef std::map<String, MovableObject*> ChildObjectList;
    00240     protected:
    00241         ChildObjectList mChildObjectList;
    00242
    00243
    00245         mutable AxisAlignedBox mFullBoundingBox;
    00246
    00247         bool mNormaliseNormals;
    00248
    00249         ShadowRenderableList mShadowRenderables;
    00250
    00252         class _OgreExport EntityShadowRenderable : public ShadowRenderable
    00253         {
    00254         protected:
    00255             Entity* mParent;
    00256             // Shared link to position buffer
    00257             HardwareVertexBufferSharedPtr mPositionBuffer;
    00258             // Shared link to w-coord buffer (optional)
    00259             HardwareVertexBufferSharedPtr mWBuffer;
    00260             // Link to current vertex data used to bind (maybe changes)
    00261             const VertexData* mCurrentVertexData;
    00262             // Original position buffer source binding
    00263             unsigned short mOriginalPosBufferBinding;
    00265             SubEntity* mSubEntity;
    00266
    00267
    00268         public:
    00269             EntityShadowRenderable(Entity* parent,
    00270                 HardwareIndexBufferSharedPtr* indexBuffer, const VertexData* vertexData,
    00271                 bool createSeparateLightCap, SubEntity* subent, bool isLightCap = false);
    00272             ~EntityShadowRenderable();
    00274             void getWorldTransforms(Matrix4* xform) const;
    00276             const Quaternion& getWorldOrientation(void) const;
    00278             const Vector3& getWorldPosition(void) const;
    00279             HardwareVertexBufferSharedPtr getPositionBuffer(void) { return mPositionBuffer; }
    00280             HardwareVertexBufferSharedPtr getWBuffer(void) { return mWBuffer; }
    00282             void rebindPositionBuffer(const VertexData* vertexData, bool force);
    00284             bool isVisible(void) const;
    00285
    00286         };
    00287     public:
    00290         ~Entity();
    00291
    00294         const MeshPtr& getMesh(void) const;
    00295
    00298         SubEntity* getSubEntity(unsigned int index) const;
    00299
    00303         SubEntity* getSubEntity( const String& name ) const;
    00304
    00307         unsigned int getNumSubEntities(void) const;
    00308
    00318         Entity* clone( const String& newName ) const;
    00319
    00328         void setMaterialName(const String& name);
    00329
    00332         void _notifyCurrentCamera(Camera* cam);
    00333
    00335         void setRenderQueueGroup(uint8 queueID);
    00336
    00339         const AxisAlignedBox& getBoundingBox(void) const;
    00340
    00342         AxisAlignedBox getChildObjectsBoundingBox(void) const;
    00343
    00346         void _updateRenderQueue(RenderQueue* queue);
    00347
    00349         const String& getMovableType(void) const;
    00350
    00357         AnimationState* getAnimationState(const String& name) const;
    00367         AnimationStateSet* getAllAnimationStates(void) const;
    00368
    00371         void setDisplaySkeleton(bool display);
    00372
    00375         bool getDisplaySkeleton(void) const;
    00376
    00377
    00383         Entity* getManualLodLevel(size_t index) const;
    00384
    00390         size_t getNumManualLodLevels(void) const;
    00391
    00418         void setMeshLodBias(Real factor, ushort maxDetailIndex = 0, ushort minDetailIndex = 99);
    00419
    00446         void setMaterialLodBias(Real factor, ushort maxDetailIndex = 0, ushort minDetailIndex = 99);
    00447
    00451         void setPolygonModeOverrideable(bool PolygonModeOverrideable);
    00463         TagPoint* attachObjectToBone(const String &boneName,
    00464             MovableObject *pMovable,
    00465             const Quaternion &offsetOrientation = Quaternion::IDENTITY,
    00466             const Vector3 &offsetPosition = Vector3::ZERO);
    00467
    00469         MovableObject* detachObjectFromBone(const String &movableName);
    00470
    00477         void detachObjectFromBone(MovableObject* obj);
    00478
    00480         void detachAllObjectsFromBone(void);
    00481
    00482         typedef MapIterator<ChildObjectList> ChildObjectListIterator;
    00484         ChildObjectListIterator getAttachedObjectIterator(void);
    00486         Real getBoundingRadius(void) const;
    00487
    00489         const AxisAlignedBox& getWorldBoundingBox(bool derive = false) const;
    00491         const Sphere& getWorldBoundingSphere(bool derive = false) const;
    00492
    00501         void setNormaliseNormals(bool normalise) { mNormaliseNormals = normalise; }
    00502
    00504         bool getNormaliseNormals(void) const {return mNormaliseNormals; }
    00505
    00506
    00508         EdgeData* getEdgeList(void);
    00510         ShadowRenderableListIterator getShadowVolumeRenderableIterator(
    00511             ShadowTechnique shadowTechnique, const Light* light,
    00512             HardwareIndexBufferSharedPtr* indexBuffer,
    00513             bool extrudeVertices, Real extrusionDistance, unsigned long flags = 0 );
    00514
    00516         const Matrix4* _getBoneMatrices(void) const { return mBoneMatrices;}
    00518         unsigned short _getNumBoneMatrices(void) const { return mNumBoneMatrices; }
    00520         bool hasSkeleton(void) const { return mSkeletonInstance != 0; }
    00522         SkeletonInstance* getSkeleton(void) const { return mSkeletonInstance; }
    00534         bool isHardwareAnimationEnabled(void) const { return mHardwareAnimation; }
    00535
    00537         void _notifyAttached(Node* parent, bool isTagPoint = false);
    00545         int getSoftwareAnimationRequests(void) const { return mSoftwareAnimationRequests; }
    00557         int getSoftwareAnimationNormalsRequests(void) const { return mSoftwareAnimationNormalsRequests; }
    00573         void addSoftwareAnimationRequest(bool normalsAlso);
    00582         void removeSoftwareAnimationRequest(bool normalsAlso);
    00583
    00588         void shareSkeletonInstanceWith(Entity* entity);
    00589
    00592         bool hasVertexAnimation(void) const;
    00593
    00594
    00597         void stopSharingSkeletonInstance();
    00598
    00599
    00603         inline bool sharesSkeletonInstance() const { return mSharedSkeletonEntities != NULL; }
    00604
    00609         inline const EntitySet* getSkeletonInstanceSharingSet() const { return mSharedSkeletonEntities; }
    00610
    00621         void refreshAvailableAnimationState(void);
    00622
    00630         void _updateAnimation(void);
    00631
    00637         bool _isAnimated(void) const;
    00638
    00641         bool _isSkeletonAnimated(void) const;
    00642
    00652         VertexData* _getSkelAnimVertexData(void) const;
    00661         VertexData* _getSoftwareVertexAnimVertexData(void) const;
    00666         VertexData* _getHardwareVertexAnimVertexData(void) const;
    00670         TempBlendedBufferInfo* _getSkelAnimTempBufferInfo(void);
    00674         TempBlendedBufferInfo* _getVertexAnimTempBufferInfo(void);
    00676         uint32 getTypeFlags(void) const;
    00678         VertexData* getVertexDataForBinding(void);
    00679
    00681         enum VertexDataBindChoice
    00682         {
    00683             BIND_ORIGINAL,
    00684             BIND_SOFTWARE_SKELETAL,
    00685             BIND_SOFTWARE_MORPH,
    00686             BIND_HARDWARE_MORPH
    00687         };
    00689         VertexDataBindChoice chooseVertexDataForBinding(bool hasVertexAnim) const;
    00690
    00692         bool _getBuffersMarkedForAnimation(void) const { return mVertexAnimationAppliedThisFrame; }
    00695         void _markBuffersUsedForAnimation(void);
    00696
    00697
    00698     };
    00699
    00701     class _OgreExport EntityFactory : public MovableObjectFactory
    00702     {
    00703     protected:
    00704         MovableObject* createInstanceImpl( const String& name, const NameValuePairList* params);
    00705     public:
    00706         EntityFactory() {}
    00707         ~EntityFactory() {}
    00708
    00709         static String FACTORY_TYPE_NAME;
    00710
    00711         const String& getType(void) const;
    00712         void destroyInstance( MovableObject* obj);
    00713
    00714     };
    00715
    00716 } // namespace
    00717
    00718 #endif

Copyright © 2000-2005 by The OGRE Team
This work is licensed under a Creative Commons Attribution-ShareAlike 2.5 License.
Last modified Sun Sep 17 15:39:08 2006