本文整理汇总了C++中FilterContext::getSession方法的典型用法代码示例。如果您正苦于以下问题:C++ FilterContext::getSession方法的具体用法?C++ FilterContext::getSession怎么用?C++ FilterContext::getSession使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类FilterContext
的用法示例。
在下文中一共展示了FilterContext::getSession方法的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: eq
FilterContext
ClampFilter::push( FeatureList& features, const FilterContext& cx )
{
const Session* session = cx.getSession();
if ( !session ) {
OE_WARN << LC << "No session - session is required for elevation clamping" << std::endl;
return cx;
}
// the map against which we'll be doing elevation clamping
MapFrame mapf = session->createMapFrame( Map::ELEVATION_LAYERS );
const SpatialReference* mapSRS = mapf.getProfile()->getSRS();
const SpatialReference* featureSRS = cx.profile()->getSRS();
bool isGeocentric = session->getMapInfo().isGeocentric();
// establish an elevation query interface based on the features' SRS.
ElevationQuery eq( mapf );
for( FeatureList::iterator i = features.begin(); i != features.end(); ++i )
{
Feature* feature = i->get();
GeometryIterator gi( feature->getGeometry() );
while( gi.hasMore() )
{
Geometry* geom = gi.next();
if ( isGeocentric )
{
// convert to map coords:
cx.toWorld( geom );
mapSRS->transformFromECEF( geom );
// populate the elevations:
eq.getElevations( geom, mapSRS );
// convert back to geocentric:
mapSRS->transformToECEF( geom );
cx.toLocal( geom );
}
else
{
// clamps the entire array to the highest available resolution.
eq.getElevations( geom, featureSRS );
}
}
}
return cx;
}
示例2:
void
FeaturesToNodeFilter::computeLocalizers( const FilterContext& context )
{
if ( context.isGeoreferenced() )
{
if ( context.getSession()->getMapInfo().isGeocentric() )
{
const SpatialReference* geogSRS = context.profile()->getSRS()->getGeographicSRS();
GeoExtent geodExtent = context.extent()->transform( geogSRS );
if ( geodExtent.width() < 180.0 )
{
osg::Vec3d centroid, centroidECEF;
geodExtent.getCentroid( centroid.x(), centroid.y() );
geogSRS->transform( centroid, geogSRS->getECEF(), centroidECEF );
geogSRS->getECEF()->createLocalToWorld( centroidECEF, _local2world );
_world2local.invert( _local2world );
}
}
else // projected
{
if ( context.extent().isSet() )
{
osg::Vec3d centroid;
context.extent()->getCentroid(centroid.x(), centroid.y());
context.extent()->getSRS()->transform(
centroid,
context.getSession()->getMapInfo().getProfile()->getSRS(),
centroid );
_world2local.makeTranslate( -centroid );
_local2world.invert( _world2local );
}
}
}
}
示例3:
void
FeaturesToNodeFilter::computeLocalizers( const FilterContext& context, const osgEarth::GeoExtent &extent, osg::Matrixd &out_w2l, osg::Matrixd &out_l2w )
{
if ( context.isGeoreferenced() )
{
if ( context.getSession()->getMapInfo().isGeocentric() )
{
const SpatialReference* geogSRS = context.profile()->getSRS()->getGeographicSRS();
GeoExtent geodExtent = extent.transform( geogSRS );
if ( geodExtent.width() < 180.0 )
{
osg::Vec3d centroid, centroidECEF;
geodExtent.getCentroid( centroid.x(), centroid.y() );
geogSRS->transform( centroid, geogSRS->getECEF(), centroidECEF );
geogSRS->getECEF()->createLocalToWorld( centroidECEF, out_l2w );
out_w2l.invert( out_l2w );
}
}
else // projected
{
if ( extent.isValid() )
{
osg::Vec3d centroid;
extent.getCentroid(centroid.x(), centroid.y());
extent.getSRS()->transform(
centroid,
context.getSession()->getMapInfo().getProfile()->getSRS(),
centroid );
out_w2l.makeTranslate( -centroid );
out_l2w.invert( out_w2l );
}
}
}
}
示例4: pushAndClamp
FilterContext
AltitudeFilter::push( FeatureList& features, FilterContext& cx )
{
bool clamp =
_altitude.valid() &&
_altitude->clamping() != AltitudeSymbol::CLAMP_NONE &&
cx.getSession() != 0L &&
cx.profile() != 0L;
if ( clamp )
pushAndClamp( features, cx );
else
pushAndDontClamp( features, cx );
return cx;
}
示例5: prop
v8::Handle<v8::Value>
JSFilterContext::PropertyCallback(v8::Local<v8::String> name, const v8::AccessorInfo& info)
{
FilterContext* context = V8Util::UnwrapObject<FilterContext>(info.Holder());
v8::String::Utf8Value utf8_value(name);
std::string prop(*utf8_value);
if (!context || prop.empty())
return v8::Handle<v8::Value>();
if (prop == "session")
return JSSession::WrapSession(const_cast<Session*>(context->getSession()));
if (prop == "profile")
return JSFeatureProfile::WrapFeatureProfile(const_cast<FeatureProfile*>(context->profile().get()));
if (prop == "extent" && context->extent().isSet())
return JSGeoExtent::WrapGeoExtent(const_cast<osgEarth::GeoExtent*>(&context->extent().get()));
//if (prop == "geocentric")
// return v8::Boolean::New(context->isGeocentric());
return v8::Handle<v8::Value>();
}
示例6: parts
bool
BuildGeometryFilter::process( FeatureList& features, const FilterContext& context )
{
bool makeECEF = false;
const SpatialReference* featureSRS = 0L;
const SpatialReference* mapSRS = 0L;
if ( context.isGeoreferenced() )
{
makeECEF = context.getSession()->getMapInfo().isGeocentric();
featureSRS = context.extent()->getSRS();
mapSRS = context.getSession()->getMapInfo().getProfile()->getSRS();
}
for( FeatureList::iterator f = features.begin(); f != features.end(); ++f )
{
Feature* input = f->get();
GeometryIterator parts( input->getGeometry(), false );
while( parts.hasMore() )
{
Geometry* part = parts.next();
// skip empty geometry
if ( part->size() == 0 )
continue;
const Style& myStyle = input->style().isSet() ? *input->style() : _style;
bool setLinePropsHere = input->style().isSet(); // otherwise it will be set globally, we assume
float width = 1.0f;
bool hasPolyOutline = false;
const PointSymbol* pointSymbol = myStyle.get<PointSymbol>();
const LineSymbol* lineSymbol = myStyle.get<LineSymbol>();
const PolygonSymbol* polySymbol = myStyle.get<PolygonSymbol>();
// resolve the geometry type from the component type and the symbology:
Geometry::Type renderType = Geometry::TYPE_UNKNOWN;
// First priority is a matching part type and symbol:
if ( polySymbol != 0L && part->getType() == Geometry::TYPE_POLYGON )
{
renderType = Geometry::TYPE_POLYGON;
}
else if ( lineSymbol != 0L && part->isLinear() )
{
renderType = part->getType();
}
else if ( pointSymbol != 0L && part->getType() == Geometry::TYPE_POINTSET )
{
renderType = Geometry::TYPE_POINTSET;
}
// Second priority is the symbol:
else if ( polySymbol != 0L )
{
renderType = Geometry::TYPE_POLYGON;
}
else if ( lineSymbol != 0L )
{
if ( part->getType() == Geometry::TYPE_POLYGON )
renderType = Geometry::TYPE_RING;
else
renderType = Geometry::TYPE_LINESTRING;
}
else if ( pointSymbol != 0L )
{
renderType = Geometry::TYPE_POINTSET;
}
// No symbol? just use the geometry type.
else
{
renderType = part->getType();
}
// validate the geometry:
if ( renderType == Geometry::TYPE_POLYGON && part->size() < 3 )
continue;
else if ( (renderType == Geometry::TYPE_LINESTRING || renderType == Geometry::TYPE_RING) && part->size() < 2 )
continue;
// resolve the color:
osg::Vec4f primaryColor =
polySymbol ? osg::Vec4f(polySymbol->fill()->color()) :
lineSymbol ? osg::Vec4f(lineSymbol->stroke()->color()) :
pointSymbol ? osg::Vec4f(pointSymbol->fill()->color()) :
osg::Vec4f(1,1,1,1);
osg::Geometry* osgGeom = new osg::Geometry();
osgGeom->setUseVertexBufferObjects( _useVertexBufferObjects.value() );
if ( _featureNameExpr.isSet() )
{
const std::string& name = input->eval( _featureNameExpr.mutable_value(), &context );
osgGeom->setName( name );
}
// build the geometry:
//.........这里部分代码省略.........
示例7: eq
void
AltitudeFilter::pushAndClamp( FeatureList& features, FilterContext& cx )
{
const Session* session = cx.getSession();
// the map against which we'll be doing elevation clamping
//MapFrame mapf = session->createMapFrame( Map::ELEVATION_LAYERS );
MapFrame mapf = session->createMapFrame(
(Map::ModelParts)(Map::TERRAIN_LAYERS | Map::MODEL_LAYERS) );
const SpatialReference* mapSRS = mapf.getProfile()->getSRS();
osg::ref_ptr<const SpatialReference> featureSRS = cx.profile()->getSRS();
// establish an elevation query interface based on the features' SRS.
ElevationQuery eq( mapf );
// want a result even if it's low res
eq.setFallBackOnNoData( true );
NumericExpression scaleExpr;
if ( _altitude->verticalScale().isSet() )
scaleExpr = *_altitude->verticalScale();
NumericExpression offsetExpr;
if ( _altitude->verticalOffset().isSet() )
offsetExpr = *_altitude->verticalOffset();
// whether to record the min/max height-above-terrain values.
bool collectHATs =
_altitude->clamping() == AltitudeSymbol::CLAMP_RELATIVE_TO_TERRAIN ||
_altitude->clamping() == AltitudeSymbol::CLAMP_ABSOLUTE;
// whether to clamp every vertex (or just the centroid)
bool perVertex =
_altitude->binding() == AltitudeSymbol::BINDING_VERTEX;
// whether the SRS's have a compatible vertical datum.
bool vertEquiv =
featureSRS->isVertEquivalentTo( mapSRS );
for( FeatureList::iterator i = features.begin(); i != features.end(); ++i )
{
Feature* feature = i->get();
// run a symbol script if present.
if ( _altitude.valid() && _altitude->script().isSet() )
{
StringExpression temp( _altitude->script().get() );
feature->eval( temp, &cx );
}
double maxTerrainZ = -DBL_MAX;
double minTerrainZ = DBL_MAX;
double minHAT = DBL_MAX;
double maxHAT = -DBL_MAX;
double scaleZ = 1.0;
if ( _altitude.valid() && _altitude->verticalScale().isSet() )
scaleZ = feature->eval( scaleExpr, &cx );
double offsetZ = 0.0;
if ( _altitude.valid() && _altitude->verticalOffset().isSet() )
offsetZ = feature->eval( offsetExpr, &cx );
GeometryIterator gi( feature->getGeometry() );
while( gi.hasMore() )
{
Geometry* geom = gi.next();
// Absolute heights in Z. Only need to collect the HATs; the geometry
// remains unchanged.
if ( _altitude->clamping() == AltitudeSymbol::CLAMP_ABSOLUTE )
{
if ( perVertex )
{
std::vector<double> elevations;
elevations.reserve( geom->size() );
if ( eq.getElevations( geom->asVector(), featureSRS, elevations, _maxRes ) )
{
for( unsigned i=0; i<geom->size(); ++i )
{
osg::Vec3d& p = (*geom)[i];
p.z() *= scaleZ;
p.z() += offsetZ;
double z = p.z();
if ( !vertEquiv )
{
osg::Vec3d tempgeo;
if ( !featureSRS->transform(p, mapSRS->getGeographicSRS(), tempgeo) )
z = tempgeo.z();
}
double hat = z - elevations[i];
//.........这里部分代码省略.........
示例8: zfinder
bool
ExtrudeGeometryFilter::extrudeGeometry(const Geometry* input,
double height,
double heightOffset,
bool flatten,
osg::Geometry* walls,
osg::Geometry* roof,
osg::Geometry* base,
osg::Geometry* outline,
const osg::Vec4& wallColor,
const osg::Vec4& wallBaseColor,
const osg::Vec4& roofColor,
const osg::Vec4& outlineColor,
const SkinResource* wallSkin,
const SkinResource* roofSkin,
FilterContext& cx )
{
bool makeECEF = false;
const SpatialReference* srs = 0L;
const SpatialReference* mapSRS = 0L;
if ( cx.isGeoreferenced() )
{
srs = cx.extent()->getSRS();
makeECEF = cx.getSession()->getMapInfo().isGeocentric();
mapSRS = cx.getSession()->getMapInfo().getProfile()->getSRS();
}
bool made_geom = false;
double tex_width_m = wallSkin ? *wallSkin->imageWidth() : 1.0;
double tex_height_m = wallSkin ? *wallSkin->imageHeight() : 1.0;
bool tex_repeats_y = wallSkin ? *wallSkin->isTiled() : false;
bool useColor = (!wallSkin || wallSkin->texEnvMode() != osg::TexEnv::DECAL) && !_makeStencilVolume;
bool isPolygon = input->getComponentType() == Geometry::TYPE_POLYGON;
unsigned pointCount = input->getTotalPointCount();
// If we are extruding a polygon, and applying a wall texture, we need an extra
// point in the geometry in order to close the polygon and generate a unique
// texture coordinate for that final point.
bool isSkinnedPolygon = isPolygon && wallSkin != 0L;
// Total number of verts. Add 2 to close a polygon (necessary so the first and last
// points can have unique texture coordinates)
unsigned numWallVerts = 2 * pointCount + (isSkinnedPolygon? (2 * input->getNumGeometries()) : 0);
// create all the OSG geometry components
osg::Vec3Array* verts = new osg::Vec3Array( numWallVerts );
walls->setVertexArray( verts );
osg::Vec2Array* wallTexcoords = 0L;
if ( wallSkin )
{
wallTexcoords = new osg::Vec2Array( numWallVerts );
walls->setTexCoordArray( 0, wallTexcoords );
}
osg::Vec4Array* colors = 0L;
if ( useColor )
{
// per-vertex colors are necessary if we are going to use the MeshConsolidator -gw
colors = new osg::Vec4Array();
colors->reserve( numWallVerts );
colors->assign( numWallVerts, wallColor );
walls->setColorArray( colors );
walls->setColorBinding( osg::Geometry::BIND_PER_VERTEX );
}
// set up rooftop tessellation and texturing, if necessary:
osg::Vec3Array* roofVerts = 0L;
osg::Vec2Array* roofTexcoords = 0L;
float roofRotation = 0.0f;
Bounds roofBounds;
float sinR = 0.0f, cosR = 0.0f;
double roofTexSpanX = 0.0, roofTexSpanY = 0.0;
osg::ref_ptr<const SpatialReference> roofProjSRS;
if ( roof )
{
roofVerts = new osg::Vec3Array( pointCount );
roof->setVertexArray( roofVerts );
// per-vertex colors are necessary if we are going to use the MeshConsolidator -gw
if ( useColor )
{
osg::Vec4Array* roofColors = new osg::Vec4Array();
roofColors->reserve( pointCount );
roofColors->assign( pointCount, roofColor );
roof->setColorArray( roofColors );
roof->setColorBinding( osg::Geometry::BIND_PER_VERTEX );
}
if ( roofSkin )
{
roofTexcoords = new osg::Vec2Array( pointCount );
roof->setTexCoordArray( 0, roofTexcoords );
// Get the orientation of the geometry. This is a hueristic that will help
//.........这里部分代码省略.........
示例9: markerURI
bool
SubstituteModelFilter::process(const FeatureList& features,
const MarkerSymbol* symbol,
Session* session,
osg::Group* attachPoint,
FilterContext& context )
{
bool makeECEF = context.getSession()->getMapInfo().isGeocentric();
// first, go through the features and build the model cache. Apply the model matrix' scale
// factor to any AutoTransforms directly (cloning them as necessary)
std::map< std::pair<URI, float>, osg::ref_ptr<osg::Node> > uniqueModels;
//std::map< Feature*, osg::ref_ptr<osg::Node> > featureModels;
StringExpression uriEx = *symbol->url();
NumericExpression scaleEx = *symbol->scale();
for( FeatureList::const_iterator f = features.begin(); f != features.end(); ++f )
{
Feature* input = f->get();
// evaluate the marker URI expression:
StringExpression uriEx = *symbol->url();
URI markerURI( input->eval(uriEx, &context), uriEx.uriContext() );
// find the corresponding marker in the cache
MarkerResource* marker = 0L;
MarkerCache::Record rec = _markerCache.get( markerURI );
if ( rec.valid() ) {
marker = rec.value();
}
else {
marker = new MarkerResource();
marker->uri() = markerURI;
_markerCache.insert( markerURI, marker );
}
// evalute the scale expression (if there is one)
float scale = 1.0f;
osg::Matrixd scaleMatrix;
if ( symbol->scale().isSet() )
{
scale = input->eval( scaleEx, &context );
if ( scale == 0.0 )
scale = 1.0;
scaleMatrix = osg::Matrix::scale( scale, scale, scale );
}
// how that we have a marker source, create a node for it
std::pair<URI,float> key( markerURI, scale );
osg::ref_ptr<osg::Node>& model = uniqueModels[key];
if ( !model.valid() )
{
model = context.resourceCache()->getMarkerNode( marker );
if ( scale != 1.0f && dynamic_cast<osg::AutoTransform*>( model.get() ) )
{
// clone the old AutoTransform, set the new scale, and copy over its children.
osg::AutoTransform* oldAT = dynamic_cast<osg::AutoTransform*>(model.get());
osg::AutoTransform* newAT = osg::clone( oldAT );
// make a scaler and put it between the new AutoTransform and its kids
osg::MatrixTransform* scaler = new osg::MatrixTransform(osg::Matrix::scale(scale,scale,scale));
for( unsigned i=0; i<newAT->getNumChildren(); ++i )
scaler->addChild( newAT->getChild(0) );
newAT->removeChildren(0, newAT->getNumChildren());
newAT->addChild( scaler );
model = newAT;
}
}
if ( model.valid() )
{
GeometryIterator gi( input->getGeometry(), false );
while( gi.hasMore() )
{
Geometry* geom = gi.next();
for( unsigned i=0; i<geom->size(); ++i )
{
osg::Matrixd mat;
osg::Vec3d point = (*geom)[i];
if ( makeECEF )
{
// the "rotation" element lets us re-orient the instance to ensure it's pointing up. We
// could take a shortcut and just use the current extent's local2world matrix for this,
// but if the tile is big enough the up vectors won't be quite right.
osg::Matrixd rotation;
ECEF::transformAndGetRotationMatrix( point, context.profile()->getSRS(), point, rotation );
mat = rotation * scaleMatrix * osg::Matrixd::translate( point ) * _world2local;
}
else
{
mat = scaleMatrix * osg::Matrixd::translate( point ) * _world2local;
}
osg::MatrixTransform* xform = new osg::MatrixTransform();
xform->setMatrix( mat );
//.........这里部分代码省略.........
示例10: uriEx
//clustering:
// troll the external model for geodes. for each geode, create a geode in the target
// model. then, for each geometry in that geode, replicate it once for each instance of
// the model in the feature batch and transform the actual verts to a local offset
// relative to the tile centroid. Finally, reassemble all the geodes and optimize.
// hopefully stateset sharing etc will work out. we may need to strip out LODs too.
bool
SubstituteModelFilter::cluster(const FeatureList& features,
const MarkerSymbol* symbol,
Session* session,
osg::Group* attachPoint,
FilterContext& context )
{
MarkerToFeatures markerToFeatures;
// first, sort the features into buckets, each bucket corresponding to a
// unique marker.
for (FeatureList::const_iterator i = features.begin(); i != features.end(); ++i)
{
Feature* f = i->get();
// resolve the URI for the marker:
StringExpression uriEx( *symbol->url() );
URI markerURI( f->eval( uriEx, &context ), uriEx.uriContext() );
// find and load the corresponding marker model. We're using the session-level
// object store to cache models. This is thread-safe sine we are always going
// to CLONE the model before using it.
osg::ref_ptr<osg::Node> model = context.getSession()->getObject<osg::Node>( markerURI.full() );
if ( !model.valid() )
{
osg::ref_ptr<MarkerResource> mres = new MarkerResource();
mres->uri() = markerURI;
model = mres->createNode( context.getSession()->getDBOptions() );
if ( model.valid() )
{
// store it, but only if there isn't already one in there.
context.getSession()->putObject( markerURI.full(), model.get(), false );
}
}
if ( model.valid() )
{
MarkerToFeatures::iterator itr = markerToFeatures.find( model.get() );
if (itr == markerToFeatures.end())
markerToFeatures[ model.get() ].push_back( f );
else
itr->second.push_back( f );
}
}
//For each model, cluster the features that use that marker
for (MarkerToFeatures::iterator i = markerToFeatures.begin(); i != markerToFeatures.end(); ++i)
{
osg::Node* prototype = i->first;
// we're using the Session cache since we know we'll be cloning.
if ( prototype )
{
osg::Node* clone = osg::clone( prototype, osg::CopyOp::DEEP_COPY_ALL );
// ..and apply the clustering to the copy.
ClusterVisitor cv( i->second, symbol, this, context );
clone->accept( cv );
attachPoint->addChild( clone );
}
}
return true;
}
示例11: instanceURI
bool
SubstituteModelFilter::process(const FeatureList& features,
const InstanceSymbol* symbol,
Session* session,
osg::Group* attachPoint,
FilterContext& context )
{
// Establish SRS information:
bool makeECEF = context.getSession()->getMapInfo().isGeocentric();
const SpatialReference* targetSRS = context.getSession()->getMapInfo().getSRS();
// first, go through the features and build the model cache. Apply the model matrix' scale
// factor to any AutoTransforms directly (cloning them as necessary)
std::map< std::pair<URI, float>, osg::ref_ptr<osg::Node> > uniqueModels;
// keep track of failed URIs so we don't waste time or warning messages on them
std::set< URI > missing;
StringExpression uriEx = *symbol->url();
NumericExpression scaleEx = *symbol->scale();
const ModelSymbol* modelSymbol = dynamic_cast<const ModelSymbol*>(symbol);
const IconSymbol* iconSymbol = dynamic_cast<const IconSymbol*> (symbol);
NumericExpression headingEx;
if ( modelSymbol )
headingEx = *modelSymbol->heading();
for( FeatureList::const_iterator f = features.begin(); f != features.end(); ++f )
{
Feature* input = f->get();
// evaluate the instance URI expression:
StringExpression uriEx = *symbol->url();
URI instanceURI( input->eval(uriEx, &context), uriEx.uriContext() );
// find the corresponding marker in the cache
osg::ref_ptr<InstanceResource> instance;
if ( !findResource(instanceURI, symbol, context, missing, instance) )
continue;
// evalute the scale expression (if there is one)
float scale = 1.0f;
osg::Matrixd scaleMatrix;
if ( symbol->scale().isSet() )
{
scale = input->eval( scaleEx, &context );
if ( scale == 0.0 )
scale = 1.0;
if ( scale != 1.0 )
_normalScalingRequired = true;
scaleMatrix = osg::Matrix::scale( scale, scale, scale );
}
osg::Matrixd rotationMatrix;
if ( modelSymbol && modelSymbol->heading().isSet() )
{
float heading = input->eval(headingEx, &context);
rotationMatrix.makeRotate( osg::Quat(osg::DegreesToRadians(heading), osg::Vec3(0,0,1)) );
}
// how that we have a marker source, create a node for it
std::pair<URI,float> key( instanceURI, scale );
// cache nodes per instance.
osg::ref_ptr<osg::Node>& model = uniqueModels[key];
if ( !model.valid() )
{
context.resourceCache()->getInstanceNode( instance.get(), model );
// if icon decluttering is off, install an AutoTransform.
if ( iconSymbol )
{
if ( iconSymbol->declutter() == true )
{
Decluttering::setEnabled( model->getOrCreateStateSet(), true );
}
else if ( dynamic_cast<osg::AutoTransform*>(model.get()) == 0L )
{
osg::AutoTransform* at = new osg::AutoTransform();
at->setAutoRotateMode( osg::AutoTransform::ROTATE_TO_SCREEN );
at->setAutoScaleToScreen( true );
at->addChild( model );
model = at;
}
}
}
if ( model.valid() )
{
GeometryIterator gi( input->getGeometry(), false );
while( gi.hasMore() )
{
Geometry* geom = gi.next();
// if necessary, transform the points to the target SRS:
if ( !makeECEF && !targetSRS->isEquivalentTo(context.profile()->getSRS()) )
{
//.........这里部分代码省略.........
示例12: xform
osg::Node*
GeomCompiler::compile(FeatureCursor* cursor,
const Style& style,
const FilterContext& context)
{
if ( !context.profile() ) {
OE_WARN << LC << "Valid feature profile required" << std::endl;
return 0L;
}
if ( style.empty() ) {
OE_WARN << LC << "Non-empty style required" << std::endl;
return 0L;
}
osg::ref_ptr<osg::Group> resultGroup = new osg::Group();
// start by making a working copy of the feature set
FeatureList workingSet;
cursor->fill( workingSet );
// create a filter context that will track feature data through the process
FilterContext cx = context;
if ( !cx.extent().isSet() )
cx.extent() = cx.profile()->getExtent();
// only localize coordinates if the map if geocentric AND the extent is
// less than 180 degrees.
const MapInfo& mi = cx.getSession()->getMapInfo();
GeoExtent workingExtent = cx.extent()->transform( cx.profile()->getSRS()->getGeographicSRS() );
bool localize = mi.isGeocentric() && workingExtent.width() < 180.0;
// go through the Style and figure out which filters to use.
const MarkerSymbol* marker = style.get<MarkerSymbol>();
const PointSymbol* point = style.get<PointSymbol>();
const LineSymbol* line = style.get<LineSymbol>();
const PolygonSymbol* polygon = style.get<PolygonSymbol>();
const ExtrusionSymbol* extrusion = style.get<ExtrusionSymbol>();
const AltitudeSymbol* altitude = style.get<AltitudeSymbol>();
const TextSymbol* text = style.get<TextSymbol>();
// transform the features into the map profile
TransformFilter xform( mi.getProfile()->getSRS(), mi.isGeocentric() );
xform.setLocalizeCoordinates( localize );
if ( altitude && altitude->verticalOffset().isSet() )
xform.setMatrix( osg::Matrixd::translate(0, 0, *altitude->verticalOffset()) );
cx = xform.push( workingSet, cx );
bool clampRequired =
altitude && altitude->clamping() != AltitudeSymbol::CLAMP_NONE;
// model substitution
if ( marker )
{
if ( marker->placement() == MarkerSymbol::PLACEMENT_RANDOM ||
marker->placement() == MarkerSymbol::PLACEMENT_INTERVAL )
{
ScatterFilter scatter;
scatter.setDensity( *marker->density() );
scatter.setRandom( marker->placement() == MarkerSymbol::PLACEMENT_RANDOM );
scatter.setRandomSeed( *marker->randomSeed() );
cx = scatter.push( workingSet, cx );
}
if ( clampRequired )
{
ClampFilter clamp;
clamp.setIgnoreZ( altitude->clamping() == AltitudeSymbol::CLAMP_TO_TERRAIN );
cx = clamp.push( workingSet, cx );
clampRequired = false;
}
SubstituteModelFilter sub( style );
sub.setClustering( *_options.clustering() );
if ( marker->scale().isSet() )
sub.setModelMatrix( osg::Matrixd::scale( *marker->scale() ) );
cx = sub.push( workingSet, cx );
osg::Node* node = sub.getNode();
if ( node )
resultGroup->addChild( node );
}
// 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 )
//.........这里部分代码省略.........
示例13: if
//.........这里部分代码省略.........
if ( node )
{
resultGroup->addChild( node );
}
}
// simple geometry
else if ( point || line || polygon )
{
if ( altRequired )
{
AltitudeFilter clamp;
clamp.setPropertiesFromStyle( style );
sharedCX = clamp.push( workingSet, sharedCX );
altRequired = false;
}
BuildGeometryFilter filter( style );
if ( _options.maxGranularity().isSet() )
filter.maxGranularity() = *_options.maxGranularity();
if ( _options.geoInterp().isSet() )
filter.geoInterp() = *_options.geoInterp();
if ( _options.featureName().isSet() )
filter.featureName() = *_options.featureName();
osg::Node* node = filter.push( workingSet, sharedCX );
if ( node )
{
resultGroup->addChild( node );
}
}
if ( text || icon )
{
if ( altRequired )
{
AltitudeFilter clamp;
clamp.setPropertiesFromStyle( style );
sharedCX = clamp.push( workingSet, sharedCX );
altRequired = false;
}
BuildTextFilter filter( style );
osg::Node* node = filter.push( workingSet, sharedCX );
if ( node )
{
resultGroup->addChild( node );
}
}
if (Registry::capabilities().supportsGLSL())
{
if ( _options.shaderPolicy() == SHADERPOLICY_GENERATE )
{
// no ss cache because we will optimize later.
Registry::shaderGenerator().run(
resultGroup.get(),
"osgEarth.GeomCompiler" );
}
else if ( _options.shaderPolicy() == SHADERPOLICY_DISABLE )
{
resultGroup->getOrCreateStateSet()->setAttributeAndModes(
new osg::Program(),
osg::StateAttribute::OFF | osg::StateAttribute::OVERRIDE );
}
}
// Optimize stateset sharing.
if ( _options.optimizeStateSharing() == true )
{
// Common state set cache?
osg::ref_ptr<StateSetCache> sscache;
if ( sharedCX.getSession() )
{
// with a shared cache, don't combine statesets. They may be
// in the live graph
sscache = sharedCX.getSession()->getStateSetCache();
sscache->consolidateStateAttributes( resultGroup.get() );
}
else
{
// isolated: perform full optimization
sscache = new StateSetCache();
sscache->optimize( resultGroup.get() );
}
}
//test: dump the tile to disk
//osgDB::writeNodeFile( *(resultGroup.get()), "out.osg" );
#ifdef PROFILING
osg::Timer_t p_end = osg::Timer::instance()->tick();
OE_INFO << LC
<< "features = " << p_features
<< ", time = " << osg::Timer::instance()->delta_s(p_start, p_end) << " s." << std::endl;
#endif
return resultGroup.release();
}
示例14: gi
bool
SubstituteModelFilter::process(const FeatureList& features,
const MarkerSymbol* symbol,
Session* session,
osg::Group* attachPoint,
FilterContext& context )
{
bool makeECEF = context.getSession()->getMapInfo().isGeocentric();
for( FeatureList::const_iterator f = features.begin(); f != features.end(); ++f )
{
Feature* input = f->get();
GeometryIterator gi( input->getGeometry(), false );
while( gi.hasMore() )
{
Geometry* geom = gi.next();
for( unsigned i=0; i<geom->size(); ++i )
{
osg::Matrixd mat;
osg::Vec3d point = (*geom)[i];
if ( makeECEF )
{
// the "rotation" element lets us re-orient the instance to ensure it's pointing up. We
// could take a shortcut and just use the current extent's local2world matrix for this,
// but it the tile is big enough the up vectors won't be quite right.
osg::Matrixd rotation;
ECEF::transformAndGetRotationMatrix( context.profile()->getSRS(), point, point, rotation );
mat = rotation * _modelMatrix * osg::Matrixd::translate( point ) * _world2local;
}
else
{
mat = _modelMatrix * osg::Matrixd::translate( point ) * _world2local;
}
osg::MatrixTransform* xform = new osg::MatrixTransform();
xform->setMatrix( mat );
xform->setDataVariance( osg::Object::STATIC );
MarkerFactory factory( session);
osg::ref_ptr< osg::Node > model = factory.getOrCreateNode( input, symbol );
if (model.get())
{
xform->addChild( model.get() );
}
attachPoint->addChild( xform );
// name the feature if necessary
if ( !_featureNameExpr.empty() )
{
const std::string& name = input->eval( _featureNameExpr );
if ( !name.empty() )
xform->setName( name );
}
}
}
}
return true;
}
示例15: zfinder
bool
ExtrudeGeometryFilter::buildStructure(const Geometry* input,
double height,
double heightOffset,
bool flatten,
const SkinResource* wallSkin,
const SkinResource* roofSkin,
Structure& structure,
FilterContext& cx )
{
bool makeECEF = false;
const SpatialReference* srs = 0L;
const SpatialReference* mapSRS = 0L;
if ( cx.isGeoreferenced() )
{
srs = cx.extent()->getSRS();
makeECEF = cx.getSession()->getMapInfo().isGeocentric();
mapSRS = cx.getSession()->getMapInfo().getProfile()->getSRS();
}
// whether this is a closed polygon structure.
structure.isPolygon = (input->getComponentType() == Geometry::TYPE_POLYGON);
// extrusion working variables
double targetLen = -DBL_MAX;
osg::Vec3d minLoc(DBL_MAX, DBL_MAX, DBL_MAX);
double minLoc_len = DBL_MAX;
osg::Vec3d maxLoc(0,0,0);
double maxLoc_len = 0;
// Initial pass over the geometry does two things:
// 1: Calculate the minimum Z across all parts.
// 2: Establish a "target length" for extrusion
double absHeight = fabs(height);
ConstGeometryIterator zfinder( input );
while( zfinder.hasMore() )
{
const Geometry* geom = zfinder.next();
for( Geometry::const_iterator m = geom->begin(); m != geom->end(); ++m )
{
osg::Vec3d m_point = *m;
if ( m_point.z() + absHeight > targetLen )
targetLen = m_point.z() + absHeight;
if (m_point.z() < minLoc.z())
minLoc = m_point;
if (m_point.z() > maxLoc.z())
maxLoc = m_point;
}
}
// apply the height offsets
height -= heightOffset;
targetLen -= heightOffset;
float roofRotation = 0.0f;
Bounds roofBounds;
float sinR = 0.0f, cosR = 0.0f;
double roofTexSpanX = 0.0, roofTexSpanY = 0.0;
osg::ref_ptr<const SpatialReference> roofProjSRS;
if ( roofSkin )
{
roofBounds = input->getBounds();
// if our data is lat/long, we need to reproject the geometry and the bounds into a projected
// coordinate system in order to properly generate tex coords.
if ( srs && srs->isGeographic() )
{
osg::Vec2d geogCenter = roofBounds.center2d();
roofProjSRS = srs->createUTMFromLonLat( Angle(geogCenter.x()), Angle(geogCenter.y()) );
if ( roofProjSRS.valid() )
{
roofBounds.transform( srs, roofProjSRS.get() );
osg::ref_ptr<Geometry> projectedInput = input->clone();
srs->transform( projectedInput->asVector(), roofProjSRS.get() );
roofRotation = getApparentRotation( projectedInput.get() );
}
}
else
{
roofRotation = getApparentRotation( input );
}
sinR = sin(roofRotation);
cosR = cos(roofRotation);
if ( !roofSkin->isTiled().value() )
{
//note: non-tiled roofs don't really work atm.
roofTexSpanX = cosR*roofBounds.width() - sinR*roofBounds.height();
roofTexSpanY = sinR*roofBounds.width() + cosR*roofBounds.height();
}
else
{
roofTexSpanX = roofSkin->imageWidth().isSet() ? *roofSkin->imageWidth() : roofSkin->imageHeight().isSet() ? *roofSkin->imageHeight() : 10.0;
//.........这里部分代码省略.........