コード例 #1
0
        public void SetTangentMode(int index, ShapeTangentMode mode)
        {
            SplineControlPoint newPoint = m_ControlPoints[index];

            newPoint.mode          = mode;
            m_ControlPoints[index] = newPoint;
        }
コード例 #2
0
 public SplinePointDto(Vector3 position, Vector3 leftTangent, Vector3 rightTangent, ShapeTangentMode tangentMode)
 {
     Position     = new Vector3Dto(position);
     LeftTangent  = new Vector3Dto(leftTangent);
     RightTangent = new Vector3Dto(rightTangent);
     TangentMode  = tangentMode;
 }
コード例 #3
0
        public Vector3 GetRightTangent(int index)
        {
            ShapeTangentMode mode = GetTangentMode(index);

            if (mode == ShapeTangentMode.Linear)
            {
                return(Vector3.zero);
            }

            return(m_ControlPoints[index].rightTangent);
        }
コード例 #4
0
        public void SetRightTangent(int index, Vector3 tangent)
        {
            ShapeTangentMode mode = GetTangentMode(index);

            if (mode == ShapeTangentMode.Linear)
            {
                return;
            }

            SplineControlPoint newPoint = m_ControlPoints[index];

            newPoint.rightTangent  = tangent;
            m_ControlPoints[index] = newPoint;
        }
コード例 #5
0
        private void CycleTangentMode()
        {
            ISelection selection = ShapeEditorCache.GetSelection();

            if (selection.single == -1)
            {
                return;
            }

            Undo.RecordObject(m_CurrentEditor.target, "Edit Tangent Mode");

            ShapeTangentMode oldMode = m_Spline.GetTangentMode(selection.single);
            ShapeTangentMode newMode = GetNextTangentMode(oldMode);

            RefreshTangentsAfterModeChange(selection.single, newMode);
        }
コード例 #6
0
        private void RefreshTangentsAfterModeChange(int pointIndex, ShapeTangentMode newMode)
        {
            m_Spline.SetTangentMode(pointIndex, newMode);
            m_Spline.SetLeftTangent(pointIndex, ShapeEditorCache.instance.leftTangent);
            m_Spline.SetRightTangent(pointIndex, ShapeEditorCache.instance.rightTangent);

            if (newMode == ShapeTangentMode.Continuous)
            {
                bool setFromRightTangent = ShapeEditorCache.instance.rightTangentChanged;

                if (m_Spline.GetRightTangent(pointIndex).sqrMagnitude == 0f)
                {
                    setFromRightTangent = false;
                }
                if (m_Spline.GetLeftTangent(pointIndex).sqrMagnitude == 0f)
                {
                    setFromRightTangent = true;
                }

                if (setFromRightTangent)
                {
                    m_Spline.SetLeftTangent(pointIndex, m_Spline.GetRightTangent(pointIndex) * -1f);
                }
                else
                {
                    m_Spline.SetRightTangent(pointIndex, m_Spline.GetLeftTangent(pointIndex) * -1f);
                }
            }

            if (newMode == ShapeTangentMode.Continuous || newMode == ShapeTangentMode.Broken)
            {
                if (m_Spline.GetLeftTangent(pointIndex).sqrMagnitude == 0f && m_Spline.GetRightTangent(pointIndex).sqrMagnitude == 0f)
                {
                    ResetTangents(pointIndex);
                }
            }

            EditorUtility.SetDirty(m_CurrentEditor.target);
        }
コード例 #7
0
    public override void ScrollRubber(float deltaPos)
    {
        Vector2 newPos;
        Spline  spline           = shape.spline;
        float   camWidth         = GameManager.instance.CameraWidth * 2f;
        int     pointIndexToMove = -1;

        for (int i = 1; i < pointsCount - 1; i++)
        {
            newPos    = spline.GetPosition(i);
            newPos.x += deltaPos * bandScrollKoefficient;
            if (newPos.x > camWidth)
            {
                newPos.x        -= camWidth * 2f;
                pointIndexToMove = i;
            }
            else if (newPos.x < -camWidth)
            {
                newPos.x        += camWidth * 2f;
                pointIndexToMove = i;
            }
            spline.SetPosition(i, newPos);
        }

        if (pointIndexToMove >= 0)
        {
            Vector3          pos = spline.GetPosition(pointIndexToMove);
            Vector3          lt  = spline.GetLeftTangent(pointIndexToMove);
            Vector3          rt  = spline.GetRightTangent(pointIndexToMove);
            ShapeTangentMode tm  = spline.GetTangentMode(pointIndexToMove);
            spline.RemovePointAt(pointIndexToMove);
            int insertIndex = deltaPos > 0 ? 1 : pointsCount - 2;
            spline.InsertPointAt(insertIndex, pos);
            spline.SetTangentMode(insertIndex, tm);
            spline.SetLeftTangent(insertIndex, lt);
            spline.SetRightTangent(insertIndex, rt);
        }
    }
