Use asDrawable()/asNode() over dynamic_cast in the Optimizer

This commit is contained in:
scrawl
2017-02-24 01:00:49 +01:00
parent ad0e6a0f81
commit a918306a99

View File

@@ -757,12 +757,15 @@ class CollectLowestTransformsVisitor : public BaseOptimizerVisitor
inline bool isOperationPermissibleForObject(const osg::Object* object) const
{
const osg::Drawable* drawable = dynamic_cast<const osg::Drawable*>(object);
if (drawable) return isOperationPermissibleForObject(drawable);
const osg::Node* node = dynamic_cast<const osg::Node*>(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<osg::Drawable*>(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<osg::MatrixTransform*>(titr->first);
osg::MatrixTransform* mt = titr->first->asMatrixTransform();
if (mt) mt->setMatrix(osg::Matrix::identity());
else
{
osg::PositionAttitudeTransform* pat = dynamic_cast<osg::PositionAttitudeTransform*>(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<osg::Transform*>(&group) && !dynamic_cast<osg::CameraView*>(&group))) &&
(typeid(group)==typeid(osg::Group) || (group.asTransform() && !dynamic_cast<osg::CameraView*>(&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<osg::Group> group = dynamic_cast<osg::Group*>(*itr);
osg::ref_ptr<osg::Group> 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.getNumDrawables();++i)
{
osg::Geometry* geom = dynamic_cast<osg::Geometry*>(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.getNumDrawables();++i)
{
osg::Geometry* geom = dynamic_cast<osg::Geometry*>(geode.getDrawable(i));
osg::Geometry* geom = geode.getDrawable(i)->asGeometry();
if (geom)
{
if (geom->getNumPrimitiveSets()>0 &&