diff --git a/Assets/UniGLTF/Runtime/SpringBoneJobs/FastSpringBoneBufferCombiner.cs b/Assets/UniGLTF/Runtime/SpringBoneJobs/FastSpringBoneBufferCombiner.cs index 7a27bd27f..a1c46b747 100644 --- a/Assets/UniGLTF/Runtime/SpringBoneJobs/FastSpringBoneBufferCombiner.cs +++ b/Assets/UniGLTF/Runtime/SpringBoneJobs/FastSpringBoneBufferCombiner.cs @@ -21,18 +21,34 @@ namespace UniGLTF.SpringBoneJobs { private FastSpringBoneCombinedBuffer _combinedBuffer; public FastSpringBoneCombinedBuffer Combined => _combinedBuffer; - private readonly LinkedList _buffers = new LinkedList(); - private Queue<(bool isAdd, FastSpringBoneBuffer buffer)> _request = new(); + private readonly List _buffers = new(); + + struct Request + { + public FastSpringBoneBuffer Remove; + public FastSpringBoneBuffer Add; + } + private Queue _request = new(); + public bool HasBuffer => _buffers.Count > 0 && _combinedBuffer != null; public void Register(FastSpringBoneBuffer buffer) { - _request.Enqueue((true, buffer)); + _request.Enqueue(new Request { Add = buffer }); } public void Unregister(FastSpringBoneBuffer buffer) { - _request.Enqueue((false, buffer)); + _request.Enqueue(new Request { Remove = buffer }); + } + + /// + /// 順番が変わらないように更新する + /// + /// + public void ReRegister(FastSpringBoneBuffer remove, FastSpringBoneBuffer add) + { + _request.Enqueue(new Request { Remove = remove, Add = add }); } /// @@ -60,14 +76,20 @@ namespace UniGLTF.SpringBoneJobs // buffer 増減 while (_request.Count > 0) { - var (isAdd, buffer) = _request.Dequeue(); - if (isAdd) + var req = _request.Dequeue(); + if (req.Remove != null && req.Add != null) { - _buffers.AddLast(buffer); + // 順番が変わらないように入れ替える + var index = _buffers.IndexOf(req.Remove); + _buffers[index] = req.Add; } - else + else if (req.Add != null) { - _buffers.Remove(buffer); + _buffers.Add(req.Add); + } + else if (req.Remove != null) + { + _buffers.Remove(req.Remove); } } diff --git a/Assets/UniGLTF/Runtime/SpringBoneJobs/FastSpringBoneConbinedBuffer.cs b/Assets/UniGLTF/Runtime/SpringBoneJobs/FastSpringBoneConbinedBuffer.cs index bae4fd0e9..6a64725b0 100644 --- a/Assets/UniGLTF/Runtime/SpringBoneJobs/FastSpringBoneConbinedBuffer.cs +++ b/Assets/UniGLTF/Runtime/SpringBoneJobs/FastSpringBoneConbinedBuffer.cs @@ -78,11 +78,14 @@ namespace UniGLTF.SpringBoneJobs _batchedBufferLogicSizes = batchedBufferLogicSizes; } + /// + /// Lidt をひとつの FastSpringBoneCombinedBuffer に統合する + /// internal static JobHandle Create(JobHandle handle, - LinkedList _buffers, out FastSpringBoneCombinedBuffer combined) + IReadOnlyList buffers, out FastSpringBoneCombinedBuffer combined) { Profiler.BeginSample("FastSpringBone.ReconstructBuffers.CopyToBatchedBuffers"); - var batchedBuffers = _buffers.ToArray(); + var batchedBuffers = buffers.ToArray(); var batchedBufferLogicSizes = batchedBuffers.Select(buffer => buffer.Logics.Length).ToArray(); Profiler.EndSample(); @@ -92,7 +95,7 @@ namespace UniGLTF.SpringBoneJobs var collidersCount = 0; var logicsCount = 0; var transformsCount = 0; - foreach (var buffer in _buffers) + foreach (var buffer in buffers) { springsCount += buffer.Springs.Length; collidersCount += buffer.Colliders.Length; @@ -103,7 +106,7 @@ namespace UniGLTF.SpringBoneJobs // バッファの構築 Profiler.BeginSample("FastSpringBone.ReconstructBuffers.CreateBuffers"); - combined = new FastSpringBoneCombinedBuffer(logicsCount, springsCount, _buffers.Count, + combined = new FastSpringBoneCombinedBuffer(logicsCount, springsCount, buffers.Count, collidersCount, transformsCount, batchedBuffers, batchedBufferLogicSizes); Profiler.EndSample();