当前位置: 首页>>代码示例>>C++>>正文


C++ IntersectAction::getActNode方法代码示例

本文整理汇总了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;
}
开发者ID:mlimper,项目名称:OpenSG1x,代码行数:27,代码来源:OSGDVRVolume.cpp

示例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;
	}
开发者ID:chengzg,项目名称:OSGAddOnsGV,代码行数:26,代码来源:OSGDynamicTerrain.cpp

示例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;
}
开发者ID:,项目名称:,代码行数:66,代码来源:

示例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;
}
开发者ID:mlimper,项目名称:OpenSG1x,代码行数:52,代码来源:OSGDistanceLOD.cpp

示例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;
}
开发者ID:mlimper,项目名称:OpenSG1x,代码行数:16,代码来源:OSGGroup.cpp

示例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;
}
开发者ID:vossg,项目名称:OSGAddOnsGV,代码行数:12,代码来源:OSGIconLabel.cpp


注:本文中的IntersectAction::getActNode方法示例由纯净天空整理自Github/MSDocs等开源代码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。