Accomodate new VRCAnimatorPlayAudio requirements:

- Nodes need to know the Animator Root, so that relative paths can be resolved during the creation of State behaviours (i.e. Relative path of an AudioSource).
- Nodes need to have the ability to create a New Behaviour, even if one already exists.
This commit is contained in:
Haï~
2024-06-30 13:58:54 +02:00
parent a9e1b62818
commit 582b109a82
4 changed files with 33 additions and 12 deletions
@@ -527,7 +527,7 @@ namespace AnimatorAsCode.V1
/// NON-PUBLIC: Internal use only so that destructive workflow can access this. Maybe this can be improved /// NON-PUBLIC: Internal use only so that destructive workflow can access this. Maybe this can be improved
public AacFlLayer InternalDoCreateLayer(AnimatorController animator, string layerName) public AacFlLayer InternalDoCreateLayer(AnimatorController animator, string layerName)
{ {
var ag = new AacAnimatorGenerator(animator, CreateEmptyClip().Clip, _configuration.DefaultsProvider); var ag = new AacAnimatorGenerator(animator, CreateEmptyClip().Clip, _configuration.DefaultsProvider, _configuration.AnimatorRoot);
var machine = ag.CreateOrClearLayerAtSameIndex(layerName, 1f); var machine = ag.CreateOrClearLayerAtSameIndex(layerName, 1f);
return new AacFlLayer(animator, _configuration, machine, layerName); return new AacFlLayer(animator, _configuration, machine, layerName);
@@ -535,7 +535,7 @@ namespace AnimatorAsCode.V1
internal AacFlLayer DoCreateLayerWithoutDeleting(AnimatorController animator, string layerName) internal AacFlLayer DoCreateLayerWithoutDeleting(AnimatorController animator, string layerName)
{ {
var ag = new AacAnimatorGenerator(animator, CreateEmptyClip().Clip, _configuration.DefaultsProvider); var ag = new AacAnimatorGenerator(animator, CreateEmptyClip().Clip, _configuration.DefaultsProvider, _configuration.AnimatorRoot);
var machine = ag.CreateOrClearLayerAtSameIndex(layerName, 1f, null, false); var machine = ag.CreateOrClearLayerAtSameIndex(layerName, 1f, null, false);
return new AacFlLayer(animator, _configuration, machine, layerName); return new AacFlLayer(animator, _configuration, machine, layerName);
@@ -693,12 +693,14 @@ namespace AnimatorAsCode.V1
private readonly AnimatorController _animatorController; private readonly AnimatorController _animatorController;
private readonly AnimationClip _emptyClip; private readonly AnimationClip _emptyClip;
private readonly IAacDefaultsProvider _defaultsProvider; private readonly IAacDefaultsProvider _defaultsProvider;
private readonly Transform _animatorRoot;
internal AacAnimatorGenerator(AnimatorController animatorController, AnimationClip emptyClip, IAacDefaultsProvider defaultsProvider) internal AacAnimatorGenerator(AnimatorController animatorController, AnimationClip emptyClip, IAacDefaultsProvider defaultsProvider, Transform animatorRoot)
{ {
_animatorController = animatorController; _animatorController = animatorController;
_emptyClip = emptyClip; _emptyClip = emptyClip;
_defaultsProvider = defaultsProvider; _defaultsProvider = defaultsProvider;
_animatorRoot = animatorRoot;
} }
internal void CreateParamsAsNeeded(params AacFlParameter[] parameters) internal void CreateParamsAsNeeded(params AacFlParameter[] parameters)
@@ -755,7 +757,7 @@ namespace AnimatorAsCode.V1
} }
var layer = TryGetLayer(layerName); var layer = TryGetLayer(layerName);
var machinist = new AacFlStateMachine(layer.stateMachine, _emptyClip, new AacBackingAnimator(this), _defaultsProvider); var machinist = new AacFlStateMachine(layer.stateMachine, _emptyClip, new AacBackingAnimator(this), _defaultsProvider, _animatorRoot);
return machinist return machinist
.WithAnyStatePosition(0, 7) .WithAnyStatePosition(0, 7)
.WithEntryPosition(0, -1) .WithEntryPosition(0, -1)
@@ -790,7 +792,7 @@ namespace AnimatorAsCode.V1
_animatorController.layers = layers; _animatorController.layers = layers;
var layer = TryGetLayer(layerName); var layer = TryGetLayer(layerName);
var machinist = new AacFlStateMachine(layer.stateMachine, _emptyClip, new AacBackingAnimator(this), _defaultsProvider); var machinist = new AacFlStateMachine(layer.stateMachine, _emptyClip, new AacBackingAnimator(this), _defaultsProvider, _animatorRoot);
_defaultsProvider.ConfigureStateMachine(layer.stateMachine); _defaultsProvider.ConfigureStateMachine(layer.stateMachine);
return machinist; return machinist;
} }
@@ -13,11 +13,13 @@ namespace AnimatorAsCode.V1
{ {
protected readonly AacFlStateMachine ParentMachine; protected readonly AacFlStateMachine ParentMachine;
protected readonly IAacDefaultsProvider DefaultsProvider; protected readonly IAacDefaultsProvider DefaultsProvider;
protected readonly Transform AnimatorRoot;
protected AacAnimatorNode(AacFlStateMachine parentMachine, IAacDefaultsProvider defaultsProvider) protected AacAnimatorNode(AacFlStateMachine parentMachine, IAacDefaultsProvider defaultsProvider, Transform animatorRoot)
{ {
ParentMachine = parentMachine; ParentMachine = parentMachine;
DefaultsProvider = defaultsProvider; DefaultsProvider = defaultsProvider;
AnimatorRoot = animatorRoot;
} }
public TNode LeftOf(AacAnimatorNode otherNode) => MoveNextTo(otherNode, -1, 0); public TNode LeftOf(AacAnimatorNode otherNode) => MoveNextTo(otherNode, -1, 0);
@@ -60,6 +62,13 @@ namespace AnimatorAsCode.V1
return (TNode) this; return (TNode) this;
} }
public string ResolveRelativePath(Transform item)
{
return AacInternals.ResolveRelativePath(AnimatorRoot, item);
}
public abstract TBehaviour EnsureBehaviour<TBehaviour>() where TBehaviour : StateMachineBehaviour; public abstract TBehaviour EnsureBehaviour<TBehaviour>() where TBehaviour : StateMachineBehaviour;
public abstract TBehaviour CreateNewBehaviour<TBehaviour>() where TBehaviour : StateMachineBehaviour;
} }
} }
@@ -121,8 +121,8 @@ namespace AnimatorAsCode.V1
private readonly HashSet<string> _stateNames; private readonly HashSet<string> _stateNames;
internal AacFlStateMachine(AnimatorStateMachine machine, AnimationClip emptyClip, AacBackingAnimator backingAnimator, IAacDefaultsProvider defaultsProvider, AacFlStateMachine parent = null) internal AacFlStateMachine(AnimatorStateMachine machine, AnimationClip emptyClip, AacBackingAnimator backingAnimator, IAacDefaultsProvider defaultsProvider, Transform animatorRoot, AacFlStateMachine parent = null)
: base(parent, defaultsProvider) : base(parent, defaultsProvider, animatorRoot)
{ {
Machine = machine; Machine = machine;
_emptyClip = emptyClip; _emptyClip = emptyClip;
@@ -151,7 +151,7 @@ namespace AnimatorAsCode.V1
public AacFlStateMachine NewSubStateMachine(string name, int x, int y) public AacFlStateMachine NewSubStateMachine(string name, int x, int y)
{ {
var stateMachine = AacInternals.NoUndo(Machine, () => Machine.AddStateMachine(EnsureNameIsDeduplicated(name), GridPosition(x, y))); var stateMachine = AacInternals.NoUndo(Machine, () => Machine.AddStateMachine(EnsureNameIsDeduplicated(name), GridPosition(x, y)));
var aacMachine = new AacFlStateMachine(stateMachine, _emptyClip, _backingAnimator, DefaultsProvider, this); var aacMachine = new AacFlStateMachine(stateMachine, _emptyClip, _backingAnimator, DefaultsProvider, AnimatorRoot, this);
_defaultsProvider.ConfigureStateMachine(stateMachine); _defaultsProvider.ConfigureStateMachine(stateMachine);
_childNodes.Add(aacMachine); _childNodes.Add(aacMachine);
return aacMachine; return aacMachine;
@@ -191,7 +191,7 @@ namespace AnimatorAsCode.V1
{ {
var state = AacInternals.NoUndo(Machine, () => Machine.AddState(EnsureNameIsDeduplicated(name), GridPosition(x, y))); var state = AacInternals.NoUndo(Machine, () => Machine.AddState(EnsureNameIsDeduplicated(name), GridPosition(x, y)));
DefaultsProvider.ConfigureState(state, _emptyClip); DefaultsProvider.ConfigureState(state, _emptyClip);
var aacState = new AacFlState(state, this, DefaultsProvider); var aacState = new AacFlState(state, this, DefaultsProvider, AnimatorRoot);
_childNodes.Add(aacState); _childNodes.Add(aacState);
return aacState; return aacState;
@@ -331,6 +331,11 @@ namespace AnimatorAsCode.V1
return AacInternals.NoUndo(Machine, () => Machine.AddStateMachineBehaviour<TBehaviour>()); return AacInternals.NoUndo(Machine, () => Machine.AddStateMachineBehaviour<TBehaviour>());
} }
public override TBehaviour CreateNewBehaviour<TBehaviour>()
{
return AacInternals.NoUndo(Machine, () => Machine.AddStateMachineBehaviour<TBehaviour>());
}
} }
public class AacFlState : AacAnimatorNode<AacFlState> public class AacFlState : AacAnimatorNode<AacFlState>
@@ -338,7 +343,7 @@ namespace AnimatorAsCode.V1
public readonly AnimatorState State; public readonly AnimatorState State;
private readonly AnimatorStateMachine _machine; private readonly AnimatorStateMachine _machine;
public AacFlState(AnimatorState state, AacFlStateMachine parentMachine, IAacDefaultsProvider defaultsProvider) : base(parentMachine, defaultsProvider) public AacFlState(AnimatorState state, AacFlStateMachine parentMachine, IAacDefaultsProvider defaultsProvider, Transform animatorRoot) : base(parentMachine, defaultsProvider, animatorRoot)
{ {
State = state; State = state;
_machine = parentMachine.Machine; _machine = parentMachine.Machine;
@@ -482,6 +487,11 @@ namespace AnimatorAsCode.V1
return AacInternals.NoUndo(State, () => State.AddStateMachineBehaviour<TBehaviour>()); return AacInternals.NoUndo(State, () => State.AddStateMachineBehaviour<TBehaviour>());
} }
public override TBehaviour CreateNewBehaviour<TBehaviour>()
{
return AacInternals.NoUndo(State, () => State.AddStateMachineBehaviour<TBehaviour>());
}
} }
public class AacFlTransition : AacFlNewTransitionContinuation public class AacFlTransition : AacFlNewTransitionContinuation
@@ -1,7 +1,7 @@
{ {
"name": "dev.hai-vr.animator-as-code.v1", "name": "dev.hai-vr.animator-as-code.v1",
"displayName": "Animator As Code (Alpha)", "displayName": "Animator As Code (Alpha)",
"version": "1.0.9940", "version": "1.0.9941-alpha.1",
"unity": "2019.4", "unity": "2019.4",
"description": "Base Animator As Code library. This library only requires Unity.", "description": "Base Animator As Code library. This library only requires Unity.",
"vrchatVersion" : "2022.1.1", "vrchatVersion" : "2022.1.1",