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-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 __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
    00088         typedef set<Entity*>::type EntitySet;
    00089         typedef map<unsigned short, bool>::type SchemeHardwareAnimMap;
    00090
    00091     protected:
    00092
    00095         Entity();
    00098         Entity( const String& name, const MeshPtr& mesh);
    00099
    00102         MeshPtr mMesh;
    00103
    00106         typedef vector<SubEntity*>::type SubEntityList;
    00107         SubEntityList mSubEntityList;
    00108
    00109
    00111         AnimationStateSet* mAnimationState;
    00112
    00113
    00115         TempBlendedBufferInfo mTempSkelAnimInfo;
    00117         VertexData* mSkelAnimVertexData;
    00119         TempBlendedBufferInfo mTempVertexAnimInfo;
    00121         VertexData* mSoftwareVertexAnimVertexData;
    00125         VertexData* mHardwareVertexAnimVertexData;
    00127         bool mVertexAnimationAppliedThisFrame;
    00129         bool mPreparedForShadowVolumes;
    00130
    00133         const VertexData* findBlendedVertexData(const VertexData* orig);
    00136         SubEntity* findSubEntityForVertexData(const VertexData* orig);
    00137
    00140         void extractTempBufferInfo(VertexData* sourceData, TempBlendedBufferInfo* info);
    00142         VertexData* cloneVertexDataRemoveBlendInfo(const VertexData* source);
    00144         void prepareTempBlendBuffers(void);
    00147         void markBuffersUnusedForAnimation(void);
    00151         void restoreBuffersForUnusedAnimation(bool hardwareAnimation);
    00152
    00158         void bindMissingHardwarePoseBuffers(const VertexData* srcData,
    00159             VertexData* destData);
    00160
    00164         void initialisePoseVertexData(const VertexData* srcData, VertexData* destData,
    00165             bool animateNormals);
    00166
    00170         void finalisePoseNormals(const VertexData* srcData, VertexData* destData);
    00171
    00173         Matrix4 *mBoneWorldMatrices;
    00175         Matrix4 *mBoneMatrices;
    00176         unsigned short mNumBoneMatrices;
    00178         unsigned long mFrameAnimationLastUpdated;
    00179
    00181         void updateAnimation(void);
    00182
    00186         unsigned long *mFrameBonesLastUpdated;
    00187
    00193         EntitySet* mSharedSkeletonEntities;
    00194
    00200         bool cacheBoneMatrices(void);
    00201
    00203         bool mDisplaySkeleton;
    00208         SchemeHardwareAnimMap mSchemeHardwareAnim;
    00209
    00211         bool mCurrentHWAnimationState;
    00212
    00214         ushort mHardwarePoseCount;
    00216         bool mVertexProgramInUse;
    00218         int mSoftwareAnimationRequests;
    00220         int mSoftwareAnimationNormalsRequests;
    00222         bool mSkipAnimStateUpdates;
    00224         bool mAlwaysUpdateMainSkeleton;
    00225
    00226
    00228         ushort mMeshLodIndex;
    00229
    00231         Real mMeshLodFactorTransformed;
    00233         ushort mMinMeshLodIndex;
    00235         ushort mMaxMeshLodIndex;
    00236
    00238         Real mMaterialLodFactor;
    00240         Real mMaterialLodFactorTransformed;
    00242         ushort mMinMaterialLodIndex;
    00244         ushort mMaxMaterialLodIndex;
    00245
    00251         typedef vector<Entity*>::type LODEntityList;
    00252         LODEntityList mLodEntityList;
    00253
    00256         SkeletonInstance* mSkeletonInstance;
    00257
    00259         bool mInitialised;
    00260
    00262         Matrix4 mLastParentXform;
    00263
    00265         size_t mMeshStateCount;
    00266
    00268         void buildSubEntityList(MeshPtr& mesh, SubEntityList* sublist);
    00269
    00271         void attachObjectImpl(MovableObject *pMovable, TagPoint *pAttachingPoint);
    00272
    00274         void detachObjectImpl(MovableObject* pObject);
    00275
    00277         void detachAllObjectsImpl(void);
    00278
    00280         void reevaluateVertexProcessing(void);
    00281
    00288         bool calcVertexProcessing(void);
    00289
    00291         void applyVertexAnimation(bool hardwareAnimation, bool stencilShadows);
    00293         ushort initHardwareAnimationElements(VertexData* vdata,
    00294             ushort numberOfElements, bool animateNormals);
    00296         bool tempVertexAnimBuffersBound(void) const;
    00298         bool tempSkelAnimBuffersBound(bool requestNormals) const;
    00299
    00300     public:
    00302         typedef map<String, MovableObject*>::type ChildObjectList;
    00303     protected:
    00304         ChildObjectList mChildObjectList;
    00305
    00306
    00308         mutable AxisAlignedBox mFullBoundingBox;
    00309
    00310         ShadowRenderableList mShadowRenderables;
    00311
    00313         class _OgreExport EntityShadowRenderable : public ShadowRenderable
    00314         {
    00315         protected:
    00316             Entity* mParent;
    00318             HardwareVertexBufferSharedPtr mPositionBuffer;
    00320             HardwareVertexBufferSharedPtr mWBuffer;
    00322             const VertexData* mCurrentVertexData;
    00324             unsigned short mOriginalPosBufferBinding;
    00326             SubEntity* mSubEntity;
    00327
    00328
    00329         public:
    00330             EntityShadowRenderable(Entity* parent,
    00331                 HardwareIndexBufferSharedPtr* indexBuffer, const VertexData* vertexData,
    00332                 bool createSeparateLightCap, SubEntity* subent, bool isLightCap = false);
    00333             ~EntityShadowRenderable();
    00334
    00336             void _createSeparateLightCap();
    00338             void getWorldTransforms(Matrix4* xform) const;
    00339             HardwareVertexBufferSharedPtr getPositionBuffer(void) { return mPositionBuffer; }
    00340             HardwareVertexBufferSharedPtr getWBuffer(void) { return mWBuffer; }
    00342             void rebindPositionBuffer(const VertexData* vertexData, bool force);
    00344             bool isVisible(void) const;
    00346             virtual void rebindIndexBuffer(const HardwareIndexBufferSharedPtr& indexBuffer);
    00347         };
    00348     public:
    00351         ~Entity();
    00352
    00355         const MeshPtr& getMesh(void) const;
    00356
    00359         SubEntity* getSubEntity(unsigned int index) const;
    00360
    00364         SubEntity* getSubEntity( const String& name ) const;
    00365
    00368         unsigned int getNumSubEntities(void) const;
    00369
    00379         Entity* clone( const String& newName ) const;
    00380
    00389         void setMaterialName( const String& name, const String& groupName = ResourceGroupManager::AUTODETECT_RESOURCE_GROUP_NAME );
    00390
    00391
    00400         void setMaterial(const MaterialPtr& material);
    00401
    00404         void _notifyCurrentCamera(Camera* cam);
    00405
    00407         void setRenderQueueGroup(uint8 queueID);
    00408
    00410         void setRenderQueueGroupAndPriority(uint8 queueID, ushort priority);
    00411
    00414         const AxisAlignedBox& getBoundingBox(void) const;
    00415
    00417         AxisAlignedBox getChildObjectsBoundingBox(void) const;
    00418
    00421         void _updateRenderQueue(RenderQueue* queue);
    00422
    00424         const String& getMovableType(void) const;
    00425
    00432         AnimationState* getAnimationState(const String& name) const;
    00434         bool hasAnimationState(const String& name) const;
    00444         AnimationStateSet* getAllAnimationStates(void) const;
    00445
    00448         void setDisplaySkeleton(bool display);
    00449
    00452         bool getDisplaySkeleton(void) const;
    00453
    00454
    00460         Entity* getManualLodLevel(size_t index) const;
    00461
    00467         size_t getNumManualLodLevels(void) const;
    00468
    00471         ushort getCurrentLodIndex() { return mMeshLodIndex; }
    00472
    00499         void setMeshLodBias(Real factor, ushort maxDetailIndex = 0, ushort minDetailIndex = 99);
    00500
    00527         void setMaterialLodBias(Real factor, ushort maxDetailIndex = 0, ushort minDetailIndex = 99);
    00528
    00532         void setPolygonModeOverrideable(bool PolygonModeOverrideable);
    00547         TagPoint* attachObjectToBone(const String &boneName,
    00548             MovableObject *pMovable,
    00549             const Quaternion &offsetOrientation = Quaternion::IDENTITY,
    00550             const Vector3 &offsetPosition = Vector3::ZERO);
    00551
    00556         MovableObject* detachObjectFromBone(const String &movableName);
    00557
    00564         void detachObjectFromBone(MovableObject* obj);
    00565
    00567         void detachAllObjectsFromBone(void);
    00568
    00569         typedef MapIterator<ChildObjectList> ChildObjectListIterator;
    00571         ChildObjectListIterator getAttachedObjectIterator(void);
    00573         Real getBoundingRadius(void) const;
    00574
    00576         const AxisAlignedBox& getWorldBoundingBox(bool derive = false) const;
    00578         const Sphere& getWorldBoundingSphere(bool derive = false) const;
    00579
    00581         EdgeData* getEdgeList(void);
    00583         bool hasEdgeList(void);
    00585         ShadowRenderableListIterator getShadowVolumeRenderableIterator(
    00586             ShadowTechnique shadowTechnique, const Light* light,
    00587             HardwareIndexBufferSharedPtr* indexBuffer,
    00588             bool extrudeVertices, Real extrusionDistance, unsigned long flags = 0 );
    00589
    00591         const Matrix4* _getBoneMatrices(void) const { return mBoneMatrices;}
    00593         unsigned short _getNumBoneMatrices(void) const { return mNumBoneMatrices; }
    00595         bool hasSkeleton(void) const { return mSkeletonInstance != 0; }
    00597         SkeletonInstance* getSkeleton(void) const { return mSkeletonInstance; }
    00613         bool isHardwareAnimationEnabled(void);
    00614
    00616         void _notifyAttached(Node* parent, bool isTagPoint = false);
    00624         int getSoftwareAnimationRequests(void) const { return mSoftwareAnimationRequests; }
    00636         int getSoftwareAnimationNormalsRequests(void) const { return mSoftwareAnimationNormalsRequests; }
    00652         void addSoftwareAnimationRequest(bool normalsAlso);
    00661         void removeSoftwareAnimationRequest(bool normalsAlso);
    00662
    00667         void shareSkeletonInstanceWith(Entity* entity);
    00668
    00671         bool hasVertexAnimation(void) const;
    00672
    00673
    00676         void stopSharingSkeletonInstance();
    00677
    00678
    00682         inline bool sharesSkeletonInstance() const { return mSharedSkeletonEntities != NULL; }
    00683
    00688         inline const EntitySet* getSkeletonInstanceSharingSet() const { return mSharedSkeletonEntities; }
    00689
    00700         void refreshAvailableAnimationState(void);
    00701
    00709         void _updateAnimation(void);
    00710
    00716         bool _isAnimated(void) const;
    00717
    00720         bool _isSkeletonAnimated(void) const;
    00721
    00731         VertexData* _getSkelAnimVertexData(void) const;
    00740         VertexData* _getSoftwareVertexAnimVertexData(void) const;
    00745         VertexData* _getHardwareVertexAnimVertexData(void) const;
    00749         TempBlendedBufferInfo* _getSkelAnimTempBufferInfo(void);
    00753         TempBlendedBufferInfo* _getVertexAnimTempBufferInfo(void);
    00755         uint32 getTypeFlags(void) const;
    00757         VertexData* getVertexDataForBinding(void);
    00758
    00760         enum VertexDataBindChoice
    00761         {
    00762             BIND_ORIGINAL,
    00763             BIND_SOFTWARE_SKELETAL,
    00764             BIND_SOFTWARE_MORPH,
    00765             BIND_HARDWARE_MORPH
    00766         };
    00768         VertexDataBindChoice chooseVertexDataForBinding(bool hasVertexAnim);
    00769
    00771         bool _getBuffersMarkedForAnimation(void) const { return mVertexAnimationAppliedThisFrame; }
    00774         void _markBuffersUsedForAnimation(void);
    00775
    00784         bool isInitialised(void) const { return mInitialised; }
    00785
    00796         void _initialise(bool forceReinitialise = false);
    00798         void _deinitialise(void);
    00799
    00803         void backgroundLoadingComplete(Resource* res);
    00804
    00806         void visitRenderables(Renderable::Visitor* visitor,
    00807             bool debugRenderables = false);
    00808
    00810         Real _getMeshLodFactorTransformed() const;
    00811
    00815         void setSkipAnimationStateUpdate(bool skip) {
    00816             mSkipAnimStateUpdates = skip;
    00817         }
    00818
    00822         bool getSkipAnimationStateUpdate() const {
    00823             return mSkipAnimStateUpdates;
    00824         }
    00825
    00826
    00831         void setAlwaysUpdateMainSkeleton(bool update) {
    00832             mAlwaysUpdateMainSkeleton = update;
    00833         }
    00834
    00839         bool getAlwaysUpdateMainSkeleton() const {
    00840             return mAlwaysUpdateMainSkeleton;
    00841         }
    00842
    00843
    00844     };
    00845
    00847     class _OgreExport EntityFactory : public MovableObjectFactory
    00848     {
    00849     protected:
    00850         MovableObject* createInstanceImpl( const String& name, const NameValuePairList* params);
    00851     public:
    00852         EntityFactory() {}
    00853         ~EntityFactory() {}
    00854
    00855         static String FACTORY_TYPE_NAME;
    00856
    00857         const String& getType(void) const;
    00858         void destroyInstance( MovableObject* obj);
    00859
    00860     };
    00864 } // namespace
    00865
    00866 #endif

Copyright © 2012 Torus Knot Software Ltd
This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.
Last modified Sun Sep 2 2012 07:27:21