From e36cccab45aa44c598ef212150a74675cbfa19bb Mon Sep 17 00:00:00 2001 From: anatawa12 Date: Fri, 10 May 2024 09:04:51 +0900 Subject: [PATCH 1/5] Revert "fix(merge-blendtree-layers): imators depends on wd off behavior broken" This reverts commit affe339436db354fe8db6acd438fb22f162f7cf0. --- .../AnimatorOptimizer/MergeBlendTreeLayer.cs | 8 ++---- Internal/AnimatorOptimizer/Wrappers.cs | 28 ------------------- 2 files changed, 3 insertions(+), 33 deletions(-) diff --git a/Internal/AnimatorOptimizer/MergeBlendTreeLayer.cs b/Internal/AnimatorOptimizer/MergeBlendTreeLayer.cs index e892ad20f..04ff4f86d 100644 --- a/Internal/AnimatorOptimizer/MergeBlendTreeLayer.cs +++ b/Internal/AnimatorOptimizer/MergeBlendTreeLayer.cs @@ -26,7 +26,7 @@ public static void Execute(AOAnimatorController controller) var alwaysOneParameter = $"AAO_AlwaysOne_{Guid.NewGuid()}"; - for (var i = 0; i < controller.layers.Length; i++) + for (var i = controller.layers.Length - 1; i >= 0; i--) { var layer = controller.layers[i]; @@ -64,8 +64,7 @@ public static void Execute(AOAnimatorController controller) directBlendTrees.Reverse(); // create merged layer - // Note: adding wd=on layer to end can break animators depends on wd=off behavior so we insert it to the first - var newLayer = controller.AddLayerFirst("Merged Direct BlendTrees"); + var newLayer = controller.AddLayer("Merged Direct BlendTrees"); var newState = new AnimatorState { name = "Merged Direct BlendTrees" }; newLayer.stateMachine!.states = new[] { new ChildAnimatorState { state = newState } }; newLayer.stateMachine.defaultState = newState; @@ -91,8 +90,7 @@ public static void Execute(AOAnimatorController controller) // clear original layers foreach (var (layerIndex, _) in directBlendTrees) { - // one offset because we inserted new layer to first - var layer = controller.layers[layerIndex + 1]; + var layer = controller.layers[layerIndex]; layer.stateMachine!.states = Array.Empty(); layer.stateMachine.defaultState = null; layer.defaultWeight = 0f; diff --git a/Internal/AnimatorOptimizer/Wrappers.cs b/Internal/AnimatorOptimizer/Wrappers.cs index fe087a91a..56d3fe4bc 100644 --- a/Internal/AnimatorOptimizer/Wrappers.cs +++ b/Internal/AnimatorOptimizer/Wrappers.cs @@ -50,34 +50,6 @@ public void SetLayersUnsafe(AOAnimatorControllerLayer[] layers) UpdateLayers(); } - public AOAnimatorControllerLayer AddLayerFirst(string layerName) - { - var layer = new AnimatorControllerLayer - { - name = layerName, - stateMachine = new AnimatorStateMachine - { - name = layerName, - hideFlags = HideFlags.HideInHierarchy - } - }; - var wrappedLayer = new AOAnimatorControllerLayer(this, layer); - wrappedLayer.IsBaseLayer = true; - - // update our layers - var wrappedLayers = layers; - for (var i = 0; i < wrappedLayers.Length; i++) - wrappedLayers[i].OnLayerIndexUpdated(i + 1); - ArrayUtility.Insert(ref wrappedLayers, 0, wrappedLayer); - layers = wrappedLayers; - - UpdateLayers(); - layers[1].IsBaseLayer = false; - layers[1].defaultWeight = 1; // previous default layer - - return wrappedLayer; - } - public AOAnimatorControllerLayer AddLayer(string layerName) { var layer = new AnimatorControllerLayer From 0472b4cc3c0218151b03e25f839f58183e029483 Mon Sep 17 00:00:00 2001 From: anatawa12 Date: Fri, 10 May 2024 09:21:14 +0900 Subject: [PATCH 2/5] fix: MergeBlendTreeLayers may break WD off behavior again --- Internal/AnimatorOptimizer/MergeBlendTreeLayer.cs | 11 ++++++----- Internal/AnimatorOptimizer/Wrappers.cs | 13 ++++++++++++- 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/Internal/AnimatorOptimizer/MergeBlendTreeLayer.cs b/Internal/AnimatorOptimizer/MergeBlendTreeLayer.cs index 04ff4f86d..00c36acbc 100644 --- a/Internal/AnimatorOptimizer/MergeBlendTreeLayer.cs +++ b/Internal/AnimatorOptimizer/MergeBlendTreeLayer.cs @@ -64,11 +64,12 @@ public static void Execute(AOAnimatorController controller) directBlendTrees.Reverse(); // create merged layer - var newLayer = controller.AddLayer("Merged Direct BlendTrees"); + var theLayer = controller.layers[directBlendTrees.Last().layerIndex]; + theLayer.name = "AAO BlendTree MergedLayer"; var newState = new AnimatorState { name = "Merged Direct BlendTrees" }; - newLayer.stateMachine!.states = new[] { new ChildAnimatorState { state = newState } }; - newLayer.stateMachine.defaultState = newState; - newLayer.defaultWeight = 1f; + theLayer.stateMachine!.states = new[] { new ChildAnimatorState { state = newState } }; + theLayer.stateMachine.defaultState = newState; + theLayer.defaultWeight = 1f; var newBlendTree = new BlendTree() { name = "Merged Direct BlendTrees" }; newState.motion = newBlendTree; @@ -88,7 +89,7 @@ public static void Execute(AOAnimatorController controller) } // clear original layers - foreach (var (layerIndex, _) in directBlendTrees) + foreach (var (layerIndex, _) in directBlendTrees.SkipLast(1)) { var layer = controller.layers[layerIndex]; layer.stateMachine!.states = Array.Empty(); diff --git a/Internal/AnimatorOptimizer/Wrappers.cs b/Internal/AnimatorOptimizer/Wrappers.cs index 56d3fe4bc..9ef605771 100644 --- a/Internal/AnimatorOptimizer/Wrappers.cs +++ b/Internal/AnimatorOptimizer/Wrappers.cs @@ -50,6 +50,8 @@ public void SetLayersUnsafe(AOAnimatorControllerLayer[] layers) UpdateLayers(); } + // Note: Adding layer to first will break MMD compatibility. + public AOAnimatorControllerLayer AddLayer(string layerName) { var layer = new AnimatorControllerLayer @@ -109,7 +111,16 @@ public float defaultWeight public int syncedLayerIndex => Layer.syncedLayerIndex; public AnimatorStateMachine? stateMachine => Layer.stateMachine ? Layer.stateMachine : null; - public string name => Layer.name; + public string name + { + get => Layer.name; + set + { + Layer.name = value; + _parent.UpdateLayers(); + } + } + public AvatarMask? avatarMask => Layer.avatarMask; // ReSharper restore InconsistentNaming From d6565c34c4d7507a4ad790f6d81a259b22238f8c Mon Sep 17 00:00:00 2001 From: anatawa12 Date: Fri, 10 May 2024 09:28:08 +0900 Subject: [PATCH 3/5] fix: statemachine name not updated --- Internal/AnimatorOptimizer/Wrappers.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/Internal/AnimatorOptimizer/Wrappers.cs b/Internal/AnimatorOptimizer/Wrappers.cs index 9ef605771..f44ba4ea7 100644 --- a/Internal/AnimatorOptimizer/Wrappers.cs +++ b/Internal/AnimatorOptimizer/Wrappers.cs @@ -117,6 +117,7 @@ public string name set { Layer.name = value; + if (Layer.stateMachine) Layer.stateMachine.name = value; _parent.UpdateLayers(); } } From af0d33ec012be4127ba00b4ad4d121772320ebfd Mon Sep 17 00:00:00 2001 From: anatawa12 Date: Fri, 10 May 2024 09:29:51 +0900 Subject: [PATCH 4/5] test: update test --- .../ConvertibleSimple.converted.controller | 55 ++++--------------- ...tibleSimple.meaningless-removed.controller | 47 +++++++++++++--- 2 files changed, 51 insertions(+), 51 deletions(-) diff --git a/Test~/AnimatorOptimizer/MergeBlendTreeLayer/ConvertibleSimple.converted.controller b/Test~/AnimatorOptimizer/MergeBlendTreeLayer/ConvertibleSimple.converted.controller index 1b66f9b17..43b6d9fce 100644 --- a/Test~/AnimatorOptimizer/MergeBlendTreeLayer/ConvertibleSimple.converted.controller +++ b/Test~/AnimatorOptimizer/MergeBlendTreeLayer/ConvertibleSimple.converted.controller @@ -27,14 +27,6 @@ BlendTree: m_PrefabAsset: {fileID: 0} m_Name: Merged Direct BlendTrees m_Childs: - - serializedVersion: 2 - m_Motion: {fileID: 7400000, guid: 4d0be314710bf47d381c302c53236b69, type: 2} - m_Threshold: 1 - m_Position: {x: 0, y: 0} - m_TimeScale: 1 - m_CycleOffset: 0 - m_DirectBlendParameter: Blend2 - m_Mirror: 0 - serializedVersion: 2 m_Motion: {fileID: 7400000, guid: 340d189efec154735b2257a6bb72271c, type: 2} m_Threshold: 0 @@ -51,6 +43,14 @@ BlendTree: m_CycleOffset: 0 m_DirectBlendParameter: Blend1 m_Mirror: 0 + - serializedVersion: 2 + m_Motion: {fileID: 7400000, guid: 4d0be314710bf47d381c302c53236b69, type: 2} + m_Threshold: 1 + m_Position: {x: 0, y: 0} + m_TimeScale: 1 + m_CycleOffset: 0 + m_DirectBlendParameter: Blend2 + m_Mirror: 0 m_BlendParameter: Blend m_BlendParameterY: Blend m_MinThreshold: 0 @@ -86,18 +86,6 @@ AnimatorController: m_DefaultBool: 0 m_Controller: {fileID: 9100000} m_AnimatorLayers: - - serializedVersion: 5 - m_Name: Merged Direct BlendTrees - m_StateMachine: {fileID: 5160141336614417078} - m_Mask: {fileID: 0} - m_Motions: [] - m_Behaviours: [] - m_BlendingMode: 0 - m_SyncedLayerIndex: -1 - m_DefaultWeight: 1 - m_IKPass: 0 - m_SyncedLayerAffectsTiming: 0 - m_Controller: {fileID: 9100000} - serializedVersion: 5 m_Name: Base Layer m_StateMachine: {fileID: -3392699957661001167} @@ -111,14 +99,14 @@ AnimatorController: m_SyncedLayerAffectsTiming: 0 m_Controller: {fileID: 9100000} - serializedVersion: 5 - m_Name: New Layer - m_StateMachine: {fileID: 6534715155493355450} + m_Name: AAO BlendTree MergedLayer + m_StateMachine: {fileID: 5160141336614417078} m_Mask: {fileID: 0} m_Motions: [] m_Behaviours: [] m_BlendingMode: 0 m_SyncedLayerIndex: -1 - m_DefaultWeight: 0 + m_DefaultWeight: 1 m_IKPass: 0 m_SyncedLayerAffectsTiming: 0 m_Controller: {fileID: 9100000} @@ -155,7 +143,7 @@ AnimatorStateMachine: m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_Name: Merged Direct BlendTrees + m_Name: AAO BlendTree MergedLayer m_ChildStates: - serializedVersion: 1 m_State: {fileID: 4858238717079009199} @@ -170,22 +158,3 @@ AnimatorStateMachine: m_ExitPosition: {x: 800, y: 120, z: 0} m_ParentStateMachinePosition: {x: 800, y: 20, z: 0} m_DefaultState: {fileID: 4858238717079009199} ---- !u!1107 &6534715155493355450 -AnimatorStateMachine: - serializedVersion: 6 - m_ObjectHideFlags: 1 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_Name: New Layer - m_ChildStates: [] - 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: 0} diff --git a/Test~/AnimatorOptimizer/MergeBlendTreeLayer/ConvertibleSimple.meaningless-removed.controller b/Test~/AnimatorOptimizer/MergeBlendTreeLayer/ConvertibleSimple.meaningless-removed.controller index 7f8262c60..ebc04260a 100644 --- a/Test~/AnimatorOptimizer/MergeBlendTreeLayer/ConvertibleSimple.meaningless-removed.controller +++ b/Test~/AnimatorOptimizer/MergeBlendTreeLayer/ConvertibleSimple.meaningless-removed.controller @@ -9,28 +9,28 @@ BlendTree: m_Name: Merged Direct BlendTrees m_Childs: - serializedVersion: 2 - m_Motion: {fileID: 7400000, guid: 4d0be314710bf47d381c302c53236b69, type: 2} + m_Motion: {fileID: 7400000, guid: 340d189efec154735b2257a6bb72271c, type: 2} m_Threshold: 0 m_Position: {x: 0, y: 0} m_TimeScale: 1 m_CycleOffset: 0 - m_DirectBlendParameter: Blend2 + m_DirectBlendParameter: Blend m_Mirror: 0 - serializedVersion: 2 - m_Motion: {fileID: 7400000, guid: 340d189efec154735b2257a6bb72271c, type: 2} + m_Motion: {fileID: 7400000, guid: 0415bc054d49e4dbe93cc6c935c8afe8, type: 2} m_Threshold: 0.5 m_Position: {x: 0, y: 0} m_TimeScale: 1 m_CycleOffset: 0 - m_DirectBlendParameter: Blend + m_DirectBlendParameter: Blend1 m_Mirror: 0 - serializedVersion: 2 - m_Motion: {fileID: 7400000, guid: 0415bc054d49e4dbe93cc6c935c8afe8, type: 2} + m_Motion: {fileID: 7400000, guid: 4d0be314710bf47d381c302c53236b69, type: 2} m_Threshold: 1 m_Position: {x: 0, y: 0} m_TimeScale: 1 m_CycleOffset: 0 - m_DirectBlendParameter: Blend1 + m_DirectBlendParameter: Blend2 m_Mirror: 0 m_BlendParameter: Blend m_BlendParameterY: Blend @@ -68,7 +68,19 @@ AnimatorController: m_Controller: {fileID: 9100000} m_AnimatorLayers: - serializedVersion: 5 - m_Name: Merged Direct BlendTrees + m_Name: Base Layer + m_StateMachine: {fileID: 2142392498253841847} + 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} + - serializedVersion: 5 + m_Name: AAO BlendTree MergedLayer m_StateMachine: {fileID: 5160141336614417078} m_Mask: {fileID: 0} m_Motions: [] @@ -79,6 +91,25 @@ AnimatorController: m_IKPass: 0 m_SyncedLayerAffectsTiming: 0 m_Controller: {fileID: 9100000} +--- !u!1107 &2142392498253841847 +AnimatorStateMachine: + serializedVersion: 6 + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Base Layer + m_ChildStates: [] + 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: 0} --- !u!1102 &4858238717079009199 AnimatorState: serializedVersion: 6 @@ -112,7 +143,7 @@ AnimatorStateMachine: m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_Name: Merged Direct BlendTrees + m_Name: AAO BlendTree MergedLayer m_ChildStates: - serializedVersion: 1 m_State: {fileID: 4858238717079009199} From 905fc478e7e49d00edefcbcab532ae6374b940cb Mon Sep 17 00:00:00 2001 From: anatawa12 Date: Fri, 10 May 2024 09:31:32 +0900 Subject: [PATCH 5/5] docs(changelog): MMD Compatibility can be broken with Merge BlendTree Layers --- CHANGELOG-PRERELEASE.md | 1 + CHANGELOG.md | 1 + 2 files changed, 2 insertions(+) diff --git a/CHANGELOG-PRERELEASE.md b/CHANGELOG-PRERELEASE.md index 88a060aeb..d8590a7d9 100644 --- a/CHANGELOG-PRERELEASE.md +++ b/CHANGELOG-PRERELEASE.md @@ -17,6 +17,7 @@ The format is based on [Keep a Changelog]. ### Removed ### Fixed +- MMD Compatibility can be broken with Merge BlendTree Layers `#1065` ### Security diff --git a/CHANGELOG.md b/CHANGELOG.md index c946d65a5..2c52ce431 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,7 @@ The format is based on [Keep a Changelog]. ### Removed ### Fixed +- MMD Compatibility can be broken with Merge BlendTree Layers `#1065` ### Security