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 
56  virtual void generateAutoconfiguredLodLevels(MeshPtr& mesh);
57 
64  virtual void getAutoconfig(MeshPtr& inMesh, LodConfig& outLodConfig);
65 
67 };
68 
74 {
75 public:
76 
78  virtual ~ProgressiveMeshGenerator();
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;
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 
170  void computeNormal();
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);
215  void tuneContainerSize();
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;
223  PMEdge* getPointer(VEdges::iterator it);
224  void computeVertexCollapseCost(PMVertex* vertex);
225  Real computeEdgeCollapseCost(PMVertex* src, PMEdge* dstEdge);
226  virtual void bakeLods();
227  void collapse(PMVertex* vertex);
228  void initialize();
229  void computeLods(LodConfig& lodConfigs);
230  void updateVertexCollapseCost(PMVertex* src);
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
237  void assertValidVertex(PMVertex* v);
238  void assertValidMesh();
239  void assertOutdatedCollapseCost(PMVertex* vertex);
240 #endif // ifndef NDEBUG
241 
242  void addTriangleToEdges(PMTriangle* triangle);
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);
247  PMTriangle* findSideTriangle(const PMVertex* v1, const PMVertex* v2);
248  bool isDuplicateTriangle(PMTriangle* triangle, PMTriangle* triangle2);
249  PMTriangle* isDuplicateTriangle(PMTriangle* triangle);
250  int getTriangleID(PMTriangle* triangle);
251  void cleanupMemory();
252 };
253 
254 }
255 #endif
Ogre::ProgressiveMeshGenerator::PMVertex::edges
VEdges edges
Definition: OgreProgressiveMeshGenerator.h:155
Ogre
Definition: OgreAndroidLogListener.h:34
Ogre::ProgressiveMeshGenerator::VertexList
vector< PMVertex >::type VertexList
Definition: OgreProgressiveMeshGenerator.h:112
OgreMesh.h
Ogre::ProgressiveMeshGenerator::VTriangles
VectorSet< PMTriangle *, 7 > VTriangles
Definition: OgreProgressiveMeshGenerator.h:121
OgreSmallVector.h
Ogre::ProgressiveMeshGenerator::PMVertex::costHeapPosition
CollapseCostHeap::iterator costHeapPosition
Definition: OgreProgressiveMeshGenerator.h:160
Ogre::ProgressiveMeshGenerator::VEdges
VectorSet< PMEdge, 8 > VEdges
Definition: OgreProgressiveMeshGenerator.h:120
OgreLodConfig.h
Ogre::ProgressiveMeshGenerator::mVertexLookup
VertexLookupList mVertexLookup
Definition: OgreProgressiveMeshGenerator.h:193
Ogre::ProgressiveMeshGenerator::PMCollapsedEdge
Definition: OgreProgressiveMeshGenerator.h:186
Ogre::ProgressiveMeshGenerator::VectorSet::iterator
SmallVector< T, S >::iterator iterator
Definition: OgreProgressiveMeshGenerator.h:92
Ogre::ProgressiveMeshGenerator::TriangleList
vector< PMTriangle >::type TriangleList
Definition: OgreProgressiveMeshGenerator.h:115
Ogre::ProgressiveMeshGenerator::PMTriangle::normal
Vector3 normal
Definition: OgreProgressiveMeshGenerator.h:165
Ogre::ProgressiveMeshGenerator::PMVertex
Definition: OgreProgressiveMeshGenerator.h:153
Ogre::SmallVector
SmallVector - This is a 'vector' (really, a variable-sized array), optimized for the case when the ar...
Definition: OgreSmallVector.h:717
Ogre::String
_StringBase String
Definition: OgrePrerequisites.h:439
Ogre::ProgressiveMeshGenerator::mUniqueVertexSet
UniqueVertexSet mUniqueVertexSet
Definition: OgreProgressiveMeshGenerator.h:196
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::VertexData
Summary class collecting together vertex source information.
Definition: OgreVertexIndexData.h:49
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::PMEdge::refCount
int refCount
Definition: OgreProgressiveMeshGenerator.h:144
OgrePrerequisites.h
Ogre::ProgressiveMeshGeneratorBase
Definition: OgreProgressiveMeshGenerator.h:41
Ogre::ProgressiveMeshGenerator::CollapseCostHeap
multimap< Real, PMVertex * >::type CollapseCostHeap
Definition: OgreProgressiveMeshGenerator.h:117
Ogre::ProgressiveMeshGenerator::CollapsedEdges
vector< PMCollapsedEdge >::type CollapsedEdges
Definition: OgreProgressiveMeshGenerator.h:123
Ogre::ProgressiveMeshGenerator::VectorSet
Definition: OgreProgressiveMeshGenerator.h:90
_OgreExport
#define _OgreExport
Definition: OgrePlatform.h:257
Ogre::ProgressiveMeshGenerator::PMVertex::triangles
VTriangles triangles
Definition: OgreProgressiveMeshGenerator.h:156
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::multimap
Definition: OgrePrerequisites.h:547
Ogre::ProgressiveMeshGenerator::PMTriangle::submeshID
unsigned short submeshID
Definition: OgreProgressiveMeshGenerator.h:167
Ogre::SharedPtr< Mesh >
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::PMIndexBufferInfo
Definition: OgreProgressiveMeshGenerator.h:176
Ogre::ProgressiveMeshGenerator::mTriangleList
TriangleList mTriangleList
Definition: OgreProgressiveMeshGenerator.h:195
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::LodConfig
Definition: OgreLodConfig.h:104
_OgrePrivate
#define _OgrePrivate
Definition: OgrePlatform.h:258
Ogre::stringstream
StringStream stringstream
Definition: OgrePrerequisites.h:441
Ogre::ProgressiveMeshGenerator::mVertexList
VertexList mVertexList
Definition: OgreProgressiveMeshGenerator.h:194
Ogre::ProgressiveMeshGenerator::mIndexBufferInfoList
IndexBufferInfoList mIndexBufferInfoList
Definition: OgreProgressiveMeshGenerator.h:199
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
Improved version of ProgressiveMesh.
Definition: OgreProgressiveMeshGenerator.h:72
Ogre::ProgressiveMeshGenerator::PMIndexBufferInfo::indexSize
size_t indexSize
Definition: OgreProgressiveMeshGenerator.h:177
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:491
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:242
Ogre::Vector3
Standard 3-dimensional vector.
Definition: OgreVector3.h:51
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

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