Beispiel #1
0
    //
    bool _UpdateDistance(float distance)
    {
        if (_nextNode == null)
        {
            return(false);
        }
        ViVector3 nextPos   = _nextNode._pos;
        float     distRight = Distance(_currentPos, nextPos);

        if (distRight > distance)
        {
            _currentPos += _dir * distance;
        }
        else
        {
            float newDistance = distance - distRight;
            _currentPos = nextPos;
            _prePos     = nextPos;
            if (ViRouteNode.HasEvent(_nextNode._eventId))
            {
                _endCallbackList.Invoke(_nextNode._eventId);
            }
            S_Nodes.Delete(_nodes.GetHead());
            _nextNode = _LerpToNextNode();
            if (_nextNode != null)
            {
                _UpdateDistance(newDistance);
            }
            else
            {
                _ClearState();
            }
        }
        return(true);
    }
Beispiel #2
0
 ViRouteNode _LerpToNextNode()
 {
     if (_nodes.IsNotEmpty())
     {
         ViRouteNode pNode = _nodes.GetHead().Data;
         _dir   = pNode._pos - _prePos;
         _dir.z = 0.0f;
         _dir.Normalize();
         return(pNode);
     }
     else
     {
         return(null);
     }
 }
Beispiel #3
0
    public float Length()
    {
        float     len    = 0.0f;
        ViVector3 prePos = _currentPos;
        ViDoubleLinkNode2 <ViRouteNode> iter = _nodes.GetHead();

        while (!_nodes.IsEnd(iter))
        {
            ViRouteNode value = iter.Data;
            ViDoubleLink2 <ViRouteNode> .Next(ref iter);

            //
            len   += Distance(value._pos, prePos);
            prePos = value._pos;
        }
        return(len);
    }