mirror of
https://gitlab.com/OpenMW/openmw.git
synced 2025-02-04 03:40:14 +00:00
optimizer: remove some cruft
This commit is contained in:
parent
e33829d493
commit
f7cb4bd245
@ -18,29 +18,18 @@
|
|||||||
|
|
||||||
#include "optimizer.hpp"
|
#include "optimizer.hpp"
|
||||||
|
|
||||||
#include <osg/ApplicationUsage>
|
|
||||||
#include <osg/Transform>
|
#include <osg/Transform>
|
||||||
#include <osg/MatrixTransform>
|
#include <osg/MatrixTransform>
|
||||||
#include <osg/PositionAttitudeTransform>
|
#include <osg/PositionAttitudeTransform>
|
||||||
#include <osg/LOD>
|
#include <osg/LOD>
|
||||||
#include <osg/Billboard>
|
#include <osg/Billboard>
|
||||||
#include <osg/CameraView>
|
|
||||||
#include <osg/Geometry>
|
#include <osg/Geometry>
|
||||||
#include <osg/Notify>
|
#include <osg/Notify>
|
||||||
#include <osg/OccluderNode>
|
|
||||||
#include <osg/Sequence>
|
|
||||||
#include <osg/Switch>
|
|
||||||
#include <osg/Texture>
|
#include <osg/Texture>
|
||||||
#include <osg/PagedLOD>
|
|
||||||
#include <osg/ProxyNode>
|
|
||||||
#include <osg/ImageStream>
|
|
||||||
#include <osg/Timer>
|
#include <osg/Timer>
|
||||||
#include <osg/TexMat>
|
|
||||||
#include <osg/io_utils>
|
#include <osg/io_utils>
|
||||||
|
|
||||||
#include <osgUtil/TransformAttributeFunctor>
|
#include <osgUtil/TransformAttributeFunctor>
|
||||||
#include <osgUtil/TriStripVisitor>
|
|
||||||
#include <osgUtil/Tessellator>
|
|
||||||
#include <osgUtil/Statistics>
|
#include <osgUtil/Statistics>
|
||||||
#include <osgUtil/MeshOptimizers>
|
#include <osgUtil/MeshOptimizers>
|
||||||
|
|
||||||
@ -53,6 +42,9 @@
|
|||||||
|
|
||||||
using namespace osgUtil;
|
using namespace osgUtil;
|
||||||
|
|
||||||
|
namespace SceneUtil
|
||||||
|
{
|
||||||
|
|
||||||
void Optimizer::reset()
|
void Optimizer::reset()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
@ -90,20 +82,6 @@ void Optimizer::optimize(osg::Node* node, unsigned int options)
|
|||||||
cstv.removeTransforms(node);
|
cstv.removeTransforms(node);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (options & MERGE_GEODES)
|
|
||||||
{
|
|
||||||
OSG_INFO<<"Optimizer::optimize() doing MERGE_GEODES"<<std::endl;
|
|
||||||
|
|
||||||
osg::Timer_t startTick = osg::Timer::instance()->tick();
|
|
||||||
|
|
||||||
MergeGeodesVisitor visitor;
|
|
||||||
node->accept(visitor);
|
|
||||||
|
|
||||||
osg::Timer_t endTick = osg::Timer::instance()->tick();
|
|
||||||
|
|
||||||
OSG_INFO<<"MERGE_GEODES took "<<osg::Timer::instance()->delta_s(startTick,endTick)<<std::endl;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (options & MERGE_GEOMETRY)
|
if (options & MERGE_GEOMETRY)
|
||||||
{
|
{
|
||||||
OSG_INFO<<"Optimizer::optimize() doing MERGE_GEOMETRY"<<std::endl;
|
OSG_INFO<<"Optimizer::optimize() doing MERGE_GEOMETRY"<<std::endl;
|
||||||
@ -119,15 +97,6 @@ void Optimizer::optimize(osg::Node* node, unsigned int options)
|
|||||||
OSG_INFO<<"MERGE_GEOMETRY took "<<osg::Timer::instance()->delta_s(startTick,endTick)<<std::endl;
|
OSG_INFO<<"MERGE_GEOMETRY took "<<osg::Timer::instance()->delta_s(startTick,endTick)<<std::endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (options & TRISTRIP_GEOMETRY)
|
|
||||||
{
|
|
||||||
OSG_INFO<<"Optimizer::optimize() doing TRISTRIP_GEOMETRY"<<std::endl;
|
|
||||||
|
|
||||||
TriStripVisitor tsv(this);
|
|
||||||
node->accept(tsv);
|
|
||||||
tsv.stripify();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (options & REMOVE_REDUNDANT_NODES)
|
if (options & REMOVE_REDUNDANT_NODES)
|
||||||
{
|
{
|
||||||
OSG_INFO<<"Optimizer::optimize() doing REMOVE_REDUNDANT_NODES"<<std::endl;
|
OSG_INFO<<"Optimizer::optimize() doing REMOVE_REDUNDANT_NODES"<<std::endl;
|
||||||
@ -142,30 +111,6 @@ void Optimizer::optimize(osg::Node* node, unsigned int options)
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (options & FLATTEN_BILLBOARDS)
|
|
||||||
{
|
|
||||||
FlattenBillboardVisitor fbv(this);
|
|
||||||
node->accept(fbv);
|
|
||||||
fbv.process();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (options & SPATIALIZE_GROUPS)
|
|
||||||
{
|
|
||||||
OSG_INFO<<"Optimizer::optimize() doing SPATIALIZE_GROUPS"<<std::endl;
|
|
||||||
|
|
||||||
SpatializeGroupsVisitor sv(this);
|
|
||||||
node->accept(sv);
|
|
||||||
sv.divide();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (options & INDEX_MESH)
|
|
||||||
{
|
|
||||||
OSG_INFO<<"Optimizer::optimize() doing INDEX_MESH"<<std::endl;
|
|
||||||
IndexMeshVisitor imv(this);
|
|
||||||
node->accept(imv);
|
|
||||||
imv.makeMesh();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (options & VERTEX_POSTTRANSFORM)
|
if (options & VERTEX_POSTTRANSFORM)
|
||||||
{
|
{
|
||||||
OSG_INFO<<"Optimizer::optimize() doing VERTEX_POSTTRANSFORM"<<std::endl;
|
OSG_INFO<<"Optimizer::optimize() doing VERTEX_POSTTRANSFORM"<<std::endl;
|
||||||
@ -300,17 +245,11 @@ class CollectLowestTransformsVisitor : public BaseOptimizerVisitor
|
|||||||
|
|
||||||
inline bool isOperationPermissibleForObject(const osg::Drawable* drawable) const
|
inline bool isOperationPermissibleForObject(const osg::Drawable* drawable) const
|
||||||
{
|
{
|
||||||
// disable if cannot apply transform functor.
|
|
||||||
if (drawable && !drawable->supports(_transformFunctor)) return false;
|
|
||||||
return BaseOptimizerVisitor::isOperationPermissibleForObject(drawable);
|
return BaseOptimizerVisitor::isOperationPermissibleForObject(drawable);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline bool isOperationPermissibleForObject(const osg::Node* node) const
|
inline bool isOperationPermissibleForObject(const osg::Node* node) const
|
||||||
{
|
{
|
||||||
// disable if object is a light point node.
|
|
||||||
if (strcmp(node->className(),"LightPointNode")==0) return false;
|
|
||||||
if (dynamic_cast<const osg::ProxyNode*>(node)) return false;
|
|
||||||
if (dynamic_cast<const osg::PagedLOD*>(node)) return false;
|
|
||||||
return BaseOptimizerVisitor::isOperationPermissibleForObject(node);
|
return BaseOptimizerVisitor::isOperationPermissibleForObject(node);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -634,28 +573,10 @@ bool CollectLowestTransformsVisitor::removeTransforms(osg::Node* nodeWeCannotRem
|
|||||||
|
|
||||||
void Optimizer::FlattenStaticTransformsVisitor::apply(osg::Node& node)
|
void Optimizer::FlattenStaticTransformsVisitor::apply(osg::Node& node)
|
||||||
{
|
{
|
||||||
if (strcmp(node.className(),"LightPointNode")==0)
|
|
||||||
{
|
|
||||||
_excludedNodeSet.insert(&node);
|
|
||||||
}
|
|
||||||
traverse(node);
|
traverse(node);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void Optimizer::FlattenStaticTransformsVisitor::apply(osg::ProxyNode& node)
|
|
||||||
{
|
|
||||||
_excludedNodeSet.insert(&node);
|
|
||||||
|
|
||||||
traverse(node);
|
|
||||||
}
|
|
||||||
|
|
||||||
void Optimizer::FlattenStaticTransformsVisitor::apply(osg::PagedLOD& node)
|
|
||||||
{
|
|
||||||
_excludedNodeSet.insert(&node);
|
|
||||||
|
|
||||||
traverse(node);
|
|
||||||
}
|
|
||||||
|
|
||||||
void Optimizer::FlattenStaticTransformsVisitor::apply(osg::Drawable& drawable)
|
void Optimizer::FlattenStaticTransformsVisitor::apply(osg::Drawable& drawable)
|
||||||
{
|
{
|
||||||
osg::Geometry *geometry = drawable.asGeometry();
|
osg::Geometry *geometry = drawable.asGeometry();
|
||||||
@ -811,7 +732,7 @@ void Optimizer::RemoveEmptyNodesVisitor::apply(osg::Group& group)
|
|||||||
{
|
{
|
||||||
// only remove empty groups, but not empty occluders.
|
// only remove empty groups, but not empty occluders.
|
||||||
if (group.getNumChildren()==0 && isOperationPermissibleForObject(&group) &&
|
if (group.getNumChildren()==0 && isOperationPermissibleForObject(&group) &&
|
||||||
(typeid(group)==typeid(osg::Group) || (dynamic_cast<osg::Transform*>(&group) && !dynamic_cast<osg::CameraView*>(&group))) &&
|
(typeid(group)==typeid(osg::Group) || (dynamic_cast<osg::Transform*>(&group))) &&
|
||||||
(group.getNumChildrenRequiringUpdateTraversal()==0 && group.getNumChildrenRequiringEventTraversal()==0) )
|
(group.getNumChildrenRequiringUpdateTraversal()==0 && group.getNumChildrenRequiringEventTraversal()==0) )
|
||||||
{
|
{
|
||||||
_redundantNodeList.insert(&group);
|
_redundantNodeList.insert(&group);
|
||||||
@ -843,13 +764,8 @@ void Optimizer::RemoveEmptyNodesVisitor::removeEmptyNodes()
|
|||||||
++pitr)
|
++pitr)
|
||||||
{
|
{
|
||||||
osg::Group* parent = *pitr;
|
osg::Group* parent = *pitr;
|
||||||
if (!dynamic_cast<osg::Sequence*>(parent) &&
|
parent->removeChild(nodeToRemove.get());
|
||||||
!dynamic_cast<osg::Switch*>(parent) &&
|
if (parent->getNumChildren()==0 && isOperationPermissibleForObject(parent)) newEmptyGroups.insert(parent);
|
||||||
strcmp(parent->className(),"MultiSwitch")!=0)
|
|
||||||
{
|
|
||||||
parent->removeChild(nodeToRemove.get());
|
|
||||||
if (parent->getNumChildren()==0 && isOperationPermissibleForObject(parent)) newEmptyGroups.insert(parent);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1887,3 +1803,4 @@ bool Optimizer::MergeGeometryVisitor::mergePrimitive(osg::DrawElementsUInt& lhs,
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
@ -270,8 +270,6 @@ class Optimizer
|
|||||||
virtual void apply(osg::Node& geode);
|
virtual void apply(osg::Node& geode);
|
||||||
virtual void apply(osg::Drawable& drawable);
|
virtual void apply(osg::Drawable& drawable);
|
||||||
virtual void apply(osg::Billboard& geode);
|
virtual void apply(osg::Billboard& geode);
|
||||||
virtual void apply(osg::ProxyNode& node);
|
|
||||||
virtual void apply(osg::PagedLOD& node);
|
|
||||||
virtual void apply(osg::Transform& transform);
|
virtual void apply(osg::Transform& transform);
|
||||||
|
|
||||||
bool removeTransforms(osg::Node* nodeWeCannotRemove);
|
bool removeTransforms(osg::Node* nodeWeCannotRemove);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user