From 9f03982e0b81b02d7eedf1b3e1857a808feb3ad4 Mon Sep 17 00:00:00 2001 From: scrawl Date: Fri, 11 Mar 2016 19:08:48 +0100 Subject: [PATCH] Use a dedicated VBO for RigGeometry's vertices and normals The VBO used by the source geometry's arrays may be unintentionally shared with other RigGeometries. The vertices and normals are the only attributes that are modified at all, so using a dedicated VBO for these should improve performance further. --- components/sceneutil/riggeometry.cpp | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/components/sceneutil/riggeometry.cpp b/components/sceneutil/riggeometry.cpp index c2a2023421..5a12b5b4f7 100644 --- a/components/sceneutil/riggeometry.cpp +++ b/components/sceneutil/riggeometry.cpp @@ -71,8 +71,7 @@ RigGeometry::RigGeometry() setCullCallback(new UpdateRigGeometry); setUpdateCallback(new UpdateRigBounds); setSupportsDisplayList(false); - //setUseVertexBufferObjects(true); - //getOrCreateVertexBufferObject()->setUsage(GL_DYNAMIC_DRAW_ARB); + setUseVertexBufferObjects(true); setComputeBoundingBoxCallback(new DummyComputeBoundCallback); } @@ -121,8 +120,23 @@ void RigGeometry::setSourceGeometry(osg::ref_ptr sourceGeometry) setVertexAttribArray(vi,array); } - setVertexArray(dynamic_cast(from.getVertexArray()->clone(osg::CopyOp::DEEP_COPY_ALL))); - setNormalArray(dynamic_cast(from.getNormalArray()->clone(osg::CopyOp::DEEP_COPY_ALL)), osg::Array::BIND_PER_VERTEX); + + osg::ref_ptr vbo (new osg::VertexBufferObject); + vbo->setUsage(GL_DYNAMIC_DRAW_ARB); + + osg::ref_ptr vertexArray = osg::clone(from.getVertexArray(), osg::CopyOp::DEEP_COPY_ALL); + if (vertexArray) + { + vertexArray->setVertexBufferObject(vbo); + setVertexArray(vertexArray); + } + + osg::ref_ptr normalArray = osg::clone(from.getNormalArray(), osg::CopyOp::DEEP_COPY_ALL); + if (normalArray) + { + normalArray->setVertexBufferObject(vbo); + setNormalArray(normalArray, osg::Array::BIND_PER_VERTEX); + } } bool RigGeometry::initFromParentSkeleton(osg::NodeVisitor* nv)