From f0d59ae948be5b332d4a513ed31fa02f73ae7af8 Mon Sep 17 00:00:00 2001 From: ousttrue Date: Fri, 14 Mar 2025 18:35:54 +0900 Subject: [PATCH 1/3] list --- .../FastSpringBoneBufferCombiner.cs | 40 ++++++++++++++----- .../FastSpringBoneConbinedBuffer.cs | 11 +++-- 2 files changed, 38 insertions(+), 13 deletions(-) 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(); From cad4082cc414c1192c0163e7d8efcfa2c2a89c39 Mon Sep 17 00:00:00 2001 From: ousttrue Date: Fri, 14 Mar 2025 18:56:44 +0900 Subject: [PATCH 2/3] =?UTF-8?q?BufferCombiner.Unregister/Register=20?= =?UTF-8?q?=E3=81=A7=E9=A0=86=E7=95=AA=E3=81=AE=E5=A4=89=E6=9B=B4=E3=81=8C?= =?UTF-8?q?=E8=B5=B7=E3=81=8D=E3=81=AA=E3=81=84=E3=82=88=E3=81=86=E3=81=AB?= =?UTF-8?q?=E3=81=99=E3=82=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../FastSpringBoneBufferCombiner.cs | 16 +--------------- .../FastSpringBoneConbinedBuffer.cs | 2 +- .../Jobs/Vrm0XFastSpringBoneRuntime.cs | 4 ++-- .../Vrm10Runtime/Vrm10FastSpringboneRuntime.cs | 14 ++++---------- .../Vrm10FastSpringboneRuntimeStandalone.cs | 15 ++++----------- 5 files changed, 12 insertions(+), 39 deletions(-) diff --git a/Assets/UniGLTF/Runtime/SpringBoneJobs/FastSpringBoneBufferCombiner.cs b/Assets/UniGLTF/Runtime/SpringBoneJobs/FastSpringBoneBufferCombiner.cs index a1c46b747..efd342140 100644 --- a/Assets/UniGLTF/Runtime/SpringBoneJobs/FastSpringBoneBufferCombiner.cs +++ b/Assets/UniGLTF/Runtime/SpringBoneJobs/FastSpringBoneBufferCombiner.cs @@ -32,21 +32,7 @@ namespace UniGLTF.SpringBoneJobs public bool HasBuffer => _buffers.Count > 0 && _combinedBuffer != null; - public void Register(FastSpringBoneBuffer buffer) - { - _request.Enqueue(new Request { Add = buffer }); - } - - public void Unregister(FastSpringBoneBuffer buffer) - { - _request.Enqueue(new Request { Remove = buffer }); - } - - /// - /// 順番が変わらないように更新する - /// - /// - public void ReRegister(FastSpringBoneBuffer remove, FastSpringBoneBuffer add) + public void Register(FastSpringBoneBuffer add, FastSpringBoneBuffer remove) { _request.Enqueue(new Request { Remove = remove, Add = add }); } diff --git a/Assets/UniGLTF/Runtime/SpringBoneJobs/FastSpringBoneConbinedBuffer.cs b/Assets/UniGLTF/Runtime/SpringBoneJobs/FastSpringBoneConbinedBuffer.cs index 6a64725b0..3202abfbd 100644 --- a/Assets/UniGLTF/Runtime/SpringBoneJobs/FastSpringBoneConbinedBuffer.cs +++ b/Assets/UniGLTF/Runtime/SpringBoneJobs/FastSpringBoneConbinedBuffer.cs @@ -79,7 +79,7 @@ namespace UniGLTF.SpringBoneJobs } /// - /// Lidt をひとつの FastSpringBoneCombinedBuffer に統合する + /// Job向けに、Lidt[FastSpringBoneBuffer] をひとつの FastSpringBoneCombinedBuffer に統合する /// internal static JobHandle Create(JobHandle handle, IReadOnlyList buffers, out FastSpringBoneCombinedBuffer combined) diff --git a/Assets/VRM/Runtime/SpringBone/Jobs/Vrm0XFastSpringBoneRuntime.cs b/Assets/VRM/Runtime/SpringBone/Jobs/Vrm0XFastSpringBoneRuntime.cs index 4e730e4ac..45d56ffad 100644 --- a/Assets/VRM/Runtime/SpringBone/Jobs/Vrm0XFastSpringBoneRuntime.cs +++ b/Assets/VRM/Runtime/SpringBone/Jobs/Vrm0XFastSpringBoneRuntime.cs @@ -57,7 +57,7 @@ namespace VRM return; } - m_service.BufferCombiner.Unregister(m_buffer); + m_service.BufferCombiner.Register(add: null, remove: m_buffer); m_buffer.Dispose(); m_buffer = null; } @@ -67,7 +67,7 @@ namespace VRM Debug.Assert(m_buffer == null); var buffer = await SpringBoneJobs.FastSpringBoneReplacer.MakeBufferAsync(m_vrm, awaitCaller); m_buffer = buffer; - SpringBoneJobs.FastSpringBoneService.Instance.BufferCombiner.Register(buffer); + SpringBoneJobs.FastSpringBoneService.Instance.BufferCombiner.Register(add: buffer, remove: null); } diff --git a/Assets/VRM10/Runtime/Components/Vrm10Runtime/Vrm10FastSpringboneRuntime.cs b/Assets/VRM10/Runtime/Components/Vrm10Runtime/Vrm10FastSpringboneRuntime.cs index 4f26d93d1..246eb9c7c 100644 --- a/Assets/VRM10/Runtime/Components/Vrm10Runtime/Vrm10FastSpringboneRuntime.cs +++ b/Assets/VRM10/Runtime/Components/Vrm10Runtime/Vrm10FastSpringboneRuntime.cs @@ -55,7 +55,7 @@ namespace UniVRM10 { if (m_fastSpringBoneBuffer != null) { - m_fastSpringBoneService.BufferCombiner.Unregister(m_fastSpringBoneBuffer); + m_fastSpringBoneService.BufferCombiner.Register(add: null, remove: m_fastSpringBoneBuffer); m_fastSpringBoneBuffer.Dispose(); } } @@ -87,16 +87,10 @@ namespace UniVRM10 } m_building = true; - // 登録削除 - if (m_fastSpringBoneBuffer != null) - { - m_fastSpringBoneService.BufferCombiner.Unregister(m_fastSpringBoneBuffer); - } + var fastSpringBoneBuffer = await FastSpringBoneBufferFactory.ConstructSpringBoneAsync(awaitCaller, m_instance, m_fastSpringBoneBuffer); - m_fastSpringBoneBuffer = await FastSpringBoneBufferFactory.ConstructSpringBoneAsync(awaitCaller, m_instance, m_fastSpringBoneBuffer); - - // 登録 - m_fastSpringBoneService.BufferCombiner.Register(m_fastSpringBoneBuffer); + m_fastSpringBoneService.BufferCombiner.Register(add: fastSpringBoneBuffer, remove: m_fastSpringBoneBuffer); + m_fastSpringBoneBuffer = fastSpringBoneBuffer; m_building = false; return true; diff --git a/Assets/VRM10/Runtime/Components/Vrm10Runtime/Vrm10FastSpringboneRuntimeStandalone.cs b/Assets/VRM10/Runtime/Components/Vrm10Runtime/Vrm10FastSpringboneRuntimeStandalone.cs index 31153063d..e1660af07 100644 --- a/Assets/VRM10/Runtime/Components/Vrm10Runtime/Vrm10FastSpringboneRuntimeStandalone.cs +++ b/Assets/VRM10/Runtime/Components/Vrm10Runtime/Vrm10FastSpringboneRuntimeStandalone.cs @@ -54,7 +54,7 @@ namespace UniVRM10 public void Dispose() { - m_bufferCombiner.Unregister(m_fastSpringBoneBuffer); + m_bufferCombiner.Register(add: null, remove: m_fastSpringBoneBuffer); m_fastSpringBoneBuffer.Dispose(); m_fastSpringBoneScheduler.Dispose(); @@ -88,16 +88,9 @@ namespace UniVRM10 } m_building = true; - // 登録削除 - if (m_fastSpringBoneBuffer != null) - { - m_bufferCombiner.Unregister(m_fastSpringBoneBuffer); - } - - m_fastSpringBoneBuffer = await FastSpringBoneBufferFactory.ConstructSpringBoneAsync(awaitCaller, m_instance, m_fastSpringBoneBuffer); - - // 登録 - m_bufferCombiner.Register(m_fastSpringBoneBuffer); + var fastSpringBoneBuffer = await FastSpringBoneBufferFactory.ConstructSpringBoneAsync(awaitCaller, m_instance, m_fastSpringBoneBuffer); + m_bufferCombiner.Register(add: fastSpringBoneBuffer, remove: m_fastSpringBoneBuffer); + m_fastSpringBoneBuffer = fastSpringBoneBuffer; m_building = false; return true; From 7a34d11a3c10a399ccf583b1892a8efc052a50a3 Mon Sep 17 00:00:00 2001 From: ousttrue Date: Mon, 17 Mar 2025 15:40:04 +0900 Subject: [PATCH 3/3] add spring.transformIndexOffset --- .../Runtime/SpringBoneJobs/FastSpringBoneConbinedBuffer.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Assets/UniGLTF/Runtime/SpringBoneJobs/FastSpringBoneConbinedBuffer.cs b/Assets/UniGLTF/Runtime/SpringBoneJobs/FastSpringBoneConbinedBuffer.cs index 3202abfbd..8e8cc7835 100644 --- a/Assets/UniGLTF/Runtime/SpringBoneJobs/FastSpringBoneConbinedBuffer.cs +++ b/Assets/UniGLTF/Runtime/SpringBoneJobs/FastSpringBoneConbinedBuffer.cs @@ -303,7 +303,9 @@ namespace UniGLTF.SpringBoneJobs public void Execute(int springIndex) { var spring = Springs[springIndex]; - var center = spring.centerTransformIndex >= 0 ? Transforms[spring.centerTransformIndex] : (BlittableTransform?)null; + var center = spring.centerTransformIndex >= 0 + ? Transforms[spring.transformIndexOffset + spring.centerTransformIndex] + : (BlittableTransform?)null; for (int jointIndex = spring.logicSpan.startIndex; jointIndex < spring.logicSpan.EndIndex; ++jointIndex) { if (float.IsNaN(CurrentTails[jointIndex].x))