Skip to content

Commit 67c9fbb

Browse files
committed
#10 first broken smooth keyframe result
1 parent 0989604 commit 67c9fbb

File tree

2 files changed

+31
-6
lines changed

2 files changed

+31
-6
lines changed

Assets/UnitySpineImporter/3DParty/CurveExtension/KeyframeUtil.cs

+8
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,14 @@ public static void SetKeyBroken(object keyframe, bool broken)
102102
tangentMode &= -2;
103103
field.SetValue(keyframe, tangentMode);
104104
}
105+
106+
// UnityEditor.CurveUtility.cs (c) Unity Technologies
107+
public static bool isKeyBroken(object keyframe){
108+
Type t = typeof( UnityEngine.Keyframe );
109+
FieldInfo field = t.GetField( "m_TangentMode", BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance );
110+
int tangentMode = (int)field.GetValue(keyframe);
111+
return (tangentMode & 1) != 0;
112+
}
105113

106114
}
107115
}

Assets/UnitySpineImporter/Scripts/Editor/Util/SpineUtil.cs

+23-6
Original file line numberDiff line numberDiff line change
@@ -545,9 +545,7 @@ public static void calcControlPoints(Vector2 a, Vector2 b, Vector2 c, Vector2 d,
545545

546546
//this is not working method
547547
public static void setCustomTangents(AnimationCurve curve, int i, int nextI, JsonData tangentArray){
548-
Keyframe thisKeyframe = curve[i];
549-
Keyframe nextKeyframe = curve[nextI];
550-
float diff = nextKeyframe.value - thisKeyframe.value;
548+
float diff = curve[i].value - curve[nextI].value;
551549
if (diff == 0)
552550
return;
553551
float cx1 = parseFloat(tangentArray[0]);
@@ -578,17 +576,36 @@ public static void setCustomTangents(AnimationCurve curve, int i, int nextI, Jso
578576
Debug.Log("ewerything is "+(ok?"ok":"bad"));
579577
*/
580578

581-
c2 = p3 - c2;
579+
c2 = c2 - p3;
582580

583581
float outTangent = c1.y / c1.x;
584582
float inTangent = c2.y / c1.y;
585583

586-
if (nextKeyframe.value < thisKeyframe.value)
587-
inTangent*=-1;
584+
if (diff < 0){
585+
inTangent *= -1;
586+
outTangent *= -1;
587+
}
588+
589+
object thisKeyframeBoxed = curve[i];
590+
object nextKeyframeBoxed = curve[nextI];
591+
592+
593+
if (!KeyframeUtil.isKeyBroken(thisKeyframeBoxed)){
594+
KeyframeUtil.SetKeyBroken(thisKeyframeBoxed, true);
595+
KeyframeUtil.SetKeyTangentMode(thisKeyframeBoxed, 1, TangentMode.Editable);
596+
}
597+
if (KeyframeUtil.isKeyBroken(nextKeyframeBoxed)){
598+
KeyframeUtil.SetKeyBroken(nextKeyframeBoxed, true);
599+
KeyframeUtil.SetKeyTangentMode(nextKeyframeBoxed, 0, TangentMode.Editable);
600+
}
601+
602+
Keyframe thisKeyframe = (Keyframe)thisKeyframeBoxed;
603+
Keyframe nextKeyframe = (Keyframe)nextKeyframeBoxed;
588604

589605
thisKeyframe.outTangent = outTangent;
590606
nextKeyframe.inTangent = inTangent;
591607

608+
Debug.Log("is broken = "+KeyframeUtil.isKeyBroken(thisKeyframe));
592609
curve.MoveKey(i, thisKeyframe);
593610
curve.MoveKey(nextI, nextKeyframe);
594611
}

0 commit comments

Comments
 (0)