OgreProgressiveMeshGenerator.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-2013 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 
29 #ifndef __ProgressiveMeshGenerator_H_
30 #define __ProgressiveMeshGenerator_H_
31 
32 #include "OgrePrerequisites.h"
33 #include "OgreVector3.h"
34 #include "OgreSmallVector.h"
35 #include "OgreMesh.h"
36 #include "OgreLodConfig.h"
37 
38 namespace Ogre
39 {
40 
42 {
43 public:
49  virtual void generateLodLevels(LodConfig& lodConfig) = 0;
50 
57 
64  virtual void getAutoconfig(MeshPtr& inMesh, LodConfig& outLodConfig);
65 
67 };
68 
74 {
75 public:
76 
79 
81  void generateLodLevels(LodConfig& lodConfig);
82 
83 protected:
84 
85  // VectorSet is basically a helper to use a vector as a small set container.
86  // Also these functions keep the code clean and fast.
87  // You can insert in O(1) time, if you know that it doesn't exists.
88  // You can remove in O(1) time, if you know the position of the item.
89  template<typename T, unsigned S>
91  public SmallVector<T, S> {
93 
94  void addNotExists(const T& item); // Complexity: O(1)!!
95  void remove(iterator it); // Complexity: O(1)!!
96  iterator add(const T& item); // Complexity: O(N)
97  void removeExists(const T& item); // Complexity: O(N)
98  bool remove(const T& item); // Complexity: O(N)
99  void replaceExists(const T& oldItem, const T& newItem); // Complexity: O(N)
100  bool has(const T& item); // Complexity: O(N)
101  iterator find(const T& item); // Complexity: O(N)
102  iterator findExists(const T& item); // Complexity: O(N)
103  };
104 
105  struct PMEdge;
106  struct PMVertex;
107  struct PMTriangle;
108  struct PMVertexHash;
109  struct PMVertexEqual;
110  struct PMCollapseCostLess;
111  struct PMCollapsedEdge;
112  struct PMIndexBufferInfo;
113 
116  typedef HashSet<PMVertex*, PMVertexHash, PMVertexEqual> UniqueVertexSet;
119 
122 
125 
126  // Hash function for UniqueVertexSet.
129 
130  PMVertexHash() { assert(0); }
132  size_t operator() (const PMVertex* v) const;
133  };
134 
135  // Equality function for UniqueVertexSet.
137  bool operator() (const PMVertex* lhs, const PMVertex* rhs) const;
138  };
139 
140  // Directed edge
144  int refCount;
145 
146  explicit PMEdge(PMVertex* destination);
147  bool operator== (const PMEdge& other) const;
148  PMEdge& operator= (const PMEdge& b);
149  PMEdge(const PMEdge& b);
150  bool operator< (const PMEdge& other) const;
151  };
152 
157 
159  bool seam;
160  CollapseCostHeap::iterator costHeapPosition;
161  };
162 
164  PMVertex* vertex[3];
166  bool isRemoved;
167  unsigned short submeshID;
168  unsigned int vertexID[3];
169 
171  bool hasVertex(const PMVertex* v) const;
172  unsigned int getVertexID(const PMVertex* v) const;
173  bool isMalformed();
174  };
175 
177  size_t indexSize;
178  size_t indexCount;
179  };
180 
182  unsigned short* pshort;
183  unsigned int* pint;
184  };
185 
187  unsigned int srcID;
188  unsigned int dstID;
189  unsigned short submeshID;
190  };
191 
198  CollapsedEdges tmpCollapsedEdges; // Tmp container used in collapse().
200 
202 
203 #ifndef NDEBUG
204 
210 #endif
213 
214  size_t calcLodVertexCount(const LodLevel& lodConfig);
216  void addVertexData(VertexData* vertexData, bool useSharedVertexLookup);
217  template<typename IndexType>
218  void addIndexDataImpl(IndexType* iPos, const IndexType* iEnd, VertexLookupList& lookup, unsigned short submeshID);
219  void addIndexData(IndexData* indexData, bool useSharedVertexLookup, unsigned short submeshID);
220 
221  void computeCosts();
222  bool isBorderVertex(const PMVertex* vertex) const;
226  virtual void bakeLods();
227  void collapse(PMVertex* vertex);
228  void initialize();
229  void computeLods(LodConfig& lodConfigs);
231 
232  bool hasSrcID(unsigned int srcID, unsigned short submeshID);
233  size_t findDstID(unsigned int srcID, unsigned short submeshID);
234  void replaceVertexID(PMTriangle* triangle, unsigned int oldID, unsigned int newID, PMVertex* dst);
235 
236 #ifndef NDEBUG
240 #endif // ifndef NDEBUG
241 
243  void removeTriangleFromEdges(PMTriangle* triangle, PMVertex* skip = NULL);
244  void addEdge(PMVertex* v, const PMEdge& edge);
245  void removeEdge(PMVertex* v, const PMEdge& edge);
246  void printTriangle(PMTriangle* triangle, stringstream& str);
248  bool isDuplicateTriangle(PMTriangle* triangle, PMTriangle* triangle2);
250  int getTriangleID(PMTriangle* triangle);
252 };
253 
254 }
255 #endif
Ogre::ProgressiveMeshGenerator::computeLods
void computeLods(LodConfig &lodConfigs)
Ogre::ProgressiveMeshGenerator::VectorSet::add
iterator add(const T &item)
Ogre::ProgressiveMeshGenerator::addEdge
void addEdge(PMVertex *v, const PMEdge &edge)
Ogre::ProgressiveMeshGenerator::PMVertex::edges
VEdges edges
Definition: OgreProgressiveMeshGenerator.h:155
Ogre
Definition: OgreAndroidLogListener.h:35
Ogre::ProgressiveMeshGenerator::assertValidVertex
void assertValidVertex(PMVertex *v)
Ogre::ProgressiveMeshGenerator::PMEdge::PMEdge
PMEdge(PMVertex *destination)
Ogre::ProgressiveMeshGenerator::VertexList
vector< PMVertex >::type VertexList
Definition: OgreProgressiveMeshGenerator.h:112
Ogre::ProgressiveMeshGenerator::addVertexData
void addVertexData(VertexData *vertexData, bool useSharedVertexLookup)
Ogre::ProgressiveMeshGenerator::ProgressiveMeshGenerator
ProgressiveMeshGenerator()
OgreMesh.h
Ogre::ProgressiveMeshGenerator::assertOutdatedCollapseCost
void assertOutdatedCollapseCost(PMVertex *vertex)
Ogre::ProgressiveMeshGenerator::VTriangles
VectorSet< PMTriangle *, 7 > VTriangles
Definition: OgreProgressiveMeshGenerator.h:121
OgreSmallVector.h
Ogre::ProgressiveMeshGenerator::tuneContainerSize
void tuneContainerSize()
Ogre::ProgressiveMeshGenerator::PMVertex::costHeapPosition
CollapseCostHeap::iterator costHeapPosition
Definition: OgreProgressiveMeshGenerator.h:160
Ogre::ProgressiveMeshGenerator::VEdges
VectorSet< PMEdge, 8 > VEdges
Definition: OgreProgressiveMeshGenerator.h:120
Ogre::ProgressiveMeshGenerator::VectorSet::remove
bool remove(const T &item)
Ogre::ProgressiveMeshGenerator::isDuplicateTriangle
bool isDuplicateTriangle(PMTriangle *triangle, PMTriangle *triangle2)
Ogre::ProgressiveMeshGenerator::PMTriangle::getVertexID
unsigned int getVertexID(const PMVertex *v) const
OgreLodConfig.h
Ogre::ProgressiveMeshGenerator::mVertexLookup
VertexLookupList mVertexLookup
Definition: OgreProgressiveMeshGenerator.h:193
Ogre::ProgressiveMeshGenerator::getPointer
PMEdge * getPointer(VEdges::iterator it)
Ogre::ProgressiveMeshGenerator::PMCollapsedEdge
Definition: OgreProgressiveMeshGenerator.h:186
Ogre::ProgressiveMeshGenerator::VectorSet::iterator
SmallVector< T, S >::iterator iterator
Definition: OgreProgressiveMeshGenerator.h:92
Ogre::ProgressiveMeshGenerator::cleanupMemory
void cleanupMemory()
Ogre::ProgressiveMeshGenerator::TriangleList
vector< PMTriangle >::type TriangleList
Definition: OgreProgressiveMeshGenerator.h:115
Ogre::ProgressiveMeshGenerator::VectorSet::removeExists
void removeExists(const T &item)
Ogre::ProgressiveMeshGenerator::PMTriangle::normal
Vector3 normal
Definition: OgreProgressiveMeshGenerator.h:165
Ogre::ProgressiveMeshGenerator::isDuplicateTriangle
PMTriangle * isDuplicateTriangle(PMTriangle *triangle)
Ogre::ProgressiveMeshGenerator::PMVertex
Definition: OgreProgressiveMeshGenerator.h:153
Ogre::ProgressiveMeshGenerator::removeTriangleFromEdges
void removeTriangleFromEdges(PMTriangle *triangle, PMVertex *skip=NULL)
Ogre::ProgressiveMeshGenerator::VectorSet::has
bool has(const T &item)
Ogre::SmallVector
SmallVector - This is a 'vector' (really, a variable-sized array), optimized for the case when the ar...
Definition: OgreSmallVector.h:717
Ogre::ProgressiveMeshGenerator::VectorSet::findExists
iterator findExists(const T &item)
Ogre::ProgressiveMeshGenerator::printTriangle
void printTriangle(PMTriangle *triangle, stringstream &str)
Ogre::String
_StringBase String
Definition: OgrePrerequisites.h:439
Ogre::ProgressiveMeshGenerator::mUniqueVertexSet
UniqueVertexSet mUniqueVertexSet
Definition: OgreProgressiveMeshGenerator.h:196
Ogre::ProgressiveMeshGenerator::~ProgressiveMeshGenerator
virtual ~ProgressiveMeshGenerator()
Ogre::ProgressiveMeshGenerator::VectorSet::replaceExists
void replaceExists(const T &oldItem, const T &newItem)
Ogre::ProgressiveMeshGenerator::VectorSet::find
iterator find(const T &item)
Ogre::ProgressiveMeshGenerator::mMesh
MeshPtr mMesh
Definition: OgreProgressiveMeshGenerator.h:201
Ogre::ProgressiveMeshGenerator::IndexBufferPointer
Definition: OgreProgressiveMeshGenerator.h:181
Ogre::ProgressiveMeshGenerator::PMTriangle::isRemoved
bool isRemoved
Definition: OgreProgressiveMeshGenerator.h:166
Ogre::ProgressiveMeshGenerator::PMIndexBufferInfo::indexCount
size_t indexCount
Definition: OgreProgressiveMeshGenerator.h:178
Ogre::ProgressiveMeshGeneratorBase::getAutoconfig
virtual void getAutoconfig(MeshPtr &inMesh, LodConfig &outLodConfig)
Fills LOD Config with a config, which works on any mesh.
Ogre::VertexData
Summary class collecting together vertex source information.
Definition: OgreVertexIndexData.h:50
Ogre::ProgressiveMeshGenerator::IndexBufferInfoList
vector< PMIndexBufferInfo >::type IndexBufferInfoList
Definition: OgreProgressiveMeshGenerator.h:124
Ogre::ProgressiveMeshGenerator::PMVertexHash::mGen
ProgressiveMeshGenerator * mGen
Definition: OgreProgressiveMeshGenerator.h:128
Ogre::ProgressiveMeshGenerator::mCollapseCostHeap
CollapseCostHeap mCollapseCostHeap
Definition: OgreProgressiveMeshGenerator.h:197
Ogre::ProgressiveMeshGenerator::UniqueVertexSet
HashSet< PMVertex *, PMVertexHash, PMVertexEqual > UniqueVertexSet
Definition: OgreProgressiveMeshGenerator.h:116
Ogre::ProgressiveMeshGenerator::updateVertexCollapseCost
void updateVertexCollapseCost(PMVertex *src)
Ogre::ProgressiveMeshGenerator::hasSrcID
bool hasSrcID(unsigned int srcID, unsigned short submeshID)
Ogre::ProgressiveMeshGenerator::PMEdge::refCount
int refCount
Definition: OgreProgressiveMeshGenerator.h:144
Ogre::ProgressiveMeshGenerator::calcLodVertexCount
size_t calcLodVertexCount(const LodLevel &lodConfig)
OgrePrerequisites.h
Ogre::ProgressiveMeshGenerator::collapse
void collapse(PMVertex *vertex)
Ogre::ProgressiveMeshGenerator::PMTriangle::isMalformed
bool isMalformed()
Ogre::ProgressiveMeshGeneratorBase
Definition: OgreProgressiveMeshGenerator.h:42
Ogre::ProgressiveMeshGenerator::CollapseCostHeap
multimap< Real, PMVertex * >::type CollapseCostHeap
Definition: OgreProgressiveMeshGenerator.h:117
Ogre::ProgressiveMeshGenerator::computeVertexCollapseCost
void computeVertexCollapseCost(PMVertex *vertex)
Ogre::ProgressiveMeshGenerator::PMTriangle::computeNormal
void computeNormal()
Vertex ID in the buffer associated with the submeshID.
Ogre::ProgressiveMeshGenerator::CollapsedEdges
vector< PMCollapsedEdge >::type CollapsedEdges
Definition: OgreProgressiveMeshGenerator.h:123
Ogre::ProgressiveMeshGenerator::getTriangleID
int getTriangleID(PMTriangle *triangle)
Ogre::ProgressiveMeshGenerator::VectorSet
Definition: OgreProgressiveMeshGenerator.h:91
_OgreExport
#define _OgreExport
Definition: OgrePlatform.h:257
Ogre::ProgressiveMeshGenerator::addIndexData
void addIndexData(IndexData *indexData, bool useSharedVertexLookup, unsigned short submeshID)
Ogre::ProgressiveMeshGenerator::PMVertex::triangles
VTriangles triangles
Definition: OgreProgressiveMeshGenerator.h:156
Ogre::ProgressiveMeshGenerator::initialize
void initialize()
Ogre::ProgressiveMeshGenerator::PMEdge
Definition: OgreProgressiveMeshGenerator.h:141
Ogre::ProgressiveMeshGenerator::PMVertex::seam
bool seam
Definition: OgreProgressiveMeshGenerator.h:159
Ogre::ProgressiveMeshGenerator::PMCollapsedEdge::srcID
unsigned int srcID
Definition: OgreProgressiveMeshGenerator.h:187
Ogre::ProgressiveMeshGenerator::generateLodLevels
void generateLodLevels(LodConfig &lodConfig)
Generates the LOD levels for a mesh.
Ogre::multimap
Definition: OgrePrerequisites.h:548
Ogre::ProgressiveMeshGenerator::PMTriangle::submeshID
unsigned short submeshID
Definition: OgreProgressiveMeshGenerator.h:167
Ogre::SharedPtr< Mesh >
Ogre::ProgressiveMeshGenerator::bakeLods
virtual void bakeLods()
Ogre::ProgressiveMeshGenerator::PMVertex::collapseTo
PMVertex * collapseTo
Triangle ID set, which are using this vertex.
Definition: OgreProgressiveMeshGenerator.h:158
Ogre::ProgressiveMeshGenerator::PMVertexEqual
Definition: OgreProgressiveMeshGenerator.h:136
Ogre::ProgressiveMeshGenerator::VectorSet::addNotExists
void addNotExists(const T &item)
Ogre::ProgressiveMeshGenerator::PMIndexBufferInfo
Definition: OgreProgressiveMeshGenerator.h:176
Ogre::ProgressiveMeshGenerator::mTriangleList
TriangleList mTriangleList
Definition: OgreProgressiveMeshGenerator.h:195
Ogre::ProgressiveMeshGenerator::isBorderVertex
bool isBorderVertex(const PMVertex *vertex) const
Ogre::ProgressiveMeshGenerator::mCollapseCostLimit
Real mCollapseCostLimit
Definition: OgreProgressiveMeshGenerator.h:212
Ogre::ProgressiveMeshGenerator::VertexLookupList
vector< PMVertex * >::type VertexLookupList
Definition: OgreProgressiveMeshGenerator.h:118
Ogre::ProgressiveMeshGenerator::IndexBufferPointer::pshort
unsigned short * pshort
Definition: OgreProgressiveMeshGenerator.h:182
Ogre::ProgressiveMeshGenerator::computeCosts
void computeCosts()
Ogre::LodConfig
Definition: OgreLodConfig.h:104
Ogre::ProgressiveMeshGenerator::findDstID
size_t findDstID(unsigned int srcID, unsigned short submeshID)
Ogre::ProgressiveMeshGenerator::assertValidMesh
void assertValidMesh()
Ogre::ProgressiveMeshGenerator::VectorSet::remove
void remove(iterator it)
Ogre::ProgressiveMeshGeneratorBase::generateLodLevels
virtual void generateLodLevels(LodConfig &lodConfig)=0
Generates the LOD levels for a mesh.
_OgrePrivate
#define _OgrePrivate
Definition: OgrePlatform.h:258
Ogre::stringstream
StringStream stringstream
Definition: OgrePrerequisites.h:441
Ogre::ProgressiveMeshGenerator::removeEdge
void removeEdge(PMVertex *v, const PMEdge &edge)
Ogre::ProgressiveMeshGenerator::addTriangleToEdges
void addTriangleToEdges(PMTriangle *triangle)
Ogre::ProgressiveMeshGenerator::mVertexList
VertexList mVertexList
Definition: OgreProgressiveMeshGenerator.h:194
Ogre::ProgressiveMeshGenerator::PMTriangle::hasVertex
bool hasVertex(const PMVertex *v) const
Ogre::ProgressiveMeshGenerator::mIndexBufferInfoList
IndexBufferInfoList mIndexBufferInfoList
Definition: OgreProgressiveMeshGenerator.h:199
Ogre::ProgressiveMeshGenerator::replaceVertexID
void replaceVertexID(PMTriangle *triangle, unsigned int oldID, unsigned int newID, PMVertex *dst)
Ogre::ProgressiveMeshGenerator::PMCollapsedEdge::submeshID
unsigned short submeshID
Definition: OgreProgressiveMeshGenerator.h:189
Ogre::ProgressiveMeshGeneratorBase::~ProgressiveMeshGeneratorBase
virtual ~ProgressiveMeshGeneratorBase()
Definition: OgreProgressiveMeshGenerator.h:66
Ogre::Real
float Real
Software floating point type.
Definition: OgrePrerequisites.h:70
Ogre::ProgressiveMeshGenerator::computeEdgeCollapseCost
Real computeEdgeCollapseCost(PMVertex *src, PMEdge *dstEdge)
Ogre::ProgressiveMeshGenerator
Improved version of ProgressiveMesh.
Definition: OgreProgressiveMeshGenerator.h:74
Ogre::ProgressiveMeshGenerator::PMIndexBufferInfo::indexSize
size_t indexSize
Definition: OgreProgressiveMeshGenerator.h:177
Ogre::ProgressiveMeshGenerator::findSideTriangle
PMTriangle * findSideTriangle(const PMVertex *v1, const PMVertex *v2)
Ogre::ProgressiveMeshGenerator::PMEdge::dst
PMVertex * dst
Definition: OgreProgressiveMeshGenerator.h:142
Ogre::ProgressiveMeshGenerator::PMCollapsedEdge::dstID
unsigned int dstID
Definition: OgreProgressiveMeshGenerator.h:188
Ogre::ProgressiveMeshGenerator::mMeshBoundingSphereRadius
Real mMeshBoundingSphereRadius
Definition: OgreProgressiveMeshGenerator.h:211
Ogre::ProgressiveMeshGenerator::mSharedVertexLookup
VertexLookupList mSharedVertexLookup
Definition: OgreProgressiveMeshGenerator.h:192
Ogre::ProgressiveMeshGenerator::PMEdge::collapseCost
Real collapseCost
Definition: OgreProgressiveMeshGenerator.h:143
Ogre::operator==
bool operator==(STLAllocator< T, P > const &, STLAllocator< T2, P > const &)
determine equality, can memory from another allocator be released by this allocator,...
Definition: OgreMemorySTLAllocator.h:184
Ogre::ProgressiveMeshGenerator::IndexBufferPointer::pint
unsigned int * pint
Definition: OgreProgressiveMeshGenerator.h:183
Ogre::ProgressiveMeshGenerator::PMVertex::position
Vector3 position
Definition: OgreProgressiveMeshGenerator.h:154
Ogre::vector
Definition: OgrePrerequisites.h:492
Ogre::ProgressiveMeshGeneratorBase::generateAutoconfiguredLodLevels
virtual void generateAutoconfiguredLodLevels(MeshPtr &mesh)
Generates the LOD levels for a mesh without configuring it.
Ogre::ProgressiveMeshGenerator::PMVertexHash::PMVertexHash
PMVertexHash()
Definition: OgreProgressiveMeshGenerator.h:130
Ogre::operator<
bool operator<(SharedPtr< T > const &a, SharedPtr< U > const &b)
Definition: OgreSharedPtr.h:326
Ogre::ProgressiveMeshGenerator::PMVertexHash::PMVertexHash
PMVertexHash(ProgressiveMeshGenerator *gen)
Definition: OgreProgressiveMeshGenerator.h:131
OgreVector3.h
Ogre::ProgressiveMeshGenerator::PMTriangle
Definition: OgreProgressiveMeshGenerator.h:163
Ogre::IndexData
Summary class collecting together index data source information.
Definition: OgreVertexIndexData.h:243
Ogre::ProgressiveMeshGenerator::PMEdge::PMEdge
PMEdge(const PMEdge &b)
Ogre::Vector3
Standard 3-dimensional vector.
Definition: OgreVector3.h:52
Ogre::ProgressiveMeshGenerator::PMVertexHash
Definition: OgreProgressiveMeshGenerator.h:127
Ogre::LodLevel
Structure for automatic LOD configuration.
Definition: OgreLodConfig.h:41
Ogre::ProgressiveMeshGenerator::mMeshName
String mMeshName
The name of the mesh being processed.
Definition: OgreProgressiveMeshGenerator.h:209
Ogre::ProgressiveMeshGenerator::tmpCollapsedEdges
CollapsedEdges tmpCollapsedEdges
Definition: OgreProgressiveMeshGenerator.h:198
Ogre::ProgressiveMeshGenerator::addIndexDataImpl
void addIndexDataImpl(IndexType *iPos, const IndexType *iEnd, VertexLookupList &lookup, unsigned short submeshID)

Copyright © 2012 Torus Knot Software Ltd
Creative Commons License
This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.