# 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-2009 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 __Entity_H__
    00029 #define __Entity_H__
    00030
    00031 #include "OgrePrerequisites.h"
    00032 #include "OgreCommon.h"
    00033
    00034 #include "OgreString.h"
    00035 #include "OgreMovableObject.h"
    00036 #include "OgreQuaternion.h"
    00037 #include "OgreVector3.h"
    00038 #include "OgreHardwareBufferManager.h"
    00039 #include "OgreMesh.h"
    00040 #include "OgreRenderable.h"
    00041 #include "OgreResourceGroupManager.h"
    00042
    00043 namespace Ogre {
    00081     class _OgreExport Entity: public MovableObject, public Resource::Listener
    00082     {
    00083         // Allow EntityFactory full access
    00084         friend class EntityFactory;
    00085         friend class SubEntity;
    00086     public:
    00087         typedef set<Entity*>::type EntitySet;
    00088
    00089     protected:
    00090
    00093         Entity();
    00096         Entity( const String& name, const MeshPtr& mesh);
    00097
    00100         MeshPtr mMesh;
    00101
    00104         typedef vector<SubEntity*>::type SubEntityList;
    00105         SubEntityList mSubEntityList;
    00106
    00107
    00109         AnimationStateSet* mAnimationState;
    00110
    00111
    00113         TempBlendedBufferInfo mTempSkelAnimInfo;
    00115         VertexData* mSkelAnimVertexData;
    00117         TempBlendedBufferInfo mTempVertexAnimInfo;
    00119         VertexData* mSoftwareVertexAnimVertexData;
    00123         VertexData* mHardwareVertexAnimVertexData;
    00125         bool mVertexAnimationAppliedThisFrame;
    00127         bool mPreparedForShadowVolumes;
    00128
    00131         const VertexData* findBlendedVertexData(const VertexData* orig);
    00134         SubEntity* findSubEntityForVertexData(const VertexData* orig);
    00135
    00138         void extractTempBufferInfo(VertexData* sourceData, TempBlendedBufferInfo* info);
    00140         VertexData* cloneVertexDataRemoveBlendInfo(const VertexData* source);
    00142         void prepareTempBlendBuffers(void);
    00145         void markBuffersUnusedForAnimation(void);
    00149         void restoreBuffersForUnusedAnimation(bool hardwareAnimation);
    00150
    00156         void bindMissingHardwarePoseBuffers(const VertexData* srcData,
    00157             VertexData* destData);
    00158
    00160         Matrix4 *mBoneWorldMatrices;
    00162         Matrix4 *mBoneMatrices;
    00163         unsigned short mNumBoneMatrices;
    00165         unsigned long mFrameAnimationLastUpdated;
    00166
    00168         void updateAnimation(void);
    00169
    00173         unsigned long *mFrameBonesLastUpdated;
    00174
    00180         EntitySet* mSharedSkeletonEntities;
    00181
    00183         void cacheBoneMatrices(void);
    00184
    00186         bool mDisplaySkeleton;
    00188         bool mHardwareAnimation;
    00190         ushort mHardwarePoseCount;
    00192         bool mVertexProgramInUse;
    00194         int mSoftwareAnimationRequests;
    00196         int mSoftwareAnimationNormalsRequests;
    00198         bool mSkipAnimStateUpdates;
    00199
    00200
    00202         ushort mMeshLodIndex;
    00203
    00205         Real mMeshLodFactorTransformed;
    00207         ushort mMinMeshLodIndex;
    00209         ushort mMaxMeshLodIndex;
    00210
    00212         Real mMaterialLodFactor;
    00214         Real mMaterialLodFactorTransformed;
    00216         ushort mMinMaterialLodIndex;
    00218         ushort mMaxMaterialLodIndex;
    00219
    00225         typedef vector<Entity*>::type LODEntityList;
    00226         LODEntityList mLodEntityList;
    00227
    00230         SkeletonInstance* mSkeletonInstance;
    00231
    00233         bool mInitialised;
    00234
    00236         Matrix4 mLastParentXform;
    00237
    00239         size_t mMeshStateCount;
    00240
    00242         void buildSubEntityList(MeshPtr& mesh, SubEntityList* sublist);
    00243
    00245         void attachObjectImpl(MovableObject *pMovable, TagPoint *pAttachingPoint);
    00246
    00248         void detachObjectImpl(MovableObject* pObject);
    00249
    00251         void detachAllObjectsImpl(void);
    00252
    00254         void reevaluateVertexProcessing(void);
    00255
    00257         void applyVertexAnimation(bool hardwareAnimation, bool stencilShadows);
    00259         void initHardwareAnimationElements(VertexData* vdata,
    00260             ushort numberOfElements);
    00262         bool tempVertexAnimBuffersBound(void) const;
    00264         bool tempSkelAnimBuffersBound(bool requestNormals) const;
    00265
    00266     public:
    00268         typedef map<String, MovableObject*>::type ChildObjectList;
    00269     protected:
    00270         ChildObjectList mChildObjectList;
    00271
    00272
    00274         mutable AxisAlignedBox mFullBoundingBox;
    00275
    00276         ShadowRenderableList mShadowRenderables;
    00277
    00279         class _OgreExport EntityShadowRenderable : public ShadowRenderable
    00280         {
    00281         protected:
    00282             Entity* mParent;
    00283             // Shared link to position buffer
    00284             HardwareVertexBufferSharedPtr mPositionBuffer;
    00285             // Shared link to w-coord buffer (optional)
    00286             HardwareVertexBufferSharedPtr mWBuffer;
    00287             // Link to current vertex data used to bind (maybe changes)
    00288             const VertexData* mCurrentVertexData;
    00289             // Original position buffer source binding
    00290             unsigned short mOriginalPosBufferBinding;
    00292             SubEntity* mSubEntity;
    00293
    00294
    00295         public:
    00296             EntityShadowRenderable(Entity* parent,
    00297                 HardwareIndexBufferSharedPtr* indexBuffer, const VertexData* vertexData,
    00298                 bool createSeparateLightCap, SubEntity* subent, bool isLightCap = false);
    00299             ~EntityShadowRenderable();
    00301             void getWorldTransforms(Matrix4* xform) const;
    00302             HardwareVertexBufferSharedPtr getPositionBuffer(void) { return mPositionBuffer; }
    00303             HardwareVertexBufferSharedPtr getWBuffer(void) { return mWBuffer; }
    00305             void rebindPositionBuffer(const VertexData* vertexData, bool force);
    00307             bool isVisible(void) const;
    00308
    00309         };
    00310     public:
    00313         ~Entity();
    00314
    00317         const MeshPtr& getMesh(void) const;
    00318
    00321         SubEntity* getSubEntity(unsigned int index) const;
    00322
    00326         SubEntity* getSubEntity( const String& name ) const;
    00327
    00330         unsigned int getNumSubEntities(void) const;
    00331
    00341         Entity* clone( const String& newName ) const;
    00342
    00351         void setMaterialName( const String& name, const String& groupName = ResourceGroupManager::AUTODETECT_RESOURCE_GROUP_NAME );
    00352
    00353
    00362         void setMaterial(const MaterialPtr& material);
    00363
    00366         void _notifyCurrentCamera(Camera* cam);
    00367
    00369         void setRenderQueueGroup(uint8 queueID);
    00370
    00372         void setRenderQueueGroupAndPriority(uint8 queueID, ushort priority);
    00373
    00376         const AxisAlignedBox& getBoundingBox(void) const;
    00377
    00379         AxisAlignedBox getChildObjectsBoundingBox(void) const;
    00380
    00383         void _updateRenderQueue(RenderQueue* queue);
    00384
    00386         const String& getMovableType(void) const;
    00387
    00394         AnimationState* getAnimationState(const String& name) const;
    00404         AnimationStateSet* getAllAnimationStates(void) const;
    00405
    00408         void setDisplaySkeleton(bool display);
    00409
    00412         bool getDisplaySkeleton(void) const;
    00413
    00414
    00420         Entity* getManualLodLevel(size_t index) const;
    00421
    00427         size_t getNumManualLodLevels(void) const;
    00428
    00431         ushort getCurrentLodIndex() { return mMeshLodIndex; }
    00432
    00459         void setMeshLodBias(Real factor, ushort maxDetailIndex = 0, ushort minDetailIndex = 99);
    00460
    00487         void setMaterialLodBias(Real factor, ushort maxDetailIndex = 0, ushort minDetailIndex = 99);
    00488
    00492         void setPolygonModeOverrideable(bool PolygonModeOverrideable);
    00507         TagPoint* attachObjectToBone(const String &boneName,
    00508             MovableObject *pMovable,
    00509             const Quaternion &offsetOrientation = Quaternion::IDENTITY,
    00510             const Vector3 &offsetPosition = Vector3::ZERO);
    00511
    00516         MovableObject* detachObjectFromBone(const String &movableName);
    00517
    00524         void detachObjectFromBone(MovableObject* obj);
    00525
    00527         void detachAllObjectsFromBone(void);
    00528
    00529         typedef MapIterator<ChildObjectList> ChildObjectListIterator;
    00531         ChildObjectListIterator getAttachedObjectIterator(void);
    00533         Real getBoundingRadius(void) const;
    00534
    00536         const AxisAlignedBox& getWorldBoundingBox(bool derive = false) const;
    00538         const Sphere& getWorldBoundingSphere(bool derive = false) const;
    00539
    00541         EdgeData* getEdgeList(void);
    00543         bool hasEdgeList(void);
    00545         ShadowRenderableListIterator getShadowVolumeRenderableIterator(
    00546             ShadowTechnique shadowTechnique, const Light* light,
    00547             HardwareIndexBufferSharedPtr* indexBuffer,
    00548             bool extrudeVertices, Real extrusionDistance, unsigned long flags = 0 );
    00549
    00551         const Matrix4* _getBoneMatrices(void) const { return mBoneMatrices;}
    00553         unsigned short _getNumBoneMatrices(void) const { return mNumBoneMatrices; }
    00555         bool hasSkeleton(void) const { return mSkeletonInstance != 0; }
    00557         SkeletonInstance* getSkeleton(void) const { return mSkeletonInstance; }
    00569         bool isHardwareAnimationEnabled(void) const { return mHardwareAnimation; }
    00570
    00572         void _notifyAttached(Node* parent, bool isTagPoint = false);
    00580         int getSoftwareAnimationRequests(void) const { return mSoftwareAnimationRequests; }
    00592         int getSoftwareAnimationNormalsRequests(void) const { return mSoftwareAnimationNormalsRequests; }
    00608         void addSoftwareAnimationRequest(bool normalsAlso);
    00617         void removeSoftwareAnimationRequest(bool normalsAlso);
    00618
    00623         void shareSkeletonInstanceWith(Entity* entity);
    00624
    00627         bool hasVertexAnimation(void) const;
    00628
    00629
    00632         void stopSharingSkeletonInstance();
    00633
    00634
    00638         inline bool sharesSkeletonInstance() const { return mSharedSkeletonEntities != NULL; }
    00639
    00644         inline const EntitySet* getSkeletonInstanceSharingSet() const { return mSharedSkeletonEntities; }
    00645
    00656         void refreshAvailableAnimationState(void);
    00657
    00665         void _updateAnimation(void);
    00666
    00672         bool _isAnimated(void) const;
    00673
    00676         bool _isSkeletonAnimated(void) const;
    00677
    00687         VertexData* _getSkelAnimVertexData(void) const;
    00696         VertexData* _getSoftwareVertexAnimVertexData(void) const;
    00701         VertexData* _getHardwareVertexAnimVertexData(void) const;
    00705         TempBlendedBufferInfo* _getSkelAnimTempBufferInfo(void);
    00709         TempBlendedBufferInfo* _getVertexAnimTempBufferInfo(void);
    00711         uint32 getTypeFlags(void) const;
    00713         VertexData* getVertexDataForBinding(void);
    00714
    00716         enum VertexDataBindChoice
    00717         {
    00718             BIND_ORIGINAL,
    00719             BIND_SOFTWARE_SKELETAL,
    00720             BIND_SOFTWARE_MORPH,
    00721             BIND_HARDWARE_MORPH
    00722         };
    00724         VertexDataBindChoice chooseVertexDataForBinding(bool hasVertexAnim) const;
    00725
    00727         bool _getBuffersMarkedForAnimation(void) const { return mVertexAnimationAppliedThisFrame; }
    00730         void _markBuffersUsedForAnimation(void);
    00731
    00740         bool isInitialised(void) const { return mInitialised; }
    00741
    00752         void _initialise(bool forceReinitialise = false);
    00754         void _deinitialise(void);
    00755
    00759         void backgroundLoadingComplete(Resource* res);
    00760
    00762         void visitRenderables(Renderable::Visitor* visitor,
    00763             bool debugRenderables = false);
    00764
    00766         Real _getMeshLodFactorTransformed() const;
    00767
    00771         void setSkipAnimationStateUpdate(bool skip) {
    00772             mSkipAnimStateUpdates = skip;
    00773         }
    00774
    00778         bool getSkipAnimationStateUpdate() const {
    00779             return mSkipAnimStateUpdates;
    00780         }
    00781
    00782
    00783     };
    00784
    00786     class _OgreExport EntityFactory : public MovableObjectFactory
    00787     {
    00788     protected:
    00789         MovableObject* createInstanceImpl( const String& name, const NameValuePairList* params);
    00790     public:
    00791         EntityFactory() {}
    00792         ~EntityFactory() {}
    00793
    00794         static String FACTORY_TYPE_NAME;
    00795
    00796         const String& getType(void) const;
    00797         void destroyInstance( MovableObject* obj);
    00798
    00799     };
    00803 } // namespace
    00804
    00805 #endif

Copyright © 2008 Torus Knot Software Ltd
This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.
Last modified Wed Nov 3 2010 19:24:51