diff --git a/include/osgUtil/Optimizer b/include/osgUtil/Optimizer index 75328b933..6a6f09305 100644 --- a/include/osgUtil/Optimizer +++ b/include/osgUtil/Optimizer @@ -73,7 +73,7 @@ class OSGUTIL_EXPORT Optimizer COMBINE_ADJACENT_LODS = (1 << 3), SHARE_DUPLICATE_STATE = (1 << 4), MERGE_GEOMETRY = (1 << 5), - CHECK_GEOMETRY = (1 << 6), + CHECK_GEOMETRY = (1 << 6), // deprecated, currently no-op MAKE_FAST_GEOMETRY = (1 << 7), SPATIALIZE_GROUPS = (1 << 8), COPY_SHARED_NODES = (1 << 9), @@ -275,7 +275,7 @@ class OSGUTIL_EXPORT Optimizer BaseOptimizerVisitor(optimizer, FLATTEN_STATIC_TRANSFORMS) {} virtual void apply(osg::Node& geode); - virtual void apply(osg::Geode& geode); + virtual void apply(osg::Drawable& drawable); virtual void apply(osg::Billboard& geode); virtual void apply(osg::ProxyNode& node); virtual void apply(osg::PagedLOD& node); @@ -360,7 +360,6 @@ class OSGUTIL_EXPORT Optimizer RemoveEmptyNodesVisitor(Optimizer* optimizer=0): BaseOptimizerVisitor(optimizer, REMOVE_REDUNDANT_NODES) {} - virtual void apply(osg::Geode& geode); virtual void apply(osg::Group& group); void removeEmptyNodes(); @@ -404,7 +403,7 @@ class OSGUTIL_EXPORT Optimizer }; - /** Tessellate all geodes, to remove POLYGONS.*/ + /** Tessellate all Geometries, to remove POLYGONS.*/ class OSGUTIL_EXPORT TessellateVisitor : public BaseOptimizerVisitor { public: @@ -415,7 +414,7 @@ class OSGUTIL_EXPORT Optimizer TessellateVisitor(Optimizer* optimizer=0): BaseOptimizerVisitor(optimizer, TESSELLATE_GEOMETRY) {} - virtual void apply(osg::Geode& geode); + virtual void apply(osg::Geometry& geom); }; @@ -461,8 +460,6 @@ class OSGUTIL_EXPORT Optimizer virtual void apply(osg::Node& node); - virtual void apply(osg::Geode& geode); - void optimize(); protected: @@ -504,20 +501,6 @@ class OSGUTIL_EXPORT Optimizer }; - class OSGUTIL_EXPORT CheckGeometryVisitor : public BaseOptimizerVisitor - { - public: - - /// default to traversing all children. - CheckGeometryVisitor(Optimizer* optimizer=0): - BaseOptimizerVisitor(optimizer, CHECK_GEOMETRY) {} - - virtual void apply(osg::Geode& geode) { checkGeode(geode); } - - void checkGeode(osg::Geode& geode); - - }; - class OSGUTIL_EXPORT MakeFastGeometryVisitor : public BaseOptimizerVisitor { public: @@ -526,9 +509,7 @@ class OSGUTIL_EXPORT Optimizer MakeFastGeometryVisitor(Optimizer* optimizer=0): BaseOptimizerVisitor(optimizer, MAKE_FAST_GEOMETRY) {} - virtual void apply(osg::Geode& geode) { checkGeode(geode); } - - void checkGeode(osg::Geode& geode); + virtual void apply(osg::Geometry& geom); }; @@ -627,7 +608,6 @@ class OSGUTIL_EXPORT Optimizer _changeClientImageStorage(changeClientImageStorage), _valueClientImageStorage(valueClientImageStorage), _changeAnisotropy(changeAnisotropy), _valueAnisotropy(valueAnisotropy) {} - virtual void apply(osg::Geode& node); virtual void apply(osg::Node& node); void apply(osg::StateSet& stateset); @@ -816,8 +796,7 @@ class OSGUTIL_EXPORT Optimizer virtual void reset(); virtual void apply(osg::Node& node); - - virtual void apply(osg::Geode& geode); + virtual void apply(osg::Drawable& node); void optimize(); @@ -850,15 +829,12 @@ class OSGUTIL_EXPORT Optimizer BaseOptimizerVisitor(optimizer, STATIC_OBJECT_DETECTION) {} virtual void apply(osg::Node& node); - - virtual void apply(osg::Geode& geode); + virtual void apply(osg::Drawable& drawable); protected: void applyStateSet(osg::StateSet& stateset); - void applyDrawable(osg::Drawable& drawable); - }; /** For all geometry apply settings.*/ diff --git a/src/osgUtil/Optimizer.cpp b/src/osgUtil/Optimizer.cpp index 997ac55f2..b3ae72f07 100644 --- a/src/osgUtil/Optimizer.cpp +++ b/src/osgUtil/Optimizer.cpp @@ -50,8 +50,6 @@ using namespace osgUtil; -// #define GEOMETRYDEPRECATED - void Optimizer::reset() { } @@ -290,14 +288,6 @@ void Optimizer::optimize(osg::Node* node, unsigned int options) OSG_INFO<<"MERGE_GEODES took "<delta_s(startTick,endTick)<accept(mgv); - } - if (options & MAKE_FAST_GEOMETRY) { OSG_INFO<<"Optimizer::optimize() doing MAKE_FAST_GEOMETRY"<(geode.getDrawable(i)); - if (geom) { - osgUtil::Tessellator Tessellator; - Tessellator.retessellatePolygons(*geom); - } - } - traverse(geode); + osgUtil::Tessellator Tessellator; + Tessellator.retessellatePolygons(geom); } @@ -468,38 +451,6 @@ void Optimizer::StateVisitor::apply(osg::Node& node) traverse(node); } -void Optimizer::StateVisitor::apply(osg::Geode& geode) -{ - if (!isOperationPermissibleForObject(&geode)) return; - - osg::StateSet* ss = geode.getStateSet(); - - - if (ss && ss->getDataVariance()==osg::Object::STATIC) - { - if (isOperationPermissibleForObject(ss)) - { - addStateSet(ss,&geode); - } - } - for(unsigned int i=0;igetStateSet(); - if (ss && ss->getDataVariance()==osg::Object::STATIC) - { - if (isOperationPermissibleForObject(drawable) && - isOperationPermissibleForObject(ss)) - { - addStateSet(ss,drawable); - } - } - } - } -} - void Optimizer::StateVisitor::optimize() { OSG_INFO << "Num of StateSet="<<_statesets.size()<< std::endl; @@ -1173,26 +1124,19 @@ void Optimizer::FlattenStaticTransformsVisitor::apply(osg::PagedLOD& node) traverse(node); } - -void Optimizer::FlattenStaticTransformsVisitor::apply(osg::Geode& geode) +void Optimizer::FlattenStaticTransformsVisitor::apply(osg::Drawable& drawable) { - if (!_transformStack.empty()) + osg::Geometry *geometry = drawable.asGeometry(); + if((geometry) && (isOperationPermissibleForObject(&drawable))) { - for(unsigned int i=0;iasGeometry(); - if((geometry) && (isOperationPermissibleForObject(&geode)) && (isOperationPermissibleForObject(geometry))) - { - if(geometry->getVertexArray() && geometry->getVertexArray()->referenceCount() > 1) { - geometry->setVertexArray(dynamic_cast(geometry->getVertexArray()->clone(osg::CopyOp::DEEP_COPY_ALL))); - } - if(geometry->getNormalArray() && geometry->getNormalArray()->referenceCount() > 1) { - geometry->setNormalArray(dynamic_cast(geometry->getNormalArray()->clone(osg::CopyOp::DEEP_COPY_ALL))); - } - } - _drawableSet.insert(geode.getDrawable(i)); + if(geometry->getVertexArray() && geometry->getVertexArray()->referenceCount() > 1) { + geometry->setVertexArray(dynamic_cast(geometry->getVertexArray()->clone(osg::CopyOp::DEEP_COPY_ALL))); + } + if(geometry->getNormalArray() && geometry->getNormalArray()->referenceCount() > 1) { + geometry->setNormalArray(dynamic_cast(geometry->getNormalArray()->clone(osg::CopyOp::DEEP_COPY_ALL))); } } + _drawableSet.insert(&drawable); } void Optimizer::FlattenStaticTransformsVisitor::apply(osg::Billboard& billboard) @@ -1329,23 +1273,6 @@ bool Optimizer::CombineStaticTransformsVisitor::removeTransforms(osg::Node* node // RemoveEmptyNodes. //////////////////////////////////////////////////////////////////////////// -void Optimizer::RemoveEmptyNodesVisitor::apply(osg::Geode& geode) -{ - for(int i=geode.getNumDrawables()-1;i>=0;--i) - { - osg::Geometry* geom = geode.getDrawable(i)->asGeometry(); - if (geom && geom->empty() && isOperationPermissibleForObject(geom)) - { - geode.removeDrawables(i,1); - } - } - - if (geode.getNumParents()>0) - { - if (geode.getNumDrawables()==0 && isOperationPermissibleForObject(&geode)) _redundantNodeList.insert(&geode); - } -} - void Optimizer::RemoveEmptyNodesVisitor::apply(osg::Group& group) { if (group.getNumParents()>0) @@ -1389,7 +1316,7 @@ void Optimizer::RemoveEmptyNodesVisitor::removeEmptyNodes() strcmp(parent->className(),"MultiSwitch")!=0) { parent->removeChild(nodeToRemove.get()); - if (parent->getNumChildren()==0) newEmptyGroups.insert(*pitr); + if (parent->getNumChildren()==0 && isOperationPermissibleForObject(parent)) newEmptyGroups.insert(parent); } } } @@ -1795,39 +1722,13 @@ struct LessGeometryPrimitiveType } }; -void Optimizer::CheckGeometryVisitor::checkGeode(osg::Geode& geode) +void Optimizer::MakeFastGeometryVisitor::apply(osg::Geometry& geom) { - if (isOperationPermissibleForObject(&geode)) + if (isOperationPermissibleForObject(&geom)) { - for(unsigned int i=0;iasGeometry(); - if (geom && isOperationPermissibleForObject(geom)) - { -#ifdef GEOMETRYDEPRECATED - geom1829 - ->computeCorrectBindingsAndArraySizes(); -#endif - } - } - } -} - -void Optimizer::MakeFastGeometryVisitor::checkGeode(osg::Geode& geode) -{ - // GeometryDeprecated CAN REMOVED - if (isOperationPermissibleForObject(&geode)) - { - for(unsigned int i=0;iasGeometry(); - if (geom && isOperationPermissibleForObject(geom)) - { - if (geom->checkForDeprecatedData()) - { - geom->fixDeprecatedData(); - } - } + geom.fixDeprecatedData(); } } } @@ -2985,33 +2886,6 @@ void Optimizer::TextureVisitor::apply(osg::Node& node) traverse(node); } -void Optimizer::TextureVisitor::apply(osg::Geode& geode) -{ - if (!isOperationPermissibleForObject(&geode)) return; - - osg::StateSet* ss = geode.getStateSet(); - - if (ss && isOperationPermissibleForObject(ss)) - { - apply(*ss); - } - - for(unsigned int i=0;igetStateSet(); - if (ss && - isOperationPermissibleForObject(drawable) && - isOperationPermissibleForObject(ss)) - { - apply(*ss); - } - } - } -} - void Optimizer::TextureVisitor::apply(osg::StateSet& stateset) { for(unsigned int i=0;igetDataVariance()==osg::Object::STATIC) { - if (isOperationPermissibleForObject(ss)) + if (isOperationPermissibleForObject(&node) && + isOperationPermissibleForObject(ss)) { - pushedGeodeStateState = pushStateSet(ss); + pushedStateState = pushStateSet(ss); } } - for(unsigned int i=0;igetStateSet(); - if (ss && ss->getDataVariance()==osg::Object::STATIC) - { - if (isOperationPermissibleForObject(drawable) && - isOperationPermissibleForObject(ss)) - { - pushedDrawableStateState = pushStateSet(ss); - } - } - - if (!_statesetStack.empty()) - { - for(StateSetStack::iterator ssitr = _statesetStack.begin(); - ssitr != _statesetStack.end(); - ++ssitr) - { - _statesetMap[*ssitr].insert(drawable); - } - } - - if (pushedDrawableStateState) popStateSet(); + _statesetMap[*ssitr].insert(&node); } - } - if (pushedGeodeStateState) popStateSet(); + if (pushedStateState) popStateSet(); } void Optimizer::TextureAtlasVisitor::optimize() @@ -4474,14 +4323,11 @@ void Optimizer::StaticObjectDetectionVisitor::apply(osg::Node& node) traverse(node); } -void Optimizer::StaticObjectDetectionVisitor::apply(osg::Geode& geode) +void Optimizer::StaticObjectDetectionVisitor::apply(osg::Drawable& drawable) { - if (geode.getStateSet()) applyStateSet(*geode.getStateSet()); + if (drawable.getStateSet()) applyStateSet(*drawable.getStateSet()); - for(unsigned int i=0; i