using System; using System.Collections.Generic; using Unity.Jobs; using UnityEngine.Profiling; using UniGLTF.SpringBoneJobs.InputPorts; using UnityEngine; namespace UniGLTF.SpringBoneJobs { /// /// CombinedBuffer 構築を管理する /// /// - FastSpringBoneBuffer(Vrm-1.0 一体分の情報)を登録・削除する。 /// - 再構築する。登録・削除後に反映するために呼び出す。 /// - (TODO) FastSpringBoneBuffer一体分の回転初期化を実行する。 /// /// public sealed class FastSpringBoneBufferCombiner : IDisposable { private FastSpringBoneCombinedBuffer _combinedBuffer; public FastSpringBoneCombinedBuffer Combined => _combinedBuffer; private readonly LinkedList _buffers = new LinkedList(); 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; } /// /// 変更があったならばバッファを再構築する /// public JobHandle ReconstructIfDirty(JobHandle handle) { if (_isDirty) { var result = ReconstructBuffers(handle); _isDirty = false; return result; } return handle; } /// /// バッファを再構築する /// 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; } /// /// 各Jointのローカルローテーションを初期回転に戻す。spring reset /// public void InitializeJointsLocalRotation(FastSpringBoneBuffer model) { if (_combinedBuffer is FastSpringBoneCombinedBuffer combined) { combined.InitializeJointsLocalRotation(model); } } public void Dispose() { if (_combinedBuffer is FastSpringBoneCombinedBuffer combined) { combined.Dispose(); _combinedBuffer = null; } } } }