Files
OpenSceneGraph/src/osgPlugins/gles/OpenGLESGeometryOptimizer.cpp
Marc Helbling 7cd7618e8c Updates gles from sketchfab
* fixes bbox issue for animated scenes
* fixes geometry split (perf + line/point primitive management)
* removes degenerated faces
2017-01-20 15:15:31 +01:00

71 lines
2.0 KiB
C++

#include <limits>
#include "OpenGLESGeometryOptimizer"
#include "glesUtil"
const unsigned glesUtil::Remapper::invalidIndex = std::numeric_limits<unsigned>::max();
osg::Node* OpenGLESGeometryOptimizer::optimize(osg::Node& node) {
osg::ref_ptr<osg::Node> model = osg::clone(&node);
if(_mode == "all" || _mode == "animation") {
// animation: process bones/weights or remove all animation data if disabled
makeAnimation(model.get());
}
if(_mode == "all" || _mode == "geometry") {
// wireframe
if (!_wireframe.empty()) {
makeWireframe(model.get());
}
// bind per vertex
makeBindPerVertex(model.get());
// index (merge exact duplicates + uses simple triangles & lines i.e. no strip/fan/loop)
makeIndexMesh(model.get());
// clean (remove degenerated data)
std::string authoringTool;
if(model->getUserValue("authoring_tool", authoringTool) && authoringTool == "Tilt Brush") {
makeCleanGeometry(model.get());
}
// smooth vertex normals (if geometry has no normal compute smooth normals)
makeSmoothNormal(model.get());
// tangent space
if (_generateTangentSpace) {
makeTangentSpace(model.get());
}
if(!_useDrawArray) {
// split geometries having some primitive index > _maxIndexValue
makeSplit(model.get());
}
// strip
if(!_disableTriStrip) {
makeTriStrip(model.get());
}
if(_useDrawArray) {
// drawelements to drawarrays
makeDrawArray(model.get());
}
else if(!_disablePreTransform) {
// pre-transform
makePreTransform(model.get());
}
// unbind bones/weights from source and bind on RigGeometry
makeBonesAndWeightOnRigGeometry(model.get());
// detach wireframe
makeDetach(model.get());
}
return model.release();
}