Ejemplo n.º 1
0
            public Vector3 InterpolateNormalByLen(float tl)
            {
                float localF;
                SplineControlPoint seg = LenToSegment(tl, out localF);

                return(seg.InterpolateNormal(localF));
            }
Ejemplo n.º 2
0
            public SplineControlPoint LenToSegment(float t, out float localF)
            {
                SplineControlPoint seg = null;

                t = Mathf.Clamp01(t);

                float len = t * mSegments[mSegments.Count - 1].Dist;


                int index = 0;

                for (index = 0; index < mSegments.Count; index++)
                {
                    if (mSegments[index].Dist >= len)
                    {
                        seg = mSegments[index];
                        break;
                    }
                }

                if (index == 0)
                {
                    //skip the first frame.
                    localF = 0f;
                    return(seg);
                }

                float PrevLen = 0f;
                int   prevIdx = seg.SegmentIndex - 1;
                SplineControlPoint prevSeg = mSegments[prevIdx];

                PrevLen = seg.Dist - prevSeg.Dist;
                localF  = (len - prevSeg.Dist) / PrevLen;
                return(prevSeg);
            }
Ejemplo n.º 3
0
    private float GetUvOffset(SplineControlPoint controlPoint, SplineControlPoint lastControlPoint)
    {
        if (lastControlPoint == null)
        {
            return(0);
        }

        return((lastControlPoint.Position - controlPoint.Position).magnitude);
    }
Ejemplo n.º 4
0
            Vector3 GetNext2Position()
            {
                SplineControlPoint cp = NextControlPoint;

                if (cp != null)
                {
                    return(cp.NextPosition);
                }
                return(NextPosition);
            }
Ejemplo n.º 5
0
            Vector3 GetNext2Normal()
            {
                SplineControlPoint cp = NextControlPoint;

                if (cp != null)
                {
                    return(cp.NextNormal);
                }


                return(Normal);
            }
Ejemplo n.º 6
0
            public Vector3 PreviousNormal(SplineControlPoint controlpoint)
            {
                SplineControlPoint seg = PreviousControlPoint(controlpoint);

                if (seg != null)
                {
                    return(seg.Normal);
                }
                else
                {
                    return(controlpoint.Normal);
                }
            }
Ejemplo n.º 7
0
            public Vector3 NextNormal(SplineControlPoint controlpoint)
            {
                SplineControlPoint seg = NextControlPoint(controlpoint);

                if (seg != null)
                {
                    return(seg.Normal);
                }
                else
                {
                    return(controlpoint.Normal);
                }
            }
Ejemplo n.º 8
0
            public Vector3 PreviousPosition(SplineControlPoint controlpoint)
            {
                SplineControlPoint seg = PreviousControlPoint(controlpoint);

                if (seg != null)
                {
                    return(seg.Position);
                }
                else
                {
                    return(controlpoint.Position);
                }
            }
Ejemplo n.º 9
0
            public Vector3 NextPosition(SplineControlPoint controlpoint)
            {
                SplineControlPoint seg = NextControlPoint(controlpoint);

                if (seg != null)
                {
                    return(seg.Position);
                }
                else
                {
                    return(controlpoint.Position);
                }
            }
Ejemplo n.º 10
0
    public void InsertControlPoint(ControlPointPair controlPoints, Vector3 position)
    {
        var targetPosition = position - transform.position;
        var direction      = Quaternion.Slerp(controlPoints.First.Direction, controlPoints.Second.Direction, 0.5f);

        var controlPoint = new SplineControlPoint {
            Position = targetPosition, Direction = direction
        };

        var insertIndex = Mathf.Max(ControlPoints.IndexOf(controlPoints.First), ControlPoints.IndexOf(controlPoints.Second));

        ControlPoints.Insert(insertIndex, controlPoint);
        UpdateMesh();
    }
Ejemplo n.º 11
0
        public void AddControlPoint(Vector3 position, Vector3 tangent)
        {
            if (_numControlPoints == MAX_CONTROL_POINTS)
            {
                Debug.LogError("Unable to add spline point: Spline has run out of control points.");
                return;
            }

            _controlPoints[_numControlPoints++] = new SplineControlPoint()
            {
                position = position,
                tangent  = tangent
            };

            onSplineModified();
        }
Ejemplo n.º 12
0
            public SplineControlPoint AddControlPoint(Vector3 pos, Vector3 up)
            {
                SplineControlPoint cp = new SplineControlPoint();

                cp.Init(this);

                cp.Position = pos;

                cp.Normal = up;

                mControlPoints.Add(cp);

                cp.ControlPointIndex = mControlPoints.Count - 1;


                return(cp);
            }
