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"
},
"nadena.dev.ndmf": {
"version": "1.3.0-alpha.2"
"version": "1.3.0-rc.2"
}
},
"locked": {
@ -19,7 +19,7 @@
"dependencies": {}
},
"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"
},
"nadena.dev.ndmf": {
"version": "1.3.0-rc.0"
"version": "1.3.0-rc.2"
}
},
"locked": {
@ -19,7 +19,7 @@
"dependencies": {}
},
"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 nadena.dev.modular_avatar.core.editor;
using nadena.dev.modular_avatar.editor.ErrorReporting;
using nadena.dev.ndmf;
using UnityEditor;
using UnityEditor.Animations;
using UnityEngine;
@ -42,14 +43,24 @@ namespace nadena.dev.modular_avatar.animation
}
}
internal Motion OriginalClip { get; }
internal readonly bool IsProxyAnimation;
private Motion _originalClip;
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)
{
ParentDatabase = parentDatabase;
CurrentClip = OriginalClip = clip;
IsProxyAnimation = clip != null && Util.IsProxyAnimation(clip);
}
/// <summary>
@ -156,22 +167,11 @@ namespace nadena.dev.modular_avatar.animation
Dictionary<Motion, ClipHolder> _originalToHolder = new Dictionary<Motion, ClipHolder>();
if (processClip == null) processClip = (_) => { };
var isProxyAnim = Util.IsProxyAnimation(state.motion);
if (state.motion == null) return;
var clipHolder = RegisterMotion(state.motion, state, processClip, _originalToHolder);
if (!_context.IsTemporaryAsset(state.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
var placeholder = Object.Instantiate(state.motion);
clipHolder.CurrentClip = placeholder;
if (isProxyAnim)
{
_clipCommitActions.Add(() => { Object.DestroyImmediate(placeholder); });
}
}
state.motion = clipHolder.CurrentClip;
_clipCommitActions.Add(() => { state.motion = clipHolder.CurrentClip; });
}
@ -223,7 +223,20 @@ namespace nadena.dev.modular_avatar.animation
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:
{
@ -239,6 +252,8 @@ namespace nadena.dev.modular_avatar.animation
}
}
holder.OriginalClip = motion;
originalToHolder[motion] = holder;
return holder;
}
@ -308,8 +323,11 @@ namespace nadena.dev.modular_avatar.animation
for (int i = 0; i < children.Length; i++)
{
holders[i] = RegisterMotion(children[i].motion, state, processClip, originalToHolder);
children[i].motion = holders[i].CurrentClip;
}
tree.children = children;
_clipCommitActions.Add(() =>
{
var dirty = false;

View File

@ -16,6 +16,6 @@
},
"vpmDependencies": {
"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"
}
}