Main Page Namespace List Class Hierarchy Alphabetical List Compound List File List Namespace Members Compound Members File Members Related Pages

# OgreMesh.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 © 2000-2002 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 __Mesh_H__
    00026 #define __Mesh_H__
    00027
    00028 #include "OgrePrerequisites.h"
    00029
    00030 #include "OgreResource.h"
    00031 #include "OgreVertexIndexData.h"
    00032 #include "OgreAxisAlignedBox.h"
    00033 #include "OgreVertexBoneAssignment.h"
    00034 #include "OgreAnimationState.h"
    00035 #include "OgreIteratorWrappers.h"
    00036 #include "OgreProgressiveMesh.h"
    00037 #include "OgreHardwareVertexBuffer.h"
    00038
    00039
    00040 namespace Ogre {
    00041
    00042
    00043
    00079     class _OgreExport Mesh: public Resource
    00080     {
    00081         friend class MeshSerializerImpl;
    00082         friend class MeshSerializerImpl_v1_1;
    00083         friend class MeshSerializerImpl_v1_2;
    00084         friend class SubMesh;
    00085     public:
    00087         struct MeshLodUsage
    00088         {
    00090             Real fromDepthSquared;
    00092             String manualName;
    00094             mutable Mesh* manualMesh;
    00096             mutable EdgeData* edgeData;
    00097         };
    00098
    00099         typedef std::vector<Real> LodDistanceList;
    00101         typedef std::multimap<size_t, VertexBoneAssignment> VertexBoneAssignmentList;
    00102         typedef MapIterator<VertexBoneAssignmentList> BoneAssignmentIterator;
    00103         typedef std::vector<SubMesh*> SubMeshList;
    00104
    00105     protected:
    00112         SubMeshList mSubMeshList;
    00113
    00115         void organiseTangentsBuffer(VertexData *vertexData, unsigned short destCoordSet);
    00116
    00117     public:
    00121         typedef HashMap<String, ushort> SubMeshNameMap ;
    00122     protected:
    00123         SubMeshNameMap mSubMeshNameMap ;
    00124
    00126         AxisAlignedBox mAABB;
    00128         Real mBoundRadius;
    00129
    00130         bool mManuallyDefined;
    00131
    00132
    00134         String mSkeletonName;
    00135         Skeleton* mSkeleton;
    00136
    00137
    00138         VertexBoneAssignmentList mBoneAssignments;
    00139
    00141         bool mBoneAssignmentsOutOfDate;
    00142
    00144         void compileBoneAssignments(const VertexBoneAssignmentList& boneAssignments,
    00145             unsigned short numBlendWeightsPerVertex,
    00146             VertexData* targetVertexData);
    00148         void compileBoneAssignmentsSoftware(const VertexBoneAssignmentList& boneAssignments,
    00149             unsigned short numBlendWeightsPerVertex, VertexData* targetVertexData);
    00150
    00151
    00152         bool mIsLodManual;
    00153         ushort mNumLods;
    00154         typedef std::vector<MeshLodUsage> MeshLodUsageList;
    00155         MeshLodUsageList mMeshLodUsageList;
    00156
    00157         HardwareBuffer::Usage mVertexBufferUsage;
    00158         HardwareBuffer::Usage mIndexBufferUsage;
    00159         bool mVertexBufferShadowBuffer;
    00160         bool mIndexBufferShadowBuffer;
    00161
    00162
    00163         bool mPreparedForShadowVolumes;
    00164         bool mEdgeListsBuilt;
    00165         bool mAutoBuildEdgeLists;
    00166
    00167     public:
    00172         Mesh(const String& name);
    00173         ~Mesh();
    00174
    00177         virtual void load(void);
    00178
    00181         virtual void unload(void);
    00182
    00183         // NB All methods below are non-virtual since they will be
    00184         // called in the rendering loop - speed is of the essence.
    00185
    00192         SubMesh* createSubMesh(void);
    00193
    00196         SubMesh* createSubMesh(const String& name);
    00197
    00200         void nameSubMesh(const String& name, ushort index);
    00201
    00207         ushort _getSubMeshIndex(const String& name) const;
    00208
    00211         unsigned short getNumSubMeshes(void) const;
    00212
    00215         SubMesh* getSubMesh(unsigned short index) const;
    00216
    00219         SubMesh* getSubMesh(const String& name) const ;
    00220
    00221         typedef VectorIterator<SubMeshList> SubMeshIterator;
    00223         SubMeshIterator getSubMeshIterator(void)
    00224         { return SubMeshIterator(mSubMeshList.begin(), mSubMeshList.end()); }
    00225
    00234         VertexData *sharedVertexData;
    00235
    00243         void setManuallyDefined(bool manuallyDefined);
    00244
    00250         Mesh* clone(const String& newName);
    00251
    00254         const AxisAlignedBox& getBounds(void) const;
    00255
    00257         Real getBoundingSphereRadius(void) const;
    00258
    00267         void _setBounds(const AxisAlignedBox& bounds, bool pad = true);
    00268
    00276         void _setBoundingSphereRadius(Real radius);
    00277
    00288         void setSkeletonName(const String& skelName);
    00289
    00291         bool hasSkeleton(void) const;
    00292
    00294         Skeleton* getSkeleton(void) const;
    00295
    00297         const String& getSkeletonName(void) const;
    00302         void _initAnimationState(AnimationStateSet* animSet);
    00303
    00316         void addBoneAssignment(const VertexBoneAssignment& vertBoneAssign);
    00317
    00323         void clearBoneAssignments(void);
    00324
    00331         void _notifySkeleton(Skeleton* pSkel);
    00332
    00333
    00336         BoneAssignmentIterator getBoneAssignmentIterator(void);
    00337
    00338
    00362         void generateLodLevels(const LodDistanceList& lodDistances,
    00363             ProgressiveMesh::VertexReductionQuota reductionMethod, Real reductionValue);
    00364
    00369         ushort getNumLodLevels(void) const;
    00371         const MeshLodUsage& getLodLevel(ushort index) const;
    00385         void createManualLodLevel(Real fromDepth, const String& meshName);
    00386
    00394         void updateManualLodLevel(ushort index, const String& meshName);
    00395
    00398         ushort getLodIndex(Real depth) const;
    00399
    00406         ushort getLodIndexSquaredDepth(Real squaredDepth) const;
    00407
    00414         bool isLodManual(void) const { return mIsLodManual; }
    00415
    00417         void _setLodInfo(unsigned short numLevels, bool isManual);
    00419         void _setLodUsage(unsigned short level, Mesh::MeshLodUsage& usage);
    00421         void _setSubMeshLodFaceList(unsigned short subIdx, unsigned short level, IndexData* facedata);
    00422
    00424         void removeLodLevels(void);
    00425
    00448         void setVertexBufferPolicy(HardwareBuffer::Usage usage, bool shadowBuffer = false);
    00471         void setIndexBufferPolicy(HardwareBuffer::Usage usage, bool shadowBuffer = false);
    00473         HardwareBuffer::Usage getVertexBufferUsage(void) const { return mVertexBufferUsage; }
    00475         HardwareBuffer::Usage getIndexBufferUsage(void) const { return mIndexBufferUsage; }
    00477         bool isVertexBufferShadowed(void) const { return mVertexBufferShadowBuffer; }
    00479         bool isIndexBufferShadowed(void) const { return mIndexBufferShadowBuffer; }
    00480
    00481
    00495         unsigned short _rationaliseBoneAssignments(size_t vertexCount, VertexBoneAssignmentList& assignments);
    00496
    00504         void _compileBoneAssignments(void);
    00505
    00523         void buildTangentVectors(unsigned short sourceTexCoordSet = 0, unsigned short destTexCoordSet = 1);
    00524
    00537         bool suggestTangentVectorBuildParams(unsigned short& outSourceCoordSet, unsigned short& outDestCoordSet);
    00538
    00542         void buildEdgeList(void);
    00544         void freeEdgeList(void);
    00545
    00564         void prepareForShadowVolume(void);
    00565
    00572         EdgeData* getEdgeList(unsigned int lodIndex = 0);
    00573
    00580         const EdgeData* getEdgeList(unsigned int lodIndex = 0) const;
    00581
    00584         bool isPreparedForShadowVolumes(void) const { return mPreparedForShadowVolumes; }
    00585
    00587         bool isEdgeListBuilt(void) const { return mEdgeListsBuilt; }
    00588
    00604         static void softwareVertexBlend(const VertexData* sourceVertexData,
    00605             const VertexData* targetVertexData, const Matrix4* pMatrices,
    00606             bool blendNormals);
    00607
    00609         const SubMeshNameMap& getSubMeshNameMap(void) const { return mSubMeshNameMap; }
    00610
    00621         void setAutoBuildEdgeLists(bool autobuild) { mAutoBuildEdgeLists = autobuild; }
    00626         bool getAutoBuildEdgeLists(void) const { return mAutoBuildEdgeLists; }
    00627
    00628
    00629     };
    00630
    00631
    00632 } // namespace
    00633
    00634 #endif

Copyright © 2002-2003 by The OGRE Team
Last modified Sun Nov 28 19:48:34 2004