Ejemplo n.º 13
0
            public SplineControlPoint PreviousControlPoint(SplineControlPoint controlpoint)
            {
                if (mControlPoints.Count == 0)
                {
                    return(null);
                }

                int i = controlpoint.ControlPointIndex - 1;

                if (i < 0)
                {
                    return(null);
                }
                else
                {
                    return(mControlPoints[i]);
                }
            }
Ejemplo n.º 14
0
            public SplineControlPoint NextControlPoint(SplineControlPoint controlpoint)
            {
                if (mControlPoints.Count == 0)
                {
                    return(null);
                }

                int i = controlpoint.ControlPointIndex + 1;

                if (i >= mControlPoints.Count)
                {
                    return(null);
                }
                else
                {
                    return(mControlPoints[i]);
                }
            }
Ejemplo n.º 15
0
    public void AddControlPoint(Vector3 position)
    {
        var lastControlPoint = ControlPoints.Last();
        var directionOffset  = position - (transform.position + lastControlPoint.Position);

        directionOffset.y = 0;
        var direction = Quaternion.LookRotation(directionOffset);

        var targetPosition = position - transform.position;

        targetPosition.y = lastControlPoint.Position.y;

        var controlPoint = new SplineControlPoint {
            Position = targetPosition, Direction = direction
        };

        ControlPoints.Add(controlPoint);
        UpdateMesh();
    }
Ejemplo n.º 16
0
    private void AddControlPointToMesh(SplineControlPoint controlPoint, SplineControlPoint lastControlPoint, MeshData meshData)
    {
        // Precalculate shared data
        var radius       = Diameter / 2;
        var radiansSteps = (Mathf.PI * 2) / RoundSegments;
        var uvSteps      = 1f / RoundSegments;

        meshData.CurrentUvOffset += GetUvOffset(controlPoint, lastControlPoint);

        // Generate data for each vertex
        for (int i = 0; i <= RoundSegments; i++)
        {
            var localDirection = new Vector3(Mathf.Sin(radiansSteps * i), Mathf.Cos(radiansSteps * i), 0);
            meshData.Vertices.Add(GetVectorPosition(controlPoint.Position, controlPoint.Direction, localDirection, radius));

            // Normals always points straight out
            meshData.Normals.Add(Vector3.up);

            // Wraps perfectly X wise and uses the length of the segment as a base for the Y value.
            meshData.Uvs.Add(new Vector2(uvSteps * i, meshData.CurrentUvOffset * 2));
        }

        // Add 1 to account for it to wrap back on its own start
        var extendedRoundSegments = RoundSegments + 1;

        if (lastControlPoint != null)
        {
            // Create the triangle list. Each quad has six entries in the list
            for (int i = 0; i < extendedRoundSegments; i++)
            {
                meshData.Triangles.AddRange(new int[] {
                    meshData.CurrentIndex - extendedRoundSegments + i,
                    meshData.CurrentIndex + i,
                    meshData.CurrentIndex + (i + 1) % extendedRoundSegments,
                    meshData.CurrentIndex + (i + 1) % extendedRoundSegments,
                    meshData.CurrentIndex - extendedRoundSegments + (i + 1) % extendedRoundSegments,
                    meshData.CurrentIndex - extendedRoundSegments + i,
                });
            }
        }

        meshData.CurrentIndex += (RoundSegments + 1);
    }
Ejemplo n.º 17
0
        /// <summary>
        /// Inserts a new control point between idx0 and idx1, shifting
        /// idx1 and every control point after it further down the spline.
        /// </summary>
        public void AddControlPointBetween(int idx0, int idx1,
                                           Vector3 position, Vector3 tangent)
        {
            if (_numControlPoints == MAX_CONTROL_POINTS)
            {
                Debug.LogError("Unable to add spline point: Spline has run out of control points.");
                return;
            }

            _numControlPoints += 1;

            for (int i = numControlPoints - 1; i > idx0; i--)
            {
                _controlPoints[i] = _controlPoints[i - 1];
            }
            _controlPoints[idx0 + 1] = new SplineControlPoint()
            {
                position = position,
                tangent  = tangent
            };
        }
Ejemplo n.º 18
0
 public void RemoveControlPoint(SplineControlPoint controlPoint)
 {
     ControlPoints.Remove(controlPoint);
     UpdateMesh();
 }
Ejemplo n.º 19
0
 public ControlPointPair(SplineControlPoint first, SplineControlPoint second)
 {
     First  = first;
     Second = second;
 }