本文整理汇总了C++中osg::Geode::dirtyBound方法的典型用法代码示例。如果您正苦于以下问题:C++ Geode::dirtyBound方法的具体用法?C++ Geode::dirtyBound怎么用?C++ Geode::dirtyBound使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类osg::Geode
的用法示例。
在下文中一共展示了Geode::dirtyBound方法的2个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的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: 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 );
}