void VertexCacheOptimizer::apply(osg::Geode& geode) { if (geode.getDataVariance() == osg::Object::DYNAMIC) return; for(unsigned i=0; i<geode.getNumDrawables(); ++i ) { osg::Geometry* geom = geode.getDrawable(i)->asGeometry(); if ( geom ) { if ( geom->getDataVariance() == osg::Object::DYNAMIC ) return; // vertex cache optimizations currently only support surface geometries. // all or nothing in the geode. osg::Geometry::PrimitiveSetList& psets = geom->getPrimitiveSetList(); for( osg::Geometry::PrimitiveSetList::iterator i = psets.begin(); i != psets.end(); ++i ) { switch( (*i)->getMode() ) { case GL_TRIANGLES: case GL_TRIANGLE_FAN: case GL_TRIANGLE_STRIP: case GL_QUADS: case GL_QUAD_STRIP: case GL_POLYGON: break; default: return; } } } } //OE_NOTICE << LC << "VC optimizing..." << std::endl; // passed the test; run the optimizer. osgUtil::VertexCacheVisitor vcv; geode.accept( vcv ); vcv.optimizeVertices(); osgUtil::VertexAccessOrderVisitor vaov; geode.accept( vaov ); vaov.optimizeOrder(); traverse( geode ); }