public void AddClipCurveDataRotation(CinemaActorClipCurve curveData, EditorCurveBinding component, bool isProperty, AnimationCurve curve, Component com) { MemberClipCurveData data = new MemberClipCurveData(); data.SetCurve(0, curve); data.Type = component.type.Name; data.PropertyName = "localEulerAngles"; data.IsProperty = isProperty; data.PropertyType = PropertyTypeInfo.Vector3; curveData.curveData.Add(data); }
public void OnSceneGUI() { CinemaActorClipCurve clipCurveGameObject = (target as CinemaActorClipCurve); for (int i = 0; i < clipCurveGameObject.CurveData.Count; i++) { MemberClipCurveData data = clipCurveGameObject.CurveData[i]; if (data.Type == "Transform" && data.PropertyName == "localPosition") { //Vector3 position = new Vector3(data.Curve1[0].value, data.Curve2[0].value, data.Curve3[0].value); //Handles.DrawSphere(0, position, Quaternion.identity, 10); } } }
protected override void showContextMenu(Behaviour behaviour) { ActorClipCurve clipCurve = behaviour as ActorClipCurve; if (clipCurve == null) { return; } List <KeyValuePair <string, string> > currentCurves = new List <KeyValuePair <string, string> >(); for (int i = 0; i < clipCurve.CurveData.Count; i++) { MemberClipCurveData data = clipCurve.CurveData[i]; KeyValuePair <string, string> curveStrings = new KeyValuePair <string, string>(data.Type, data.PropertyName); currentCurves.Add(curveStrings); } GenericMenu createMenu = new GenericMenu(); createMenu.AddItem(new GUIContent("Rename"), false, renameItem, behaviour); createMenu.AddItem(new GUIContent("Copy"), false, copyItem, behaviour); createMenu.AddItem(new GUIContent("Delete"), false, deleteItem, behaviour); if (clipCurve.Actor != null) { createMenu.AddSeparator(string.Empty); Component[] components = DirectorHelper.getValidComponents(clipCurve.Actor.gameObject); for (int i = 0; i < components.Length; i++) { Component component = components[i]; MemberInfo[] members = DirectorHelper.getValidMembers(component); for (int j = 0; j < members.Length; j++) { AddCurveContext context = new AddCurveContext(); context.clipCurve = clipCurve; context.component = component; context.memberInfo = members[j]; if (!currentCurves.Contains(new KeyValuePair <string, string>(component.GetType().Name, members[j].Name))) { createMenu.AddItem(new GUIContent(string.Format("Add Curve/{0}/{1}", component.GetType().Name, DirectorHelper.GetUserFriendlyName(component, members[j]))), false, addCurve, context); } } } createMenu.AddItem(new GUIContent(clipCurve.showInScene?"HideInScene":"ShowInScene"), false, showInScene, clipCurve); } createMenu.ShowAsContext(); }
protected virtual void CinemaCurveControl_CurvesChanged(object sender, CurveClipWrapperEventArgs e) { if (e.wrapper == null) { return; } CinemaClipCurveWrapper wrapper = e.wrapper; CinemaClipCurve clipCurve = wrapper.Behaviour as CinemaClipCurve; if (clipCurve == null) { return; } Undo.RecordObject(clipCurve, string.Format("Changed {0}", clipCurve.name)); for (int i = 0; i < clipCurve.CurveData.Count; i++) { MemberClipCurveData member = clipCurve.CurveData[i]; CinemaMemberCurveWrapper memberWrapper = null; if (wrapper.TryGetValue(member.Type, member.PropertyName, out memberWrapper)) { int showingCurves = UnityPropertyTypeInfo.GetCurveCount(member.PropertyType); for (int j = 0; j < showingCurves; j++) { member.SetCurve(j, new AnimationCurve(memberWrapper.AnimationCurves[j].Curve.keys)); } } } clipCurve.Firetime = wrapper.Firetime; clipCurve.Duration = wrapper.Duration; EditorUtility.SetDirty(clipCurve); }
private void checkToAddNewKeyframes(ActorClipCurve clipCurve, DirectorControlState state) { if (state.IsInPreviewMode && IsEditing && clipCurve.Manager.State == TimelineManager.TimeLineState.Paused && GUIUtility.hotControl == 0 && (clipCurve.Firetime <= state.ScrubberPosition && state.ScrubberPosition <= clipCurve.Firetime + clipCurve.Duration) && clipCurve.Actor != null) { Undo.RecordObject(clipCurve, "Auto Key Created"); bool hasDifferenceBeenFound = false; for (int i = 0; i < clipCurve.CurveData.Count; i++) { MemberClipCurveData data = clipCurve.CurveData[i]; if (data.Type == string.Empty || data.PropertyName == string.Empty) { continue; } Component component = clipCurve.Actor.GetComponent(data.Type); object value = clipCurve.GetCurrentValue(component, data.PropertyName, data.IsProperty); PropertyTypeInfo typeInfo = data.PropertyType; if (typeInfo == PropertyTypeInfo.Int || typeInfo == PropertyTypeInfo.Long) { float curve1Value = data.Curve1.Evaluate(state.ScrubberPosition); hasDifferenceBeenFound |= addKeyOnUserInteraction(Convert.ToInt32(value), curve1Value, data.Curve1, state.ScrubberPosition); } else if (typeInfo == PropertyTypeInfo.Float || typeInfo == PropertyTypeInfo.Double) { float curve1Value = data.Curve1.Evaluate(state.ScrubberPosition); hasDifferenceBeenFound |= addKeyOnUserInteraction(Convert.ToSingle(value), curve1Value, data.Curve1, state.ScrubberPosition); } else if (typeInfo == PropertyTypeInfo.Vector2) { Vector2 vec2 = (Vector2)value; float curve1Value = data.Curve1.Evaluate(state.ScrubberPosition); float curve2Value = data.Curve2.Evaluate(state.ScrubberPosition); hasDifferenceBeenFound |= addKeyOnUserInteraction(vec2.x, curve1Value, data.Curve1, state.ScrubberPosition); hasDifferenceBeenFound |= addKeyOnUserInteraction(vec2.y, curve2Value, data.Curve2, state.ScrubberPosition); } else if (typeInfo == PropertyTypeInfo.Vector3) { Vector3 vec3 = (Vector3)value; float curve1Value = data.Curve1.Evaluate(state.ScrubberPosition); float curve2Value = data.Curve2.Evaluate(state.ScrubberPosition); float curve3Value = data.Curve3.Evaluate(state.ScrubberPosition); hasDifferenceBeenFound |= addKeyOnUserInteraction(vec3.x, curve1Value, data.Curve1, state.ScrubberPosition); hasDifferenceBeenFound |= addKeyOnUserInteraction(vec3.y, curve2Value, data.Curve2, state.ScrubberPosition); hasDifferenceBeenFound |= addKeyOnUserInteraction(vec3.z, curve3Value, data.Curve3, state.ScrubberPosition); } else if (typeInfo == PropertyTypeInfo.Vector4) { Vector4 vec4 = (Vector4)value; float curve1Value = data.Curve1.Evaluate(state.ScrubberPosition); float curve2Value = data.Curve2.Evaluate(state.ScrubberPosition); float curve3Value = data.Curve3.Evaluate(state.ScrubberPosition); float curve4Value = data.Curve4.Evaluate(state.ScrubberPosition); hasDifferenceBeenFound |= addKeyOnUserInteraction(vec4.x, curve1Value, data.Curve1, state.ScrubberPosition); hasDifferenceBeenFound |= addKeyOnUserInteraction(vec4.y, curve2Value, data.Curve2, state.ScrubberPosition); hasDifferenceBeenFound |= addKeyOnUserInteraction(vec4.z, curve3Value, data.Curve3, state.ScrubberPosition); hasDifferenceBeenFound |= addKeyOnUserInteraction(vec4.w, curve4Value, data.Curve4, state.ScrubberPosition); } else if (typeInfo == PropertyTypeInfo.Quaternion) { Quaternion quaternion = (Quaternion)value; float curve1Value = data.Curve1.Evaluate(state.ScrubberPosition); float curve2Value = data.Curve2.Evaluate(state.ScrubberPosition); float curve3Value = data.Curve3.Evaluate(state.ScrubberPosition); float curve4Value = data.Curve4.Evaluate(state.ScrubberPosition); for (int j = 0; j < data.Curve1.length; j++) { Keyframe k = data.Curve1[j]; if (k.time == state.ScrubberPosition) { Keyframe newKeyframe = new Keyframe(k.time, quaternion.x, k.inTangent, k.outTangent); newKeyframe.tangentMode = k.tangentMode; AnimationCurveHelper.MoveKey(data.Curve1, j, newKeyframe); } } for (int j = 0; j < data.Curve2.length; j++) { Keyframe k = data.Curve2[j]; if (k.time == state.ScrubberPosition) { Keyframe newKeyframe = new Keyframe(k.time, quaternion.y, k.inTangent, k.outTangent); newKeyframe.tangentMode = k.tangentMode; AnimationCurveHelper.MoveKey(data.Curve2, j, newKeyframe); } } for (int j = 0; j < data.Curve3.length; j++) { Keyframe k = data.Curve3[j]; if (k.time == state.ScrubberPosition) { Keyframe newKeyframe = new Keyframe(k.time, quaternion.z, k.inTangent, k.outTangent); newKeyframe.tangentMode = k.tangentMode; AnimationCurveHelper.MoveKey(data.Curve3, j, newKeyframe); } } for (int j = 0; j < data.Curve4.length; j++) { Keyframe k = data.Curve4[j]; if (k.time == state.ScrubberPosition) { Keyframe newKeyframe = new Keyframe(k.time, quaternion.w, k.inTangent, k.outTangent); newKeyframe.tangentMode = k.tangentMode; AnimationCurveHelper.MoveKey(data.Curve4, j, newKeyframe); } } Quaternion curveValue = new Quaternion(curve1Value, curve2Value, curve3Value, curve4Value); float angle = Vector3.Angle(quaternion.eulerAngles, curveValue.eulerAngles); hasDifferenceBeenFound = hasDifferenceBeenFound || angle > QUATERNION_THRESHOLD; if (angle > QUATERNION_THRESHOLD && hasUserInteracted) { data.Curve1.AddKey(state.ScrubberPosition, quaternion.x); data.Curve2.AddKey(state.ScrubberPosition, quaternion.y); data.Curve3.AddKey(state.ScrubberPosition, quaternion.z); data.Curve4.AddKey(state.ScrubberPosition, quaternion.w); hasUserInteracted = true; } } else if (typeInfo == PropertyTypeInfo.Color) { Color color = (Color)value; float curve1Value = data.Curve1.Evaluate(state.ScrubberPosition); float curve2Value = data.Curve2.Evaluate(state.ScrubberPosition); float curve3Value = data.Curve3.Evaluate(state.ScrubberPosition); float curve4Value = data.Curve4.Evaluate(state.ScrubberPosition); hasDifferenceBeenFound |= addKeyOnUserInteraction(color.r, curve1Value, data.Curve1, state.ScrubberPosition); hasDifferenceBeenFound |= addKeyOnUserInteraction(color.g, curve2Value, data.Curve2, state.ScrubberPosition); hasDifferenceBeenFound |= addKeyOnUserInteraction(color.b, curve3Value, data.Curve3, state.ScrubberPosition); hasDifferenceBeenFound |= addKeyOnUserInteraction(color.a, curve4Value, data.Curve4, state.ScrubberPosition); } } if (hasDifferenceBeenFound) { hasUserInteracted = true; EditorUtility.SetDirty(clipCurve); } } }
public override void UpdateCurveWrappers(CinemaClipCurveWrapper clipWrapper) { CinemaMultiActorCurveClip clipCurve = clipWrapper.Behaviour as CinemaMultiActorCurveClip; if (clipCurve == null) { return; } for (int i = 0; i < clipCurve.CurveData.Count; i++) { MemberClipCurveData member = clipCurve.CurveData[i]; CinemaMemberCurveWrapper memberWrapper = null; if (!clipWrapper.TryGetValue(member.PropertyType.ToString(), member.PropertyName, out memberWrapper)) { memberWrapper = new CinemaMemberCurveWrapper(); memberWrapper.Type = member.PropertyType.ToString(); memberWrapper.PropertyName = member.PropertyName; memberWrapper.Texture = EditorGUIUtility.ObjectContent(null, UnityPropertyTypeInfo.GetUnityType(member.Type)).image; ArrayUtility.Add <CinemaMemberCurveWrapper>(ref clipWrapper.MemberCurves, memberWrapper); int showingCurves = UnityPropertyTypeInfo.GetCurveCount(member.PropertyType); memberWrapper.AnimationCurves = new CinemaAnimationCurveWrapper[showingCurves]; for (int j = 0; j < showingCurves; j++) { memberWrapper.AnimationCurves[j] = new CinemaAnimationCurveWrapper(); memberWrapper.AnimationCurves[j].Id = j; memberWrapper.AnimationCurves[j].Curve = member.GetCurve(j); memberWrapper.AnimationCurves[j].Color = UnityPropertyTypeInfo.GetCurveColor(j); memberWrapper.AnimationCurves[j].Label = UnityPropertyTypeInfo.GetCurveName(member.PropertyType, j); } } } // Remove missing track items List <CinemaMemberCurveWrapper> itemRemovals = new List <CinemaMemberCurveWrapper>(); { // foreach(var cw in clipWrapper.MemberCurves) var __enumerator1 = (clipWrapper.MemberCurves).GetEnumerator(); while (__enumerator1.MoveNext()) { var cw = (CinemaMemberCurveWrapper)__enumerator1.Current; { bool found = false; { // foreach(var member in clipCurve.CurveData) var __enumerator3 = (clipCurve.CurveData).GetEnumerator(); while (__enumerator3.MoveNext()) { var member = (MemberClipCurveData)__enumerator3.Current; { if (member.PropertyType.ToString() == cw.Type && member.PropertyName == cw.PropertyName) { found = true; break; } } } } if (!found) { itemRemovals.Add(cw); } } } } { var __list2 = itemRemovals; var __listCount2 = __list2.Count; for (int __i2 = 0; __i2 < __listCount2; ++__i2) { var item = (CinemaMemberCurveWrapper)__list2[__i2]; { ArrayUtility.Remove <CinemaMemberCurveWrapper>(ref clipWrapper.MemberCurves, item); } } } }
public override void UpdateCurveWrappers(CinemaClipCurveWrapper clipWrapper) { CinemaClipCurve clipCurve = clipWrapper.Behaviour as CinemaClipCurve; if (clipCurve == null) { return; } for (int i = 0; i < clipCurve.CurveData.Count; i++) { MemberClipCurveData member = clipCurve.CurveData[i]; CinemaMemberCurveWrapper memberWrapper = null; if (!clipWrapper.TryGetValue(member.Type, member.PropertyName, out memberWrapper)) { memberWrapper = new CinemaMemberCurveWrapper(); memberWrapper.Type = member.Type; memberWrapper.PropertyName = member.PropertyName; memberWrapper.Texture = EditorGUIUtility.ObjectContent(null, UnityPropertyTypeInfo.GetUnityType(member.Type)).image; ArrayUtility.Add <CinemaMemberCurveWrapper>(ref clipWrapper.MemberCurves, memberWrapper); int showingCurves = UnityPropertyTypeInfo.GetCurveCount(member.PropertyType); memberWrapper.AnimationCurves = new CinemaAnimationCurveWrapper[showingCurves]; for (int j = 0; j < showingCurves; j++) { memberWrapper.AnimationCurves[j] = new CinemaAnimationCurveWrapper(); memberWrapper.AnimationCurves[j].Id = j; memberWrapper.AnimationCurves[j].Curve = new AnimationCurve(member.GetCurve(j).keys); // Make a deep copy. memberWrapper.AnimationCurves[j].Label = UnityPropertyTypeInfo.GetCurveName(member.PropertyType, j); memberWrapper.AnimationCurves[j].Color = UnityPropertyTypeInfo.GetCurveColor(member.Type, member.PropertyName, memberWrapper.AnimationCurves[j].Label, j); } } else { int showingCurves = UnityPropertyTypeInfo.GetCurveCount(member.PropertyType); for (int j = 0; j < showingCurves; j++) { memberWrapper.AnimationCurves[j].Curve = new AnimationCurve(member.GetCurve(j).keys); // Make a deep copy. } } } // Remove missing track items List <CinemaMemberCurveWrapper> itemRemovals = new List <CinemaMemberCurveWrapper>(); for (int i = 0; i < clipWrapper.MemberCurves.Length; i++) { CinemaMemberCurveWrapper cw = clipWrapper.MemberCurves[i]; bool found = false; for (int j = 0; j < clipCurve.CurveData.Count; j++) { MemberClipCurveData member = clipCurve.CurveData[j]; if (member.Type == cw.Type && member.PropertyName == cw.PropertyName) { found = true; break; } } if (!found) { itemRemovals.Add(cw); } } for (int i = 0; i < itemRemovals.Count; i++) { ArrayUtility.Remove <CinemaMemberCurveWrapper>(ref clipWrapper.MemberCurves, itemRemovals[i]); } }
public void OnSceneGUI() { CinemaActorClipCurve clipCurveGameObject = (target as CinemaActorClipCurve); for (int i = 0; i < clipCurveGameObject.CurveData.Count; i++) { MemberClipCurveData data = clipCurveGameObject.CurveData[i]; if (data.Type == "Transform" && data.PropertyName == "localPosition") { HandlesUtility.DrawCurvePath(data.Curve1, data.Curve2, data.Curve3); /* for (int j = 0; j < data.Curve1.keys.Length - 1; j++) * { * //AnimationUtility.SetKeyLeftTangentMode(data.Curve1, j, AnimationUtility.TangentMode.Linear); * Keyframe key1x = data.Curve1.keys[j]; * Keyframe key1y = data.Curve2.keys[j]; * Keyframe key1z = data.Curve3.keys[j]; * Keyframe key2x = data.Curve1.keys[j + 1]; * Keyframe key2y = data.Curve2.keys[j + 1]; * Keyframe key2z = data.Curve3.keys[j + 1]; * * Vector3 position = new Vector3(key1x.value, key1y.value, key1z.value); * Vector3 inTangent1 = new Vector3(key1x.inTangent, key1y.inTangent, key1z.inTangent); * Vector3 outTangent1 = new Vector3(key1x.outTangent, key1y.outTangent, key1z.outTangent); * * Vector3 position2 = new Vector3(key2x.value, key2y.value, key2z.value); * Vector3 inTangent2 = new Vector3(key2x.inTangent, key2y.inTangent, key2z.inTangent); * Vector3 outTangent2 = new Vector3(key2x.outTangent, key2y.outTangent, key2z.outTangent); * * float handleSize = HandlesUtility.GetHandleSize(position); * Handles.Label(position + new Vector3(0.25f * handleSize, 0.0f * handleSize, 0.0f * handleSize), j.ToString()); * * Vector3 nPosition = HandlesUtility.PositionHandle(position, Quaternion.identity); * if (position != nPosition) * { * Keyframe nkey1 = new Keyframe(data.Curve1.keys[j].time, nPosition.x); * data.Curve1.MoveKey(j, nkey1); * Keyframe nkey2 = new Keyframe(data.Curve2.keys[j].time, nPosition.y); * data.Curve2.MoveKey(j, nkey2); * Keyframe nkey3 = new Keyframe(data.Curve3.keys[j].time, nPosition.z); * data.Curve3.MoveKey(j, nkey3); * } * if (j == data.Curve1.length - 2) * { * Vector3 nPosition2 = HandlesUtility.PositionHandle(position2, Quaternion.identity); * float handleSize2 = HandlesUtility.GetHandleSize(position2); * Handles.Label(position2 + new Vector3(0.25f * handleSize2, 0.0f * handleSize2, 0.0f * handleSize2), (j+1).ToString()); * * if (position2 != nPosition2) * { * Keyframe nkey1 = new Keyframe(data.Curve1.keys[j+1].time, nPosition2.x); * data.Curve1.MoveKey(j + 1, nkey1); * Keyframe nkey2 = new Keyframe(data.Curve2.keys[j + 1].time, nPosition2.y); * data.Curve2.MoveKey(j + 1, nkey2); * Keyframe nkey3 = new Keyframe(data.Curve3.keys[j + 1].time, nPosition2.z); * data.Curve3.MoveKey(j + 1, nkey3); * } * } * * Vector3 ninTangent1 = HandlesUtility.TangentHandle(inTangent1 + position); * if (inTangent1 != ninTangent1) * { * Keyframe ok1= data.Curve1.keys[j]; * Keyframe nkey1 = new Keyframe(ok1.time, ok1.value, ninTangent1.x - ok1.value, ok1.outTangent); * data.Curve1.MoveKey(j, nkey1); * Keyframe ok2 = data.Curve2.keys[j]; * Keyframe nkey2 = new Keyframe(ok2.time, ok2.value, ninTangent1.y - ok2.value, ok2.outTangent); * data.Curve2.MoveKey(j, nkey2); * Keyframe ok3 = data.Curve3.keys[j]; * Keyframe nkey3 = new Keyframe(ok3.time, ok3.value, ninTangent1.z - ok3.value, ok3.outTangent); * data.Curve3.MoveKey(j, nkey3); * } * * float time1 = data.Curve1.keys[j].time; * float time2 = data.Curve1.keys[j +1].time; * int N = 20; * float gap = (time2 - time1) / N; * * for (float t = time1; t < time2; t += gap) * { * Vector3 dposition = new Vector3(data.Curve1.Evaluate(t), data.Curve2.Evaluate(t), data.Curve3.Evaluate(t)); * Vector3 dposition2 = new Vector3(data.Curve1.Evaluate(t + gap), data.Curve2.Evaluate(t + gap), data.Curve3.Evaluate(t + gap)); * Handles.color = Color.red; * Handles.DrawLine(dposition, dposition2); * Handles.color = Color.white; * } * * }*/ } } }
private void checkToAddNewKeyframes(CinemaActorClipCurve clipCurve, DirectorControlState state) { if (state.IsInPreviewMode && IsEditing && clipCurve.Cutscene.State == Cutscene.CutsceneState.Paused && GUIUtility.hotControl == 0 && (clipCurve.Firetime <= state.ScrubberPosition && state.ScrubberPosition <= clipCurve.Firetime + clipCurve.Duration) && clipCurve.Actor != null) { Undo.RecordObject(clipCurve, "Auto Key Created"); bool hasDifferenceBeenFound = false; for (int i = 0; i < clipCurve.CurveData.Count; i++) { MemberClipCurveData data = clipCurve.CurveData[i]; if (data.Type == string.Empty || data.PropertyName == string.Empty) { continue; } Component component = clipCurve.Actor.GetComponent(data.Type); object value = null; //Specific hard-coded fix for the Rotation Curve Issue. currentlyEditingRotation = data.PropertyName == "localEulerAngles"; #if UNITY_2017_2_OR_NEWER if (component != null) { Type type = component.GetType(); if (data.IsProperty) { // Deal with a special case, use the new TransformUtils to get the rotation value from the editor field. if (type == typeof(Transform) && data.PropertyName == "localEulerAngles") { value = UnityEditor.TransformUtils.GetInspectorRotation(component.transform); // TransformUtils added in 2017.2 } else { value = clipCurve.GetCurrentValue(component, data.PropertyName, data.IsProperty); } } } #else value = clipCurve.GetCurrentValue(component, data.PropertyName, data.IsProperty); #endif PropertyTypeInfo typeInfo = data.PropertyType; if (typeInfo == PropertyTypeInfo.Int || typeInfo == PropertyTypeInfo.Long) { float curve1Value = data.Curve1.Evaluate(state.ScrubberPosition); hasDifferenceBeenFound |= addKeyOnUserInteraction(Convert.ToInt32(value), curve1Value, data.Curve1, state.ScrubberPosition); } else if (typeInfo == PropertyTypeInfo.Float || typeInfo == PropertyTypeInfo.Double) { float curve1Value = data.Curve1.Evaluate(state.ScrubberPosition); hasDifferenceBeenFound |= addKeyOnUserInteraction(Convert.ToSingle(value), curve1Value, data.Curve1, state.ScrubberPosition); } else if (typeInfo == PropertyTypeInfo.Vector2) { Vector2 vec2 = (Vector2)value; float curve1Value = data.Curve1.Evaluate(state.ScrubberPosition); float curve2Value = data.Curve2.Evaluate(state.ScrubberPosition); hasDifferenceBeenFound |= addKeyOnUserInteraction(vec2.x, curve1Value, data.Curve1, state.ScrubberPosition); hasDifferenceBeenFound |= addKeyOnUserInteraction(vec2.y, curve2Value, data.Curve2, state.ScrubberPosition); } else if (typeInfo == PropertyTypeInfo.Vector3) { //Special check for rotations if (!currentlyEditingRotation || (currentlyEditingRotation && clipCurve.Actor.transform.hasChanged)) { Vector3 vec3 = (Vector3)value; float curve1Value = data.Curve1.Evaluate(state.ScrubberPosition); float curve2Value = data.Curve2.Evaluate(state.ScrubberPosition); float curve3Value = data.Curve3.Evaluate(state.ScrubberPosition); hasDifferenceBeenFound |= addKeyOnUserInteraction(vec3.x, curve1Value, data.Curve1, state.ScrubberPosition); hasDifferenceBeenFound |= addKeyOnUserInteraction(vec3.y, curve2Value, data.Curve2, state.ScrubberPosition); hasDifferenceBeenFound |= addKeyOnUserInteraction(vec3.z, curve3Value, data.Curve3, state.ScrubberPosition); } } else if (typeInfo == PropertyTypeInfo.Vector4) { Vector4 vec4 = (Vector4)value; float curve1Value = data.Curve1.Evaluate(state.ScrubberPosition); float curve2Value = data.Curve2.Evaluate(state.ScrubberPosition); float curve3Value = data.Curve3.Evaluate(state.ScrubberPosition); float curve4Value = data.Curve4.Evaluate(state.ScrubberPosition); hasDifferenceBeenFound |= addKeyOnUserInteraction(vec4.x, curve1Value, data.Curve1, state.ScrubberPosition); hasDifferenceBeenFound |= addKeyOnUserInteraction(vec4.y, curve2Value, data.Curve2, state.ScrubberPosition); hasDifferenceBeenFound |= addKeyOnUserInteraction(vec4.z, curve3Value, data.Curve3, state.ScrubberPosition); hasDifferenceBeenFound |= addKeyOnUserInteraction(vec4.w, curve4Value, data.Curve4, state.ScrubberPosition); } else if (typeInfo == PropertyTypeInfo.Quaternion) { Quaternion quaternion = (Quaternion)value; float curve1Value = data.Curve1.Evaluate(state.ScrubberPosition); float curve2Value = data.Curve2.Evaluate(state.ScrubberPosition); float curve3Value = data.Curve3.Evaluate(state.ScrubberPosition); float curve4Value = data.Curve4.Evaluate(state.ScrubberPosition); for (int j = 0; j < data.Curve1.length; j++) { Keyframe k = data.Curve1[j]; if (k.time == state.ScrubberPosition) { Keyframe newKeyframe = new Keyframe(k.time, quaternion.x, k.inTangent, k.outTangent); newKeyframe.tangentMode = k.tangentMode; AnimationCurveHelper.MoveKey(data.Curve1, j, newKeyframe); } } for (int j = 0; j < data.Curve2.length; j++) { Keyframe k = data.Curve2[j]; if (k.time == state.ScrubberPosition) { Keyframe newKeyframe = new Keyframe(k.time, quaternion.y, k.inTangent, k.outTangent); newKeyframe.tangentMode = k.tangentMode; AnimationCurveHelper.MoveKey(data.Curve2, j, newKeyframe); } } for (int j = 0; j < data.Curve3.length; j++) { Keyframe k = data.Curve3[j]; if (k.time == state.ScrubberPosition) { Keyframe newKeyframe = new Keyframe(k.time, quaternion.z, k.inTangent, k.outTangent); newKeyframe.tangentMode = k.tangentMode; AnimationCurveHelper.MoveKey(data.Curve3, j, newKeyframe); } } for (int j = 0; j < data.Curve4.length; j++) { Keyframe k = data.Curve4[j]; if (k.time == state.ScrubberPosition) { Keyframe newKeyframe = new Keyframe(k.time, quaternion.w, k.inTangent, k.outTangent); newKeyframe.tangentMode = k.tangentMode; AnimationCurveHelper.MoveKey(data.Curve4, j, newKeyframe); } } Quaternion curveValue = new Quaternion(curve1Value, curve2Value, curve3Value, curve4Value); float angle = Vector3.Angle(quaternion.eulerAngles, curveValue.eulerAngles); hasDifferenceBeenFound = hasDifferenceBeenFound || angle > QUATERNION_THRESHOLD; if (angle > QUATERNION_THRESHOLD && hasUserInteracted) { data.Curve1.AddKey(state.ScrubberPosition, quaternion.x); data.Curve2.AddKey(state.ScrubberPosition, quaternion.y); data.Curve3.AddKey(state.ScrubberPosition, quaternion.z); data.Curve4.AddKey(state.ScrubberPosition, quaternion.w); hasUserInteracted = true; } } else if (typeInfo == PropertyTypeInfo.Color) { Color color = (Color)value; float curve1Value = data.Curve1.Evaluate(state.ScrubberPosition); float curve2Value = data.Curve2.Evaluate(state.ScrubberPosition); float curve3Value = data.Curve3.Evaluate(state.ScrubberPosition); float curve4Value = data.Curve4.Evaluate(state.ScrubberPosition); hasDifferenceBeenFound |= addKeyOnUserInteraction(color.r, curve1Value, data.Curve1, state.ScrubberPosition); hasDifferenceBeenFound |= addKeyOnUserInteraction(color.g, curve2Value, data.Curve2, state.ScrubberPosition); hasDifferenceBeenFound |= addKeyOnUserInteraction(color.b, curve3Value, data.Curve3, state.ScrubberPosition); hasDifferenceBeenFound |= addKeyOnUserInteraction(color.a, curve4Value, data.Curve4, state.ScrubberPosition); } } if (hasDifferenceBeenFound) { hasUserInteracted = true; EditorUtility.SetDirty(clipCurve); } } }