mirror of
https://github.com/bdunderscore/modular-avatar.git
synced 2024-12-29 18:55:06 +08:00
fix: issues with blendtree handling in AnimationDatabase (#615)
Closes: #609
This commit is contained in:
parent
66d3eee78d
commit
d0b4dd67e5
4
.github/ProjectRoot/vpm-manifest-2019.json
vendored
4
.github/ProjectRoot/vpm-manifest-2019.json
vendored
@ -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"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
4
.github/ProjectRoot/vpm-manifest-2022.json
vendored
4
.github/ProjectRoot/vpm-manifest-2022.json
vendored
@ -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"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -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;
|
||||||
|
@ -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"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user