本文整理汇总了C++中osg::Polytope类的典型用法代码示例。如果您正苦于以下问题:C++ Polytope类的具体用法?C++ Polytope怎么用?C++ Polytope使用的例子?那么, 这里精选的类代码示例或许可以为您提供帮助。
在下文中一共展示了Polytope类的10个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: setPolytope
void setPolytope(osg::Polytope& polytope, osg::Plane& referencePlane)
{
_referencePlane = referencePlane;
const PlaneMask currentMask = polytope.getCurrentMask();
PlaneMask selector_mask = 0x1;
const PlaneList& planeList = polytope.getPlaneList();
unsigned int numActivePlanes = 0;
PlaneList::const_iterator itr;
for(itr=planeList.begin(); itr!=planeList.end(); ++itr)
{
if (currentMask&selector_mask) ++numActivePlanes;
selector_mask <<= 1;
}
_plane_mask = 0x0;
_planes.clear();
_planes.reserve(numActivePlanes);
_lines.clear();
selector_mask=0x1;
for(itr=planeList.begin(); itr!=planeList.end(); ++itr)
{
if (currentMask&selector_mask)
{
_planes.push_back(*itr);
_plane_mask <<= 1;
_plane_mask |= 0x1;
}
selector_mask <<= 1;
}
}
示例2: getPolytope
void ComputeBoundsVisitor::getPolytope(osg::Polytope& polytope, float margin) const
{
float delta = _bb.radius()*margin;
polytope.add( osg::Plane(0.0, 0.0, 1.0, -(_bb.zMin()-delta)) );
polytope.add( osg::Plane(0.0, 0.0, -1.0, (_bb.zMax()+delta)) );
polytope.add( osg::Plane(1.0, 0.0, 0.0, -(_bb.xMin()-delta)) );
polytope.add( osg::Plane(-1.0, 0.0, 0.0, (_bb.xMax()+delta)) );
polytope.add( osg::Plane(0.0, 1.0, 0.0, -(_bb.yMin()-delta)) );
polytope.add( osg::Plane(0.0, -1.0, 0.0, (_bb.yMax()+delta)) );
}
示例3: intersects
bool ossimPlanetBoundingBox::intersects(const osg::Polytope& frustum)const
{
const osg::Polytope::PlaneList& planeList = frustum.getPlaneList();
unsigned int idx = 0;
unsigned int ptIdx = 0;
unsigned int outsideCount = 0;
unsigned int upperBound = planeList.size();
double testValue = 0.0;
for(; idx < upperBound;++idx)
{
const osg::Vec4& plane = planeList[idx].asVec4();
outsideCount = 0;
for(ptIdx = 0; ptIdx < 8; ++ptIdx)
{
testValue = (((((double)plane[0])*theCorners[ptIdx][0] +
((double)plane[1])*theCorners[ptIdx][1] +
((double)plane[2])*theCorners[ptIdx][2])) + (double)plane[3]);
if(testValue >-FLT_EPSILON)
{
break;
}
else
{
++outsideCount;
}
}
if(outsideCount == 8)
{
return false;
}
}
return true;
}
示例4:
bool
Feature::getWorldBoundingPolytope(const SpatialReference* srs,
osg::Polytope& out_polytope) const
{
osg::BoundingSphered bs;
if ( getWorldBound(srs, bs) && bs.valid() )
{
out_polytope.clear();
// add planes for the four sides of the BS. Normals point inwards.
out_polytope.add( osg::Plane(osg::Vec3d( 1, 0,0), osg::Vec3d(-bs.radius(),0,0)) );
out_polytope.add( osg::Plane(osg::Vec3d(-1, 0,0), osg::Vec3d( bs.radius(),0,0)) );
out_polytope.add( osg::Plane(osg::Vec3d( 0, 1,0), osg::Vec3d(0, -bs.radius(),0)) );
out_polytope.add( osg::Plane(osg::Vec3d( 0,-1,0), osg::Vec3d(0, bs.radius(),0)) );
// for a projected feature, we're done. For a geocentric one, transform the polytope
// into world (ECEF) space.
if ( srs->isGeographic() && !srs->isPlateCarre() )
{
const osg::EllipsoidModel* e = srs->getEllipsoid();
// add a bottom cap, unless the bounds are sufficiently large.
double minRad = std::min(e->getRadiusPolar(), e->getRadiusEquator());
double maxRad = std::max(e->getRadiusPolar(), e->getRadiusEquator());
double zeroOffset = bs.center().length();
if ( zeroOffset > minRad * 0.1 )
{
out_polytope.add( osg::Plane(osg::Vec3d(0,0,1), osg::Vec3d(0,0,-maxRad+zeroOffset)) );
}
}
// transform the clipping planes ito ECEF space
GeoPoint refPoint;
refPoint.fromWorld( srs, bs.center() );
osg::Matrix local2world;
refPoint.createLocalToWorld( local2world );
out_polytope.transform( local2world );
return true;
}
return false;
}
示例5:
bool
GeoCell::intersects( const osg::Polytope& tope ) const
{
const osg::Polytope::PlaneList& planes = tope.getPlaneList();
for( osg::Polytope::PlaneList::const_iterator i = planes.begin(); i != planes.end(); ++i )
{
if ( i->intersect( _boundaryPoints ) < 0 )
return false;
}
return true;
}
示例6: build
bool PrecipitationEffect::build(const osg::Vec3 eyeLocal, int i, int j, int k, float startTime, PrecipitationDrawableSet& pds, osg::Polytope& frustum, osgUtil::CullVisitor* cv) const
{
osg::Vec3 position = _origin + osg::Vec3(float(i)*_du.x(), float(j)*_dv.y(), float(k+1)*_dw.z());
osg::Vec3 scale(_du.x(), _dv.y(), -_dw.z());
osg::BoundingBox bb(position.x(), position.y(), position.z()+scale.z(),
position.x()+scale.x(), position.y()+scale.y(), position.z());
if (!frustum.contains(bb)) return false;
osg::Vec3 center = position + scale*0.5f;
float distance = (center-eyeLocal).length();
osg::Matrix* mymodelview = 0;
if (distance < _nearTransition)
{
PrecipitationDrawable::DepthMatrixStartTime& mstp = pds._quadPrecipitationDrawable->getCurrentCellMatrixMap()[PrecipitationDrawable::Cell(i,k,j)];
mstp.depth = distance;
mstp.startTime = startTime;
mymodelview = &mstp.modelview;
}
else if (distance <= _farTransition)
{
if (_useFarLineSegments)
{
PrecipitationDrawable::DepthMatrixStartTime& mstp = pds._linePrecipitationDrawable->getCurrentCellMatrixMap()[PrecipitationDrawable::Cell(i,k,j)];
mstp.depth = distance;
mstp.startTime = startTime;
mymodelview = &mstp.modelview;
}
else
{
PrecipitationDrawable::DepthMatrixStartTime& mstp = pds._pointPrecipitationDrawable->getCurrentCellMatrixMap()[PrecipitationDrawable::Cell(i,k,j)];
mstp.depth = distance;
mstp.startTime = startTime;
mymodelview = &mstp.modelview;
}
}
else
{
return false;
}
*mymodelview = *(cv->getModelViewMatrix());
mymodelview->preMultTranslate(position);
mymodelview->preMultScale(scale);
cv->updateCalculatedNearFar(*(cv->getModelViewMatrix()),bb);
return true;
}
示例7: defined
bool DebugShadowMap::ViewData::DebugPolytope
( const osg::Polytope & p, const char * name )
{
bool result = false;
#if defined( _DEBUG ) || defined( DEBUG )
if( !name ) name = "";
osg::Polytope & p_prev = _polytopeMap[ std::string( name ) ];
result = ( p.getPlaneList() != p_prev.getPlaneList() );
if( result ) {
std::cout << "Polytope<" << name
<< "> size(" << p.getPlaneList().size() << ")"
<< std::endl;
if( p.getPlaneList().size() == p_prev.getPlaneList().size() ) {
for( unsigned i = 0; i < p.getPlaneList().size(); ++i )
{
if( p.getPlaneList()[i] != p_prev.getPlaneList()[i] )
{
std::cout << "Plane<" << i
<< "> ("
<< p.getPlaneList()[i].asVec4()[0] << ", "
<< p.getPlaneList()[i].asVec4()[1] << ", "
<< p.getPlaneList()[i].asVec4()[2] << ", "
<< p.getPlaneList()[i].asVec4()[3] << ")"
<< std::endl;
}
}
}
}
p_prev = p;
#endif
return result;
}
示例8: if
//.........这里部分代码省略.........
// and update its time signatures.
drawable->reset();
rg->addLeaf(new osgUtil::RenderLeaf(drawable,&projection,NULL,FLT_MAX));
// need to update the drawable's frame count.
if (cv->getFrameStamp())
{
drawable->updateSimulationTime(cv->getFrameStamp()->getSimulationTime());
}
}
#ifdef USE_TIMER
t4 = timer.tick();
#endif
#ifdef USE_TIMER
t7 = timer.tick();
#endif
if (cv->getComputeNearFarMode() != osgUtil::CullVisitor::DO_NOT_COMPUTE_NEAR_FAR)
cv->updateCalculatedNearFar(matrix,_bbox);
const float minimumIntensity = 1.0f/256.0f;
const osg::Vec3 eyePoint = cv->getEyeLocal();
double time=drawable->getSimulationTime();
double timeInterval=drawable->getSimulationTimeInterval();
const osg::Polytope clipvol(cv->getCurrentCullingSet().getFrustum());
const bool computeClipping = false;//(clipvol.getCurrentMask()!=0);
//LightPointDrawable::ColorPosition cp;
for(LightPointList::iterator itr=_lightPointList.begin();
itr!=_lightPointList.end();
++itr)
{
const LightPoint& lp = *itr;
if (!lp._on) continue;
const osg::Vec3& position = lp._position;
// skip light point if it is not contianed in the view frustum.
if (computeClipping && !clipvol.contains(position)) continue;
// delta vector between eyepoint and light point.
osg::Vec3 dv(eyePoint-position);
float intensity = (_lightSystem.valid()) ? _lightSystem->getIntensity() : lp._intensity;
// slip light point if its intensity is 0.0 or negative.
if (intensity<=minimumIntensity) continue;
// (SIB) Clip on distance, if close to limit, add transparancy
float distanceFactor = 1.0f;
if (_maxVisibleDistance2!=FLT_MAX)
{
if (dv.length2()>_maxVisibleDistance2) continue;
else if (_maxVisibleDistance2 > 0)
distanceFactor = 1.0f - osg::square(dv.length2() / _maxVisibleDistance2);
}
示例9: getBase
void ComputeBoundsVisitor::getBase(osg::Polytope& polytope, float margin) const
{
float delta = _bb.radius()*margin;
polytope.add( osg::Plane(0.0, 0.0, 1.0, -(_bb.zMin()-delta)) );
}
示例10: build
bool SiltEffect::build(const osg::Vec3 eyeLocal, int i, int j, int k, float startTime, SiltDrawableSet& pds, osg::Polytope& frustum, osgUtil::CullVisitor* cv) const
{
osg::Vec3 position = _origin + osg::Vec3(float(i)*_du.x(), float(j)*_dv.y(), float(k+1)*_dw.z());
osg::Vec3 scale(_du.x(), _dv.y(), -_dw.z());
osg::BoundingBox bb(position.x(), position.y(), position.z()+scale.z(),
position.x()+scale.x(), position.y()+scale.y(), position.z());
if ( !frustum.contains(bb) )
return false;
osg::Vec3 center = position + scale*0.5f;
float distance = (center-eyeLocal).length();
osg::Matrix* mymodelview = 0;
if (distance < _nearTransition)
{
SiltDrawable::DepthMatrixStartTime& mstp
= pds._quadSiltDrawable->getCurrentCellMatrixMap()[SiltDrawable::Cell(i,k,j)];
mstp.depth = distance;
mstp.startTime = startTime;
mymodelview = &mstp.modelview;
}
else if (distance <= _farTransition)
{
SiltDrawable::DepthMatrixStartTime& mstp
= pds._pointSiltDrawable->getCurrentCellMatrixMap()[SiltDrawable::Cell(i,k,j)];
mstp.depth = distance;
mstp.startTime = startTime;
mymodelview = &mstp.modelview;
}
else
{
return false;
}
*mymodelview = *(cv->getModelViewMatrix());
#if OPENSCENEGRAPH_MAJOR_VERSION > 2 || \
(OPENSCENEGRAPH_MAJOR_VERSION == 2 && OPENSCENEGRAPH_MINOR_VERSION > 7) || \
(OPENSCENEGRAPH_MAJOR_VERSION == 2 && OPENSCENEGRAPH_MINOR_VERSION == 7 && OPENSCENEGRAPH_PATCH_VERSION >= 3)
// preMultTranslate and preMultScale introduced in rev 8868, which was
// before OSG 2.7.3.
mymodelview->preMultTranslate(position);
mymodelview->preMultScale(scale);
#else
// Otherwise use unoptimized versions
mymodelview->preMult(osg::Matrix::translate(position));
mymodelview->preMult(osg::Matrix::scale(scale));
#endif
cv->updateCalculatedNearFar(*(cv->getModelViewMatrix()),bb);
return true;
}