diff --git a/UnitTests~/Animation/AnimationDatabaseCloning.meta b/UnitTests~/Animation/AnimationDatabaseCloning.meta new file mode 100644 index 00000000..164f095c --- /dev/null +++ b/UnitTests~/Animation/AnimationDatabaseCloning.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 95d3991b4f748854ba65633263a5f186 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/UnitTests~/Animation/AnimationDatabaseCloning/AnimationDatabaseCloningTest.cs b/UnitTests~/Animation/AnimationDatabaseCloning/AnimationDatabaseCloningTest.cs new file mode 100644 index 00000000..42f82d88 --- /dev/null +++ b/UnitTests~/Animation/AnimationDatabaseCloning/AnimationDatabaseCloningTest.cs @@ -0,0 +1,58 @@ +using System.Collections; +using System.Collections.Generic; +using modular_avatar_tests; +using nadena.dev.modular_avatar.animation; +using nadena.dev.ndmf; +using NUnit.Framework; +using UnityEditor.Animations; +using UnityEngine; + + +namespace _ModularAvatar.EditModeTests +{ + public class AnimationDatabaseCloningTest : TestBase + { + [Test] + public void TestAnimationDatabaseCloningLogic() + { + var root = CreateRoot("root"); + var context = CreateContext(root); + + var origController = LoadAsset("ac.controller"); + var state = origController.layers[0].stateMachine.defaultState; + var clonedState = Object.Instantiate(state); + + var origAnimation = LoadAsset("anim.anim"); + + using (new ObjectRegistryScope(new ObjectRegistry(root.transform))) + { + var db = new AnimationDatabase(); + db.OnActivate(context); + db.RegisterState(clonedState); + + var newBlendTree = clonedState.motion as BlendTree; + var origBlendTree = state.motion as BlendTree; + + Assert.NotNull(newBlendTree); + Assert.NotNull(origBlendTree); + + Assert.AreNotSame(newBlendTree, origBlendTree); + Assert.AreNotSame(newBlendTree.children[1].motion, origBlendTree.children[1].motion); + + // Before commit, proxy animations are replaced. + Assert.AreNotSame(newBlendTree.children[0].motion, origBlendTree.children[0].motion); + + Assert.AreSame(ObjectRegistry.GetReference(origAnimation), + ObjectRegistry.GetReference(newBlendTree.children[1].motion)); + + db.Commit(); + + Assert.AreNotSame(newBlendTree, origBlendTree); + Assert.AreNotSame(newBlendTree.children[1].motion, origBlendTree.children[1].motion); + + // After commit, proxy animations are restored to the original assets. + Assert.AreSame(newBlendTree.children[0].motion, origBlendTree.children[0].motion); + } + } + } +} \ No newline at end of file diff --git a/UnitTests~/Animation/AnimationDatabaseCloning/AnimationDatabaseCloningTest.cs.meta b/UnitTests~/Animation/AnimationDatabaseCloning/AnimationDatabaseCloningTest.cs.meta new file mode 100644 index 00000000..d8bd5575 --- /dev/null +++ b/UnitTests~/Animation/AnimationDatabaseCloning/AnimationDatabaseCloningTest.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: d86c7d257d78fff4d8fdf56e2954a5c9 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/UnitTests~/Animation/AnimationDatabaseCloning/ac.controller b/UnitTests~/Animation/AnimationDatabaseCloning/ac.controller new file mode 100644 index 00000000..1b8ee610 --- /dev/null +++ b/UnitTests~/Animation/AnimationDatabaseCloning/ac.controller @@ -0,0 +1,109 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1107 &-6893063848705454272 +AnimatorStateMachine: + serializedVersion: 6 + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Base Layer + m_ChildStates: + - serializedVersion: 1 + m_State: {fileID: -756388900498452404} + m_Position: {x: 266, y: 190, z: 0} + m_ChildStateMachines: [] + m_AnyStateTransitions: [] + m_EntryTransitions: [] + m_StateMachineTransitions: {} + m_StateMachineBehaviours: [] + m_AnyStatePosition: {x: 50, y: 20, z: 0} + m_EntryPosition: {x: 50, y: 120, z: 0} + m_ExitPosition: {x: 800, y: 120, z: 0} + m_ParentStateMachinePosition: {x: 800, y: 20, z: 0} + m_DefaultState: {fileID: -756388900498452404} +--- !u!1102 &-756388900498452404 +AnimatorState: + serializedVersion: 6 + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Blend Tree + m_Speed: 1 + m_CycleOffset: 0 + m_Transitions: [] + m_StateMachineBehaviours: [] + m_Position: {x: 50, y: 50, z: 0} + m_IKOnFeet: 0 + m_WriteDefaultValues: 1 + m_Mirror: 0 + m_SpeedParameterActive: 0 + m_MirrorParameterActive: 0 + m_CycleOffsetParameterActive: 0 + m_TimeParameterActive: 0 + m_Motion: {fileID: 3644920549707694882} + m_Tag: + m_SpeedParameter: + m_MirrorParameter: + m_CycleOffsetParameter: + m_TimeParameter: +--- !u!91 &9100000 +AnimatorController: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: ac + serializedVersion: 5 + m_AnimatorParameters: + - m_Name: Blend + m_Type: 1 + m_DefaultFloat: 0 + m_DefaultInt: 0 + m_DefaultBool: 0 + m_Controller: {fileID: 0} + m_AnimatorLayers: + - serializedVersion: 5 + m_Name: Base Layer + m_StateMachine: {fileID: -6893063848705454272} + m_Mask: {fileID: 0} + m_Motions: [] + m_Behaviours: [] + m_BlendingMode: 0 + m_SyncedLayerIndex: -1 + m_DefaultWeight: 0 + m_IKPass: 0 + m_SyncedLayerAffectsTiming: 0 + m_Controller: {fileID: 9100000} +--- !u!206 &3644920549707694882 +BlendTree: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Blend Tree + m_Childs: + - serializedVersion: 2 + m_Motion: {fileID: 7400000, guid: 4cf06429686164a45adaedb6a6e520a5, type: 2} + m_Threshold: 0 + m_Position: {x: 0, y: 0} + m_TimeScale: 1 + m_CycleOffset: 0 + m_DirectBlendParameter: Blend + m_Mirror: 0 + - serializedVersion: 2 + m_Motion: {fileID: 7400000, guid: c92d9c90fcea2a242a7d91407f734597, type: 2} + m_Threshold: 1 + m_Position: {x: 0, y: 0} + m_TimeScale: 1 + m_CycleOffset: 0 + m_DirectBlendParameter: Blend + m_Mirror: 0 + m_BlendParameter: Blend + m_BlendParameterY: Blend + m_MinThreshold: 0 + m_MaxThreshold: 1 + m_UseAutomaticThresholds: 1 + m_NormalizedBlendValues: 0 + m_BlendType: 0 diff --git a/UnitTests~/Animation/AnimationDatabaseCloning/ac.controller.meta b/UnitTests~/Animation/AnimationDatabaseCloning/ac.controller.meta new file mode 100644 index 00000000..c751bdee --- /dev/null +++ b/UnitTests~/Animation/AnimationDatabaseCloning/ac.controller.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: b53a1c2e299efbc4fae28295fb13512f +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 9100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/UnitTests~/Animation/AnimationDatabaseCloning/anim.anim b/UnitTests~/Animation/AnimationDatabaseCloning/anim.anim new file mode 100644 index 00000000..b95f8e6c --- /dev/null +++ b/UnitTests~/Animation/AnimationDatabaseCloning/anim.anim @@ -0,0 +1,53 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!74 &7400000 +AnimationClip: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: anim + serializedVersion: 6 + m_Legacy: 0 + m_Compressed: 0 + m_UseHighQualityCurve: 1 + m_RotationCurves: [] + m_CompressedRotationCurves: [] + m_EulerCurves: [] + m_PositionCurves: [] + m_ScaleCurves: [] + m_FloatCurves: [] + m_PPtrCurves: [] + m_SampleRate: 60 + m_WrapMode: 0 + m_Bounds: + m_Center: {x: 0, y: 0, z: 0} + m_Extent: {x: 0, y: 0, z: 0} + m_ClipBindingConstant: + genericBindings: [] + pptrCurveMapping: [] + m_AnimationClipSettings: + serializedVersion: 2 + m_AdditiveReferencePoseClip: {fileID: 0} + m_AdditiveReferencePoseTime: 0 + m_StartTime: 0 + m_StopTime: 1 + m_OrientationOffsetY: 0 + m_Level: 0 + m_CycleOffset: 0 + m_HasAdditiveReferencePose: 0 + m_LoopTime: 0 + m_LoopBlend: 0 + m_LoopBlendOrientation: 0 + m_LoopBlendPositionY: 0 + m_LoopBlendPositionXZ: 0 + m_KeepOriginalOrientation: 0 + m_KeepOriginalPositionY: 1 + m_KeepOriginalPositionXZ: 0 + m_HeightFromFeet: 0 + m_Mirror: 0 + m_EditorCurves: [] + m_EulerEditorCurves: [] + m_HasGenericRootTransform: 0 + m_HasMotionFloatCurves: 0 + m_Events: [] diff --git a/UnitTests~/Animation/AnimationDatabaseCloning/anim.anim.meta b/UnitTests~/Animation/AnimationDatabaseCloning/anim.anim.meta new file mode 100644 index 00000000..8649f91a --- /dev/null +++ b/UnitTests~/Animation/AnimationDatabaseCloning/anim.anim.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: c92d9c90fcea2a242a7d91407f734597 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 7400000 + userData: + assetBundleName: + assetBundleVariant: