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); }
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); }
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"); } //*/ }