UniVRM/Assets/UniGLTF/Runtime/SpringBoneJobs/FastSpringBoneBufferCombiner.cs
ousttrue 6917f195f1 FastSpringBoneBufferCombiner の責務を分割。
- FastSpringBoneCombinedBuffer 統合バッファ
- FastSpringBoneBufferCombiner 統合前バッファの登録管理
2024-10-01 19:10:35 +09:00

87 lines
2.7 KiB
C#

using System;
using System.Collections.Generic;
using Unity.Jobs;
using UnityEngine.Profiling;
using UniGLTF.SpringBoneJobs.InputPorts;
namespace UniGLTF.SpringBoneJobs
{
/// <summary>
/// CombinedBuffer 構築を管理する
///
/// - FastSpringBoneBuffer(Vrm-1.0 一体分の情報)を登録・削除する。
/// - 再構築する。登録・削除後に反映するために呼び出す。
/// - (TODO) FastSpringBoneBuffer一体分の回転初期化を実行する。
///
/// </summary>
public sealed class FastSpringBoneBufferCombiner : IDisposable
{
private FastSpringBoneCombinedBuffer _combinedBuffer;
public FastSpringBoneCombinedBuffer Combined => _combinedBuffer;
private readonly LinkedList<FastSpringBoneBuffer> _buffers = new LinkedList<FastSpringBoneBuffer>();
private bool _isDirty;
public bool HasBuffer => _buffers.Count > 0 && _combinedBuffer != null;
public void Register(FastSpringBoneBuffer buffer)
{
_buffers.AddLast(buffer);
_isDirty = true;
}
public void Unregister(FastSpringBoneBuffer buffer)
{
_buffers.Remove(buffer);
_isDirty = true;
}
/// <summary>
/// 変更があったならばバッファを再構築する
/// </summary>
public JobHandle ReconstructIfDirty(JobHandle handle)
{
if (_isDirty)
{
var result = ReconstructBuffers(handle);
_isDirty = false;
return result;
}
return handle;
}
/// <summary>
/// バッファを再構築する
/// </summary>
private JobHandle ReconstructBuffers(JobHandle handle)
{
Profiler.BeginSample("FastSpringBone.ReconstructBuffers");
Profiler.BeginSample("FastSpringBone.ReconstructBuffers.DisposeBuffers");
if (_combinedBuffer is FastSpringBoneCombinedBuffer combined)
{
Profiler.BeginSample("FastSpringBone.ReconstructBuffers.SaveToSourceBuffer");
combined.SaveToSourceBuffer();
Profiler.EndSample();
// TODO: Dispose せずに再利用?
combined.Dispose();
}
Profiler.EndSample();
handle = FastSpringBoneCombinedBuffer.Create(handle, _buffers, out _combinedBuffer);
Profiler.EndSample();
return handle;
}
public void Dispose()
{
if (_combinedBuffer is FastSpringBoneCombinedBuffer combined)
{
combined.Dispose();
_combinedBuffer = null;
}
}
}
}