Exemple #1
0
        public void DeferredUpdate()
        {
            lock (this)
            {
                if (!_dirty)
                {
                    return;
                }
                _dirty = false;
            }

            FromMatrix = MatrixD.CreateWorld(From.Position, CorrectTangent(From.Tangent), From.Up);
            ToMatrix   = MatrixD.CreateWorld(To.Position, CorrectTangent(To.Tangent), To.Up);


            var ext = Math.Max((FromMatrix.Translation - ToMatrix.Translation).Length() / 3, 1f);
            var d1  = default(Vector3D);
            var d2  = default(Vector3D);

            if (Mode != CurveMode.Linear)
            {
                if (_ctl0.HasValue)
                {
                    d1 = Vector3D.Transform(_ctl0.Value, FromMatrix);
                }
                else
                {
                    d1 = FromMatrix.Translation + (FromMatrix.Forward * ext);
                }
                if (_ctl1.HasValue)
                {
                    d2 = Vector3D.Transform(_ctl1.Value, ToMatrix);
                }
                else
                {
                    d2 = ToMatrix.Translation - (ToMatrix.Forward * ext);
                }
            }


            switch (Mode)
            {
            case CurveMode.Linear:
                Curve = new LinearCurve(From.Position, To.Position);
                break;

            case CurveMode.QuadraticBez:
                Curve = new QuadraticCurve(FromMatrix.Translation, (d1 + d2) / 2, ToMatrix.Translation);
                break;

            case CurveMode.CubicBez:
                Curve = new CubicCurve(FromMatrix.Translation, d1, d2, ToMatrix.Translation);
                break;

            default:
                throw new Exception($"Unsupported curve mode {Mode}");
            }

            CurveUpdated?.Invoke(this);
        }
Exemple #2
0
    public Vector3 Evaluate(float t)
    {
        t = Mathf.Clamp01(t);
        Vector3 quadratic1 = QuadraticCurve.Evaluate(p1, pivot1, p2, t);
        Vector3 quadratic2 = QuadraticCurve.Evaluate(pivot1, p2, pivot2, t);

        return(Vector3.Lerp(quadratic1, quadratic2, t));
    }
Exemple #3
0
    void Update()
    {
        if (p1 != null && p2 != null && pivot != null)
        {
            if (curve == null)
            {
                curve = new QuadraticCurve(p1.position, p2.position, pivot.position, splinePointCount);
            }

            UpdateCurve();
            curve.Draw();
        }
    }
Exemple #4
0

        
Exemple #5
0
        public void Initialize(NotesUI owner, RectTransform rectParent, QuadraticCurve curve, int input)
        {
            if (indicatorUI == null)
            {
                indicatorUI = Instantiate(owner.noteIndicatorPrefab, rectParent);
            }

            // Colocamos el indicador segun nos indique la curva
            float scale = rectParent.rect.height * 2;

            indicatorUI.Initialize(curve.FromPoint * scale, this.color, input);

            // Hacemos que la curva empiece desde el punto 0 para que sea relativo al indicador
            // y tratamos de conseguir un camino para las notas
            curve.FromPoint = Vector2.zero;
            curvePath.UpdateCurve(curve, curveSpacing, curveResolution, scale);
        }
        /// <summary>
        /// Approximate a cubic Bezier with a single quadratic within a given tolerance.
        /// </summary>
        /// <param name="controlPoints">Four complex numbers representing control points of the cubic Bezier curve.</param>
        /// <param name="maxError">Permitted deviation from the original curve.</param>
        /// <param name="quadraticCurve">Three complex numbers representing control points of the quadratic
        /// curve if it fits within the given tolerance, or null if no suitable
        /// curve could be calculated.</param>
        /// <returns>True if the curve could be converted, else false</returns>
        private static bool CubicApproximateQuadratic(CubicCurve controlPoints, float maxError, out QuadraticCurve quadraticCurve)
        {
            if (!TryCalculateIntersection(controlPoints.Point0, controlPoints.Point1, controlPoints.Point2, controlPoints.Point3, out var q1))
            {
                return(false);
            }

            var c0 = controlPoints.Point0;
            var c3 = controlPoints.Point3;
            var c1 = c0 + (q1 - c0) * TwoOverThree;
            var c2 = c3 + (q1 - c3) * TwoOverThree;

            if (CubicFarthestFitsInside(0, c1 - controlPoints.Point1, c2 - controlPoints.Point2, 0, maxError))
            {
                return(false);
            }

            quadraticCurve = new QuadraticCurve(c0, q1, c3);
            return(true);
        }
        public static List <Base> ToPathList(this string pathDataText)
        {
            pathDataText = pathDataText.Trim();
            var strings = new List <string>();
            int start   = 0;

            for (int i = 1; i <= pathDataText.Length; i++)
            {
                if (i == pathDataText.Length || (char.ToLower(pathDataText[i]) != 'e' && char.IsLetter(pathDataText[i])))
                {
                    strings.Add(pathDataText.Substring(start, i - start));
                    start = i;
                }
            }

            var result = new List <PathElement.Base>();

            foreach (var str in strings)
            {
                if (string.IsNullOrWhiteSpace(str))
                {
                    continue;
                }
                var cmd = char.ToUpper(str[0]);
                switch (cmd)
                {
                case Arc.Symbol:
                    if (Arc.FromString(str) is List <Arc> arcList)
                    {
                        result.AddRange(arcList);
                    }
                    break;

                case BezierCurve.Symbol:
                    if (BezierCurve.FromString(str) is List <BezierCurve> bezierCurveList)
                    {
                        result.AddRange(bezierCurveList);
                    }
                    break;

                case ClosePath.Symbol:
                    result.Add(new ClosePath());
                    break;

                case HorzLineTo.Symbol:
                    if (HorzLineTo.FromString(str) is HorzLineTo horzLineTo)
                    {
                        result.Add(horzLineTo);
                    }
                    break;

                case LineTo.Symbol:
                    if (LineTo.FromString(str) is List <LineTo> lineList)
                    {
                        result.AddRange(lineList);
                    }
                    break;

                case MoveTo.Symbol:
                    if (MoveTo.FromString(str) is List <Base> moveAndLineList)
                    {
                        result.AddRange(moveAndLineList);
                    }
                    break;

                case QuadraticCurve.Symbol:
                    if (QuadraticCurve.FromString(str) is List <QuadraticCurve> quadraticCurveList)
                    {
                        result.AddRange(quadraticCurveList);
                    }
                    break;

                case ShortcutBezierCurve.Symbol:
                    if (ShortcutBezierCurve.FromString(str) is List <ShortcutBezierCurve> shortcutBezierCurveList)
                    {
                        result.AddRange(shortcutBezierCurveList);
                    }
                    break;

                case ShortcutQuadraticCurve.Symbol:
                    if (ShortcutQuadraticCurve.FromString(str) is List <ShortcutQuadraticCurve> shortcutQuadraticCurveList)
                    {
                        result.AddRange(shortcutQuadraticCurveList);
                    }
                    break;

                case VertLineTo.Symbol:
                    if (VertLineTo.FromString(str) is VertLineTo vertLineTo)
                    {
                        result.Add(vertLineTo);
                    }
                    break;

                default:
                    throw new Exception("Unrecognized Path Command : " + str);
                }
            }
            return(result);
        }