From 6377e37e88f8ec90941c5669f3b54fc1be74571f Mon Sep 17 00:00:00 2001 From: Robert Osfield Date: Wed, 26 Jun 2013 09:04:20 +0000 Subject: [PATCH] From Pjotr Svetachov and Robert Osfield, "the index mesh and vertex pre-transform optimizers can rearrange or change the size of arrays assigned to a geometry. This leads to crashes or corrupt geometry when using shared arrays. Attached a fix that duplicates shared geometry arrays." --- src/osgUtil/MeshOptimizers.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/osgUtil/MeshOptimizers.cpp b/src/osgUtil/MeshOptimizers.cpp index 3a246e5f1..a5ba79205 100644 --- a/src/osgUtil/MeshOptimizers.cpp +++ b/src/osgUtil/MeshOptimizers.cpp @@ -275,6 +275,9 @@ void IndexMeshVisitor::makeMesh(Geometry& geom) // nothing to index if (!numSurfacePrimitives || !numNonIndexedPrimitives) return; + // duplicate shared arrays as it isn't safe to rearrange vertices when arrays are shared. + if (geom.containsSharedArrays()) geom.duplicateSharedArrays(); + // compute duplicate vertices typedef std::vector IndexList; unsigned int numVertices = geom.getVertexArray()->getNumElements(); @@ -1139,6 +1142,10 @@ void VertexAccessOrderVisitor::optimizeOrder(Geometry& geom) return; ps->accept(vr); } + + // duplicate shared arrays as it isn't safe to rearrange vertices when arrays are shared. + if (geom.containsSharedArrays()) geom.duplicateSharedArrays(); + Remapper remapper(vr.remap); gatherer.accept(remapper); for (Geometry::PrimitiveSetList::iterator itr = primSets.begin(),