Esempio n. 1
0
        public static void setSteppedInterval(AnimationCurve curve, int i, int nextI)
        {
            if (curve.keys[i].value == curve.keys[nextI].value)
            {
                return;
            }

            object thisKeyframeBoxed = curve[i];
            object nextKeyframeBoxed = curve[nextI];

            if (!KeyframeUtil.isKeyBroken(thisKeyframeBoxed))
            {
                KeyframeUtil.SetKeyBroken(thisKeyframeBoxed, true);
            }
            if (!KeyframeUtil.isKeyBroken(nextKeyframeBoxed))
            {
                KeyframeUtil.SetKeyBroken(nextKeyframeBoxed, true);
            }

            KeyframeUtil.SetKeyTangentMode(thisKeyframeBoxed, 1, TangentMode.Stepped);
            KeyframeUtil.SetKeyTangentMode(nextKeyframeBoxed, 0, TangentMode.Stepped);

            Keyframe thisKeyframe = (Keyframe)thisKeyframeBoxed;
            Keyframe nextKeyframe = (Keyframe)nextKeyframeBoxed;

            thisKeyframe.outTangent = float.PositiveInfinity;
            nextKeyframe.inTangent  = float.PositiveInfinity;
            curve.MoveKey(i, thisKeyframe);
            curve.MoveKey(nextI, nextKeyframe);
        }
Esempio n. 2
0
        public static void setLinearInterval(AnimationCurve curve, int i, int nextI)
        {
            Keyframe thisKeyframe = curve[i];
            Keyframe nextKeyframe = curve[nextI];

            thisKeyframe.outTangent = CurveExtension.CalculateLinearTangent(curve, i, nextI);
            nextKeyframe.inTangent  = CurveExtension.CalculateLinearTangent(curve, nextI, i);

            KeyframeUtil.SetKeyBroken((object)thisKeyframe, true);
            KeyframeUtil.SetKeyBroken((object)nextKeyframe, true);

            KeyframeUtil.SetKeyTangentMode((object)thisKeyframe, 1, TangentMode.Linear);
            KeyframeUtil.SetKeyTangentMode((object)nextKeyframe, 0, TangentMode.Linear);


            curve.MoveKey(i, thisKeyframe);
            curve.MoveKey(nextI, nextKeyframe);
        }
Esempio n. 3
0
        public static void setCustomTangents(AnimationCurve curve, int i, int nextI, JsonData tangentArray)
        {
            float diffValue = curve[nextI].value - curve[i].value;
            float diffTime  = curve[nextI].time - curve[i].time;

            if (diffValue == 0)
            {
                return;
            }



            float   cx1    = parseFloat(tangentArray[0]);
            float   cy1    = parseFloat(tangentArray[1]);
            float   cx2    = parseFloat(tangentArray[2]);
            float   cy2    = parseFloat(tangentArray[3]);
            Vector2 p0     = new Vector2(0, curve[i].value);
            Vector2 p3     = new Vector2(diffTime, curve[nextI].value);
            Vector2 cOrig1 = new Vector2(diffTime * cx1, curve[i].value);

            cOrig1.y += diffValue > 0 ? diffValue * cy1 : -1.0f * Mathf.Abs(diffValue * cy1);

            Vector2 cOrig2 = new Vector2(diffTime * cx2, curve[i].value);

            cOrig2.y += diffValue > 0 ? diffValue * cy2 : -1.0f * Mathf.Abs(diffValue * cy2);

            Vector2 p1 = getBezierPoint(p0, cOrig1, cOrig2, p3, 1.0f / 3.0f);
            Vector2 p2 = getBezierPoint(p0, cOrig1, cOrig2, p3, 2.0f / 3.0f);


            Vector2 c1tg, c2tg, c1, c2;

            calcControlPoints(p0, p1, p2, p3, out c1, out c2);

            c1tg = c1 - p0;
            c2tg = c2 - p3;

            float outTangent = c1tg.y / c1tg.x;
            float inTangent  = c2tg.y / c2tg.x;


            object thisKeyframeBoxed = curve[i];
            object nextKeyframeBoxed = curve[nextI];


            if (!KeyframeUtil.isKeyBroken(thisKeyframeBoxed))
            {
                KeyframeUtil.SetKeyBroken(thisKeyframeBoxed, true);
            }
            KeyframeUtil.SetKeyTangentMode(thisKeyframeBoxed, 1, TangentMode.Editable);

            if (!KeyframeUtil.isKeyBroken(nextKeyframeBoxed))
            {
                KeyframeUtil.SetKeyBroken(nextKeyframeBoxed, true);
            }
            KeyframeUtil.SetKeyTangentMode(nextKeyframeBoxed, 0, TangentMode.Editable);

            Keyframe thisKeyframe = (Keyframe)thisKeyframeBoxed;
            Keyframe nextKeyframe = (Keyframe)nextKeyframeBoxed;

            thisKeyframe.outTangent = outTangent;
            nextKeyframe.inTangent  = inTangent;

            curve.MoveKey(i, thisKeyframe);
            curve.MoveKey(nextI, nextKeyframe);

            //* test method
            bool  ok        = true;
            float startTime = thisKeyframe.time;

            float epsilon = 0.001f;

            for (float j = 0; j < 25f; j++)
            {
                float   t          = j / 25.0f;
                Vector2 t1         = getBezierPoint(p0, cOrig1, cOrig2, p3, t);
                Vector2 t2         = getBezierPoint(p0, c1, c2, p3, t);
                float   curveValue = curve.Evaluate(startTime + diffTime * t);
                if (!NearlyEqual(t1.y, t2.y, epsilon) ||
                    !NearlyEqual(t2.y, curveValue, epsilon))
                {
                    Debug.LogError("time = " + t + "   t1 = [" + t1.y.ToString("N8") + "]   t2 = [" + t2.y.ToString("N8") + "]    curve = [" + curveValue.ToString("N8") + "]");
                    ok = false;
                }
            }
            if (!ok)
            {
                Debug.LogWarning("something wrong with bezier points");
            }
            //*/
        }