private void BuildSegment(BezierSplineSegment ss, BezierSplinePoint pp, BezierSplinePoint sp, BezierSplinePoint ep, BezierSplinePoint np) { PreparePoint(pp, sp, ep); PreparePoint(sp, ep, np); ss.m_startpos = sp.m_point; ss.m_endpos = ep.m_point; ss.m_startctrl = ss.m_startpos + sp.m_nextctrl; ss.m_endctrl = ss.m_endpos + ep.m_prevctrl; if (sp.m_type == SplinePointType.Corner && ep.m_type == SplinePointType.Corner) { ss.m_type = SplineSegmentType.Linear; } else { ss.m_type = SplineSegmentType.Curve; } ss.m_startlen = m_length; float seglen = GetLength(ss); m_length += seglen; ss.m_length = seglen; ss.m_endlen = m_length; switch (m_reparam) { case SplineReparamType.None: ss.m_params = null; ss.m_precomps = null; break; case SplineReparamType.Simple: { m_precompdiv = 1 / (float)m_stepcount; float param = 0, length = 0; Vector3 prev, next; ss.m_params = new float[m_stepcount + 1]; ss.m_precomps = new float[m_stepcount + 1]; for (int i = 1; i < m_stepcount + 1; ++i) { prev = GetPosition(ss, param); param += m_precompdiv; next = GetPosition(ss, param); length += (next - prev).magnitude; ss.m_precomps[i] = length / seglen; ss.m_params[i] = param; } ss.m_params[0] = 0; ss.m_params[m_stepcount] = 1; ss.m_precomps[0] = 0; ss.m_precomps[m_stepcount] = 1; m_precompdiv = 1 / (float)m_stepcount; } break; } }
private void PreparePoint(BezierSplinePoint pp, BezierSplinePoint pt, BezierSplinePoint np) { switch (pt.m_type) { case SplinePointType.Bezier: pt.m_nextctrl = -pt.m_prevctrl; break; case SplinePointType.Smooth: pt.m_prevctrl = -0.25f * (np.m_point - pp.m_point); pt.m_nextctrl = -0.25f * (pp.m_point - np.m_point); break; case SplinePointType.Corner: pt.m_prevctrl = Vector3.zero; pt.m_nextctrl = Vector3.zero; break; case SplinePointType.BezierCorner: break; } }
public BezierSplinePointSerializable(BezierSplinePoint other) { this.position = other.position; this.rotation = other.rotation; this.controlPoint = other.controlPoint; }
public BezierSpline(BezierSplinePoint a, BezierSplinePoint b) { this.a = a; this.b = b; }
private void PreparePoint(BezierSplinePoint pp, BezierSplinePoint pt, BezierSplinePoint np) { switch(pt.m_type) { case SplinePointType.Bezier: pt.m_nextctrl = -pt.m_prevctrl; break; case SplinePointType.Smooth: pt.m_prevctrl = -0.25f * (np.m_point - pp.m_point); pt.m_nextctrl = -0.25f * (pp.m_point - np.m_point); break; case SplinePointType.Corner: pt.m_prevctrl = Vector3.zero; pt.m_nextctrl = Vector3.zero; break; case SplinePointType.BezierCorner: break; } }
private void BuildSegment(BezierSplineSegment ss, BezierSplinePoint pp, BezierSplinePoint sp, BezierSplinePoint ep, BezierSplinePoint np) { PreparePoint(pp, sp, ep); PreparePoint(sp, ep, np); ss.m_startpos = sp.m_point; ss.m_endpos = ep.m_point; ss.m_startctrl = ss.m_startpos + sp.m_nextctrl; ss.m_endctrl = ss.m_endpos + ep.m_prevctrl; if(sp.m_type == SplinePointType.Corner && ep.m_type == SplinePointType.Corner) { ss.m_type = SplineSegmentType.Linear; } else { ss.m_type = SplineSegmentType.Curve; } ss.m_startlen = m_length; float seglen = GetLength(ss); m_length += seglen; ss.m_length = seglen; ss.m_endlen = m_length; switch(m_reparam) { case SplineReparamType.None: ss.m_params = null; ss.m_precomps = null; break; case SplineReparamType.Simple: { m_precompdiv = 1 / (float)m_stepcount; float param = 0, length = 0; Vector3 prev, next; ss.m_params = new float[m_stepcount + 1]; ss.m_precomps = new float[m_stepcount + 1]; for(int i = 1; i < m_stepcount + 1; ++i) { prev = GetPosition(ss, param); param += m_precompdiv; next = GetPosition(ss, param); length += (next - prev).magnitude; ss.m_precomps[i] = length / seglen; ss.m_params[i] = param; } ss.m_params[0] = 0; ss.m_params[m_stepcount] = 1; ss.m_precomps[0] = 0; ss.m_precomps[m_stepcount] = 1; m_precompdiv = 1 / (float)m_stepcount; } break; } }