From 3613e66e82add9c5895ae065585cc57b3dc49e83 Mon Sep 17 00:00:00 2001 From: Robert Osfield Date: Fri, 24 Nov 2006 21:19:11 +0000 Subject: [PATCH] Added extra checks to RemoveRedendentVisitor to catch Groups that may only have one child, but also have StateSet's etc and thefore not suitable for removal. --- src/osgUtil/Optimizer.cpp | 42 +++++++++++++++++++++------------------ 1 file changed, 23 insertions(+), 19 deletions(-) diff --git a/src/osgUtil/Optimizer.cpp b/src/osgUtil/Optimizer.cpp index 219b08135..98fb977bc 100644 --- a/src/osgUtil/Optimizer.cpp +++ b/src/osgUtil/Optimizer.cpp @@ -796,7 +796,7 @@ class CollectLowestTransformsVisitor : public BaseOptimizerVisitor { if (!_transformSet.empty()) { - if (_firstMatrix!=_identity_matrix) _moreThanOneMatrixRequired=true; + if (!_firstMatrix.isIdentity()) _moreThanOneMatrixRequired=true; } } @@ -807,8 +807,6 @@ class CollectLowestTransformsVisitor : public BaseOptimizerVisitor bool _moreThanOneMatrixRequired; osg::Matrix _firstMatrix; TransformSet _transformSet; - osg::Matrix _identity_matrix; - }; @@ -1314,34 +1312,40 @@ void Optimizer::RemoveEmptyNodesVisitor::removeEmptyNodes() // RemoveRedundantNodes. //////////////////////////////////////////////////////////////////////////// +bool Optimizer::RemoveRedundantNodesVisitor::isOperationPermissible(osg::Node& node) +{ + return node.getNumParents()>0 && + !node.getStateSet() && + !node.getUserData() && + !node.getUpdateCallback() && + !node.getEventCallback() && + !node.getUpdateCallback() && + node.getDescriptions().empty() && + isOperationPermissibleForObject(&node); +} + void Optimizer::RemoveRedundantNodesVisitor::apply(osg::Group& group) { - if (group.getNumParents()>0) + if (group.getNumChildren()==1 && + typeid(group)==typeid(osg::Group) && + isOperationPermissible(group)) { - if (group.getNumChildren()==1 && typeid(group)==typeid(osg::Group)) - { - if (group.getNumParents()>0 && group.getNumChildren()<=1) - { - if (isOperationPermissibleForObject(&group)) - { - _redundantNodeList.insert(&group); - } - } - } + _redundantNodeList.insert(&group); } + traverse(group); } + + void Optimizer::RemoveRedundantNodesVisitor::apply(osg::Transform& transform) { - if (transform.getNumParents()>0 && - transform.getDataVariance()==osg::Object::STATIC && - isOperationPermissibleForObject(&transform)) + if (transform.getDataVariance()==osg::Object::STATIC && + isOperationPermissible(transform)) { - static osg::Matrix identity; osg::Matrix matrix; transform.computeWorldToLocalMatrix(matrix,NULL); - if (matrix==identity) + if (matrix.isIdentity()) { _redundantNodeList.insert(&transform); }