OGRE  1.9
Object-Oriented Graphics Rendering Engine
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
OgreMesh.h
Go to the documentation of this file.
1 /*
2 -----------------------------------------------------------------------------
3 This source file is part of OGRE
4  (Object-oriented Graphics Rendering Engine)
5 For the latest info, see http://www.ogre3d.org/
6 
7 Copyright (c) 2000-2014 Torus Knot Software Ltd
8 
9 Permission is hereby granted, free of charge, to any person obtaining a copy
10 of this software and associated documentation files (the "Software"), to deal
11 in the Software without restriction, including without limitation the rights
12 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
13 copies of the Software, and to permit persons to whom the Software is
14 furnished to do so, subject to the following conditions:
15 
16 The above copyright notice and this permission notice shall be included in
17 all copies or substantial portions of the Software.
18 
19 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
22 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
23 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
24 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
25 THE SOFTWARE.
26 -----------------------------------------------------------------------------
27 */
28 #ifndef __Mesh_H__
29 #define __Mesh_H__
30 
31 #include "OgrePrerequisites.h"
32 
33 #include "OgreResource.h"
34 #include "OgreVertexIndexData.h"
35 #include "OgreAxisAlignedBox.h"
37 #include "OgreIteratorWrappers.h"
39 #include "OgreSkeleton.h"
40 #include "OgreAnimation.h"
41 #include "OgreAnimationTrack.h"
42 #include "OgrePose.h"
43 #include "OgreDataStream.h"
44 #include "OgreHeaderPrefix.h"
45 
46 
47 namespace Ogre {
48 
49 
57  struct MeshLodUsage;
58  struct LodConfig;
59  class LodStrategy;
60 
94  {
95  friend class SubMesh;
96  friend class MeshSerializerImpl;
100 
101  public:
109 
110  protected:
118 
120  void organiseTangentsBuffer(VertexData *vertexData,
121  VertexElementSemantic targetSemantic, unsigned short index,
122  unsigned short sourceTexCoordSet);
123 
124  public:
128  typedef HashMap<String, ushort> SubMeshNameMap ;
129 
130 
131  protected:
132 
134 
136 
141 
145 
146 
148 
151 
153  void buildIndexMap(const VertexBoneAssignmentList& boneAssignments,
154  IndexMap& boneIndexToBlendIndexMap, IndexMap& blendIndexToBoneIndexMap);
156  void compileBoneAssignments(const VertexBoneAssignmentList& boneAssignments,
157  unsigned short numBlendWeightsPerVertex,
158  IndexMap& blendIndexToBoneIndexMap,
159  VertexData* targetVertexData);
160 
165 
170 
171 
175 
184  mutable bool mAnimationTypesDirty;
185 
188  mutable bool mPosesIncludeNormals;
189 
190 
196  void prepareImpl(void);
199  void unprepareImpl(void);
201  void loadImpl(void);
203  void postLoadImpl(void);
205  void unloadImpl(void);
207  size_t calculateSize(void) const;
208 
209  void mergeAdjacentTexcoords( unsigned short finalTexCoordSet,
210  unsigned short texCoordSetToDestroy, VertexData *vertexData );
211 
212 
213  public:
218  Mesh(ResourceManager* creator, const String& name, ResourceHandle handle,
219  const String& group, bool isManual = false, ManualResourceLoader* loader = 0);
220  ~Mesh();
221 
222  // NB All methods below are non-virtual since they will be
223  // called in the rendering loop - speed is of the essence.
224 
231  SubMesh* createSubMesh(void);
232 
235  SubMesh* createSubMesh(const String& name);
236 
239  void nameSubMesh(const String& name, ushort index);
240 
243  void unnameSubMesh(const String& name);
244 
250  ushort _getSubMeshIndex(const String& name) const;
251 
254  unsigned short getNumSubMeshes(void) const;
255 
258  SubMesh* getSubMesh(unsigned short index) const;
259 
262  SubMesh* getSubMesh(const String& name) const ;
263 
270  void destroySubMesh(unsigned short index);
271 
278  void destroySubMesh(const String& name);
279 
283  { return SubMeshIterator(mSubMeshList.begin(), mSubMeshList.end()); }
284 
294 
316 
328  MeshPtr clone(const String& newName, const String& newGroup = StringUtil::BLANK);
329 
332  const AxisAlignedBox& getBounds(void) const;
333 
335  Real getBoundingSphereRadius(void) const;
336 
345  void _setBounds(const AxisAlignedBox& bounds, bool pad = true);
346 
354  void _setBoundingSphereRadius(Real radius);
355 
367  void setSkeletonName(const String& skelName);
368 
370  bool hasSkeleton(void) const;
371 
374  bool hasVertexAnimation(void) const;
375 
380  const SkeletonPtr& getSkeleton(void) const;
381 
383  const String& getSkeletonName(void) const;
388  void _initAnimationState(AnimationStateSet* animSet);
389 
394  void _refreshAnimationState(AnimationStateSet* animSet);
407  void addBoneAssignment(const VertexBoneAssignment& vertBoneAssign);
408 
414  void clearBoneAssignments(void);
415 
422  void _notifySkeleton(SkeletonPtr& pSkel);
423 
424 
427  BoneAssignmentIterator getBoneAssignmentIterator(void);
428 
431  const VertexBoneAssignmentList& getBoneAssignments() const { return mBoneAssignments; }
432 
433 
438  ushort getNumLodLevels(void) const;
440  const MeshLodUsage& getLodLevel(ushort index) const;
456  void createManualLodLevel(Real value, const String& meshName, const String& groupName = Ogre::String());
457 
467  void updateManualLodLevel(ushort index, const String& meshName);
468 
475  ushort getLodIndex(Real value) const;
476 
483  bool isLodManual(void) const { return mIsLodManual; }
484 
486  void _setLodInfo(unsigned short numLevels, bool isManual);
488  void _setLodUsage(unsigned short level, MeshLodUsage& usage);
490  void _setSubMeshLodFaceList(unsigned short subIdx, unsigned short level, IndexData* facedata);
491 
493  void removeLodLevels(void);
494 
519  void setVertexBufferPolicy(HardwareBuffer::Usage usage, bool shadowBuffer = false);
544  void setIndexBufferPolicy(HardwareBuffer::Usage usage, bool shadowBuffer = false);
546  HardwareBuffer::Usage getVertexBufferUsage(void) const { return mVertexBufferUsage; }
548  HardwareBuffer::Usage getIndexBufferUsage(void) const { return mIndexBufferUsage; }
550  bool isVertexBufferShadowed(void) const { return mVertexBufferShadowBuffer; }
552  bool isIndexBufferShadowed(void) const { return mIndexBufferShadowBuffer; }
553 
554 
571  unsigned short _rationaliseBoneAssignments(size_t vertexCount, VertexBoneAssignmentList& assignments);
572 
580  void _compileBoneAssignments(void);
581 
587  void _updateCompiledBoneAssignments(void);
588 
604  void mergeAdjacentTexcoords( unsigned short finalTexCoordSet, unsigned short texCoordSetToDestroy );
605 
606  void _configureMeshLodUsage(const LodConfig& lodConfig);
607 
640  void buildTangentVectors(VertexElementSemantic targetSemantic = VES_TANGENT,
641  unsigned short sourceTexCoordSet = 0, unsigned short index = 0,
642  bool splitMirrored = false, bool splitRotated = false, bool storeParityInW = false);
643 
665  bool suggestTangentVectorBuildParams(VertexElementSemantic targetSemantic,
666  unsigned short& outSourceCoordSet, unsigned short& outIndex);
667 
671  void buildEdgeList(void);
673  void freeEdgeList(void);
674 
693  void prepareForShadowVolume(void);
694 
702  EdgeData* getEdgeList(unsigned short lodIndex = 0);
703 
711  const EdgeData* getEdgeList(unsigned short lodIndex = 0) const;
712 
715  bool isPreparedForShadowVolumes(void) const { return mPreparedForShadowVolumes; }
716 
718  bool isEdgeListBuilt(void) const { return mEdgeListsBuilt; }
719 
734  static void prepareMatricesForVertexBlend(const Matrix4** blendMatrices,
735  const Matrix4* boneMatrices, const IndexMap& indexMap);
736 
760  static void softwareVertexBlend(const VertexData* sourceVertexData,
761  const VertexData* targetVertexData,
762  const Matrix4* const* blendMatrices, size_t numMatrices,
763  bool blendNormals);
764 
781  static void softwareVertexMorph(Real t,
784  VertexData* targetVertexData);
785 
805  static void softwareVertexPoseBlend(Real weight,
806  const map<size_t, Vector3>::type& vertexOffsetMap,
807  const map<size_t, Vector3>::type& normalsMap,
808  VertexData* targetVertexData);
810  const SubMeshNameMap& getSubMeshNameMap(void) const { return mSubMeshNameMap; }
811 
822  void setAutoBuildEdgeLists(bool autobuild) { mAutoBuildEdgeLists = autobuild; }
827  bool getAutoBuildEdgeLists(void) const { return mAutoBuildEdgeLists; }
828 
831  virtual VertexAnimationType getSharedVertexDataAnimationType(void) const;
832 
834  bool getSharedVertexDataAnimationIncludesNormals() const { return mSharedVertexDataAnimationIncludesNormals; }
835 
842  virtual Animation* createAnimation(const String& name, Real length);
843 
848  virtual Animation* getAnimation(const String& name) const;
849 
855  virtual Animation* _getAnimationImpl(const String& name) const;
856 
858  virtual bool hasAnimation(const String& name) const;
859 
861  virtual void removeAnimation(const String& name);
862 
864  virtual unsigned short getNumAnimations(void) const;
865 
868  virtual Animation* getAnimation(unsigned short index) const;
869 
871  virtual void removeAllAnimations(void);
877  VertexData* getVertexDataByTrackHandle(unsigned short handle);
889  void updateMaterialForAllSubMeshes(void);
890 
895  void _determineAnimationTypes(void) const;
897  bool _getAnimationTypesDirty(void) const { return mAnimationTypesDirty; }
898 
908  Pose* createPose(ushort target, const String& name = StringUtil::BLANK);
910  size_t getPoseCount(void) const { return mPoseList.size(); }
912  Pose* getPose(ushort index);
914  Pose* getPose(const String& name);
919  void removePose(ushort index);
924  void removePose(const String& name);
926  void removeAllPoses(void);
927 
930 
932  PoseIterator getPoseIterator(void);
934  ConstPoseIterator getPoseIterator(void) const;
936  const PoseList& getPoseList(void) const;
937 
939  const LodStrategy *getLodStrategy() const;
941  void setLodStrategy(LodStrategy *lodStrategy);
942 
943  };
944 
947  {
953 
960 
968  mutable EdgeData* edgeData;
969 
970  MeshLodUsage() : userValue(0.0), value(0.0), edgeData(0) {}
971  };
972 
977 } // namespace Ogre
978 
979 #include "OgreHeaderSuffix.h"
980 
981 #endif // __Mesh_H__
Class encapsulating a set of AnimationState objects.
Class encapsulating a standard 4x4 homogeneous matrix.
Definition: OgreMatrix4.h:78
bool mPosesIncludeNormals
Definition: OgreMesh.h:188
bool mEdgeListsBuilt
Definition: OgreMesh.h:173
SkeletonPtr mSkeleton
Definition: OgreMesh.h:144
float Real
Software floating point type.
vector< unsigned short >::type IndexMap
Definition: OgreMesh.h:108
#define _OgreExport
Definition: OgrePlatform.h:260
AxisAlignedBox mAABB
Local bounding box volume.
Definition: OgreMesh.h:138
bool _getAnimationTypesDirty(void) const
Are the derived animation types out of date?
Definition: OgreMesh.h:897
HardwareBuffer::Usage mIndexBufferUsage
Definition: OgreMesh.h:167
Real mBoundRadius
Local bounding sphere radius (centered on object).
Definition: OgreMesh.h:140
ushort mNumLods
Definition: OgreMesh.h:163
Tangent (X axis if normal is Z)
A way of recording the way each LODs is recorded this Mesh.
Definition: OgreMesh.h:946
MapIterator< VertexBoneAssignmentList > BoneAssignmentIterator
Definition: OgreMesh.h:106
bool mSharedVertexDataAnimationIncludesNormals
Whether vertex animation includes normals.
Definition: OgreMesh.h:182
const LodStrategy * mLodStrategy
Definition: OgreMesh.h:161
bool mAnimationTypesDirty
Do we need to scan animations for animation types?
Definition: OgreMesh.h:184
bool getSharedVertexDataAnimationIncludesNormals() const
Returns whether animation on shared vertex data includes normals.
Definition: OgreMesh.h:834
IndexMap sharedBlendIndexToBoneIndexMap
Shared index map for translating blend index to bone index.
Definition: OgreMesh.h:315
A pose is a linked set of vertex offsets applying to one set of vertex data.
Definition: OgrePose.h:55
Shared pointer implementation used to share vertex buffers.
A 3D box aligned with the x/y/z axes.
bool mPreparedForShadowVolumes
Definition: OgreMesh.h:172
map< String, Animation * >::type AnimationList
Storage of morph animations, lookup by name.
Definition: OgreMesh.h:177
Interface describing a manual resource loader.
Definition: OgreResource.h:514
VertexElementSemantic
Vertex element semantics, used to identify the meaning of vertex buffer contents. ...
SubMeshList mSubMeshList
A list of submeshes which make up this mesh.
Definition: OgreMesh.h:117
Strategy for determining level of detail.
MeshLodUsageList mMeshLodUsageList
Definition: OgreMesh.h:164
HardwareBuffer::Usage mVertexBufferUsage
Definition: OgreMesh.h:166
bool mIndexBufferShadowBuffer
Definition: OgreMesh.h:169
Concrete IteratorWrapper for nonconst access to the underlying key-value container.
bool mVertexBufferShadowBuffer
Definition: OgreMesh.h:168
vector< Pose * >::type PoseList
Definition: OgrePose.h:135
bool mAutoBuildEdgeLists
Definition: OgreMesh.h:174
const SubMeshNameMap & getSubMeshNameMap(void) const
Gets a reference to the optional name assignments of the SubMeshes.
Definition: OgreMesh.h:810
bool isIndexBufferShadowed(void) const
Gets whether or not this meshes index buffers are shadowed.
Definition: OgreMesh.h:552
bool getAutoBuildEdgeLists(void) const
Sets whether or not this Mesh should automatically build edge lists when asked for them...
Definition: OgreMesh.h:827
VertexData * sharedVertexData
Shared vertex data.
Definition: OgreMesh.h:293
void setAutoBuildEdgeLists(bool autobuild)
Sets whether or not this Mesh should automatically build edge lists when asked for them...
Definition: OgreMesh.h:822
DataStreamPtr mFreshFromDisk
Definition: OgreMesh.h:133
String manualGroup
Only relevant if mIsLodManual is true, the name of the group of the alternative mesh.
Definition: OgreMesh.h:964
bool isPreparedForShadowVolumes(void) const
Returns whether this mesh has already had it's geometry prepared for use in rendering shadow volumes...
Definition: OgreMesh.h:715
Concrete IteratorWrapper for const access to the underlying container.
vector< SubMesh * >::type SubMeshList
Definition: OgreMesh.h:107
Internal implementation of Mesh reading / writing for the latest version of the .mesh format...
HardwareBuffer::Usage getVertexBufferUsage(void) const
Gets the usage setting for this meshes vertex buffers.
Definition: OgreMesh.h:546
Summary class collecting together index data source information.
Usage
Enums describing buffer usage; not mutually exclusive.
EdgeData * edgeData
Edge list for this LOD level (may be derived from manual mesh).
Definition: OgreMesh.h:968
HashMap< String, ushort > SubMeshNameMap
A hashmap used to store optional SubMesh names.
Definition: OgreMesh.h:128
Defines a part of a complete mesh.
Definition: OgreSubMesh.h:62
Real value
Value used by to determine when this LOD applies.
Definition: OgreMesh.h:959
SubMeshIterator getSubMeshIterator(void)
Gets an iterator over the available submeshes.
Definition: OgreMesh.h:282
MeshPtr manualMesh
Hard link to mesh to avoid looking up each time.
Definition: OgreMesh.h:966
unsigned short ushort
const VertexBoneAssignmentList & getBoneAssignments() const
Gets a const reference to the list of bone assignments.
Definition: OgreMesh.h:431
Real userValue
User-supplied values used to determine when th is LOD applies.
Definition: OgreMesh.h:952
Abstract class representing a loadable resource (e.g.
Definition: OgreResource.h:79
unsigned long long int ResourceHandle
Definition: OgreResource.h:41
static const String BLANK
Constant blank string, useful for returning by ref where local does not exist.
Definition: OgreString.h:196
Summary class collecting together vertex source information.
String manualName
Only relevant if mIsLodManual is true, the name of the alternative mesh to use.
Definition: OgreMesh.h:962
bool mBoneAssignmentsOutOfDate
Flag indicating that bone assignments need to be recompiled.
Definition: OgreMesh.h:150
PoseList mPoseList
List of available poses for shared and dedicated geometryPoseList.
Definition: OgreMesh.h:187
multimap< size_t, VertexBoneAssignment >::type VertexBoneAssignmentList
Multimap of vertex bone assignments (orders by vertex index).
Definition: OgreMesh.h:105
vector< Real >::type LodValueList
Definition: OgreMesh.h:102
An animation container interface, which allows generic access to sibling animations.
Definition: OgreAnimation.h:58
Class for providing backwards-compatibility for loading version 1.2 of the .mesh format.
AnimationList mAnimationsList
Definition: OgreMesh.h:178
ConstVectorIterator< PoseList > ConstPoseIterator
Definition: OgreMesh.h:929
Class for providing backwards-compatibility for loading version 1.4 of the .mesh format.
This class contains the information required to describe the edge connectivity of a given set of vert...
Defines a generic resource handler.
bool isVertexBufferShadowed(void) const
Gets whether or not this meshes vertex buffers are shadowed.
Definition: OgreMesh.h:550
VertexBoneAssignmentList mBoneAssignments
Definition: OgreMesh.h:147
_StringBase String
bool isLodManual(void) const
Returns true if this mesh is using manual LOD.
Definition: OgreMesh.h:483
HardwareBuffer::Usage getIndexBufferUsage(void) const
Gets the usage setting for this meshes index buffers.
Definition: OgreMesh.h:548
size_t getPoseCount(void) const
Get the number of poses.
Definition: OgreMesh.h:910
Resource holding data about 3D mesh.
Definition: OgreMesh.h:93
bool mIsLodManual
Definition: OgreMesh.h:162
VectorIterator< SubMeshList > SubMeshIterator
Definition: OgreMesh.h:280
Concrete IteratorWrapper for nonconst access to the underlying container.
vector< MeshLodUsage >::type MeshLodUsageList
Definition: OgreMesh.h:103
bool isEdgeListBuilt(void) const
Returns whether this mesh has an attached edge list.
Definition: OgreMesh.h:718
VertexAnimationType
Type of vertex animation.
VectorIterator< PoseList > PoseIterator
Definition: OgreMesh.h:928
String mSkeletonName
Optional linked skeleton.
Definition: OgreMesh.h:143
An animation sequence.
Definition: OgreAnimation.h:92
SubMeshNameMap mSubMeshNameMap
Definition: OgreMesh.h:135
Records the assignment of a single vertex to a single bone with the corresponding weight...
Class for providing backwards-compatibility for loading version 1.1 of the .mesh format.
VertexAnimationType mSharedVertexDataAnimationType
The vertex animation type associated with the shared vertex data.
Definition: OgreMesh.h:180