本文整理汇总了C++中FilterContext::isGeoreferenced方法的典型用法代码示例。如果您正苦于以下问题:C++ FilterContext::isGeoreferenced方法的具体用法?C++ FilterContext::isGeoreferenced怎么用?C++ FilterContext::isGeoreferenced使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类FilterContext
的用法示例。
在下文中一共展示了FilterContext::isGeoreferenced方法的2个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: 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 );
roofBounds = input->getBounds();
//.........这里部分代码省略.........
示例2: zfinder
bool
ExtrudeGeometryFilter::buildStructure(const Geometry* input,
double height,
bool flatten,
float verticalOffset,
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();
mapSRS = cx.getSession()->getMapSRS();
makeECEF = cx.getSession()->getMapSRS()->isGeographic(); //->getMapInfo().isGeocentric();
}
// whether this is a closed polygon structure.
structure.isPolygon = (input->getComponentType() == Geometry::TYPE_POLYGON);
// store the vert offset for later encoding
structure.verticalOffset = verticalOffset;
// 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;
}
}
osg::Vec2d c = input->getBounds().center2d();
osg::Vec3d centroid(c.x(), c.y(), minLoc.z());
transformAndLocalize(centroid, srs, structure.baseCentroid, mapSRS, _world2local, makeECEF );
// 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();
// This sometimes fails with the aerodrom stuff. No idea why -gw.
//roofProjSRS = srs->createUTMFromLonLat( Angle(geogCenter.x()), Angle(geogCenter.y()) );
roofProjSRS = SpatialReference::create("spherical-mercator");
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);
//.........这里部分代码省略.........