void VertexCacheOptimizer::apply(osg::Drawable& drawable) { if (drawable.getDataVariance() == osg::Object::DYNAMIC) return; osg::Geometry* geom = drawable.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; drawable.accept( vcv ); vcv.optimizeVertices(); osgUtil::VertexAccessOrderVisitor vaov; drawable.accept( vaov ); vaov.optimizeOrder(); traverse( drawable ); }
// decompose Drawable primitives into triangles, print out these triangles and computed normals. void printTriangles(const std::string& name, osg::Drawable& drawable) { std::cout<<name<<std::endl; osg::TriangleFunctor<NormalPrint> tf; drawable.accept(tf); std::cout<<std::endl; }
CullVisitor::value_type CullVisitor::computeNearestPointInFrustum(const osg::Matrix& matrix, const osg::Polytope::PlaneList& planes,const osg::Drawable& drawable) { // OSG_WARN<<"CullVisitor::computeNearestPointInFrustum("<<getTraversalNumber()<<"\t"<<planes.size()<<std::endl; osg::TriangleFunctor<ComputeNearestPointFunctor> cnpf; cnpf.set(_computed_znear, matrix, &planes); drawable.accept(cnpf); return cnpf._znear; }
virtual void apply(osg::Drawable &drawable) { if (!mTriangleMesh) mTriangleMesh.reset(new btTriangleMesh); osg::Matrixf worldMat = osg::computeLocalToWorld(getNodePath()); osg::TriangleFunctor<GetTriangleFunctor> functor; functor.setTriMesh(mTriangleMesh.get()); functor.setMatrix(worldMat); drawable.accept(functor); }
void StatsVisitor::apply(osg::Drawable& drawable) { if (drawable.getStateSet()) { ++_numInstancedStateSet; _statesetSet.insert(drawable.getStateSet()); } ++_numInstancedDrawable; drawable.accept(_instancedStats); _drawableSet.insert(&drawable); osg::Geometry* geometry = dynamic_cast<osg::Geometry*>(&drawable); if (geometry) { ++_numInstancedGeometry; _geometrySet.insert(geometry); } }
void StatsVisitor::apply(osg::Drawable& drawable) { if (drawable.getStateSet()) { apply(*drawable.getStateSet()); } ++_numInstancedDrawable; drawable.accept(_instancedStats); _drawableSet.insert(&drawable); osg::Geometry* geometry = drawable.asGeometry(); if (geometry) { ++_numInstancedGeometry; _geometrySet.insert(geometry); ++_numInstancedFastGeometry; _fastGeometrySet.insert(geometry); } }