From 7611f950789c013d65dcdd9c2f2636da94f84a3b Mon Sep 17 00:00:00 2001 From: scrawl Date: Fri, 20 Jan 2017 20:57:03 +0100 Subject: [PATCH 01/10] RemoveEmptyNodesVisitor: remove redundant code for Geode handling --- include/osgUtil/Optimizer | 1 - src/osgUtil/Optimizer.cpp | 17 ----------------- 2 files changed, 18 deletions(-) diff --git a/include/osgUtil/Optimizer b/include/osgUtil/Optimizer index 75328b933..4113f4589 100644 --- a/include/osgUtil/Optimizer +++ b/include/osgUtil/Optimizer @@ -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(); diff --git a/src/osgUtil/Optimizer.cpp b/src/osgUtil/Optimizer.cpp index 997ac55f2..31854ebbf 100644 --- a/src/osgUtil/Optimizer.cpp +++ b/src/osgUtil/Optimizer.cpp @@ -1329,23 +1329,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) From 4457df9a8ae60d6b85a0808da27e0c441fa75d0c Mon Sep 17 00:00:00 2001 From: scrawl Date: Fri, 20 Jan 2017 20:58:05 +0100 Subject: [PATCH 02/10] RemoveEmptyNodesVisitor: add missing isOperationPermissible check --- src/osgUtil/Optimizer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/osgUtil/Optimizer.cpp b/src/osgUtil/Optimizer.cpp index 31854ebbf..4f442d4cd 100644 --- a/src/osgUtil/Optimizer.cpp +++ b/src/osgUtil/Optimizer.cpp @@ -1372,7 +1372,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); } } } From dc2689f7797d2477f4c8b4a2d5404ef83d4a1ba4 Mon Sep 17 00:00:00 2001 From: scrawl Date: Fri, 20 Jan 2017 21:08:02 +0100 Subject: [PATCH 03/10] TextureVisitor: remove redundant code for Geode handling --- include/osgUtil/Optimizer | 1 - src/osgUtil/Optimizer.cpp | 27 --------------------------- 2 files changed, 28 deletions(-) diff --git a/include/osgUtil/Optimizer b/include/osgUtil/Optimizer index 4113f4589..032952259 100644 --- a/include/osgUtil/Optimizer +++ b/include/osgUtil/Optimizer @@ -626,7 +626,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); diff --git a/src/osgUtil/Optimizer.cpp b/src/osgUtil/Optimizer.cpp index 4f442d4cd..42ad887d7 100644 --- a/src/osgUtil/Optimizer.cpp +++ b/src/osgUtil/Optimizer.cpp @@ -2968,33 +2968,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;i Date: Fri, 20 Jan 2017 21:25:32 +0100 Subject: [PATCH 04/10] TextureAtlasVisitor: fix handling of Drawables that are directly in the scene graph not attached to a Geode --- include/osgUtil/Optimizer | 3 +-- src/osgUtil/Optimizer.cpp | 51 ++++++++++----------------------------- 2 files changed, 14 insertions(+), 40 deletions(-) diff --git a/include/osgUtil/Optimizer b/include/osgUtil/Optimizer index 032952259..0a7c97748 100644 --- a/include/osgUtil/Optimizer +++ b/include/osgUtil/Optimizer @@ -814,8 +814,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(); diff --git a/src/osgUtil/Optimizer.cpp b/src/osgUtil/Optimizer.cpp index 42ad887d7..179d74b6e 100644 --- a/src/osgUtil/Optimizer.cpp +++ b/src/osgUtil/Optimizer.cpp @@ -4093,56 +4093,31 @@ void Optimizer::TextureAtlasVisitor::apply(osg::Node& node) if (pushedStateState) popStateSet(); } -void Optimizer::TextureAtlasVisitor::apply(osg::Geode& geode) +void Optimizer::TextureAtlasVisitor::apply(osg::Drawable& node) { - if (!isOperationPermissibleForObject(&geode)) return; - - osg::StateSet* ss = geode.getStateSet(); - - - bool pushedGeodeStateState = false; + bool pushedStateState = false; + osg::StateSet* ss = node.getStateSet(); if (ss && ss->getDataVariance()==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() From ff1a9a195a3217fd1632b4540a1747ea680f9987 Mon Sep 17 00:00:00 2001 From: scrawl Date: Fri, 20 Jan 2017 21:48:45 +0100 Subject: [PATCH 05/10] StaticObjectDetectionVisitor: make use of apply(Drawable) visitor function --- include/osgUtil/Optimizer | 5 +---- src/osgUtil/Optimizer.cpp | 18 +++--------------- 2 files changed, 4 insertions(+), 19 deletions(-) diff --git a/include/osgUtil/Optimizer b/include/osgUtil/Optimizer index 0a7c97748..d0a1937b5 100644 --- a/include/osgUtil/Optimizer +++ b/include/osgUtil/Optimizer @@ -847,15 +847,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 179d74b6e..9c7d525ac 100644 --- a/src/osgUtil/Optimizer.cpp +++ b/src/osgUtil/Optimizer.cpp @@ -4405,14 +4405,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 Date: Fri, 20 Jan 2017 22:43:58 +0100 Subject: [PATCH 06/10] FlattenStaticTransformsVisitor: fix handling of Drawables that are directly in the scene graph not attached to a Geode --- include/osgUtil/Optimizer | 2 +- src/osgUtil/Optimizer.cpp | 25 +++++++++---------------- 2 files changed, 10 insertions(+), 17 deletions(-) diff --git a/include/osgUtil/Optimizer b/include/osgUtil/Optimizer index d0a1937b5..665eafb91 100644 --- a/include/osgUtil/Optimizer +++ b/include/osgUtil/Optimizer @@ -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); diff --git a/src/osgUtil/Optimizer.cpp b/src/osgUtil/Optimizer.cpp index 9c7d525ac..ddacb8800 100644 --- a/src/osgUtil/Optimizer.cpp +++ b/src/osgUtil/Optimizer.cpp @@ -1173,26 +1173,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) From f229b194962bd5138aad20d70b4e254c158aa791 Mon Sep 17 00:00:00 2001 From: scrawl Date: Fri, 20 Jan 2017 22:47:43 +0100 Subject: [PATCH 07/10] TessellateVisitor: fix handling of Geometries that are directly in the scene graph not attached to a Geode --- include/osgUtil/Optimizer | 4 ++-- src/osgUtil/Optimizer.cpp | 13 +++---------- 2 files changed, 5 insertions(+), 12 deletions(-) diff --git a/include/osgUtil/Optimizer b/include/osgUtil/Optimizer index 665eafb91..520c0f748 100644 --- a/include/osgUtil/Optimizer +++ b/include/osgUtil/Optimizer @@ -403,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: @@ -414,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); }; diff --git a/src/osgUtil/Optimizer.cpp b/src/osgUtil/Optimizer.cpp index ddacb8800..6e9e411b6 100644 --- a/src/osgUtil/Optimizer.cpp +++ b/src/osgUtil/Optimizer.cpp @@ -405,17 +405,10 @@ void Optimizer::optimize(osg::Node* node, unsigned int options) //////////////////////////////////////////////////////////////////////////// // Tessellate geometry - eg break complex POLYGONS into triangles, strips, fans.. //////////////////////////////////////////////////////////////////////////// -void Optimizer::TessellateVisitor::apply(osg::Geode& geode) +void Optimizer::TessellateVisitor::apply(osg::Geometry &geom) { - for(unsigned int i=0;i(geode.getDrawable(i)); - if (geom) { - osgUtil::Tessellator Tessellator; - Tessellator.retessellatePolygons(*geom); - } - } - traverse(geode); + osgUtil::Tessellator Tessellator; + Tessellator.retessellatePolygons(geom); } From 833f37ea57f5a7c0f05b10bc8dbf7feb9ae2c2fa Mon Sep 17 00:00:00 2001 From: scrawl Date: Fri, 20 Jan 2017 22:49:17 +0100 Subject: [PATCH 08/10] StateVisitor: remove redundant code for Geode handling --- include/osgUtil/Optimizer | 2 -- src/osgUtil/Optimizer.cpp | 32 -------------------------------- 2 files changed, 34 deletions(-) diff --git a/include/osgUtil/Optimizer b/include/osgUtil/Optimizer index 520c0f748..979baa1d0 100644 --- a/include/osgUtil/Optimizer +++ b/include/osgUtil/Optimizer @@ -460,8 +460,6 @@ class OSGUTIL_EXPORT Optimizer virtual void apply(osg::Node& node); - virtual void apply(osg::Geode& geode); - void optimize(); protected: diff --git a/src/osgUtil/Optimizer.cpp b/src/osgUtil/Optimizer.cpp index 6e9e411b6..0c92f984b 100644 --- a/src/osgUtil/Optimizer.cpp +++ b/src/osgUtil/Optimizer.cpp @@ -461,38 +461,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; From 4a05caf4f7a614df9b4ca22869b203845958b612 Mon Sep 17 00:00:00 2001 From: scrawl Date: Fri, 20 Jan 2017 23:01:04 +0100 Subject: [PATCH 09/10] MakeFastGeometryVisitor: fix handling of Geometries that are directly in the scene graph not attached to a Geode --- include/osgUtil/Optimizer | 6 ++---- src/osgUtil/Optimizer.cpp | 30 ++++++++---------------------- 2 files changed, 10 insertions(+), 26 deletions(-) diff --git a/include/osgUtil/Optimizer b/include/osgUtil/Optimizer index 979baa1d0..7b1bfa82a 100644 --- a/include/osgUtil/Optimizer +++ b/include/osgUtil/Optimizer @@ -509,7 +509,7 @@ class OSGUTIL_EXPORT Optimizer CheckGeometryVisitor(Optimizer* optimizer=0): BaseOptimizerVisitor(optimizer, CHECK_GEOMETRY) {} - virtual void apply(osg::Geode& geode) { checkGeode(geode); } + virtual void apply(osg::Geometry& geom); void checkGeode(osg::Geode& geode); @@ -523,9 +523,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); }; diff --git a/src/osgUtil/Optimizer.cpp b/src/osgUtil/Optimizer.cpp index 0c92f984b..6bfbcc607 100644 --- a/src/osgUtil/Optimizer.cpp +++ b/src/osgUtil/Optimizer.cpp @@ -1732,39 +1732,25 @@ struct LessGeometryPrimitiveType } }; -void Optimizer::CheckGeometryVisitor::checkGeode(osg::Geode& geode) +void Optimizer::CheckGeometryVisitor::apply(osg::Geometry& geom) { - if (isOperationPermissibleForObject(&geode)) + if (isOperationPermissibleForObject(&geom)) { - for(unsigned int i=0;iasGeometry(); - if (geom && isOperationPermissibleForObject(geom)) - { #ifdef GEOMETRYDEPRECATED - geom1829 - ->computeCorrectBindingsAndArraySizes(); + geom + .computeCorrectBindingsAndArraySizes(); #endif - } - } } } -void Optimizer::MakeFastGeometryVisitor::checkGeode(osg::Geode& geode) +void Optimizer::MakeFastGeometryVisitor::apply(osg::Geometry& geom) { // GeometryDeprecated CAN REMOVED - if (isOperationPermissibleForObject(&geode)) + if (isOperationPermissibleForObject(&geom)) { - for(unsigned int i=0;iasGeometry(); - if (geom && isOperationPermissibleForObject(geom)) - { - if (geom->checkForDeprecatedData()) - { - geom->fixDeprecatedData(); - } - } + geom.fixDeprecatedData(); } } } From f13fbff2511a4fcf5b88fa76b6611508174aebf1 Mon Sep 17 00:00:00 2001 From: scrawl Date: Fri, 20 Jan 2017 23:02:15 +0100 Subject: [PATCH 10/10] Remove CheckGeometryVisitor which was a no-op --- include/osgUtil/Optimizer | 16 +--------------- src/osgUtil/Optimizer.cpp | 22 ---------------------- 2 files changed, 1 insertion(+), 37 deletions(-) diff --git a/include/osgUtil/Optimizer b/include/osgUtil/Optimizer index 7b1bfa82a..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), @@ -501,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::Geometry& geom); - - void checkGeode(osg::Geode& geode); - - }; - class OSGUTIL_EXPORT MakeFastGeometryVisitor : public BaseOptimizerVisitor { public: diff --git a/src/osgUtil/Optimizer.cpp b/src/osgUtil/Optimizer.cpp index 6bfbcc607..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"<