public override void Build() { int idx, count; BezierSplinePoint pp, sp, ep, np; // if (m_points.Count < 2) { m_segments = null; m_length = 0; return; } if (m_wrapmode == SplineWrapMode.Loop) { count = m_points.Count; } else { count = m_points.Count - 1; } // m_segments = new BezierSplineSegment[count]; m_length = 0; idx = 0; if (m_wrapmode == SplineWrapMode.Loop) { while (idx < count) { pp = m_points[SplineUtil.WrapIndex(idx - 1, m_points.Count)]; sp = m_points[SplineUtil.WrapIndex(idx, m_points.Count)]; ep = m_points[SplineUtil.WrapIndex(idx + 1, m_points.Count)]; np = m_points[SplineUtil.WrapIndex(idx + 2, m_points.Count)]; m_segments[idx] = new BezierSplineSegment(); BuildSegment(m_segments[idx], pp, sp, ep, np); ++idx; } } else { while (idx < count) { pp = m_points[SplineUtil.ClampIndex(idx - 1, m_points.Count)]; sp = m_points[SplineUtil.ClampIndex(idx, m_points.Count)]; ep = m_points[SplineUtil.ClampIndex(idx + 1, m_points.Count)]; np = m_points[SplineUtil.ClampIndex(idx + 2, m_points.Count)]; m_segments[idx] = new BezierSplineSegment(); BuildSegment(m_segments[idx], pp, sp, ep, np); ++idx; } } ++m_buildnum; if (OnSplineRebuild != null) { OnSplineRebuild(); } }
public void SetOffset(float offset) { offset = SplineUtil.WrapPosition(m_spline.WrapMode, offset, m_spline.Length); m_segidx = m_spline.FindSegment(offset); m_segpos = offset - m_spline.GetSegmentStartLength(m_segidx); }