# OgreInstancedGeometry.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 __InstancedGeometry_H__
    00030 #define __InstancedGeometry_H__
    00031
    00032 #include "OgrePrerequisites.h"
    00033 #include "OgreMovableObject.h"
    00034 #include "OgreSimpleRenderable.h"
    00035 #include "OgreSkeleton.h"
    00036 #include "OgreSkeletonInstance.h"
    00037 #include "OgreAnimationTrack.h"
    00038 #include "OgreBone.h"
    00039 #include "OgreIteratorWrappers.h"
    00040
    00041 namespace Ogre {
    00042
    00098     class _OgreExport  InstancedGeometry : public BatchedGeometryAlloc
    00099     {
    00100     public:
    00113         class _OgrePrivate OptimisedSubMeshGeometry : public BatchedGeometryAlloc
    00114         {
    00115         public:
    00116             OptimisedSubMeshGeometry() :vertexData(0), indexData(0) {}
    00117             ~OptimisedSubMeshGeometry()
    00118             {
    00119                 delete vertexData;
    00120                 delete indexData;
    00121             }
    00122             VertexData *vertexData;
    00123             IndexData *indexData;
    00124         };
    00125         typedef std::list<OptimisedSubMeshGeometry*> OptimisedSubMeshGeometryList;
    00128         struct SubMeshLodGeometryLink
    00129         {
    00130             VertexData* vertexData;
    00131             IndexData* indexData;
    00132         };
    00133         typedef std::vector<SubMeshLodGeometryLink> SubMeshLodGeometryLinkList;
    00134         typedef std::map<SubMesh*, SubMeshLodGeometryLinkList*> SubMeshGeometryLookup;
    00136         struct QueuedSubMesh : public BatchedGeometryAlloc
    00137         {
    00138             SubMesh* submesh;
    00140             SubMeshLodGeometryLinkList* geometryLodList;
    00141             String materialName;
    00142             Vector3 position;
    00143             Quaternion orientation;
    00144             Vector3 scale;
    00146             AxisAlignedBox worldBounds;
    00147             unsigned int ID;
    00148         };
    00149         typedef std::vector<QueuedSubMesh*> QueuedSubMeshList;
    00150         typedef std::vector<String> QueuedSubMeshOriginList;
    00152         struct QueuedGeometry : public BatchedGeometryAlloc
    00153         {
    00154             SubMeshLodGeometryLink* geometry;
    00155             Vector3 position;
    00156             Quaternion orientation;
    00157             Vector3 scale;
    00158             unsigned int ID;
    00159         };
    00160         typedef std::vector<QueuedGeometry*> QueuedGeometryList;
    00161
    00162         // forward declarations
    00163         class LODBucket;
    00164         class MaterialBucket;
    00165         class BatchInstance;
    00166         class InstancedObject;
    00167
    00172         class _OgreExport  GeometryBucket : public SimpleRenderable
    00173         {
    00174         protected:
    00175
    00177             QueuedGeometryList mQueuedGeometry;
    00179             InstancedGeometry*mBatch;
    00181             MaterialBucket* mParent;
    00183             String mFormatString;
    00186             VertexData* mVertexData;
    00189             IndexData* mIndexData;
    00191             HardwareIndexBuffer::IndexType mIndexType;
    00193             size_t mMaxVertexIndex;
    00195             unsigned short mTexCoordIndex;
    00196             AxisAlignedBox mAABB;
    00197
    00198             template<typename T>
    00199             void copyIndexes(const T* src, T* dst, size_t count, size_t indexOffset)
    00200             {
    00201                 if (indexOffset == 0)
    00202                 {
    00203                     memcpy(dst, src, sizeof(T) * count);
    00204                 }
    00205                 else
    00206                 {
    00207                     while(count--)
    00208                     {
    00209                         *dst++ = static_cast<T>(*src++ + indexOffset);
    00210                     }
    00211                 }
    00212             }
    00213         public:
    00214             GeometryBucket(MaterialBucket* parent, const String& formatString,
    00215                 const VertexData* vData, const IndexData* iData);
    00216             GeometryBucket(MaterialBucket* parent,const String& formatString,GeometryBucket*bucket);
    00217             virtual ~GeometryBucket();
    00218             MaterialBucket* getParent(void) { return mParent; }
    00219             Real getBoundingRadius(void) const;
    00221             const VertexData* getVertexData(void) const { return mVertexData; }
    00223             const IndexData* getIndexData(void) const { return mIndexData; }
    00225             const MaterialPtr& getMaterial(void) const;
    00226             Technique* getTechnique(void) const;
    00227             void getWorldTransforms(Matrix4* xform) const;
    00228             virtual unsigned short getNumWorldTransforms(void) const ;
    00229             Real getSquaredViewDepth(const Camera* cam) const;
    00230             const LightList& getLights(void) const;
    00231             bool getCastsShadows(void) const;
    00232             String getFormatString(void) const;
    00236             bool assign(QueuedGeometry* qsm);
    00238             void build();
    00240             void dump(std::ofstream& of) const;
    00242             AxisAlignedBox & getAABB(void){return mAABB;};
    00244             void visitRenderables(Renderable::Visitor* visitor, bool debugRenderables);
    00245
    00246         };
    00247         class _OgreExport  InstancedObject : public BatchedGeometryAlloc
    00248         {
    00249             friend class GeometryBucket;
    00250         public:
    00251              enum TransformSpace
    00252         {
    00254             TS_LOCAL,
    00256             TS_PARENT,
    00258             TS_WORLD
    00259         };
    00261             typedef std::vector<GeometryBucket*> GeometryBucketList;
    00262         protected:
    00263             GeometryBucketList mGeometryBucketList;
    00264             unsigned short mIndex;
    00265             Matrix4  mTransformation;
    00266             Quaternion mOrientation;
    00267             Vector3 mScale;
    00268             Vector3 mPosition;
    00269             SkeletonInstance* mSkeletonInstance;
    00271             Matrix4 *mBoneWorldMatrices;
    00273             Matrix4 *mBoneMatrices;
    00275             AnimationStateSet* mAnimationState;
    00276             unsigned short mNumBoneMatrices;
    00278             unsigned long mFrameAnimationLastUpdated;
    00279         public:
    00280             InstancedObject(int index);
    00281             InstancedObject(int index,SkeletonInstance *skeleton,AnimationStateSet*animations);
    00282             ~InstancedObject();
    00283             void setPosition( Vector3  position);
    00284             Vector3 & getPosition(void);
    00285             void yaw(const Radian& angle);
    00286             void pitch(const Radian& angle);
    00287             void roll(const Radian& angle);
    00288             void rotate(const Quaternion& q);
    00289             void setScale(const Vector3& scale);
    00290             void setOrientation(const Quaternion& q);
    00291             void setPositionAndOrientation(Vector3 p, const Quaternion& q);
    00292             Quaternion & getOrientation(void);
    00293             void addBucketToList(GeometryBucket* bucket);
    00294             void needUpdate();
    00295             GeometryBucketList&getGeometryBucketList(void){return mGeometryBucketList;}
    00296             void translate(const Matrix3& axes, const Vector3& move);
    00297             void translate(const Vector3& d);
    00298             Matrix3 getLocalAxes(void) const;
    00299             void updateAnimation(void);
    00300             AnimationState* getAnimationState(const String& name) const;
    00301             SkeletonInstance*getSkeletonInstance(void){return mSkeletonInstance;}
    00302
    00303         };
    00306         class _OgreExport  MaterialBucket : public BatchedGeometryAlloc
    00307         {
    00308         public:
    00310             typedef std::vector<GeometryBucket*> GeometryBucketList;
    00311         protected:
    00313             LODBucket* mParent;
    00315             String mMaterialName;
    00317             MaterialPtr mMaterial;
    00319             Technique* mTechnique;
    00320             int mLastIndex;
    00322             GeometryBucketList mGeometryBucketList;
    00323             // index to current Geometry Buckets for a given geometry format
    00324             typedef std::map<String, GeometryBucket*> CurrentGeometryMap;
    00325             CurrentGeometryMap mCurrentGeometryMap;
    00327             String getGeometryFormatString(SubMeshLodGeometryLink* geom);
    00328
    00329         public:
    00330             MaterialBucket(LODBucket* parent, const String& materialName);
    00331             virtual ~MaterialBucket();
    00332             LODBucket* getParent(void) { return mParent; }
    00334             const String& getMaterialName(void) const { return mMaterialName; }
    00336             void assign(QueuedGeometry* qsm);
    00338             void build();
    00340             void addRenderables(RenderQueue* queue, uint8 group,
    00341                 Real camSquaredDist);
    00343             const MaterialPtr& getMaterial(void) const { return mMaterial; }
    00345             typedef VectorIterator<GeometryBucketList> GeometryIterator;
    00347             GeometryIterator getGeometryIterator(void);
    00349             Technique* getCurrentTechnique(void) const { return mTechnique; }
    00351             void dump(std::ofstream& of) const;
    00353             MaterialBucket::CurrentGeometryMap* getMaterialBucketMap(void) const;
    00355             MaterialBucket::GeometryBucketList*getGeometryBucketList(void) const;
    00357             void updateContainers(GeometryBucket* bucket, const String &format);
    00358             void setLastIndex(int index){mLastIndex=index;}
    00359             int getLastIndex(){return mLastIndex;}
    00360             void setMaterial(const String & name);
    00361             void visitRenderables(Renderable::Visitor* visitor, bool debugRenderables);
    00362
    00363         };
    00369         class _OgreExport  LODBucket : public BatchedGeometryAlloc
    00370         {
    00371         public:
    00373             typedef std::map<String, MaterialBucket*> MaterialBucketMap;
    00374         protected:
    00376             BatchInstance* mParent;
    00378             unsigned short mLod;
    00380             Real mSquaredDistance;
    00382             MaterialBucketMap mMaterialBucketMap;
    00384             QueuedGeometryList mQueuedGeometryList;
    00385         public:
    00386             LODBucket(BatchInstance* parent, unsigned short lod, Real lodDist);
    00387             virtual ~LODBucket();
    00388             BatchInstance* getParent(void) { return mParent; }
    00390             ushort getLod(void) const { return mLod; }
    00392             Real getSquaredDistance(void) const { return mSquaredDistance; }
    00394             void assign(QueuedSubMesh* qsm, ushort atLod);
    00396             void build();
    00398             void addRenderables(RenderQueue* queue, uint8 group,
    00399                 Real camSquaredDistance);
    00401             typedef MapIterator<MaterialBucketMap> MaterialIterator;
    00403             MaterialIterator getMaterialIterator(void);
    00405             void dump(std::ofstream& of) const;
    00407             void updateContainers(MaterialBucket* bucket, String& name );
    00408             void visitRenderables(Renderable::Visitor* visitor, bool debugRenderables);
    00409
    00410         };
    00419         class _OgreExport  BatchInstance : public MovableObject
    00420         {
    00421             public:
    00422
    00423
    00425             typedef std::vector<LODBucket*> LODBucketList;
    00426             typedef std::map<int, InstancedObject*> ObjectsMap;
    00427             typedef MapIterator<ObjectsMap> InstancedObjectIterator;
    00428         protected:
    00429
    00431             InstancedGeometry* mParent;
    00433             SceneManager* mSceneMgr;
    00435             SceneNode* mNode;
    00437             QueuedSubMeshList mQueuedSubMeshes;
    00439             uint32 mBatchInstanceID;
    00440
    00441             ObjectsMap mInstancesMap;
    00442         public:
    00444             std::vector<Real> mLodSquaredDistances;
    00446             AxisAlignedBox mAABB;
    00448             Real mBoundingRadius;
    00450             ushort mCurrentLod;
    00452             Real mCamDistanceSquared;
    00453         protected:
    00455             LODBucketList mLodBucketList;
    00456
    00457         public:
    00458             BatchInstance(InstancedGeometry* parent, const String& name, SceneManager* mgr,
    00459                 uint32 BatchInstanceID);
    00460             virtual ~BatchInstance();
    00461             // more fields can be added in subclasses
    00462             InstancedGeometry* getParent(void) const { return mParent;}
    00464             void assign(QueuedSubMesh* qmesh);
    00466             void build();
    00468             uint32 getID(void) const { return mBatchInstanceID; }
    00470 //          const Vector3& getCentre(void) const { return mCentre; }
    00471             const String& getMovableType(void) const;
    00472             void _notifyCurrentCamera(Camera* cam);
    00473             const AxisAlignedBox& getBoundingBox(void) const;
    00474             void  setBoundingBox(AxisAlignedBox& box);
    00475             Real getBoundingRadius(void) const;
    00476             void _updateRenderQueue(RenderQueue* queue);
    00477             bool isVisible(void) const;
    00479             void visitRenderables(Renderable::Visitor* visitor,
    00480                 bool debugRenderables = false);
    00481
    00482         //  uint32 getTypeFlags(void) const;
    00483
    00484             typedef VectorIterator<LODBucketList> LODIterator;
    00486             LODIterator getLODIterator(void);
    00488             const LightList& getLights(void) const;
    00489
    00491             void updateBoundingBox();
    00492
    00494             void dump(std::ofstream& of) const;
    00496             void updateContainers(LODBucket* bucket );
    00498             void attachToScene();
    00499             void addInstancedObject(int index, InstancedObject* object);
    00500             InstancedObject*  isInstancedObjectPresent(int index);
    00501             InstancedObjectIterator getObjectIterator();
    00502             SceneNode*getSceneNode(void){return mNode;}
    00503             ObjectsMap& getInstancesMap(void){return  mInstancesMap;}
    00505
    00506         };
    00510         typedef std::map<uint32, BatchInstance*> BatchInstanceMap;
    00516         typedef std::vector<RenderOperation*> RenderOperationVector;
    00517     protected:
    00518         // General state & settings
    00519         SceneManager* mOwner;
    00520         String mName;
    00521         bool mBuilt;
    00522         Real mUpperDistance;
    00523         Real mSquaredUpperDistance;
    00524         bool mCastShadows;
    00525         Vector3 mBatchInstanceDimensions;
    00526         Vector3 mHalfBatchInstanceDimensions;
    00527         Vector3 mOrigin;
    00528         bool mVisible;
    00530         uint8 mRenderQueueID;
    00532         bool mRenderQueueIDSet;
    00534         unsigned int mObjectCount;
    00535         QueuedSubMeshList mQueuedSubMeshes;
    00536         BatchInstance*mInstancedGeometryInstance;
    00540         SkeletonPtr mBaseSkeleton;
    00541         SkeletonInstance *mSkeletonInstance;
    00545         AnimationStateSet* mAnimationState;
    00548         OptimisedSubMeshGeometryList mOptimisedSubMeshGeometryList;
    00549
    00554         SubMeshGeometryLookup mSubMeshGeometryLookup;
    00555
    00557         BatchInstanceMap mBatchInstanceMap;
    00561         RenderOperationVector mRenderOps;
    00565         virtual BatchInstance* getBatchInstance(const AxisAlignedBox& bounds, bool autoCreate);
    00567         virtual BatchInstance* getBatchInstance(const Vector3& point, bool autoCreate);
    00569         virtual BatchInstance* getBatchInstance(ushort x, ushort y, ushort z, bool autoCreate);
    00571         virtual BatchInstance* getBatchInstance(uint32 index);
    00574         virtual void getBatchInstanceIndexes(const Vector3& point,
    00575             ushort& x, ushort& y, ushort& z);
    00578         virtual BatchInstance* getInstancedGeometryInstance(void);
    00581         virtual uint32 packIndex(ushort x, ushort y, ushort z);
    00584         virtual Real getVolumeIntersection(const AxisAlignedBox& box,
    00585             ushort x, ushort y, ushort z);
    00588         virtual AxisAlignedBox getBatchInstanceBounds(ushort x, ushort y, ushort z);
    00591         virtual Vector3 getBatchInstanceCentre(ushort x, ushort y, ushort z);
    00593         virtual AxisAlignedBox calculateBounds(VertexData* vertexData,
    00594             const Vector3& position, const Quaternion& orientation,
    00595             const Vector3& scale);
    00597         SubMeshLodGeometryLinkList* determineGeometry(SubMesh* sm);
    00599         void splitGeometry(VertexData* vd, IndexData* id,
    00600             SubMeshLodGeometryLink* targetGeomLink);
    00601
    00602         typedef std::map<size_t, size_t> IndexRemap;
    00607         template <typename T>
    00608         void buildIndexRemap(T* pBuffer, size_t numIndexes, IndexRemap& remap)
    00609         {
    00610             remap.clear();
    00611             for (size_t i = 0; i < numIndexes; ++i)
    00612             {
    00613                 // use insert since duplicates are silently discarded
    00614                 remap.insert(IndexRemap::value_type(*pBuffer++, remap.size()));
    00615                 // this will have mapped oldindex -> new index IF oldindex
    00616                 // wasn't already there
    00617             }
    00618         }
    00620         template <typename T>
    00621         void remapIndexes(T* src, T* dst, const IndexRemap& remap,
    00622                 size_t numIndexes)
    00623         {
    00624             for (size_t i = 0; i < numIndexes; ++i)
    00625             {
    00626                 // look up original and map to target
    00627                 IndexRemap::const_iterator ix = remap.find(*src++);
    00628                 assert(ix != remap.end());
    00629                 *dst++ = static_cast<T>(ix->second);
    00630             }
    00631         }
    00632
    00633     public:
    00635         InstancedGeometry(SceneManager* owner, const String& name);
    00637         virtual ~InstancedGeometry();
    00638
    00640         const String& getName(void) const { return mName; }
    00659         virtual void addEntity(Entity* ent, const Vector3& position,
    00660             const Quaternion& orientation = Quaternion::IDENTITY,
    00661             const Vector3& scale = Vector3::UNIT_SCALE);
    00662
    00681         virtual void addSceneNode(const SceneNode* node);
    00682
    00693         virtual void build(void);
    00702         void addBatchInstance(void);
    00708         virtual void destroy(void);
    00709
    00713         virtual void reset(void);
    00714
    00724         virtual void setRenderingDistance(Real dist) {
    00725             mUpperDistance = dist;
    00726             mSquaredUpperDistance = mUpperDistance * mUpperDistance;
    00727         }
    00728
    00730         virtual Real getRenderingDistance(void) const { return mUpperDistance; }
    00731
    00733         virtual Real getSquaredRenderingDistance(void) const
    00734         { return mSquaredUpperDistance; }
    00735
    00737         virtual void setVisible(bool visible);
    00738
    00740         virtual bool isVisible(void) const { return mVisible; }
    00741
    00759         virtual void setCastShadows(bool castShadows);
    00761         virtual bool getCastShadows(void) { return mCastShadows; }
    00762
    00773         virtual void setBatchInstanceDimensions(const Vector3& size) {
    00774             mBatchInstanceDimensions = size;
    00775             mHalfBatchInstanceDimensions = size * 0.5;
    00776         }
    00778         virtual const Vector3& getBatchInstanceDimensions(void) const { return mBatchInstanceDimensions; }
    00790         virtual void setOrigin(const Vector3& origin) { mOrigin = origin; }
    00792         virtual const Vector3& getOrigin(void) const { return mOrigin; }
    00793
    00805         virtual void setRenderQueueGroup(uint8 queueID);
    00806
    00808         virtual uint8 getRenderQueueGroup(void) const;
    00810         typedef MapIterator<BatchInstanceMap> BatchInstanceIterator;
    00812         BatchInstanceIterator getBatchInstanceIterator(void);
    00814         RenderOperationVector& getRenderOperationVector(){return mRenderOps;}
    00816         void visitRenderables(Renderable::Visitor* visitor,
    00817             bool debugRenderables = false);
    00818
    00822         virtual void dump(const String& filename) const;
    00827         SkeletonInstance *getBaseSkeletonInstance(void){return mSkeletonInstance;}
    00832         SkeletonPtr getBaseSkeleton(void){return mBaseSkeleton;}
    00837         AnimationStateSet* getBaseAnimationState(void){return mAnimationState;}
    00842         unsigned int getObjectCount(void){return mObjectCount;}
    00843
    00844
    00845
    00846     };
    00847
    00848 }
    00849
    00850 #endif
    00851

Copyright © 2008 Torus Knot Software Ltd
This work is licensed under a Creative Commons Attribution-ShareAlike 2.5 License.
Last modified Sat Apr 11 14:26:41 2009