Пример #1
0
 public void UpdatePoints()
 {
     for (int i = connections.Length - 1; i >= 0; i--)
     {
         if (!connections[i].isValid)
         {
             RemoveConnection(i);
             continue;
         }
         SplinePoint point = connections[i].spline.GetPoint(connections[i].pointIndex);
         point.SetPosition(transform.position);
         SetPoint(i, point, true);
     }
 }
Пример #2
0
 private void UpdatePoints()
 {
     for (int i = connections.Length - 1; i >= 0; i--)
     {
         if (!connections[i].isValid)
         {
             RemoveConnection(i);
             continue;
         }
         SplinePoint point = connections[i].computer.GetPoint(connections[i].pointIndex);
         point.SetPosition(this.transform.position);
         SetPoint(i, point);
     }
 }
Пример #3
0
 private void UpdatePoints()
 {
     for (int num = connections.Length - 1; num >= 0; num--)
     {
         if (!connections[num].isValid)
         {
             RemoveConnection(num);
         }
         else
         {
             SplinePoint point = connections[num].computer.GetPoint(connections[num].pointIndex);
             point.SetPosition(base.transform.position);
             SetPoint(num, point, swappedTangents: true);
         }
     }
 }
Пример #4
0
        void SplitAtPercent(double percent, ref SplinePoint[] points)
        {
            Undo.RecordObject(computer, "Split At Percent ");
            EditorUtility.SetDirty(computer);
            float pointValue     = (computer.pointCount - 1) * (float)percent;
            int   lastPointIndex = Mathf.FloorToInt(pointValue);
            int   nextPointIndex = Mathf.CeilToInt(pointValue);

            SplinePoint[] splitPoints = new SplinePoint[computer.pointCount - lastPointIndex];
            float         lerpPercent = Mathf.InverseLerp(lastPointIndex, nextPointIndex, pointValue);
            SplinePoint   splitPoint  = SplinePoint.Lerp(computer.GetPoint(lastPointIndex), computer.GetPoint(nextPointIndex), lerpPercent);

            splitPoint.SetPosition(computer.EvaluatePosition(percent));
            splitPoints[0] = splitPoint;
            for (int i = 1; i < splitPoints.Length; i++)
            {
                splitPoints[i] = computer.GetPoint(lastPointIndex + i);
            }
            SplineComputer spline = CreateNewSpline();

            spline.SetPoints(splitPoints);
            SplineUser[] users = spline.GetSubscribers();
            for (int i = 0; i < users.Length; i++)
            {
                users[i].clipFrom = DMath.InverseLerp(percent, 1.0, users[i].clipFrom);
                users[i].clipTo   = DMath.InverseLerp(percent, 1.0, users[i].clipTo);
            }
            splitPoints = new SplinePoint[lastPointIndex + 2];
            for (int i = 0; i <= lastPointIndex; i++)
            {
                splitPoints[i] = computer.GetPoint(i);
            }
            splitPoints[splitPoints.Length - 1] = splitPoint;
            points = splitPoints;
            users  = computer.GetSubscribers();
            for (int i = 0; i < users.Length; i++)
            {
                users[i].clipFrom = DMath.InverseLerp(0.0, percent, users[i].clipFrom);
                users[i].clipTo   = DMath.InverseLerp(0.0, percent, users[i].clipTo);
            }
            HandleNodes(spline, lastPointIndex);
        }
Пример #5
0
        public virtual void AddConnection(SplineComputer computer, int pointIndex)
        {
            RemoveInvalidConnections();
            Node connected = computer.GetNode(pointIndex);

            if (connected != null)
            {
                Debug.LogError(computer.name + " is already connected to node " + connected.name + " at point " + pointIndex);
                return;
            }
            SplinePoint point = computer.GetPoint(pointIndex);

            point.SetPosition(transform.position);
            ArrayUtility.Add(ref connections, new Connection(computer, pointIndex, PointToLocal(point)));
            if (connections.Length == 1)
            {
                SetPoint(connections.Length - 1, point, true);
            }
            UpdateConnectedComputers();
        }
