From 77ecdc2d552d11c37e74aedfd31152e23271c302 Mon Sep 17 00:00:00 2001 From: ousttrue Date: Wed, 14 Jun 2023 17:00:25 +0900 Subject: [PATCH] VrmAnimationImporter create VrmAnimationInstance --- .../VrmAnimationInstance.cs | 9 +++++++- .../VRM10/Runtime/IO/VrmAnimationImporter.cs | 8 +++++-- .../VRM10Viewer/Motions/VrmAnimation.cs | 23 ++++--------------- 3 files changed, 19 insertions(+), 21 deletions(-) diff --git a/Assets/VRM10/Runtime/Components/VrmAnimationInstance/VrmAnimationInstance.cs b/Assets/VRM10/Runtime/Components/VrmAnimationInstance/VrmAnimationInstance.cs index 0b29d09b9..cc63e0962 100644 --- a/Assets/VRM10/Runtime/Components/VrmAnimationInstance/VrmAnimationInstance.cs +++ b/Assets/VRM10/Runtime/Components/VrmAnimationInstance/VrmAnimationInstance.cs @@ -1,3 +1,4 @@ +using System.Collections.Generic; using UniHumanoid; using UnityEngine; @@ -7,8 +8,9 @@ namespace UniVRM10 { public SkinnedMeshRenderer BoxMan; public (INormalizedPoseProvider, ITPoseProvider) ControlRig; + public Dictionary ExpressionMap = new Dictionary(); - public void Initialize() + public void Initialize(IReadOnlyList<(ExpressionKey, Transform)> expressions) { var humanoid = gameObject.AddComponent(); if (humanoid.AssignBonesFromAnimator()) @@ -25,6 +27,11 @@ namespace UniVRM10 var mesh = BoxMan.sharedMesh; mesh.name = "box-man"; } + + foreach (var (preset, transform) in expressions) + { + ExpressionMap.Add(preset, transform); + } } } } diff --git a/Assets/VRM10/Runtime/IO/VrmAnimationImporter.cs b/Assets/VRM10/Runtime/IO/VrmAnimationImporter.cs index 03c2ce3df..5ba5bf037 100644 --- a/Assets/VRM10/Runtime/IO/VrmAnimationImporter.cs +++ b/Assets/VRM10/Runtime/IO/VrmAnimationImporter.cs @@ -19,6 +19,7 @@ namespace UniVRM10 IMaterialDescriptorGenerator materialGenerator = null) : base(data, externalObjectMap, textureDeserializer, materialGenerator) { + InvertAxis = Axes.X; } private static int? GetNodeIndex(UniGLTF.Extensions.VRMC_vrm_animation.Humanoid humanoid, HumanBodyBones bone) @@ -169,7 +170,7 @@ namespace UniVRM10 { var instance = await base.LoadAsync(awaitCaller, measureTime); - // VRMA-humanoid + // setup humanoid var humanMap = GetHumanMap(); if (humanMap.Count > 0) { @@ -184,8 +185,11 @@ namespace UniVRM10 animator.avatar = avatar; } + // VRMA-animation solver + var animationInstance = instance.gameObject.AddComponent(); + animationInstance.Initialize(GetExpressions()); + return instance; } - } } diff --git a/Assets/VRM10_Samples/VRM10Viewer/Motions/VrmAnimation.cs b/Assets/VRM10_Samples/VRM10Viewer/Motions/VrmAnimation.cs index f1b2b02ca..53e1b12e2 100644 --- a/Assets/VRM10_Samples/VRM10Viewer/Motions/VrmAnimation.cs +++ b/Assets/VRM10_Samples/VRM10Viewer/Motions/VrmAnimation.cs @@ -1,7 +1,6 @@ using System.Collections.Generic; using System.Threading.Tasks; using UniGLTF; -using UniHumanoid; using UnityEngine; using VRMShaders; @@ -12,7 +11,7 @@ namespace UniVRM10.VRM10Viewer private readonly VrmAnimationInstance m_instance; (INormalizedPoseProvider, ITPoseProvider) IMotion.ControlRig => m_instance.ControlRig; - public IDictionary ExpressionMap { get; } = new Dictionary(); + IDictionary IMotion.ExpressionMap => m_instance.ExpressionMap; public VrmAnimation(VrmAnimationInstance instance) { @@ -41,22 +40,10 @@ namespace UniVRM10.VRM10Viewer public static async Task LoadVrmAnimationFromPathAsync(string path) { - using (GltfData data = new AutoGltfFileParser(path).Parse()) - using (var loader = new VrmAnimationImporter(data)) - { - loader.InvertAxis = Axes.X; - var instance = await loader.LoadAsync(new ImmediateCaller()); - - var animationInstance = instance.gameObject.AddComponent(); - animationInstance.Initialize(); - - var animation = new VrmAnimation(animationInstance); - foreach (var (preset, transform) in loader.GetExpressions()) - { - animation.ExpressionMap.Add(preset, transform); - } - return animation; - } + using GltfData data = new AutoGltfFileParser(path).Parse(); + using var loader = new VrmAnimationImporter(data); + var instance = await loader.LoadAsync(new ImmediateCaller()); + return new VrmAnimation(instance.GetComponent()); } } }