/usr/include/OGRE/OgreProgressiveMesh.h is in libogre-dev 1.7.4-3.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 | /*
-----------------------------------------------------------------------------
This source file is part of OGRE
(Object-oriented Graphics Rendering Engine)
For the latest info, see http://www.ogre3d.org/
Copyright (c) 2000-2011 Torus Knot Software Ltd
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
-----------------------------------------------------------------------------
*/
// The underlying algorithms in this class are based heavily on:
/*
* Progressive Mesh type Polygon Reduction Algorithm
* by Stan Melax (c) 1998
*/
#ifndef __ProgressiveMesh_H_
#define __ProgressiveMesh_H_
#include "OgrePrerequisites.h"
#include "OgreVector3.h"
#include "OgreHardwareVertexBuffer.h"
#include "OgreHardwareIndexBuffer.h"
#include "OgreRenderOperation.h"
namespace Ogre {
/** \addtogroup Core
* @{
*/
/** \addtogroup LOD
* @{
*/
/** This class reduces the complexity of the geometry it is given.
This class is dedicated to reducing the number of triangles in a given mesh
taking into account seams in both geometry and texture co-ordinates and meshes
which have multiple frames.
@par
The primary use for this is generating LOD versions of Mesh objects, but it can be
used by any geometry provider. The only limitation at the moment is that the
provider uses a common vertex buffer for all LODs and one index buffer per LOD.
Therefore at the moment this class can only handle indexed geometry.
@par
NB the interface of this class will certainly change when compiled vertex buffers are
supported.
*/
class _OgreExport ProgressiveMesh : public ProgMeshAlloc
{
public:
/** The way to derive the quota of vertices which are reduced at each LOD. */
enum VertexReductionQuota
{
/// A set number of vertices are removed at each reduction
VRQ_CONSTANT,
/// A proportion of the remaining number of vertices are removed at each reduction
VRQ_PROPORTIONAL
};
typedef vector<IndexData*>::type LODFaceList;
/** Constructor, takes the geometry data and index buffer.
@remarks
DO NOT pass write-only, unshadowed buffers to this method! They will not
work. Pass only shadowed buffers, or better yet perform mesh reduction as
an offline process using DefaultHardwareBufferManager to manage vertex
buffers in system memory.
*/
ProgressiveMesh(const VertexData* vertexData, const IndexData* indexData);
virtual ~ProgressiveMesh();
/** Adds an extra vertex position buffer.
@remarks
As well as the main vertex buffer, the client of this class may add extra versions
of the vertex buffer which will also be taken into account when the cost of
simplifying the mesh is taken into account. This is because the cost of
simplifying an animated mesh cannot be calculated from just the reference position,
multiple positions needs to be assessed in order to find the best simplification option.
@par
DO NOT pass write-only, unshadowed buffers to this method! They will not
work. Pass only shadowed buffers, or better yet perform mesh reduction as
an offline process using DefaultHardwareBufferManager to manage vertex
buffers in system memory.
@param buffer Pointer to x/y/z buffer with vertex positions. The number of vertices
must be the same as in the original GeometryData passed to the constructor.
*/
virtual void addExtraVertexPositionBuffer(const VertexData* vertexData);
/** Builds the progressive mesh with the specified number of levels.
@param numLevels The number of levels to include in the output excluding the full detail version.
@param outList Pointer to a list of LOD geometry data which will be completed by the application.
Each entry is a reduced form of the mesh, in decreasing order of detail.
@param quota The way to derive the number of vertices removed at each LOD
@param reductionValue Either the proportion of vertices to remove at each level, or a fixed
number of vertices to remove at each level, depending on the value of quota
*/
virtual void build(ushort numLevels, LODFaceList* outList,
VertexReductionQuota quota = VRQ_PROPORTIONAL, Real reductionValue = 0.5f );
protected:
const VertexData *mpVertexData;
const IndexData *mpIndexData;
size_t mCurrNumIndexes;
size_t mNumCommonVertices;
// Internal classes
class PMTriangle;
class PMVertex;
public: // VC6 hack
/** A vertex as used by a face. This records the index of the actual vertex which is used
by the face, and a pointer to the common vertex used for surface evaluation. */
class _OgrePrivate PMFaceVertex {
public:
size_t realIndex;
PMVertex* commonVertex;
};
protected:
/** A triangle in the progressive mesh, holds extra info like face normal. */
class _OgrePrivate PMTriangle {
public:
PMTriangle();
void setDetails(size_t index, PMFaceVertex *v0, PMFaceVertex *v1, PMFaceVertex *v2);
void computeNormal(void);
void replaceVertex(PMFaceVertex *vold, PMFaceVertex *vnew);
bool hasCommonVertex(PMVertex *v) const;
bool hasFaceVertex(PMFaceVertex *v) const;
PMFaceVertex* getFaceVertexFromCommon(PMVertex* commonVert);
void notifyRemoved(void);
PMFaceVertex* vertex[3]; // the 3 points that make this tri
Vector3 normal; // unit vector orthogonal to this face
bool removed; // true if this tri is now removed
size_t index;
};
/** A vertex in the progressive mesh, holds info like collapse cost etc.
This vertex can actually represent several vertices in the final model, because
vertices along texture seams etc will have been duplicated. In order to properly
evaluate the surface properties, a single common vertex is used for these duplicates,
and the faces hold the detail of the duplicated vertices.
*/
class _OgrePrivate PMVertex {
public:
PMVertex();
void setDetails(const Vector3& v, size_t index);
void removeIfNonNeighbor(PMVertex *n);
bool isBorder(void);/// true if this vertex is on the edge of an open geometry patch
bool isManifoldEdgeWith(PMVertex* v); // is edge this->src a manifold edge?
void notifyRemoved(void);
Vector3 position; // location of point in euclidean space
size_t index; // place of vertex in original list
typedef set<PMVertex *>::type NeighborList;
typedef set<PMVertex *>::type DuplicateList;
NeighborList neighbor; // adjacent vertices
typedef set<PMTriangle *>::type FaceList;
FaceList face; // adjacent triangles
Real collapseCost; // cached cost of collapsing edge
PMVertex * collapseTo; // candidate vertex for collapse
bool removed; // true if this vert is now removed
bool toBeRemoved; // denug
bool seam; /// true if this vertex is on a model seam where vertices are duplicated
};
typedef vector<PMTriangle>::type TriangleList;
typedef vector<PMFaceVertex>::type FaceVertexList;
typedef vector<PMVertex>::type CommonVertexList;
typedef vector<Real>::type WorstCostList;
/// Data used to calculate the collapse costs
struct PMWorkingData
{
TriangleList mTriList; /// List of faces
FaceVertexList mFaceVertList; // The vertex details referenced by the triangles
CommonVertexList mVertList; // The master list of common vertices
};
typedef vector<PMWorkingData>::type WorkingDataList;
/// Multiple copies, 1 per vertex buffer
WorkingDataList mWorkingData;
/// The worst collapse cost from all vertex buffers for each vertex
WorstCostList mWorstCosts;
/// Internal method for building PMWorkingData from geometry data
void addWorkingData(const VertexData* vertexData, const IndexData* indexData);
/// Internal method for initialising the edge collapse costs
void initialiseEdgeCollapseCosts(void);
/// Internal calculation method for deriving a collapse cost from u to v
Real computeEdgeCollapseCost(PMVertex *src, PMVertex *dest);
/// Internal method evaluates all collapse costs from this vertex and picks the lowest for a single buffer
Real computeEdgeCostAtVertexForBuffer(WorkingDataList::iterator idata, size_t vertIndex);
/// Internal method evaluates all collapse costs from this vertex for every buffer and returns the worst
void computeEdgeCostAtVertex(size_t vertIndex);
/// Internal method to compute edge collapse costs for all buffers /
void computeAllCosts(void);
/// Internal method for getting the index of next best vertex to collapse
size_t getNextCollapser(void);
/// Internal method builds an new LOD based on the current state
void bakeNewLOD(IndexData* pData);
/** Internal method, collapses vertex onto it's saved collapse target.
@remarks
This updates the working triangle list to drop a triangle and recalculates
the edge collapse costs around the collapse target.
This also updates all the working vertex lists for the relevant buffer.
*/
void collapse(PMVertex *collapser);
/** Internal debugging method */
void dumpContents(const String& log);
};
/** @} */
/** @} */
}
#endif
|