コード例 #8
0
 public void SetTangentMode(int pointIndex, ShapeTangentMode mode)
 {
     m_SplineEditor.SetTangentModeUseThisOne(pointIndex, (SplineEditor.TangentMode)mode);
 }
コード例 #9
0
 private static ShapeTangentMode GetNextTangentMode(ShapeTangentMode current)
 {
     return((ShapeTangentMode)((((int)current) + 1) % Enum.GetValues(typeof(ShapeTangentMode)).Length));
 }
コード例 #10
0
 private void InsertPoint(Spline spline, int index, Vector3 point, ShapeTangentMode mode)
 {
     spline.InsertPointAt(index, point);
     spline.SetTangentMode(index, mode);
     spline.SetSpriteIndex(index, UnityEngine.Random.Range(0, _config.GrassShape.angleRanges[0].sprites.Count));
 }
コード例 #11
0
    const float SCALE = 0.35f;//4.25f;

    /// <summary>
    /// Updates a sprite shape.
    /// </summary>
    /// <param name="controller">Sprite Shape Controller</param>
    /// <param name="pathCreator">Path Creator</param>
    /// <param name="j">Index of last bezier path segment updated</param>
    public static int UpdateSpriteShape(SpriteShapeController controller, PathCreator pathCreator, int j, ShapeTangentMode tangentMode = ShapeTangentMode.Continuous, bool sharpCorners = false)
    {
        Spline spline = controller.spline;

        spline.isOpenEnded = !pathCreator.path.isClosedLoop;
        int numSegments = pathCreator.bezierPath.NumSegments;
        int index       = spline.GetPointCount();

        Vector3[] segment;
        if (index == 2 || index == 0)
        {
            spline.Clear();
            index   = 0;
            segment = pathCreator.bezierPath.GetPointsInSegment(0);
            InsertPointBezier(spline, segment[0], index);
            index++;
            InsertPointBezier(spline, segment[3], index);
            index++;
        }
        for (int i = j + 1; i < numSegments; i++)
        {
            if (!(i == numSegments - 1 && !spline.isOpenEnded))
            {
                segment = pathCreator.bezierPath.GetPointsInSegment(i);
                InsertPointBezier(spline, segment[3], index);
                index++;
                j = i;
            }
        }

        if (!sharpCorners)
        {
            spline.SetTangentMode(0, ShapeTangentMode.Continuous);
            spline.SetRightTangent(0, pathCreator.path.anchorTangents[0] * SCALE);

            int anchorT = 1;
            for (int i = 1; i < spline.GetPointCount() - 1; i++)
            {
                spline.SetTangentMode(i, ShapeTangentMode.Continuous);
                spline.SetLeftTangent(i, -pathCreator.path.anchorTangents[anchorT] * SCALE);
                anchorT++;
                spline.SetRightTangent(i, pathCreator.path.anchorTangents[anchorT] * SCALE);
                anchorT++;
            }
            spline.SetLeftTangent(spline.GetPointCount() - 1, -pathCreator.path.anchorTangents[pathCreator.path.anchorTangents.Length - 1] * SCALE);
            if (!spline.isOpenEnded)
            {
                spline.SetLeftTangent(0, -pathCreator.path.anchorTangents[0] * SCALE);
                spline.SetTangentMode(0, ShapeTangentMode.Continuous);
                spline.SetRightTangent(spline.GetPointCount() - 1, pathCreator.path.anchorTangents[pathCreator.path.anchorTangents.Length - 1] * SCALE);
                spline.SetTangentMode(spline.GetPointCount() - 1, ShapeTangentMode.Continuous);
            }
        }
        else
        {
            for (int i = 0; i < spline.GetPointCount() - 1; i++)
            {
                spline.SetTangentMode(i, ShapeTangentMode.Continuous);
                spline.SetLeftTangent(i, Vector3.zero);
                spline.SetRightTangent(i, Vector3.zero);
            }
        }

        return(j);
    }