Skip to content

Commit

Permalink
bool ReconstructSpringBone()
Browse files Browse the repository at this point in the history
log を削除。
m_building を修正。
  • Loading branch information
ousttrue committed Sep 24, 2024
1 parent 0b08507 commit 1bdd824
Show file tree
Hide file tree
Showing 4 changed files with 47 additions and 31 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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;
/// <summary>
/// 多重実行防止
/// </summary>
private bool m_building = false;

public Vector3 ExternalForce
{
Expand All @@ -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);
}
}

Expand All @@ -57,12 +51,26 @@ public void Dispose()
/// このVRMに紐づくSpringBone関連のバッファを再構築する
/// ランタイム実行時にSpringBoneに対して変更を行いたいときは、このメソッドを明示的に呼ぶ必要がある
/// </summary>
public void ReconstructSpringBone()
public bool ReconstructSpringBone()
{
// new ImmediateCaller() により即時実行して結果を得る。
// スパイクは許容する。
var task = ConstructSpringBoneAsync(new ImmediateCaller());
return task.Result;
}

private bool m_building = false;
/// <summary>
/// 多重実行防止。
/// m_building は ConstructSpringBoneAsync 専用。他で使う場合は注意。
/// </summary>
/// <param name="awaitCaller"></param>
/// <returns>ConstructSpringBoneAsync がすでに実行中の場合は中止して false で戻る</returns>
private async Task<bool> ConstructSpringBoneAsync(IAwaitCaller awaitCaller)
{
if (m_building)
{
Debug.LogWarning("already building");
return;
return false;
}
m_building = true;

Expand All @@ -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()
Expand Down
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -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
{
Expand All @@ -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);
}
}

Expand All @@ -66,28 +61,42 @@ public void Dispose()
/// このVRMに紐づくSpringBone関連のバッファを再構築する
/// ランタイム実行時にSpringBoneに対して変更を行いたいときは、このメソッドを明示的に呼ぶ必要がある
/// </summary>
public void ReconstructSpringBone()
public bool ReconstructSpringBone()
{
// new ImmediateCaller() により即時実行して結果を得る。
// スパイクは許容する。
var task = ConstructSpringBoneAsync(new ImmediateCaller());
return task.Result;
}

private bool m_building = false;
/// <summary>
/// 多重実行防止。
/// m_building は ConstructSpringBoneAsync 専用。他で使う場合は注意。
/// </summary>
/// <param name="awaitCaller"></param>
/// <returns>ConstructSpringBoneAsync がすでに実行中の場合は中止して false で戻る</returns>
private async Task<bool> 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()
Expand Down
4 changes: 2 additions & 2 deletions Assets/VRM10/Runtime/IO/IVrm10SpringBoneRuntime.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,9 @@ public interface IVrm10SpringBoneRuntime : IDisposable
public Task InitializeAsync(Vrm10Instance instance, IAwaitCaller awaitCaller);

/// <summary>
/// 主に singleton のバッチング更新
/// SpringBone の構成変更を反映して再構築する
/// </summary>
public void ReconstructSpringBone();
public bool ReconstructSpringBone();

/// <summary>
/// initialTransform 状態に復帰。verlet の速度 も 0 に。
Expand Down
2 changes: 1 addition & 1 deletion Assets/VRM10/Runtime/IO/Vrm10Importer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -273,7 +273,7 @@ protected override async Task OnLoadHierarchy(IAwaitCaller awaitCaller, Func<str
if (UniGLTF.Extensions.VRMC_springBone.GltfDeserializer.TryGet(Data.GLTF.extensions, out UniGLTF.Extensions.VRMC_springBone.VRMC_springBone springBone))
{
await LoadSpringBoneAsync(awaitCaller, controller, springBone);
// Vrm10Runtime で初期化していたが async にするため、こちらに引越し `v0.127`
// Vrm10Runtime で初期化していたが async にするためこちらに移動 v0.127
await m_springboneRuntime.InitializeAsync(controller, awaitCaller);
}
// constraint
Expand Down

0 comments on commit 1bdd824

Please sign in to comment.