Пример #6
0
        public virtual void AddConnection(SplineComputer computer, int pointIndex)
        {
            RemoveInvalidConnections();
            for (int i = 0; i < computer.nodeLinks.Length; i++)
            {
                if (computer.nodeLinks[i].pointIndex == pointIndex)
                {
                    Debug.LogError("Connection has been already added in " + computer.nodeLinks[i].node);
                    return;
                }
            }
            SplinePoint point = computer.GetPoint(pointIndex);

            point.SetPosition(transform.position);
            Connection newConnection = new Connection(computer, pointIndex, PointToLocal(point));

            Connection[] newConnections = new Connection[connections.Length + 1];
            connections.CopyTo(newConnections, 0);
            newConnections[connections.Length] = newConnection;
            connections = newConnections;
            SetPoint(connections.Length - 1, point);
            computer.AddNodeLink(this, pointIndex);
            UpdateConnectedComputers();
        }
Пример #7
0
        public virtual void AddConnection(SplineComputer computer, int pointIndex)
        {
            RemoveInvalidConnections();
            for (int i = 0; i < computer.nodeLinks.Length; i++)
            {
                if (computer.nodeLinks[i].pointIndex == pointIndex)
                {
                    UnityEngine.Debug.LogError("Connection has been already added in " + computer.nodeLinks[i].node);
                    return;
                }
            }
            SplinePoint point = computer.GetPoint(pointIndex);

            point.SetPosition(base.transform.position);
            Connection connection = new Connection(computer, pointIndex, PointToLocal(point));

            Connection[] array = new Connection[connections.Length + 1];
            connections.CopyTo(array, 0);
            array[connections.Length] = connection;
            connections = array;
            SetPoint(connections.Length - 1, point, swappedTangents: true);
            computer.AddNodeLink(this, pointIndex);
            UpdateConnectedComputers();
        }
        void MakeMiddlePoint(ref SplinePoint point)
        {
            point.type     = SplinePoint.Type.Broken;
            point.position = computer.transform.InverseTransformPoint(point.position);
            point.tangent  = computer.transform.InverseTransformPoint(point.tangent);
            point.tangent2 = computer.transform.InverseTransformPoint(point.tangent2);
            Vector3 newPos      = point.position;
            Vector3 localCenter = computer.transform.InverseTransformPoint(center);

            switch (axis)
            {
            case Axis.X:

                newPos.x = localCenter.x;
                point.SetPosition(newPos);
                if ((point.tangent.x >= localCenter.x && flip) || (point.tangent.x <= localCenter.x && !flip))
                {
                    point.tangent2   = point.tangent;
                    point.tangent2.x = point.position.x + (point.position.x - point.tangent.x);
                }
                else
                {
                    point.tangent   = point.tangent2;
                    point.tangent.x = point.position.x + (point.position.x - point.tangent2.x);
                }
                break;

            case Axis.Y:
                newPos.y = localCenter.y;
                point.SetPosition(newPos);
                if ((point.tangent.y >= localCenter.y && flip) || (point.tangent.y <= localCenter.y && !flip))
                {
                    point.tangent2   = point.tangent;
                    point.tangent2.y = point.position.y + (point.position.y - point.tangent.y);
                }
                else
                {
                    point.tangent   = point.tangent2;
                    point.tangent.y = point.position.y + (point.position.y - point.tangent2.y);
                }
                break;

            case Axis.Z:
                newPos.z = localCenter.z;
                point.SetPosition(newPos);
                if ((point.tangent.z >= localCenter.z && flip) || (point.tangent.z <= localCenter.z && !flip))
                {
                    point.tangent2   = point.tangent;
                    point.tangent2.z = point.position.z + (point.position.z - point.tangent.z);
                }
                else
                {
                    point.tangent   = point.tangent2;
                    point.tangent.z = point.position.z + (point.position.z - point.tangent2.z);
                }
                break;
            }
            point.position = computer.transform.TransformPoint(point.position);
            point.tangent  = computer.transform.TransformPoint(point.tangent);
            point.tangent2 = computer.transform.TransformPoint(point.tangent2);
        }