fix: issues with blendtree handling in AnimationDatabase (#615)

Closes: #609
This commit is contained in:
bd_ 2024-01-07 17:07:50 +09:00 committed by GitHub
parent 66d3eee78d
commit d0b4dd67e5
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 39 additions and 21 deletions

View File

@ -4,7 +4,7 @@
"version": "3.4.2" "version": "3.4.2"
}, },
"nadena.dev.ndmf": { "nadena.dev.ndmf": {
"version": "1.3.0-alpha.2" "version": "1.3.0-rc.2"
} }
}, },
"locked": { "locked": {
@ -19,7 +19,7 @@
"dependencies": {} "dependencies": {}
}, },
"nadena.dev.ndmf": { "nadena.dev.ndmf": {
"version": "1.3.0-alpha.2" "version": "1.3.0-rc.2"
} }
} }
} }

View File

@ -4,7 +4,7 @@
"version": "3.5.0" "version": "3.5.0"
}, },
"nadena.dev.ndmf": { "nadena.dev.ndmf": {
"version": "1.3.0-rc.0" "version": "1.3.0-rc.2"
} }
}, },
"locked": { "locked": {
@ -19,7 +19,7 @@
"dependencies": {} "dependencies": {}
}, },
"nadena.dev.ndmf": { "nadena.dev.ndmf": {
"version": "1.3.0-rc.0" "version": "1.3.0-rc.2"
} }
} }
} }

View File

@ -4,6 +4,7 @@ using System.Collections.Immutable;
using System.Data.Odbc; using System.Data.Odbc;
using nadena.dev.modular_avatar.core.editor; using nadena.dev.modular_avatar.core.editor;
using nadena.dev.modular_avatar.editor.ErrorReporting; using nadena.dev.modular_avatar.editor.ErrorReporting;
using nadena.dev.ndmf;
using UnityEditor; using UnityEditor;
using UnityEditor.Animations; using UnityEditor.Animations;
using UnityEngine; using UnityEngine;
@ -42,14 +43,24 @@ namespace nadena.dev.modular_avatar.animation
} }
} }
internal Motion OriginalClip { get; } private Motion _originalClip;
internal readonly bool IsProxyAnimation;
internal Motion OriginalClip
{
get => _originalClip;
set
{
_originalClip = value;
IsProxyAnimation = value != null && Util.IsProxyAnimation(value);
}
}
internal bool IsProxyAnimation { private set; get; }
internal ClipHolder(AnimationDatabase parentDatabase, Motion clip) internal ClipHolder(AnimationDatabase parentDatabase, Motion clip)
{ {
ParentDatabase = parentDatabase; ParentDatabase = parentDatabase;
CurrentClip = OriginalClip = clip; CurrentClip = OriginalClip = clip;
IsProxyAnimation = clip != null && Util.IsProxyAnimation(clip);
} }
/// <summary> /// <summary>
@ -156,22 +167,11 @@ namespace nadena.dev.modular_avatar.animation
Dictionary<Motion, ClipHolder> _originalToHolder = new Dictionary<Motion, ClipHolder>(); Dictionary<Motion, ClipHolder> _originalToHolder = new Dictionary<Motion, ClipHolder>();
if (processClip == null) processClip = (_) => { }; if (processClip == null) processClip = (_) => { };
var isProxyAnim = Util.IsProxyAnimation(state.motion);
if (state.motion == null) return; if (state.motion == null) return;
var clipHolder = RegisterMotion(state.motion, state, processClip, _originalToHolder); var clipHolder = RegisterMotion(state.motion, state, processClip, _originalToHolder);
if (!_context.IsTemporaryAsset(state.motion)) state.motion = clipHolder.CurrentClip;
{
// Protect the original animations from mutations by creating temporary clones; in the case of a proxy
// animation, we'll restore the original in a later pass
var placeholder = Object.Instantiate(state.motion);
clipHolder.CurrentClip = placeholder;
if (isProxyAnim)
{
_clipCommitActions.Add(() => { Object.DestroyImmediate(placeholder); });
}
}
_clipCommitActions.Add(() => { state.motion = clipHolder.CurrentClip; }); _clipCommitActions.Add(() => { state.motion = clipHolder.CurrentClip; });
} }
@ -223,7 +223,20 @@ namespace nadena.dev.modular_avatar.animation
InvalidateCaches(); InvalidateCaches();
switch (motion) Motion cloned = motion;
if (!_context.IsTemporaryAsset(motion))
{
// Protect the original animations from mutations by creating temporary clones; in the case of a proxy
// animation, we'll restore the original in a later pass
// cloned = Object.Instantiate(motion); - Object.Instantiate can't be used on AnimationClips and BlendTrees
cloned = (Motion)motion.GetType().GetConstructor(new Type[0]).Invoke(new object[0]);
EditorUtility.CopySerialized(motion, cloned);
ObjectRegistry.RegisterReplacedObject(motion, cloned);
}
switch (cloned)
{ {
case AnimationClip clip: case AnimationClip clip:
{ {
@ -239,6 +252,8 @@ namespace nadena.dev.modular_avatar.animation
} }
} }
holder.OriginalClip = motion;
originalToHolder[motion] = holder; originalToHolder[motion] = holder;
return holder; return holder;
} }
@ -308,8 +323,11 @@ namespace nadena.dev.modular_avatar.animation
for (int i = 0; i < children.Length; i++) for (int i = 0; i < children.Length; i++)
{ {
holders[i] = RegisterMotion(children[i].motion, state, processClip, originalToHolder); holders[i] = RegisterMotion(children[i].motion, state, processClip, originalToHolder);
children[i].motion = holders[i].CurrentClip;
} }
tree.children = children;
_clipCommitActions.Add(() => _clipCommitActions.Add(() =>
{ {
var dirty = false; var dirty = false;

View File

@ -16,6 +16,6 @@
}, },
"vpmDependencies": { "vpmDependencies": {
"com.vrchat.avatars": ">=3.2.0", "com.vrchat.avatars": ">=3.2.0",
"nadena.dev.ndmf": ">=1.3.0-rc.0 <2.0.0-a" "nadena.dev.ndmf": ">=1.3.0-rc.2 <2.0.0-a"
} }
} }