diff --git a/include/osgUtil/Optimizer b/include/osgUtil/Optimizer index 890615a93..989e43f78 100644 --- a/include/osgUtil/Optimizer +++ b/include/osgUtil/Optimizer @@ -82,7 +82,7 @@ class OSGUTIL_EXPORT Optimizer virtual void apply(osg::Billboard& geode); virtual void apply(osg::Transform& transform); - bool removeTransforms(); + bool removeTransforms(osg::Node* nodeWeCannotRemove); protected: diff --git a/src/osgUtil/Optimizer.cpp b/src/osgUtil/Optimizer.cpp index b31cd1b6b..8f33bfe02 100644 --- a/src/osgUtil/Optimizer.cpp +++ b/src/osgUtil/Optimizer.cpp @@ -13,6 +13,8 @@ #include #include +#include +#include #include #include #include @@ -55,7 +57,7 @@ void Optimizer::optimize(osg::Node* node, unsigned int options) osg::notify(osg::DEBUG_INFO) << "** RemoveStaticTransformsVisitor *** Pass "<accept(fstv); - result = fstv.removeTransforms(); + result = fstv.removeTransforms(node); ++i; } while (result); @@ -457,7 +459,7 @@ class CollectLowestTransformsVisitor : public osg::NodeVisitor void setUpMaps(); void disableTransform(osg::Transform* transform); - bool removeTransforms(); + bool removeTransforms(osg::Node* nodeWeCannotRemove); protected: @@ -693,7 +695,7 @@ void CollectLowestTransformsVisitor::setUpMaps() } -bool CollectLowestTransformsVisitor::removeTransforms() +bool CollectLowestTransformsVisitor::removeTransforms(osg::Node* nodeWeCannotRemove) { // transform the objects that can be applied. for(ObjectMap::iterator oitr=_objectMap.begin(); @@ -718,22 +720,48 @@ bool CollectLowestTransformsVisitor::removeTransforms() { if (titr->second._canBeApplied) { - transformRemoved = true; - osg::ref_ptr transform = titr->first; - osg::ref_ptr group = new osg::Group; - group->setDataVariance(osg::Object::STATIC); - for(unsigned int i=0;igetNumChildren();++i) + if (titr->first!=nodeWeCannotRemove) { - for(unsigned int j=0;jgetNumParents();++j) + transformRemoved = true; + + osg::ref_ptr transform = titr->first; + osg::ref_ptr group = new osg::Group; + group->setDataVariance(osg::Object::STATIC); + for(unsigned int i=0;igetNumChildren();++i) { - group->addChild(transform->getChild(i)); + for(unsigned int j=0;jgetNumParents();++j) + { + group->addChild(transform->getChild(i)); + } + } + + for(int i2=transform->getNumParents()-1;i2>=0;--i2) + { + transform->getParent(i2)->replaceChild(transform.get(),group.get()); } } - - for(int i2=transform->getNumParents()-1;i2>=0;--i2) + else { - transform->getParent(i2)->replaceChild(transform.get(),group.get()); + osg::MatrixTransform* mt = dynamic_cast(titr->first); + if (mt) mt->setMatrix(osg::Matrix::identity()); + else + { + osg::PositionAttitudeTransform* pat = dynamic_cast(titr->first); + if (pat) + { + pat->setPosition(osg::Vec3(0.0f,0.0f,0.0f)); + pat->setAttitude(osg::Quat()); + pat->setPivotPoint(osg::Vec3(0.0f,0.0f,0.0f)); + } + else + { + osg::notify(osg::WARN)<<"Warning:: during Optimize::CollectLowestTransformsVisitor::removeTransforms(Node*)"<first->className()<