本文整理汇总了C++中FilterContext::inverseReferenceFrame方法的典型用法代码示例。如果您正苦于以下问题:C++ FilterContext::inverseReferenceFrame方法的具体用法?C++ FilterContext::inverseReferenceFrame怎么用?C++ FilterContext::inverseReferenceFrame使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类FilterContext
的用法示例。
在下文中一共展示了FilterContext::inverseReferenceFrame方法的4个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: textColor
bool
BuildGeometryFilter::pushTextAnnotation( TextAnnotation* anno, const FilterContext& context )
{
// find the centroid
osg::Vec3d centroid = anno->getGeometry()->getBounds().center();
osgText::Text* t = new osgText::Text();
t->setText( anno->text() );
t->setFont( "fonts/arial.ttf" );
t->setAutoRotateToScreen( true );
t->setCharacterSizeMode( osgText::TextBase::SCREEN_COORDS );
t->setCharacterSize( 32.0f );
//t->setCharacterSizeMode( osgText::TextBase::OBJECT_COORDS_WITH_MAXIMUM_SCREEN_SIZE_CAPPED_BY_FONT_HEIGHT );
//t->setCharacterSize( 300000.0f );
t->setPosition( centroid );
t->setAlignment( osgText::TextBase::CENTER_CENTER );
t->getOrCreateStateSet()->setAttributeAndModes( new osg::Depth(osg::Depth::ALWAYS), osg::StateAttribute::ON );
t->getOrCreateStateSet()->setRenderBinDetails( 99999, "RenderBin" );
// apply styling as appropriate:
osg::Vec4f textColor(1,1,1,1);
osg::Vec4f haloColor(0,0,0,1);
const TextSymbol* textSymbolizer = getStyle().getSymbol<TextSymbol>();
if ( textSymbolizer )
{
textColor = textSymbolizer->fill()->color();
if ( textSymbolizer->halo().isSet() )
{
haloColor = textSymbolizer->halo()->color();
}
}
t->setColor( textColor );
t->setBackdropColor( haloColor );
t->setBackdropType( osgText::Text::OUTLINE );
if ( context.isGeocentric() )
{
// install a cluster culler: note that the CCC control point and normal must be
// in world coordinates
const osg::EllipsoidModel* ellip = context.profile()->getSRS()->getEllipsoid();
osg::Vec3d cp = centroid * context.inverseReferenceFrame();
osg::Vec3d normal = ellip->computeLocalUpVector( cp.x(), cp.y(), cp.z() );
osg::ClusterCullingCallback* ccc = new osg::ClusterCullingCallback( cp, normal, 0.0f );
t->setCullCallback( ccc );
}
_geode->addDrawable( t );
return true;
}
示例2: xform
//.........这里部分代码省略.........
}
// extruded geometry
if ( extrusion && ( line || polygon ) )
{
if ( clampRequired )
{
ClampFilter clamp;
clamp.setIgnoreZ( altitude->clamping() == AltitudeSymbol::CLAMP_TO_TERRAIN );
if ( extrusion->heightReference() == ExtrusionSymbol::HEIGHT_REFERENCE_MSL )
clamp.setMaxZAttributeName( "__max_z");
cx = clamp.push( workingSet, cx );
clampRequired = false;
}
ExtrudeGeometryFilter extrude;
if ( extrusion )
{
if ( extrusion->height().isSet() )
extrude.setExtrusionHeight( *extrusion->height() );
if ( extrusion->heightExpression().isSet() )
extrude.setExtrusionExpr( *extrusion->heightExpression() );
//extrude.setHeightReferenceFrame( *extrusion->heightReference() );
if ( extrusion->heightReference() == ExtrusionSymbol::HEIGHT_REFERENCE_MSL )
extrude.setHeightOffsetExpression( NumericExpression("[__max_z]") );
extrude.setFlatten( *extrusion->flatten() );
}
if ( polygon )
{
extrude.setColor( polygon->fill()->color() );
}
osg::Node* node = extrude.push( workingSet, cx );
if ( node )
resultGroup->addChild( node );
}
// simple geometry
else if ( point || line || polygon )
{
if ( clampRequired )
{
ClampFilter clamp;
clamp.setIgnoreZ( altitude->clamping() == AltitudeSymbol::CLAMP_TO_TERRAIN );
cx = clamp.push( workingSet, cx );
clampRequired = false;
}
BuildGeometryFilter filter( style );
if ( _options.maxGranularity().isSet() )
filter.maxGranularity() = *_options.maxGranularity();
if ( _options.mergeGeometry().isSet() )
filter.mergeGeometry() = *_options.mergeGeometry();
if ( _options.featureName().isSet() )
filter.featureName() = *_options.featureName();
cx = filter.push( workingSet, cx );
osg::Node* node = filter.getNode();
if ( node )
resultGroup->addChild( node );
}
if ( text )
{
if ( clampRequired )
{
ClampFilter clamp;
clamp.setIgnoreZ( altitude->clamping() == AltitudeSymbol::CLAMP_TO_TERRAIN );
cx = clamp.push( workingSet, cx );
clampRequired = false;
}
BuildTextFilter filter( style );
cx = filter.push( workingSet, cx );
osg::Node* node = filter.takeNode();
if ( node )
resultGroup->addChild( node );
}
//else // insufficient symbology
//{
// OE_WARN << LC << "Insufficient symbology; no geometry created" << std::endl;
//}
// install the localization transform if necessary.
if ( cx.hasReferenceFrame() )
{
osg::MatrixTransform* delocalizer = new osg::MatrixTransform( cx.inverseReferenceFrame() );
delocalizer->addChild( resultGroup.get() );
resultGroup = delocalizer;
}
resultGroup->getOrCreateStateSet()->setMode( GL_BLEND, 1 );
//osgDB::writeNodeFile( *(resultGroup.get()), "out.osg" );
return resultGroup.release();
}
示例3: Point
FilterContext
BuildGeometryFilter::push( FeatureList& input, const FilterContext& context )
{
reset();
OE_DEBUG << LC
<< context.toString() << std::endl;
bool ok = true;
for( FeatureList::iterator i = input.begin(); i != input.end(); i++ )
if ( !push( i->get(), context ) )
ok = false;
// In a feature class with one point-per-feature, you end up with one geometry per point,
// which results is (a) very bad performance and (b) geometries with a zero bbox that therefore
// don't draw. This is not a total solution (won't work for a single point, isn't friendly for
// doing feature-selection, etc.) but is a workable temporary fix. In the future we're going
// to replace this filter anyway with something more highly optimized (a la osgGIS).
//
// however...seems that MERGE_GEOMETRY destroys almost everything except for points!!
if ( _mergeGeometry == true )
{
osgUtil::Optimizer optimizer;
optimizer.optimize( _geode.get(), osgUtil::Optimizer::MERGE_GEOMETRY );
}
if ( ok )
{
if ( !_style.empty() && _geode.valid() )
{
// could optimize this to only happen is lines or points were created ..
const LineSymbol* lineSymbol = _style.getSymbol<LineSymbol>();
float size = 1.0;
if (lineSymbol)
size = lineSymbol->stroke()->width().value();
_geode->getOrCreateStateSet()->setAttribute( new osg::Point(size), osg::StateAttribute::ON );
_geode->getOrCreateStateSet()->setAttribute( new osg::LineWidth(size), osg::StateAttribute::ON );
const PointSymbol* pointSymbol = _style.getSymbol<PointSymbol>();
if ( pointSymbol && pointSymbol->size().isSet() )
_geode->getOrCreateStateSet()->setAttribute(
new osg::Point( *pointSymbol->size() ), osg::StateAttribute::ON );
}
_result = _geode.release();
if ( context.hasReferenceFrame() )
{
osg::MatrixTransform* delocalizer = new osg::MatrixTransform( context.inverseReferenceFrame() );
delocalizer->addChild( _result.get() );
_result = delocalizer;
}
}
else
{
_result = 0L;
}
FilterContext outCx( context );
outCx.setReferenceFrame( osg::Matrixd::identity() ); // clear the ref frame.
return outCx;
}
示例4: parts
//.........这里部分代码省略.........
osg::Geometry* osgGeom = new osg::Geometry();
if ( _featureNameExpr.isSet() )
{
const std::string& name = input->eval( _featureNameExpr.mutable_value() );
osgGeom->setName( name );
}
osgGeom->setUseVertexBufferObjects( true );
osgGeom->setUseDisplayList( false );
if ( setWidth && width != 1.0f )
{
osgGeom->getOrCreateStateSet()->setAttributeAndModes(
new osg::LineWidth( width ), osg::StateAttribute::ON );
}
if (part->getType() == Geometry::TYPE_POLYGON && static_cast<Polygon*>(part)->getHoles().size() > 0 )
{
Polygon* poly = static_cast<Polygon*>(part);
int totalPoints = poly->getTotalPointCount();
osg::Vec3Array* allPoints = new osg::Vec3Array( totalPoints );
std::copy( part->begin(), part->end(), allPoints->begin() );
osgGeom->addPrimitiveSet( new osg::DrawArrays( primMode, 0, part->size() ) );
int offset = part->size();
for( RingCollection::const_iterator h = poly->getHoles().begin(); h != poly->getHoles().end(); ++h )
{
Geometry* hole = h->get();
if ( hole->isValid() )
{
std::copy( hole->begin(), hole->end(), allPoints->begin() + offset );
osgGeom->addPrimitiveSet( new osg::DrawArrays( primMode, offset, hole->size() ) );
offset += hole->size();
}
}
osgGeom->setVertexArray( allPoints );
}
else
{
osgGeom->setVertexArray( part->toVec3Array() );
osgGeom->addPrimitiveSet( new osg::DrawArrays( primMode, 0, part->size() ) );
}
// tessellate all polygon geometries. Tessellating each geometry separately
// with TESS_TYPE_GEOMETRY is much faster than doing the whole bunch together
// using TESS_TYPE_DRAWABLE.
if ( part->getType() == Geometry::TYPE_POLYGON && tessellatePolys )
{
osgUtil::Tessellator tess;
//tess.setTessellationType( osgUtil::Tessellator::TESS_TYPE_DRAWABLE );
//tess.setWindingType( osgUtil::Tessellator::TESS_WINDING_ODD );
tess.setTessellationType( osgUtil::Tessellator::TESS_TYPE_GEOMETRY );
tess.setWindingType( osgUtil::Tessellator::TESS_WINDING_POSITIVE );
tess.retessellatePolygons( *osgGeom );
// the tessellator results in a collection of trifans, strips, etc. This step will
// consolidate those into one (or more if necessary) GL_TRIANGLES primitive.
MeshConsolidator::run( *osgGeom );
// mark this geometry as DYNAMIC because otherwise the OSG optimizer will destroy it.
//osgGeom->setDataVariance( osg::Object::DYNAMIC );
}
if ( context.isGeocentric() && part->getType() != Geometry::TYPE_POINTSET )
{
double threshold = osg::DegreesToRadians( *_maxAngle_deg );
MeshSubdivider ms( context.referenceFrame(), context.inverseReferenceFrame() );
//ms.setMaxElementsPerEBO( INT_MAX );
ms.run( threshold, *osgGeom );
}
// set the color array. We have to do this last, otherwise it screws up any modifications
// make by the MeshSubdivider. No idea why. gw
//osg::Vec4Array* colors = new osg::Vec4Array( osgGeom->getVertexArray()->getNumElements() );
//for( unsigned c = 0; c < colors->size(); ++c )
// (*colors)[c] = color;
//osgGeom->setColorArray( colors );
//osgGeom->setColorBinding( osg::Geometry::BIND_PER_VERTEX );
// NOTE! per-vertex colors makes the optimizer destroy the geometry....
osg::Vec4Array* colors = new osg::Vec4Array(1);
(*colors)[0] = color;
osgGeom->setColorArray( colors );
osgGeom->setColorBinding( osg::Geometry::BIND_OVERALL );
// add the part to the geode.
_geode->addDrawable( osgGeom );
}
return true;
}