From a918306a99fa1d41acd01d280427908b532f247d Mon Sep 17 00:00:00 2001 From: scrawl Date: Fri, 24 Feb 2017 01:00:49 +0100 Subject: [PATCH] Use asDrawable()/asNode() over dynamic_cast in the Optimizer --- src/osgUtil/Optimizer.cpp | 32 +++++++++++++++++++------------- 1 file changed, 19 insertions(+), 13 deletions(-) diff --git a/src/osgUtil/Optimizer.cpp b/src/osgUtil/Optimizer.cpp index b3ae72f07..beb38209c 100644 --- a/src/osgUtil/Optimizer.cpp +++ b/src/osgUtil/Optimizer.cpp @@ -757,12 +757,15 @@ class CollectLowestTransformsVisitor : public BaseOptimizerVisitor inline bool isOperationPermissibleForObject(const osg::Object* object) const { - const osg::Drawable* drawable = dynamic_cast(object); - if (drawable) return isOperationPermissibleForObject(drawable); - - const osg::Node* node = dynamic_cast(object); - if (node) return isOperationPermissibleForObject(node); - + const osg::Node* node = object->asNode(); + if (node) + { + const osg::Drawable* drawable = node->asDrawable(); + if (drawable) + return isOperationPermissibleForObject(drawable); + else + return isOperationPermissibleForObject(node); + } return true; } @@ -872,7 +875,10 @@ class CollectLowestTransformsVisitor : public BaseOptimizerVisitor void CollectLowestTransformsVisitor::doTransform(osg::Object* obj,osg::Matrix& matrix) { - osg::Drawable* drawable = dynamic_cast(obj); + osg::Node* node = obj->asNode(); + if (!node) + return; + osg::Drawable* drawable = node->asDrawable(); if (drawable) { osgUtil::TransformAttributeFunctor tf(matrix); @@ -1072,11 +1078,11 @@ bool CollectLowestTransformsVisitor::removeTransforms(osg::Node* nodeWeCannotRem } else { - osg::MatrixTransform* mt = dynamic_cast(titr->first); + osg::MatrixTransform* mt = titr->first->asMatrixTransform(); if (mt) mt->setMatrix(osg::Matrix::identity()); else { - osg::PositionAttitudeTransform* pat = dynamic_cast(titr->first); + osg::PositionAttitudeTransform* pat = titr->first->asPositionAttitudeTransform(); if (pat) { pat->setPosition(osg::Vec3(0.0f,0.0f,0.0f)); @@ -1279,7 +1285,7 @@ void Optimizer::RemoveEmptyNodesVisitor::apply(osg::Group& group) { // only remove empty groups, but not empty occluders. if (group.getNumChildren()==0 && isOperationPermissibleForObject(&group) && - (typeid(group)==typeid(osg::Group) || (dynamic_cast(&group) && !dynamic_cast(&group))) && + (typeid(group)==typeid(osg::Group) || (group.asTransform() && !dynamic_cast(&group))) && (group.getNumChildrenRequiringUpdateTraversal()==0 && group.getNumChildrenRequiringEventTraversal()==0) ) { _redundantNodeList.insert(&group); @@ -1380,7 +1386,7 @@ void Optimizer::RemoveRedundantNodesVisitor::removeRedundantNodes() itr!=_redundantNodeList.end(); ++itr) { - osg::ref_ptr group = dynamic_cast(*itr); + osg::ref_ptr group = (*itr)->asGroup(); if (group.valid()) { // take a copy of parents list since subsequent removes will modify the original one. @@ -2038,7 +2044,7 @@ bool Optimizer::MergeGeometryVisitor::mergeGeode(osg::Geode& geode) unsigned int i; for(i=0;i(geode.getDrawable(i)); + osg::Geometry* geom = geode.getDrawable(i)->asGeometry(); if (geom) { osg::Geometry::PrimitiveSetList& primitives = geom->getPrimitiveSetList(); @@ -2065,7 +2071,7 @@ bool Optimizer::MergeGeometryVisitor::mergeGeode(osg::Geode& geode) // now merge any compatible primitives. for(i=0;i(geode.getDrawable(i)); + osg::Geometry* geom = geode.getDrawable(i)->asGeometry(); if (geom) { if (geom->getNumPrimitiveSets()>0 &&