diff --git a/include/osgUtil/Optimizer b/include/osgUtil/Optimizer index 11f4da648..66eeb738d 100644 --- a/include/osgUtil/Optimizer +++ b/include/osgUtil/Optimizer @@ -310,7 +310,8 @@ class OSGUTIL_EXPORT Optimizer protected: - void transformDrawables(osg::Geode& geode); + void transformGeode(osg::Geode& geode); + void transformDrawable(osg::Drawable& drawable); void transformBillboard(osg::Billboard& billboard); std::vector _matrixStack; diff --git a/src/osgUtil/Optimizer.cpp b/src/osgUtil/Optimizer.cpp index 0cce6c635..c058881ee 100644 --- a/src/osgUtil/Optimizer.cpp +++ b/src/osgUtil/Optimizer.cpp @@ -4408,7 +4408,7 @@ void Optimizer::FlattenStaticTransformsDuplicatingSharedSubgraphsVisitor::apply( // If there is only one parent, just transform all vertices and normals if(geode.getNumParents() == 1) { - transformDrawables(geode); + transformGeode(geode); } else { @@ -4428,7 +4428,7 @@ void Optimizer::FlattenStaticTransformsDuplicatingSharedSubgraphsVisitor::apply( else osg::notify(osg::NOTICE) << "No parent for this Geode" << std::endl; - transformDrawables(*(new_geode.get())); + transformGeode(*(new_geode.get())); } } } @@ -4469,45 +4469,55 @@ void Optimizer::FlattenStaticTransformsDuplicatingSharedSubgraphsVisitor::apply( } -void Optimizer::FlattenStaticTransformsDuplicatingSharedSubgraphsVisitor::transformDrawables(osg::Geode& geode) +void Optimizer::FlattenStaticTransformsDuplicatingSharedSubgraphsVisitor::transformGeode(osg::Geode& geode) { for(unsigned int i=0; iasGeometry(); - if(geometry) - { - // transform all geometry - osg::Vec3Array* verts = dynamic_cast(geometry->getVertexArray()); - if(verts) - { - for(unsigned int j=0; jsize(); j++) - (*verts)[j] = (*verts)[j] * _matrixStack.back(); - } - else - { - osg::Vec4Array* verts = dynamic_cast(geometry->getVertexArray()); - if(verts) - { - for(unsigned int j=0; jsize(); j++) - (*verts)[j] = _matrixStack.back() * (*verts)[j]; - } - } - osg::Vec3Array* normals = dynamic_cast(geometry->getNormalArray()); - if(normals) - { - for(unsigned int j=0; jsize(); j++) - (*normals)[j] = osg::Matrix::transform3x3((*normals)[j], _matrixStack.back()); - } - - geometry->dirtyBound(); - geometry->dirtyDisplayList(); - } + transformDrawable(*geode.getDrawable(i)); } geode.dirtyBound(); } +void Optimizer::FlattenStaticTransformsDuplicatingSharedSubgraphsVisitor::transformDrawable(osg::Drawable& drawable) +{ + osg::Geometry* geometry = drawable.asGeometry(); + if(geometry) + { + // transform all geometry + osg::Vec3Array* verts = dynamic_cast(geometry->getVertexArray()); + if(verts) + { + for(unsigned int j=0; jsize(); j++) + { + (*verts)[j] = (*verts)[j] * _matrixStack.back(); + } + } + else + { + osg::Vec4Array* verts = dynamic_cast(geometry->getVertexArray()); + if(verts) + { + for(unsigned int j=0; jsize(); j++) + { + (*verts)[j] = _matrixStack.back() * (*verts)[j]; + } + } + } + osg::Vec3Array* normals = dynamic_cast(geometry->getNormalArray()); + if(normals) + { + for(unsigned int j=0; jsize(); j++) + (*normals)[j] = osg::Matrix::transform3x3((*normals)[j], _matrixStack.back()); + } + + geometry->dirtyBound(); + geometry->dirtyDisplayList(); + } +} + + void Optimizer::FlattenStaticTransformsDuplicatingSharedSubgraphsVisitor::transformBillboard(osg::Billboard& billboard) { osg::Vec3 axis = osg::Matrix::transform3x3(billboard.getAxis(), _matrixStack.back()); @@ -4519,7 +4529,18 @@ void Optimizer::FlattenStaticTransformsDuplicatingSharedSubgraphsVisitor::transf billboard.setNormal(normal); for(unsigned int i=0; i