本文整理汇总了C++中IntersectAction::getActNode方法的典型用法代码示例。如果您正苦于以下问题:C++ IntersectAction::getActNode方法的具体用法?C++ IntersectAction::getActNode怎么用?C++ IntersectAction::getActNode使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类IntersectAction
的用法示例。
在下文中一共展示了IntersectAction::getActNode方法的6个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: intersect
//! intersection test
Action::ResultE DVRVolume::intersect(Action * action)
{
FDEBUG(("DVRVolume::intersect\n"));
IntersectAction *ia = dynamic_cast<IntersectAction*>(action);
#ifndef OSG_2_PREP
const DynamicVolume &vol = ia->getActNode()->getVolume();
#else
const BoxVolume &vol = ia->getActNode()->getVolume();
#endif
if(vol.isValid() && !vol.intersect(ia->getLine()))
{
return Action::Skip; //bv missed -> can not hit children
}
//!! FIXME: simulate hit when bounding volume is hit
Real32 t, v;
Vec3f norm;
if(vol.intersect(ia->getLine(), t, v))
ia->setHit(t, ia->getActNode(), 0, norm);
return Action::Continue;
}
示例2: intersectEnter
Action::ResultE DynamicTerrain::intersectEnter(Action* action )
{
IntersectAction *ia = dynamic_cast< IntersectAction* >( action );
#ifndef OSG_2_PREP
const DynamicVolume &vol = ia->getActNode()->editVolume(true);
#else
const BoxVolume &vol = ia->getActNode()->editVolume(true);
#endif
Real32 enter = 0, exit = 0;
if(vol.isValid() && !vol.intersect(ia->getLine(), enter, exit))
{
return Action::Skip; //bv missed -> can not hit children
}
Real32 t = enter;
Vec3f normal(0,0,0);
Int32 index = -1;
//if( geoClipmaps_.findFirstIntersection( ia->getLine(), t, normal ) )
{
ia->setHit( t, ia->getActNode(), index, normal );
}
return Action::Continue;
}
示例3: intersect
/*! The IntersectAction callback for Geometry. It computes if the ray used in
the IntersectAction \a action hits this object and if that is the case,
which triangle is hit.
\param[in] action IntersectAction performing the intersect test.
\return Action result code, \see OSG::Action.
\note This method is registered with the IntersectAction and automatically
called from there, you probably never have to call it manually.
*/
Action::ResultE Geometry::intersect(Action * action)
{
IntersectAction *ia = dynamic_cast<IntersectAction*>(action);
ia->getActNode()->updateVolume();
const BoxVolume &bv = ia->getActNode()->getVolume();
if(bv.isValid() && !bv.intersect(ia->getLine()))
{
return Action::Skip; //bv missed -> can not hit children
}
TriangleIterator it = this->beginTriangles();
TriangleIterator end = this->endTriangles ();
Real32 t;
Vec3f norm;
Line ia_line(ia->getLine());
for(; it != end; ++it)
{
if(ia_line.intersect(it.getPosition(0),
it.getPosition(1),
it.getPosition(2), t, &norm))
{
ia->setHit(t, ia->getActNode(), it.getIndex(), norm, -1);
}
}
// If we need to test lines, iterate over lines and test for
// lines that are within width distance from the line
if(ia->getTestLines())
{
Real32 range_sq = ia->getTestLineWidth();
range_sq = range_sq * range_sq;
LineIterator it = this->beginLines();
LineIterator end = this->endLines ();
Pnt3f pt1, pt2;
OSG::Vec3f norm;
// Find closest points and if they are within the range, then add a hit
for(; it != end; ++it)
{
Line cur_line(it.getPosition(0), it.getPosition(1));
ia_line.getClosestPoints(cur_line, pt1, pt2);
Real32 dist_sq( pt1.dist2(pt2) );
if (dist_sq <= range_sq)
{
t = ia_line.getPosition().dist(pt1);
ia->setHit(t, ia->getActNode(), -1, norm, it.getIndex());
}
}
}
return Action::Continue;
}
示例4: intersect
Action::ResultE DistanceLOD::intersect(Action *action)
{
IntersectAction *ia = dynamic_cast<IntersectAction *>(action);
#ifndef OSG_2_PREP
const DynamicVolume &vol = ia->getActNode()->getVolume();
#else
const BoxVolume &vol = ia->getActNode()->getVolume();
#endif
UInt32 numLevels = action->getNNodes();
// early out: no children or lod set missed, cannot hit anything
if (numLevels == 0 ||
vol.isValid() && !vol.intersect(ia->getLine()))
{
return Action::Skip;
}
const MFReal32 &range = (*getMFRange());
UInt32 numRanges = range.size();
UInt32 index = 0;
if (numRanges > 0)
{
if (numRanges >= numLevels)
numRanges = numLevels - 1;
if (numRanges == 0)
{
index = 0;
}
else if (_lastDist >= range[numRanges - 1])
{
index = numRanges;
}
else
{
for (index = 0; index < numRanges; ++index)
{
if (_lastDist < range[index])
break;
}
}
}
const NodePtr nodePtr = action->getNode(index);
ia->addNode(nodePtr);
return Action::Continue;
}
示例5: intersect
Action::ResultE Group::intersect(Action *action)
{
IntersectAction *ia = dynamic_cast<IntersectAction *>(action);
#ifndef OSG_2_PREP
const DynamicVolume &vol = ia->getActNode()->getVolume();
#else
const BoxVolume &vol = ia->getActNode()->getVolume();
#endif
if(vol.isValid() && ! vol.intersect(ia->getLine()))
{
return Action::Skip; //bv missed -> can not hit children
}
return Action::Continue;
}
示例6: intersectEnter
Action::ResultE IconLabel::intersectEnter(Action *action)
{
IntersectAction *ia = dynamic_cast<IntersectAction *>(action);
const BoxVolume &bv = ia->getActNode()->getVolume();
if(bv.isValid() && ! bv.intersect(ia->getLine()))
{
return Action::Skip; //bv missed -> can not hit children
}
return Action::Continue;
}