You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
101 lines
3.1 KiB
101 lines
3.1 KiB
/* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2006 Robert Osfield |
|
* |
|
* This library is open source and may be redistributed and/or modified under |
|
* the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or |
|
* (at your option) any later version. The full license is in LICENSE file |
|
* included with this distribution, and on the openscenegraph.org website. |
|
* |
|
* This library is distributed in the hope that it will be useful, |
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
* OpenSceneGraph Public License for more details. |
|
*/ |
|
|
|
#ifndef OSGUTIL_MESHOPTIMIZERS |
|
#define OSGUTIL_MESHOPTIMIZERS 1 |
|
|
|
#include <set> |
|
#include <vector> |
|
|
|
#include <osg/Geode> |
|
#include <osg/Geometry> |
|
#include <osg/NodeVisitor> |
|
|
|
#include <osgUtil/Optimizer> |
|
|
|
namespace osgUtil |
|
{ |
|
// Helper that collects all the unique Geometry objects in a subgraph. |
|
class OSGUTIL_EXPORT GeometryCollector : public BaseOptimizerVisitor |
|
{ |
|
public: |
|
GeometryCollector(Optimizer* optimizer, |
|
Optimizer::OptimizationOptions options) |
|
: BaseOptimizerVisitor(optimizer, options) {} |
|
void reset(); |
|
void apply(osg::Geode& geode); |
|
typedef std::set<osg::Geometry*> GeometryList; |
|
GeometryList& getGeometryList() { return _geometryList; }; |
|
protected: |
|
GeometryList _geometryList; |
|
}; |
|
|
|
// Convert geometry that uses DrawArrays to DrawElements i.e., |
|
// construct a real mesh. This removes duplicate vertices. |
|
class OSGUTIL_EXPORT IndexMeshVisitor : public GeometryCollector |
|
{ |
|
public: |
|
IndexMeshVisitor(Optimizer* optimizer = 0) |
|
: GeometryCollector(optimizer, Optimizer::INDEX_MESH) |
|
{ |
|
} |
|
void makeMesh(osg::Geometry& geom); |
|
void makeMesh(); |
|
}; |
|
|
|
// Optimize the triangle order in a mesh for best use of the GPU's |
|
// post-transform cache. This uses Tom Forsyth's algorithm described |
|
// at http://home.comcast.net/~tom_forsyth/papers/fast_vert_cache_opt.html |
|
class OSGUTIL_EXPORT VertexCacheVisitor : public GeometryCollector |
|
{ |
|
public: |
|
VertexCacheVisitor(Optimizer* optimizer = 0) |
|
: GeometryCollector(optimizer, Optimizer::VERTEX_POSTTRANSFORM) |
|
{ |
|
} |
|
|
|
void optimizeVertices(osg::Geometry& geom); |
|
void optimizeVertices(); |
|
private: |
|
void doVertexOptimization(osg::Geometry& geom, |
|
std::vector<unsigned>& vertDrawList); |
|
}; |
|
|
|
// Gather statistics on post-transform cache misses for geometry |
|
class OSGUTIL_EXPORT VertexCacheMissVisitor : public osg::NodeVisitor |
|
{ |
|
public: |
|
VertexCacheMissVisitor(unsigned cacheSize = 16); |
|
void reset(); |
|
virtual void apply(osg::Geode& geode); |
|
void doGeometry(osg::Geometry& geom); |
|
unsigned misses; |
|
unsigned triangles; |
|
protected: |
|
const unsigned _cacheSize; |
|
}; |
|
|
|
// Optimize the use of the GPU pre-transform cache by arranging vertex |
|
// attributes in the order they are used. |
|
class OSGUTIL_EXPORT VertexAccessOrderVisitor : public GeometryCollector |
|
{ |
|
public: |
|
VertexAccessOrderVisitor(Optimizer* optimizer = 0) |
|
: GeometryCollector(optimizer, Optimizer::VERTEX_PRETRANSFORM) |
|
{ |
|
} |
|
void optimizeOrder(); |
|
void optimizeOrder(osg::Geometry& geom); |
|
}; |
|
} |
|
#endif
|
|
|