public void SetTangent(int leftRight, TangentMode mode, List <KeyIdentifier> keysToSet) { List <ChangedCurve> changedCurves = new List <ChangedCurve>(); foreach (KeyIdentifier keyToSet in keysToSet) { AnimationCurve animationCurve = keyToSet.curve; Keyframe key = keyToSet.keyframe; AnimationUtility.SetKeyBroken(ref key, true); if (leftRight == 2) { AnimationUtility.SetKeyLeftTangentMode(ref key, mode); AnimationUtility.SetKeyRightTangentMode(ref key, mode); } else { if (leftRight == 0) { AnimationUtility.SetKeyLeftTangentMode(ref key, mode); // Make sure other tangent is handled correctly if (AnimationUtility.GetKeyRightTangentMode(key) == TangentMode.ClampedAuto || AnimationUtility.GetKeyRightTangentMode(key) == TangentMode.Auto) { AnimationUtility.SetKeyRightTangentMode(ref key, TangentMode.Free); } } else //if (leftRight == 1) { AnimationUtility.SetKeyRightTangentMode(ref key, mode); // Make sure other tangent is handled correctly if (AnimationUtility.GetKeyLeftTangentMode(key) == TangentMode.ClampedAuto || AnimationUtility.GetKeyLeftTangentMode(key) == TangentMode.Auto) { AnimationUtility.SetKeyLeftTangentMode(ref key, TangentMode.Free); } } } if (mode == TangentMode.Constant && (leftRight == 0 || leftRight == 2)) { key.inTangent = Mathf.Infinity; } if (mode == TangentMode.Constant && (leftRight == 1 || leftRight == 2)) { key.outTangent = Mathf.Infinity; } animationCurve.MoveKey(keyToSet.key, key); AnimationUtility.UpdateTangentsFromModeSurrounding(animationCurve, keyToSet.key); // Debug.Log ("Before " + DebKey (key) + " after: " + DebKey (animationCurve[keyToSet.key])); ChangedCurve changedCurve = new ChangedCurve(animationCurve, keyToSet.curveId, keyToSet.binding); if (!changedCurves.Contains(changedCurve)) { changedCurves.Add(changedCurve); } } updater.UpdateCurves(changedCurves, "Set Tangents"); }
public void SetBoth(TangentMode mode, List <KeyIdentifier> keysToSet) { List <ChangedCurve> changedCurves = new List <ChangedCurve>(); foreach (KeyIdentifier keyToSet in keysToSet) { AnimationCurve animationCurve = keyToSet.curve; Keyframe key = keyToSet.keyframe; AnimationUtility.SetKeyBroken(ref key, false); AnimationUtility.SetKeyRightTangentMode(ref key, mode); AnimationUtility.SetKeyLeftTangentMode(ref key, mode); // Smooth Tangents based on neighboring nodes // Note: not needed since the UpdateTangentsFromModeSurrounding call below will handle it //if (mode == TangentMode.ClampedAuto) animationCurve.SmoothTangents(keyToSet.key, 0.0F); // Smooth tangents based on existing tangents if (mode == TangentMode.Free) { float slope = CurveUtility.CalculateSmoothTangent(key); key.inTangent = slope; key.outTangent = slope; } animationCurve.MoveKey(keyToSet.key, key); AnimationUtility.UpdateTangentsFromModeSurrounding(animationCurve, keyToSet.key); ChangedCurve changedCurve = new ChangedCurve(animationCurve, keyToSet.curveId, keyToSet.binding); if (!changedCurves.Contains(changedCurve)) { changedCurves.Add(changedCurve); } } updater.UpdateCurves(changedCurves, "Set Tangents"); }
public void ToggleWeighted(WeightedMode weightedMode, List <KeyIdentifier> keysToSet) { bool allWeighted = keysToSet.TrueForAll(key => (key.keyframe.weightedMode & weightedMode) == weightedMode); List <ChangedCurve> changedCurves = new List <ChangedCurve>(); foreach (KeyIdentifier keyToSet in keysToSet) { AnimationCurve animationCurve = keyToSet.curve; Keyframe key = keyToSet.keyframe; bool weighted = (key.weightedMode & weightedMode) == weightedMode; if (weighted == allWeighted) { WeightedMode lastWeightedMode = key.weightedMode; key.weightedMode = weighted ? key.weightedMode & ~weightedMode : key.weightedMode | weightedMode; if (key.weightedMode != WeightedMode.None) { TangentMode rightTangentMode = AnimationUtility.GetKeyRightTangentMode(key); TangentMode leftTangentMode = AnimationUtility.GetKeyLeftTangentMode(key); if ((lastWeightedMode & WeightedMode.Out) == WeightedMode.None && (key.weightedMode & WeightedMode.Out) == WeightedMode.Out) { if (rightTangentMode == TangentMode.Linear || rightTangentMode == TangentMode.Constant) { AnimationUtility.SetKeyRightTangentMode(ref key, TangentMode.Free); } if (keyToSet.key < (animationCurve.length - 1)) { key.outWeight = 1 / 3.0f; } } if ((lastWeightedMode & WeightedMode.In) == WeightedMode.None && (key.weightedMode & WeightedMode.In) == WeightedMode.In) { if (leftTangentMode == TangentMode.Linear || leftTangentMode == TangentMode.Constant) { AnimationUtility.SetKeyLeftTangentMode(ref key, TangentMode.Free); } if (keyToSet.key > 0) { key.inWeight = 1 / 3.0f; } } } animationCurve.MoveKey(keyToSet.key, key); AnimationUtility.UpdateTangentsFromModeSurrounding(animationCurve, keyToSet.key); ChangedCurve changedCurve = new ChangedCurve(animationCurve, keyToSet.curveId, keyToSet.binding); if (!changedCurves.Contains(changedCurve)) { changedCurves.Add(changedCurve); } } } updater.UpdateCurves(changedCurves, "Toggle Weighted"); }
static internal void SetSmoothEditable(ref Keyframe[] keys, TangentMode tangentMode) { for (int i = 0; i < keys.Length; i++) { AnimationUtility.SetKeyBroken(ref keys[i], false); AnimationUtility.SetKeyLeftTangentMode(ref keys[i], tangentMode); AnimationUtility.SetKeyRightTangentMode(ref keys[i], tangentMode); } }
// Move me to CurveEditor.cs public static void SetKeyModeFromContext(AnimationCurve curve, int keyIndex) { Keyframe key = curve[keyIndex]; bool broken = false; bool smoothTangent = false; if (keyIndex > 0) { if (AnimationUtility.GetKeyBroken(curve[keyIndex - 1])) { broken = true; } TangentMode prevTangentMode = AnimationUtility.GetKeyRightTangentMode(curve[keyIndex - 1]); if (prevTangentMode == TangentMode.ClampedAuto || prevTangentMode == TangentMode.Auto) { smoothTangent = true; } } if (keyIndex < curve.length - 1) { if (AnimationUtility.GetKeyBroken(curve[keyIndex + 1])) { broken = true; } TangentMode nextTangentMode = AnimationUtility.GetKeyLeftTangentMode(curve[keyIndex + 1]); if (nextTangentMode == TangentMode.ClampedAuto || nextTangentMode == TangentMode.Auto) { smoothTangent = true; } } AnimationUtility.SetKeyBroken(ref key, broken); if (broken && !smoothTangent) { if (keyIndex > 0) { AnimationUtility.SetKeyLeftTangentMode(ref key, AnimationUtility.GetKeyRightTangentMode(curve[keyIndex - 1])); } if (keyIndex < curve.length - 1) { AnimationUtility.SetKeyRightTangentMode(ref key, AnimationUtility.GetKeyLeftTangentMode(curve[keyIndex + 1])); } // Keys at boundaries. Make sure left and right tangent modes are the same. if (keyIndex == 0) { AnimationUtility.SetKeyLeftTangentMode(ref key, AnimationUtility.GetKeyRightTangentMode(key)); } if (keyIndex == curve.length - 1) { AnimationUtility.SetKeyRightTangentMode(ref key, AnimationUtility.GetKeyLeftTangentMode(key)); } } else { // If both neighbors or only neighbor are set to TangentMode.Auto or TangentMode.ClampedAuto, set new key to this mode as well. // If there are no neighbors, set new key to TangentMode.ClampedAuto. // Otherwise, fall back to TangentMode.Free. TangentMode mode = TangentMode.Free; if ((keyIndex == 0 || AnimationUtility.GetKeyRightTangentMode(curve[keyIndex - 1]) == TangentMode.ClampedAuto) && (keyIndex == curve.length - 1 || AnimationUtility.GetKeyLeftTangentMode(curve[keyIndex + 1]) == TangentMode.ClampedAuto)) { mode = TangentMode.ClampedAuto; } else if ((keyIndex == 0 || AnimationUtility.GetKeyRightTangentMode(curve[keyIndex - 1]) == TangentMode.Auto) && (keyIndex == curve.length - 1 || AnimationUtility.GetKeyLeftTangentMode(curve[keyIndex + 1]) == TangentMode.Auto)) { mode = TangentMode.Auto; } AnimationUtility.SetKeyLeftTangentMode(ref key, mode); AnimationUtility.SetKeyRightTangentMode(ref key, mode); } curve.MoveKey(keyIndex, key); }
public void AddTangentMenuItems(GenericMenu menu, List <KeyIdentifier> keyList) { bool anyKeys = (keyList.Count > 0); // Find out which qualities apply to all the keys bool allClampedAuto = anyKeys; bool allAuto = anyKeys; bool allFreeSmooth = anyKeys; bool allFlat = anyKeys; bool allBroken = anyKeys; bool allLeftWeighted = anyKeys; bool allLeftFree = anyKeys; bool allLeftLinear = anyKeys; bool allLeftConstant = anyKeys; bool allRightWeighted = anyKeys; bool allRightFree = anyKeys; bool allRightLinear = anyKeys; bool allRightConstant = anyKeys; foreach (KeyIdentifier sel in keyList) { Keyframe key = sel.keyframe; TangentMode leftMode = AnimationUtility.GetKeyLeftTangentMode(key); TangentMode rightMode = AnimationUtility.GetKeyRightTangentMode(key); bool broken = AnimationUtility.GetKeyBroken(key); if (leftMode != TangentMode.ClampedAuto || rightMode != TangentMode.ClampedAuto) { allClampedAuto = false; } if (leftMode != TangentMode.Auto || rightMode != TangentMode.Auto) { allAuto = false; } if (broken || leftMode != TangentMode.Free || rightMode != TangentMode.Free) { allFreeSmooth = false; } if (broken || leftMode != TangentMode.Free || key.inTangent != 0 || rightMode != TangentMode.Free || key.outTangent != 0) { allFlat = false; } if (!broken) { allBroken = false; } if (!broken || leftMode != TangentMode.Free) { allLeftFree = false; } if (!broken || leftMode != TangentMode.Linear) { allLeftLinear = false; } if (!broken || leftMode != TangentMode.Constant) { allLeftConstant = false; } if (!broken || rightMode != TangentMode.Free) { allRightFree = false; } if (!broken || rightMode != TangentMode.Linear) { allRightLinear = false; } if (!broken || rightMode != TangentMode.Constant) { allRightConstant = false; } if ((key.weightedMode & WeightedMode.In) == WeightedMode.None) { allLeftWeighted = false; } if ((key.weightedMode & WeightedMode.Out) == WeightedMode.None) { allRightWeighted = false; } } if (anyKeys) { menu.AddItem(EditorGUIUtility.TrTextContent("Clamped Auto"), allClampedAuto, SetClampedAuto, keyList); menu.AddItem(EditorGUIUtility.TrTextContent("Auto"), allAuto, SetAuto, keyList); menu.AddItem(EditorGUIUtility.TrTextContent("Free Smooth"), allFreeSmooth, SetEditable, keyList); menu.AddItem(EditorGUIUtility.TrTextContent("Flat"), allFlat, SetFlat, keyList); menu.AddItem(EditorGUIUtility.TrTextContent("Broken"), allBroken, SetBroken, keyList); menu.AddSeparator(""); menu.AddItem(EditorGUIUtility.TrTextContent("Left Tangent/Free"), allLeftFree, SetLeftEditable, keyList); menu.AddItem(EditorGUIUtility.TrTextContent("Left Tangent/Linear"), allLeftLinear, SetLeftLinear, keyList); menu.AddItem(EditorGUIUtility.TrTextContent("Left Tangent/Constant"), allLeftConstant, SetLeftConstant, keyList); menu.AddItem(EditorGUIUtility.TrTextContent("Left Tangent/Weighted"), allLeftWeighted, ToggleLeftWeighted, keyList); menu.AddItem(EditorGUIUtility.TrTextContent("Right Tangent/Free"), allRightFree, SetRightEditable, keyList); menu.AddItem(EditorGUIUtility.TrTextContent("Right Tangent/Linear"), allRightLinear, SetRightLinear, keyList); menu.AddItem(EditorGUIUtility.TrTextContent("Right Tangent/Constant"), allRightConstant, SetRightConstant, keyList); menu.AddItem(EditorGUIUtility.TrTextContent("Right Tangent/Weighted"), allRightWeighted, ToggleRightWeighted, keyList); menu.AddItem(EditorGUIUtility.TrTextContent("Both Tangents/Free"), allRightFree && allLeftFree, SetBothEditable, keyList); menu.AddItem(EditorGUIUtility.TrTextContent("Both Tangents/Linear"), allRightLinear && allLeftLinear, SetBothLinear, keyList); menu.AddItem(EditorGUIUtility.TrTextContent("Both Tangents/Constant"), allRightConstant && allLeftConstant, SetBothConstant, keyList); menu.AddItem(EditorGUIUtility.TrTextContent("Both Tangents/Weighted"), allRightWeighted && allLeftWeighted, ToggleBothWeighted, keyList); } else { menu.AddDisabledItem(EditorGUIUtility.TrTextContent("Weighted")); menu.AddDisabledItem(EditorGUIUtility.TrTextContent("Auto")); menu.AddDisabledItem(EditorGUIUtility.TrTextContent("Free Smooth")); menu.AddDisabledItem(EditorGUIUtility.TrTextContent("Flat")); menu.AddDisabledItem(EditorGUIUtility.TrTextContent("Broken")); menu.AddSeparator(""); menu.AddDisabledItem(EditorGUIUtility.TrTextContent("Left Tangent/Free")); menu.AddDisabledItem(EditorGUIUtility.TrTextContent("Left Tangent/Linear")); menu.AddDisabledItem(EditorGUIUtility.TrTextContent("Left Tangent/Constant")); menu.AddDisabledItem(EditorGUIUtility.TrTextContent("Left Tangent/Weighted")); menu.AddDisabledItem(EditorGUIUtility.TrTextContent("Right Tangent/Free")); menu.AddDisabledItem(EditorGUIUtility.TrTextContent("Right Tangent/Linear")); menu.AddDisabledItem(EditorGUIUtility.TrTextContent("Right Tangent/Constant")); menu.AddDisabledItem(EditorGUIUtility.TrTextContent("Right Tangent/Weighted")); menu.AddDisabledItem(EditorGUIUtility.TrTextContent("Both Tangents/Free")); menu.AddDisabledItem(EditorGUIUtility.TrTextContent("Both Tangents/Linear")); menu.AddDisabledItem(EditorGUIUtility.TrTextContent("Both Tangents/Constant")); menu.AddDisabledItem(EditorGUIUtility.TrTextContent("Both Tangents/Weighted")); } }