Beispiel #1
0
        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;
            }
        }
Beispiel #2
0
        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;
 }
Beispiel #4
0
 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;
					
				}
			}