public static void KeyProperties(GameObject go, WindowState state, IList <EditorCurveBinding> bindings)
        {
            var allKeyedProperties = new List <PropertyModification>();
            var rotationPaths      = new HashSet <string>();

            for (var i = 0; i < bindings.Count; ++i)
            {
                // Skip the euler and key quaternion+hint
                if (CurveEditUtility.IsRotationKey(bindings[i]))
                {
                    rotationPaths.Add(bindings[i].path);
                    continue;
                }

                AnimationUtility.GetFloatValue(go, bindings[i], out var val);
                var compo = GetTargetFromEditorBinding(go, bindings[i]);
                allKeyedProperties.Add(new PropertyModification
                {
                    target       = compo,
                    value        = val.ToString(EditorGUI.kFloatFieldFormatString),
                    propertyPath = bindings[i].propertyName
                });
            }

            foreach (var path in rotationPaths)
            {
                foreach (var binding in GetRotationBindings(path))
                {
                    var compo       = GetTargetFromEditorBinding(go, binding);
                    var readBinding = binding;
                    switch (binding.propertyName)
                    {
                    case kLocalEulerHint + ".x":
                        readBinding = EditorCurveBinding.FloatCurve(path, typeof(Transform), kLocalRotation + ".x");
                        break;

                    case kLocalEulerHint + ".y":
                        readBinding = EditorCurveBinding.FloatCurve(path, typeof(Transform), kLocalRotation + ".y");
                        break;

                    case kLocalEulerHint + ".z":
                        readBinding = EditorCurveBinding.FloatCurve(path, typeof(Transform), kLocalRotation + ".z");
                        break;
                    }

                    AnimationUtility.GetFloatValue(go, readBinding, out var val);
                    allKeyedProperties.Add(new PropertyModification
                    {
                        target       = compo,
                        value        = val.ToString(EditorGUI.kFloatFieldFormatString),
                        propertyPath = binding.propertyName
                    });
                }
            }

            AddKey(allKeyedProperties, state);
            state.Refresh();
        }
 public static void RemoveKey(AnimationClip clip, EditorCurveBinding sourceBinding, SerializedProperty prop, double time)
 {
     if (sourceBinding.get_isPPtrCurve())
     {
         CurveEditUtility.RemoveObjectKey(clip, sourceBinding, time);
     }
     else if (CurveEditUtility.IsRotationKey(sourceBinding))
     {
         CurveEditUtility.RemoveRotationKey(clip, sourceBinding, prop, time);
     }
     else
     {
         CurveEditUtility.RemoveFloatKey(clip, sourceBinding, prop, time);
     }
 }