From 1bdd8243e74c7777cb744d12672d9a23d6a33f52 Mon Sep 17 00:00:00 2001 From: ousttrue Date: Tue, 24 Sep 2024 16:09:17 +0900 Subject: [PATCH] bool ReconstructSpringBone() MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit log を削除。 m_building を修正。 --- .../Vrm10FastSpringboneRuntime.cs | 35 +++++++++++------- .../Vrm10FastSpringboneRuntimeStandalone.cs | 37 ++++++++++++------- .../Runtime/IO/IVrm10SpringBoneRuntime.cs | 4 +- Assets/VRM10/Runtime/IO/Vrm10Importer.cs | 2 +- 4 files changed, 47 insertions(+), 31 deletions(-) diff --git a/Assets/VRM10/Runtime/Components/Vrm10Runtime/Vrm10FastSpringboneRuntime.cs b/Assets/VRM10/Runtime/Components/Vrm10Runtime/Vrm10FastSpringboneRuntime.cs index 96d190bf9b..3ca33eaf3c 100644 --- a/Assets/VRM10/Runtime/Components/Vrm10Runtime/Vrm10FastSpringboneRuntime.cs +++ b/Assets/VRM10/Runtime/Components/Vrm10Runtime/Vrm10FastSpringboneRuntime.cs @@ -16,10 +16,6 @@ public class Vrm10FastSpringboneRuntime : IVrm10SpringBoneRuntime private Vrm10Instance m_instance; private readonly FastSpringBones.FastSpringBoneService m_fastSpringBoneService = FastSpringBones.FastSpringBoneService.Instance; private FastSpringBoneBuffer m_fastSpringBoneBuffer; - /// - /// 多重実行防止 - /// - private bool m_building = false; public Vector3 ExternalForce { @@ -41,9 +37,7 @@ public async Task InitializeAsync(Vrm10Instance instance, IAwaitCaller awaitCall // NOTE: FastSpringBoneService は UnitTest などでは動作しない if (Application.isPlaying) { - m_fastSpringBoneBuffer = await FastSpringBoneBufferFactory.ConstructSpringBoneAsync(awaitCaller, m_instance); - // 登録 - m_fastSpringBoneService.BufferCombiner.Register(m_fastSpringBoneBuffer); + await ConstructSpringBoneAsync(awaitCaller); } } @@ -57,12 +51,26 @@ public void Dispose() /// このVRMに紐づくSpringBone関連のバッファを再構築する /// ランタイム実行時にSpringBoneに対して変更を行いたいときは、このメソッドを明示的に呼ぶ必要がある /// - public void ReconstructSpringBone() + public bool ReconstructSpringBone() + { + // new ImmediateCaller() により即時実行して結果を得る。 + // スパイクは許容する。 + var task = ConstructSpringBoneAsync(new ImmediateCaller()); + return task.Result; + } + + private bool m_building = false; + /// + /// 多重実行防止。 + /// m_building は ConstructSpringBoneAsync 専用。他で使う場合は注意。 + /// + /// + /// ConstructSpringBoneAsync がすでに実行中の場合は中止して false で戻る + private async Task ConstructSpringBoneAsync(IAwaitCaller awaitCaller) { if (m_building) { - Debug.LogWarning("already building"); - return; + return false; } m_building = true; @@ -72,14 +80,13 @@ public void ReconstructSpringBone() m_fastSpringBoneService.BufferCombiner.Unregister(m_fastSpringBoneBuffer); } - // new ImmediateCaller() により即時実行して結果を得る。 - // スパイクは許容する。 - var task = FastSpringBoneBufferFactory.ConstructSpringBoneAsync(new ImmediateCaller(), m_instance, m_fastSpringBoneBuffer); - m_fastSpringBoneBuffer = task.Result; + m_fastSpringBoneBuffer = await FastSpringBoneBufferFactory.ConstructSpringBoneAsync(new ImmediateCaller(), m_instance, m_fastSpringBoneBuffer); // 登録 m_fastSpringBoneService.BufferCombiner.Register(m_fastSpringBoneBuffer); + m_building = false; + return true; } public void RestoreInitialTransform() diff --git a/Assets/VRM10/Runtime/Components/Vrm10Runtime/Vrm10FastSpringboneRuntimeStandalone.cs b/Assets/VRM10/Runtime/Components/Vrm10Runtime/Vrm10FastSpringboneRuntimeStandalone.cs index 6a2e2e83ea..a0c795c781 100644 --- a/Assets/VRM10/Runtime/Components/Vrm10Runtime/Vrm10FastSpringboneRuntimeStandalone.cs +++ b/Assets/VRM10/Runtime/Components/Vrm10Runtime/Vrm10FastSpringboneRuntimeStandalone.cs @@ -1,8 +1,5 @@ -using System; using UniGLTF; -using UniGLTF.Utils; using UnityEngine; -using UniGLTF.SpringBoneJobs.Blittables; using UniGLTF.SpringBoneJobs.InputPorts; using UniGLTF.SpringBoneJobs; using System.Threading.Tasks; @@ -21,7 +18,6 @@ public class Vrm10FastSpringboneRuntimeStandalone : IVrm10SpringBoneRuntime private FastSpringBoneBuffer m_fastSpringBoneBuffer; public FastSpringBoneBufferCombiner m_bufferCombiner = new(); private FastSpringBoneScheduler m_fastSpringBoneScheduler; - private bool m_building = false; public Vector3 ExternalForce { @@ -48,8 +44,7 @@ public async Task InitializeAsync(Vrm10Instance instance, IAwaitCaller awaitCall // NOTE: FastSpringBoneService は UnitTest などでは動作しない if (Application.isPlaying) { - m_fastSpringBoneBuffer = await FastSpringBoneBufferFactory.ConstructSpringBoneAsync(awaitCaller, m_instance, m_fastSpringBoneBuffer); - m_bufferCombiner.Register(m_fastSpringBoneBuffer); + await ConstructSpringBoneAsync(awaitCaller); } } @@ -66,28 +61,42 @@ public void Dispose() /// このVRMに紐づくSpringBone関連のバッファを再構築する /// ランタイム実行時にSpringBoneに対して変更を行いたいときは、このメソッドを明示的に呼ぶ必要がある /// - public void ReconstructSpringBone() + public bool ReconstructSpringBone() + { + // new ImmediateCaller() により即時実行して結果を得る。 + // スパイクは許容する。 + var task = ConstructSpringBoneAsync(new ImmediateCaller()); + return task.Result; + } + + private bool m_building = false; + /// + /// 多重実行防止。 + /// m_building は ConstructSpringBoneAsync 専用。他で使う場合は注意。 + /// + /// + /// ConstructSpringBoneAsync がすでに実行中の場合は中止して false で戻る + private async Task ConstructSpringBoneAsync(IAwaitCaller awaitCaller) { if (m_building) { - Debug.LogWarning("already building"); - return; + return false; } m_building = true; - // 登録解除 + // 登録削除 if (m_fastSpringBoneBuffer != null) { m_bufferCombiner.Unregister(m_fastSpringBoneBuffer); } - // new ImmediateCaller() により即時実行して結果を得る。 - // スパイクは許容する。 - var task = FastSpringBoneBufferFactory.ConstructSpringBoneAsync(new ImmediateCaller(), m_instance, m_fastSpringBoneBuffer); - m_fastSpringBoneBuffer = task.Result; + m_fastSpringBoneBuffer = await FastSpringBoneBufferFactory.ConstructSpringBoneAsync(new ImmediateCaller(), m_instance, m_fastSpringBoneBuffer); // 登録 m_bufferCombiner.Register(m_fastSpringBoneBuffer); + + m_building = false; + return true; } public void RestoreInitialTransform() diff --git a/Assets/VRM10/Runtime/IO/IVrm10SpringBoneRuntime.cs b/Assets/VRM10/Runtime/IO/IVrm10SpringBoneRuntime.cs index 0cbc906a31..00714a46dd 100644 --- a/Assets/VRM10/Runtime/IO/IVrm10SpringBoneRuntime.cs +++ b/Assets/VRM10/Runtime/IO/IVrm10SpringBoneRuntime.cs @@ -10,9 +10,9 @@ public interface IVrm10SpringBoneRuntime : IDisposable public Task InitializeAsync(Vrm10Instance instance, IAwaitCaller awaitCaller); /// - /// 主に singleton のバッチング更新。 + /// SpringBone の構成変更を反映して再構築する。 /// - public void ReconstructSpringBone(); + public bool ReconstructSpringBone(); /// /// initialTransform 状態に復帰。verlet の速度 も 0 に。 diff --git a/Assets/VRM10/Runtime/IO/Vrm10Importer.cs b/Assets/VRM10/Runtime/IO/Vrm10Importer.cs index ed77743949..8347dbb11a 100644 --- a/Assets/VRM10/Runtime/IO/Vrm10Importer.cs +++ b/Assets/VRM10/Runtime/IO/Vrm10Importer.cs @@ -273,7 +273,7 @@ protected override async Task OnLoadHierarchy(IAwaitCaller awaitCaller, Func