Skip to content

Commit

Permalink
Merge pull request #1065 from anatawa12/fix-merge-blendtree-mmd
Browse files Browse the repository at this point in the history
fix: merge BlendTree can break mmd compatibility
  • Loading branch information
anatawa12 authored May 10, 2024
2 parents 3c3fff8 + cac0f90 commit ad20be1
Show file tree
Hide file tree
Showing 6 changed files with 73 additions and 88 deletions.
1 change: 1 addition & 0 deletions CHANGELOG-PRERELEASE.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ The format is based on [Keep a Changelog].

### Fixed
- Mesh preview may cause empty mesh on enter play mode if reload scene is disabled [`#1064`](https://github.com/anatawa12/AvatarOptimizer/pull/1064)
- MMD Compatibility can be broken with Merge BlendTree Layers `#1065`

### Security

Expand Down
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ The format is based on [Keep a Changelog].

### Fixed
- Mesh preview may cause empty mesh on enter play mode if reload scene is disabled [`#1064`](https://github.com/anatawa12/AvatarOptimizer/pull/1064)
- MMD Compatibility can be broken with Merge BlendTree Layers `#1065`

### Security

Expand Down
17 changes: 8 additions & 9 deletions Internal/AnimatorOptimizer/MergeBlendTreeLayer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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];

Expand Down Expand Up @@ -64,12 +64,12 @@ 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 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;
Expand All @@ -89,10 +89,9 @@ public static void Execute(AOAnimatorController controller)
}

// clear original layers
foreach (var (layerIndex, _) in directBlendTrees)
foreach (var (layerIndex, _) in directBlendTrees.SkipLast(1))
{
// 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<ChildAnimatorState>();
layer.stateMachine.defaultState = null;
layer.defaultWeight = 0f;
Expand Down
40 changes: 12 additions & 28 deletions Internal/AnimatorOptimizer/Wrappers.cs
Original file line number Diff line number Diff line change
Expand Up @@ -50,33 +50,7 @@ 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;
}
// Note: Adding layer to first will break MMD compatibility.

public AOAnimatorControllerLayer AddLayer(string layerName)
{
Expand Down Expand Up @@ -137,7 +111,17 @@ 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;
if (Layer.stateMachine) Layer.stateMachine.name = value;
_parent.UpdateLayers();
}
}

public AvatarMask? avatarMask => Layer.avatarMask;
// ReSharper restore InconsistentNaming

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
Expand Down Expand Up @@ -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}
Expand All @@ -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}
Expand Down Expand Up @@ -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}
Expand All @@ -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}
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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: []
Expand All @@ -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
Expand Down Expand Up @@ -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}
Expand Down

0 comments on commit ad20be1

Please sign in to comment.