From d71a6f6cab5801401619e5cef34eb3dc202099f2 Mon Sep 17 00:00:00 2001 From: Robert Osfield Date: Sun, 14 Sep 2008 10:31:27 +0000 Subject: [PATCH] Introduced Geometry::containsSharedArrays() and Geometry::duplicateSharedArrays() to support a fix to the osgUtil::Simplifier that couldn't handle shared arrays --- include/osg/Geometry | 6 +++++ src/osg/Geometry.cpp | 55 ++++++++++++++++++++++++++++++++++++++ src/osgUtil/Simplifier.cpp | 8 ++++++ 3 files changed, 69 insertions(+) diff --git a/include/osg/Geometry b/include/osg/Geometry index 7754faab9..195b416e6 100644 --- a/include/osg/Geometry +++ b/include/osg/Geometry @@ -344,6 +344,12 @@ class OSG_EXPORT Geometry : public Drawable void copyToAndOptimize(Geometry& target); + + bool containsSharedArrays() const; + + void duplicateSharedArrays(); + + void computeInternalOptimizedGeometry(); void removeInternalOptimizedGeometry() { _internalOptimizedGeometry = 0; } diff --git a/src/osg/Geometry.cpp b/src/osg/Geometry.cpp index f10021f4d..c2c7c9240 100644 --- a/src/osg/Geometry.cpp +++ b/src/osg/Geometry.cpp @@ -3171,6 +3171,61 @@ void Geometry::copyToAndOptimize(Geometry& target) } } +bool Geometry::containsSharedArrays() const +{ + unsigned int numSharedArrays = 0; + + if (getVertexArray() && getVertexArray()->referenceCount()>1) ++numSharedArrays; + if (getNormalArray() && getNormalArray()->referenceCount()>1) ++numSharedArrays; + if (getColorArray() && getColorArray()->referenceCount()>1) ++numSharedArrays; + if (getSecondaryColorArray() && getSecondaryColorArray()->referenceCount()>1) ++numSharedArrays; + if (getFogCoordArray() && getFogCoordArray()->referenceCount()>1) ++numSharedArrays; + + for(unsigned int ti=0;tireferenceCount()>1) ++numSharedArrays; + } + + for(unsigned int vi=0;vi<_vertexAttribList.size();++vi) + { + const ArrayData& arrayData = _vertexAttribList[vi]; + if (arrayData.array.valid() && arrayData.array->referenceCount()>1) ++numSharedArrays; + } + return numSharedArrays!=0; +} + +void Geometry::duplicateSharedArrays() +{ + #define DUPLICATE_IF_REQUIRED(A) \ + if (get##A() && get##A()->referenceCount()>1) \ + { \ + set##A(dynamic_cast(get##A()->clone(osg::CopyOp::DEEP_COPY_ARRAYS))); \ + } + + DUPLICATE_IF_REQUIRED(VertexArray) + DUPLICATE_IF_REQUIRED(NormalArray) + DUPLICATE_IF_REQUIRED(ColorArray) + DUPLICATE_IF_REQUIRED(SecondaryColorArray) + DUPLICATE_IF_REQUIRED(FogCoordArray) + + for(unsigned int ti=0;tireferenceCount()>1) + { + setTexCoordArray(ti, dynamic_cast(getTexCoordArray(ti)->clone(osg::CopyOp::DEEP_COPY_ARRAYS))); + } + } + + for(unsigned int vi=0;vi<_vertexAttribList.size();++vi) + { + ArrayData& arrayData = _vertexAttribList[vi]; + if (arrayData.array.valid() && arrayData.array->referenceCount()>1) + { + arrayData.array = dynamic_cast(arrayData.array->clone(osg::CopyOp::DEEP_COPY_ARRAYS)); + } + } +} + void Geometry::computeInternalOptimizedGeometry() { if (suitableForOptimization()) diff --git a/src/osgUtil/Simplifier.cpp b/src/osgUtil/Simplifier.cpp index bc9ac2470..4a4c83936 100644 --- a/src/osgUtil/Simplifier.cpp +++ b/src/osgUtil/Simplifier.cpp @@ -1413,6 +1413,14 @@ void EdgeCollapse::setGeometry(osg::Geometry* geometry, const Simplifier::IndexL osg::notify(osg::INFO)<<"EdgeCollapse::setGeometry(..): Removing attribute indices"<copyToAndOptimize(*_geometry); } + + // check to see if vertex attributes indices exists, if so expand them to remove them + if (_geometry->containsSharedArrays()) + { + // removing coord indices + osg::notify(osg::INFO)<<"EdgeCollapse::setGeometry(..): Duplicate shared arrays"<duplicateSharedArrays(); + } unsigned int numVertices = geometry->getVertexArray()->getNumElements();