本文整理汇总了C++中osg::Geode::removeDrawables方法的典型用法代码示例。如果您正苦于以下问题:C++ Geode::removeDrawables方法的具体用法?C++ Geode::removeDrawables怎么用?C++ Geode::removeDrawables使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类osg::Geode
的用法示例。
在下文中一共展示了Geode::removeDrawables方法的4个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: apply
void apply( osg::Geode& geode )
{
bool makeECEF = _cx.getSession()->getMapInfo().isGeocentric();
const SpatialReference* srs = _cx.profile()->getSRS();
NumericExpression scaleEx = *_symbol->scale();
osg::Matrixd scaleMatrix;
// save the geode's drawables..
osg::Geode::DrawableList old_drawables = geode.getDrawableList();
// ..and clear out the drawables list.
geode.removeDrawables( 0, geode.getNumDrawables() );
// foreach each drawable that was originally in the geode...
for( osg::Geode::DrawableList::iterator i = old_drawables.begin(); i != old_drawables.end(); i++ )
{
osg::Geometry* originalDrawable = dynamic_cast<osg::Geometry*>( i->get() );
if ( !originalDrawable )
continue;
// go through the list of input features...
for( FeatureList::const_iterator j = _features.begin(); j != _features.end(); j++ )
{
const Feature* feature = j->get();
if ( _symbol->scale().isSet() )
{
double scale = feature->eval( scaleEx, &_cx );
scaleMatrix.makeScale( scale, scale, scale );
}
ConstGeometryIterator gi( feature->getGeometry(), false );
while( gi.hasMore() )
{
const Geometry* geom = gi.next();
for( Geometry::const_iterator k = geom->begin(); k != geom->end(); ++k )
{
osg::Vec3d point = *k;
osg::Matrixd mat;
if ( makeECEF )
{
osg::Matrixd rotation;
ECEF::transformAndGetRotationMatrix( point, srs, point, rotation );
mat = rotation * scaleMatrix * osg::Matrixd::translate(point) * _f2n->world2local();
}
else
{
mat = scaleMatrix * osg::Matrixd::translate(point) * _f2n->world2local();
}
// clone the source drawable once for each input feature.
osg::ref_ptr<osg::Geometry> newDrawable = osg::clone(
originalDrawable,
osg::CopyOp::DEEP_COPY_ARRAYS | osg::CopyOp::DEEP_COPY_PRIMITIVES );
osg::Vec3Array* verts = dynamic_cast<osg::Vec3Array*>( newDrawable->getVertexArray() );
if ( verts )
{
for( osg::Vec3Array::iterator v = verts->begin(); v != verts->end(); ++v )
{
(*v).set( (*v) * mat );
}
// add the new cloned, translated drawable back to the geode.
geode.addDrawable( newDrawable.get() );
}
}
}
}
}
geode.dirtyBound();
MeshConsolidator::run( geode );
// merge the geometry. Not sure this is necessary
osgUtil::Optimizer opt;
opt.optimize( &geode, osgUtil::Optimizer::MERGE_GEOMETRY | osgUtil::Optimizer::SHARE_DUPLICATE_STATE );
osg::NodeVisitor::apply( geode );
}
示例2: convertToTriangles
void
MeshConsolidator::run( osg::Geode& geode )
{
bool useVBOs = false;
// NOTE: we'd rather use the IndexMeshVisitor instead of our own code here,
// but the IMV does not preserve the user data attached to the primitive sets.
// We need that since it holds the feature index information.
//osgUtil::IndexMeshVisitor mesher;
//geode.accept(mesher);
// trivial bailout:
if ( geode.getNumDrawables() <= 1 )
return;
// list of geometries to consolidate and not to consolidate.
DrawableList consolidate, dontConsolidate;
// list of texture coordinate array image units in use
std::vector<unsigned> texCoordArrayUnits;
texCoordArrayUnits.reserve(32);
// sort the drawables:
for( unsigned i=0; i<geode.getNumDrawables(); ++i )
{
osg::Geometry* geom = geode.getDrawable(i)->asGeometry();
if ( geom )
{
if ( canOptimize(*geom) )
{
// convert all primitives to triangles.
convertToTriangles( *geom );
// NOTE!! tex/attrib array counts much already be equal.
if ( texCoordArrayUnits.size() == 0 )
{
for( unsigned u=0; u<32; ++u ) {
if ( geom->getTexCoordArray(u) != 0L )
texCoordArrayUnits.push_back( u );
}
if ( geom->getUseVertexBufferObjects() )
useVBOs = true;
}
consolidate.push_back(geom);
}
else
{
dontConsolidate.push_back(geom);
}
}
}
// start consolidating the geometries.
unsigned targetNumVertsPerGeom = 100000; //TODO: configurable?
DrawableList results;
unsigned numVerts = 0, numColors = 0, numNormals = 0;
DrawableList::iterator start = consolidate.begin();
for( DrawableList::iterator end = consolidate.begin(); end != consolidate.end(); )
{
osg::Geometry* geom = end->get()->asGeometry(); // already type-checked this earlier.
unsigned geomNumVerts = geom->getVertexArray()->getNumElements();
++end;
numVerts += geomNumVerts;
if ( geom->getColorArray() )
numColors += geom->getColorArray()->getNumElements();
if ( geom->getNormalArray() )
numNormals += geom->getNormalArray()->getNumElements();
if ( numVerts > targetNumVertsPerGeom || end == consolidate.end() )
{
OE_DEBUG << LC << "Merging " << ((unsigned)(end-start)) << " geoms with " << numVerts << " verts." << std::endl;
merge( start, end, numVerts, numColors, numNormals, texCoordArrayUnits, useVBOs, results );
start = end;
numVerts = 0, numColors = 0, numNormals = 0;
}
}
// re-build the geode:
geode.removeDrawables( 0, geode.getNumDrawables() );
for( DrawableList::iterator i = results.begin(); i != results.end(); ++i )
geode.addDrawable( i->get() );
for( DrawableList::iterator i = dontConsolidate.begin(); i != dontConsolidate.end(); ++i )
geode.addDrawable( i->get() );
}
示例3: apply
void apply( osg::Geode& geode )
{
// save the geode's drawables..
osg::Geode::DrawableList old_drawables = geode.getDrawableList();
//OE_DEBUG << "ClusterVisitor geode " << &geode << " featureNode=" << _featureNode << " drawables=" << old_drawables.size() << std::endl;
// ..and clear out the drawables list.
geode.removeDrawables( 0, geode.getNumDrawables() );
// foreach each drawable that was originally in the geode...
for( osg::Geode::DrawableList::iterator i = old_drawables.begin(); i != old_drawables.end(); i++ )
{
osg::Geometry* originalDrawable = dynamic_cast<osg::Geometry*>( i->get() );
if ( !originalDrawable )
continue;
// go through the list of input features...
for( FeatureList::const_iterator j = _features.begin(); j != _features.end(); j++ )
{
Feature* feature = j->get();
osg::Matrixd scaleMatrix;
if ( _symbol->scale().isSet() )
{
double scale = feature->eval( _scaleExpr, &_cx );
scaleMatrix.makeScale( scale, scale, scale );
}
osg::Matrixd rotationMatrix;
if ( _modelSymbol && _modelSymbol->heading().isSet() )
{
float heading = feature->eval( _headingExpr, &_cx );
rotationMatrix.makeRotate( osg::Quat(osg::DegreesToRadians(heading), osg::Vec3(0,0,1)) );
}
GeometryIterator gi( feature->getGeometry(), false );
while( gi.hasMore() )
{
Geometry* geom = gi.next();
// if necessary, transform the points to the target SRS:
if ( !_makeECEF && !_targetSRS->isEquivalentTo(_srs) )
{
_srs->transform( geom->asVector(), _targetSRS );
}
for( Geometry::const_iterator k = geom->begin(); k != geom->end(); ++k )
{
osg::Vec3d point = *k;
osg::Matrixd mat;
if ( _makeECEF )
{
osg::Matrixd rotation;
ECEF::transformAndGetRotationMatrix( point, _srs, point, _targetSRS, rotation );
mat = rotationMatrix * rotation * scaleMatrix * osg::Matrixd::translate(point) * _f2n->world2local();
}
else
{
mat = rotationMatrix * scaleMatrix * osg::Matrixd::translate(point) * _f2n->world2local();
}
// clone the source drawable once for each input feature.
osg::ref_ptr<osg::Geometry> newDrawable = osg::clone(
originalDrawable,
osg::CopyOp::DEEP_COPY_ARRAYS | osg::CopyOp::DEEP_COPY_PRIMITIVES );
osg::Vec3Array* verts = dynamic_cast<osg::Vec3Array*>( newDrawable->getVertexArray() );
if ( verts )
{
for( osg::Vec3Array::iterator v = verts->begin(); v != verts->end(); ++v )
{
(*v).set( (*v) * mat );
}
// add the new cloned, translated drawable back to the geode.
geode.addDrawable( newDrawable.get() );
if ( _cx.featureIndex() )
_cx.featureIndex()->tagPrimitiveSets( newDrawable.get(), feature );
}
}
}
}
}
geode.dirtyBound();
MeshConsolidator::run( geode );
osg::NodeVisitor::apply( geode );
}
示例4: if
//.........这里部分代码省略.........
osg::Vec3Array* normals = dynamic_cast<osg::Vec3Array*>( geom->getNormalArray() );
if ( normals )
{
if ( newNormalsBinding == osg::Geometry::BIND_PER_VERTEX )
{
std::copy( normals->begin(), normals->end(), std::back_inserter(*newNormals) );
}
else if ( i == 0 ) // overall
{
newNormals->push_back( (*normals)[0] );
}
}
}
if ( newTexCoordsArrays.size() > 0 )
{
for( unsigned a=0; a<texCoordArrayUnits.size(); ++a )
{
unsigned unit = texCoordArrayUnits[a];
osg::Vec2Array* texCoords = dynamic_cast<osg::Vec2Array*>( geom->getTexCoordArray(unit) );
if ( texCoords )
{
osg::Vec2Array* newTexCoords = newTexCoordsArrays[a];
std::copy( texCoords->begin(), texCoords->end(), std::back_inserter(*newTexCoords) );
}
}
}
osg::ref_ptr<osg::Referenced> sharedUserData;
for( unsigned j=0; j < geom->getNumPrimitiveSets(); ++j )
{
osg::PrimitiveSet* pset = geom->getPrimitiveSet(j);
osg::PrimitiveSet* newpset = 0L;
// all primsets have the same user data (or else we would not have made it this far
// since canOptimize would be false)
if ( !sharedUserData.valid() )
sharedUserData = pset->getUserData();
if ( dynamic_cast<osg::DrawElementsUByte*>(pset) )
newpset = remake( static_cast<osg::DrawElementsUByte*>(pset), numVerts, offset );
else if ( dynamic_cast<osg::DrawElementsUShort*>(pset) )
newpset = remake( static_cast<osg::DrawElementsUShort*>(pset), numVerts, offset );
else if ( dynamic_cast<osg::DrawElementsUInt*>(pset) )
newpset = remake( static_cast<osg::DrawElementsUInt*>(pset), numVerts, offset );
else if ( dynamic_cast<osg::DrawArrays*>(pset) )
newpset = convertDAtoDE( static_cast<osg::DrawArrays*>(pset), numVerts, offset );
if ( newpset )
{
newpset->setUserData( sharedUserData.get() );
newPrimSets.push_back( newpset );
}
}
offset += geomVerts->size();
}
}
}
// assemble the new geometry.
osg::Geometry* newGeom = new osg::Geometry();
newGeom->setUseVertexBufferObjects( useVBOs );
newGeom->setVertexArray( newVerts );
if ( useVBOs && newVerts->getVertexBufferObject() )
newVerts->getVertexBufferObject()->setUsage( usage );
if ( newColors )
{
newGeom->setColorArray( newColors );
newGeom->setColorBinding( newColorsBinding );
}
if ( newNormals )
{
newGeom->setNormalArray( newNormals );
newGeom->setNormalBinding( newNormalsBinding );
}
if ( newTexCoordsArrays.size() > 0 )
{
for( unsigned a=0; a<texCoordArrayUnits.size(); ++a )
{
unsigned unit = texCoordArrayUnits[a];
newGeom->setTexCoordArray( unit, newTexCoordsArrays[a] );
}
}
newGeom->setPrimitiveSetList( newPrimSets );
newGeom->setStateSet( unifiedStateSet );
// replace the geode's drawables
geode.removeDrawables( 0, geode.getNumDrawables() );
geode.addDrawable( newGeom );
for( std::vector<osg::ref_ptr<osg::Geometry> >::iterator i = nonOptimizedGeoms.begin(); i != nonOptimizedGeoms.end(); ++i )
geode.addDrawable( i->get() );
}