diff --git a/Assets/VRM10/Runtime/FastSpringBone/Blittables/BlittableLogic.cs b/Assets/VRM10/Runtime/FastSpringBone/Blittables/BlittableLogic.cs index fc760480a..16eea4635 100644 --- a/Assets/VRM10/Runtime/FastSpringBone/Blittables/BlittableLogic.cs +++ b/Assets/VRM10/Runtime/FastSpringBone/Blittables/BlittableLogic.cs @@ -1,6 +1,5 @@ using System; using UnityEngine; -using UnityEngine.Serialization; namespace UniVRM10.FastSpringBones.Blittables { @@ -10,6 +9,7 @@ namespace UniVRM10.FastSpringBones.Blittables [Serializable] public struct BlittableLogic { + public int transformIndexOffset; public int parentTransformIndex; public int headTransformIndex; public float length; diff --git a/Assets/VRM10/Runtime/FastSpringBone/System/FastSpringBoneBufferCombiner.cs b/Assets/VRM10/Runtime/FastSpringBone/System/FastSpringBoneBufferCombiner.cs index 63ac84af3..afad9ab1e 100644 --- a/Assets/VRM10/Runtime/FastSpringBone/System/FastSpringBoneBufferCombiner.cs +++ b/Assets/VRM10/Runtime/FastSpringBone/System/FastSpringBoneBufferCombiner.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Linq; using Unity.Collections; using Unity.Jobs; using UnityEngine; @@ -25,6 +26,7 @@ namespace UniVRM10.FastSpringBones.System private TransformAccessArray _transformAccessArray; private readonly LinkedList _buffers = new LinkedList(); + private FastSpringBoneBuffer[] _batchedBuffers; private bool _isDirty; @@ -62,14 +64,34 @@ namespace UniVRM10.FastSpringBones.System return handle; } + /// + /// バッチングされたバッファから、個々のバッファへと値を戻す + /// バッファの再構築前にこの処理を行わないと、揺れの状態がリセットされてしまい、不自然な挙動になる + /// + private void SaveToSourceBuffer() + { + if (_batchedBuffers == null) return; + + var logicsIndex = 0; + foreach (var buffer in _batchedBuffers) + { + var length = buffer.Logics.Length; + NativeArray.Copy(_logics, logicsIndex, buffer.Logics, 0, length); + logicsIndex += length; + } + } + /// /// バッファを再構築する - /// TODO: 最適化 /// private JobHandle ReconstructBuffers(JobHandle handle) { Profiler.BeginSample("FastSpringBone.ReconstructBuffers"); + Profiler.BeginSample("FastSpringBone.ReconstructBuffers.SaveToSourceBuffer"); + SaveToSourceBuffer(); + Profiler.EndSample(); + Profiler.BeginSample("FastSpringBone.ReconstructBuffers.DisposeBuffers"); DisposeAllBuffers(); Profiler.EndSample(); @@ -79,6 +101,10 @@ namespace UniVRM10.FastSpringBones.System var logicsCount = 0; var transformsCount = 0; + Profiler.BeginSample("FastSpringBone.ReconstructBuffers.CopyToBatchedBuffers"); + _batchedBuffers = _buffers.ToArray(); + Profiler.EndSample(); + Profiler.BeginSample("FastSpringBone.ReconstructBuffers.CountBufferSize"); foreach (var buffer in _buffers) { @@ -250,8 +276,7 @@ namespace UniVRM10.FastSpringBones.System public void Execute(int index) { var logic = SrcLogics[index]; - logic.headTransformIndex += TransformOffset; - if (logic.parentTransformIndex >= 0) logic.parentTransformIndex += TransformOffset; + logic.transformIndexOffset = TransformOffset; DestLogics[index] = logic; DestJoints[index] = SrcJoints[index]; } diff --git a/Assets/VRM10/Runtime/FastSpringBone/System/UpdateFastSpringBoneJob.cs b/Assets/VRM10/Runtime/FastSpringBone/System/UpdateFastSpringBoneJob.cs index c0b7fa9d9..7e9df7d89 100644 --- a/Assets/VRM10/Runtime/FastSpringBone/System/UpdateFastSpringBoneJob.cs +++ b/Assets/VRM10/Runtime/FastSpringBone/System/UpdateFastSpringBoneJob.cs @@ -34,12 +34,12 @@ namespace UniVRM10.FastSpringBones.System var logic = Logics[logicIndex]; var joint = Joints[logicIndex]; - var headTransform = Transforms[logic.headTransformIndex]; + var headTransform = Transforms[logic.headTransformIndex + logic.transformIndexOffset]; var parentTransform = logic.parentTransformIndex >= 0 - ? Transforms[logic.parentTransformIndex] + ? Transforms[logic.parentTransformIndex + logic.transformIndexOffset] : (BlittableTransform?)null; var centerTransform = spring.centerTransformIndex >= 0 - ? Transforms[spring.centerTransformIndex] + ? Transforms[spring.centerTransformIndex + logic.transformIndexOffset] : (BlittableTransform?)null; @@ -130,7 +130,7 @@ namespace UniVRM10.FastSpringBones.System } // 値をバッファに戻す - Transforms[logic.headTransformIndex] = headTransform; + Transforms[logic.headTransformIndex + logic.transformIndexOffset] = headTransform; Logics[logicIndex] = logic; } }