public void UpdatePos(int idx, Vector3 pos)
    {
        pointInfo current  = _pointList[idx];
        pointInfo previous = _pointList[idx].previous;
        pointInfo next     = _pointList[idx].next;

        current.worldPos = pos;
        if (previous != null)
        {
            previous.Update(previous.worldPos, pos);
        }
        if (next != null)
        {
            current.Update(pos, next.worldPos);
        }
    }
    public int AddPoint(Vector3 worldPos)
    {
        // extend
        int tail = (_head + _activeCnt) % _pointList.Count;

        if (_activeCnt == _pointList.Count)
        {
            _pointList.Insert(tail, CreatePointInfo(worldPos));
        }
        pointInfo pi = _pointList[tail];

        pi.worldPos = worldPos;
        if (_endPoint != null)
        {
            _endPoint.next = pi;
            pi.previous    = _endPoint;
            _endPoint.Active(Time.timeSinceLevelLoad);
            _endPoint.Update(_endPoint.worldPos, worldPos);
        }
        _endPoint = pi;
        ++_activeCnt;

        return(tail);
    }