From 0e738ae3d29280a329e418c3290afc5c6bffb4c4 Mon Sep 17 00:00:00 2001 From: ousttrue Date: Wed, 11 Sep 2024 20:35:57 +0900 Subject: [PATCH 1/5] =?UTF-8?q?BlittableLogic=20=E3=82=92=20immutable=20?= =?UTF-8?q?=E3=81=AB=E3=81=99=E3=82=8B=E3=81=B9=E3=81=8F=20currentTail=20?= =?UTF-8?q?=E3=81=A8=20prevTail=20=E3=82=92=E5=A4=96=E5=87=BA=E3=81=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...littableLogic.cs => BlittableJointInit.cs} | 7 +- ...gic.cs.meta => BlittableJointInit.cs.meta} | 0 ...ableJoint.cs => BlittableJointSettings.cs} | 6 +- ...cs.meta => BlittableJointSettings.cs.meta} | 0 .../FastSpringBoneBufferCombiner.cs | 142 +++++++++++++++--- .../SpringBoneJobs/FastSpringBoneScheduler.cs | 7 +- .../InputPorts/FastSpringBoneBuffer.cs | 41 ++--- .../InputPorts/FastSpringBoneJoint.cs | 2 +- .../SpringBoneJobs/UpdateFastSpringBoneJob.cs | 44 +++--- .../SpringBone/Jobs/FastSpringBoneReplacer.cs | 2 +- .../Vrm10Runtime/Vrm10RuntimeSpringBone.cs | 12 +- 11 files changed, 168 insertions(+), 95 deletions(-) rename Assets/UniGLTF/Runtime/SpringBoneJobs/Blittables/{BlittableLogic.cs => BlittableJointInit.cs} (64%) rename Assets/UniGLTF/Runtime/SpringBoneJobs/Blittables/{BlittableLogic.cs.meta => BlittableJointInit.cs.meta} (100%) rename Assets/UniGLTF/Runtime/SpringBoneJobs/Blittables/{BlittableJoint.cs => BlittableJointSettings.cs} (77%) rename Assets/UniGLTF/Runtime/SpringBoneJobs/Blittables/{BlittableJoint.cs.meta => BlittableJointSettings.cs.meta} (100%) diff --git a/Assets/UniGLTF/Runtime/SpringBoneJobs/Blittables/BlittableLogic.cs b/Assets/UniGLTF/Runtime/SpringBoneJobs/Blittables/BlittableJointInit.cs similarity index 64% rename from Assets/UniGLTF/Runtime/SpringBoneJobs/Blittables/BlittableLogic.cs rename to Assets/UniGLTF/Runtime/SpringBoneJobs/Blittables/BlittableJointInit.cs index 547ca4cbe..2c070da6e 100644 --- a/Assets/UniGLTF/Runtime/SpringBoneJobs/Blittables/BlittableLogic.cs +++ b/Assets/UniGLTF/Runtime/SpringBoneJobs/Blittables/BlittableJointInit.cs @@ -4,16 +4,15 @@ using UnityEngine; namespace UniGLTF.SpringBoneJobs.Blittables { /// - /// SpringBoneの各関節に紐付いた計算情報を表すデータ型 + /// 初期状態から計算できる Joint のパラメーター /// [Serializable] - public struct BlittableLogic + public struct BlittableJointInit { public int parentTransformIndex; public int headTransformIndex; + public int tailTransformIndex; public float length; - public Vector3 currentTail; - public Vector3 prevTail; public Quaternion localRotation; public Vector3 boneAxis; } diff --git a/Assets/UniGLTF/Runtime/SpringBoneJobs/Blittables/BlittableLogic.cs.meta b/Assets/UniGLTF/Runtime/SpringBoneJobs/Blittables/BlittableJointInit.cs.meta similarity index 100% rename from Assets/UniGLTF/Runtime/SpringBoneJobs/Blittables/BlittableLogic.cs.meta rename to Assets/UniGLTF/Runtime/SpringBoneJobs/Blittables/BlittableJointInit.cs.meta diff --git a/Assets/UniGLTF/Runtime/SpringBoneJobs/Blittables/BlittableJoint.cs b/Assets/UniGLTF/Runtime/SpringBoneJobs/Blittables/BlittableJointSettings.cs similarity index 77% rename from Assets/UniGLTF/Runtime/SpringBoneJobs/Blittables/BlittableJoint.cs rename to Assets/UniGLTF/Runtime/SpringBoneJobs/Blittables/BlittableJointSettings.cs index c7d79a95d..ace72b98d 100644 --- a/Assets/UniGLTF/Runtime/SpringBoneJobs/Blittables/BlittableJoint.cs +++ b/Assets/UniGLTF/Runtime/SpringBoneJobs/Blittables/BlittableJointSettings.cs @@ -4,10 +4,10 @@ using UnityEngine; namespace UniGLTF.SpringBoneJobs.Blittables { /// - /// SpringBoneの各関節を表すデータ型 + /// - 毎フレームの変化を許可する /// [Serializable] - public struct BlittableJoint + public struct BlittableJointSettings { public float stiffnessForce; public float gravityPower; @@ -15,4 +15,4 @@ namespace UniGLTF.SpringBoneJobs.Blittables public float dragForce; public float radius; } -} +} \ No newline at end of file diff --git a/Assets/UniGLTF/Runtime/SpringBoneJobs/Blittables/BlittableJoint.cs.meta b/Assets/UniGLTF/Runtime/SpringBoneJobs/Blittables/BlittableJointSettings.cs.meta similarity index 100% rename from Assets/UniGLTF/Runtime/SpringBoneJobs/Blittables/BlittableJoint.cs.meta rename to Assets/UniGLTF/Runtime/SpringBoneJobs/Blittables/BlittableJointSettings.cs.meta diff --git a/Assets/UniGLTF/Runtime/SpringBoneJobs/FastSpringBoneBufferCombiner.cs b/Assets/UniGLTF/Runtime/SpringBoneJobs/FastSpringBoneBufferCombiner.cs index 82d400e8a..d365bbc93 100644 --- a/Assets/UniGLTF/Runtime/SpringBoneJobs/FastSpringBoneBufferCombiner.cs +++ b/Assets/UniGLTF/Runtime/SpringBoneJobs/FastSpringBoneBufferCombiner.cs @@ -19,11 +19,19 @@ namespace UniGLTF.SpringBoneJobs /// public sealed class FastSpringBoneBufferCombiner : IDisposable { + // 長さと index 同じ + private NativeArray _logics; + private NativeArray _joints; + + private NativeArray _prevTails; + private NativeArray _currentTails; + private NativeArray _nextTails; + private NativeArray _springs; - private NativeArray _transforms; + private NativeArray _colliders; - private NativeArray _joints; - private NativeArray _logics; + + private NativeArray _transforms; private TransformAccessArray _transformAccessArray; private readonly LinkedList _buffers = new LinkedList(); @@ -32,15 +40,39 @@ namespace UniGLTF.SpringBoneJobs private bool _isDirty; + public NativeArray Logics => _logics; + public NativeArray Joints => _joints; + public NativeArray PrevTails => _prevTails; + public NativeArray CurrentTails => _currentTails; + public NativeArray NextTails => _nextTails; + public NativeArray Springs => _springs; - public NativeArray Joints => _joints; + + public NativeArray Colliders => _colliders; + public NativeArray Transforms => _transforms; public TransformAccessArray TransformAccessArray => _transformAccessArray; - public NativeArray Colliders => _colliders; - public NativeArray Logics => _logics; public bool HasBuffer => _batchedBuffers != null && _batchedBuffers.Length > 0; + int flipPhase = 0; + public (NativeArray current, NativeArray prev, NativeArray next) FlipBuffer() + { + switch (flipPhase++ % 3) + { + case 0: return (_currentTails, _prevTails, _nextTails); + case 1: return (_nextTails, _currentTails, _prevTails); + case 2: return (_prevTails, _nextTails, _currentTails); + default: + throw new Exception(); + } + // dispose が狂う?? + // var tmp = _prevTails; + // _currentTails = _nextTails; + // _prevTails = _currentTails; + // _nextTails = tmp; + } + public void Register(FastSpringBoneBuffer buffer) { _buffers.AddLast(buffer); @@ -82,7 +114,7 @@ namespace UniGLTF.SpringBoneJobs var length = _batchedBufferLogicSizes[i]; if (!_batchedBuffers[i].IsDisposed && length > 0) { - NativeArray.Copy(_logics, logicsIndex, _batchedBuffers[i].Logics, 0, length); + NativeArray.Copy(_logics, logicsIndex, _batchedBuffers[i].Logics, 0, length); } logicsIndex += length; @@ -123,26 +155,29 @@ namespace UniGLTF.SpringBoneJobs logicsCount += buffer.Logics.Length; transformsCount += buffer.BlittableTransforms.Length; } - Profiler.EndSample(); // バッファの構築 Profiler.BeginSample("FastSpringBone.ReconstructBuffers.CreateBuffers"); + + _logics = new NativeArray(logicsCount, Allocator.Persistent); + _joints = new NativeArray(logicsCount, Allocator.Persistent); + _prevTails = new NativeArray(logicsCount, Allocator.Persistent); + _currentTails = new NativeArray(logicsCount, Allocator.Persistent); + _nextTails = new NativeArray(logicsCount, Allocator.Persistent); + _springs = new NativeArray(springsCount, Allocator.Persistent); - _joints = new NativeArray(logicsCount, Allocator.Persistent); - _logics = new NativeArray(logicsCount, Allocator.Persistent); _colliders = new NativeArray(collidersCount, Allocator.Persistent); _transforms = new NativeArray(transformsCount, Allocator.Persistent); Profiler.EndSample(); + Profiler.BeginSample("FastSpringBone.ReconstructBuffers.ScheduleLoadBufferJobs"); var springsOffset = 0; var collidersOffset = 0; var logicsOffset = 0; var transformOffset = 0; - - Profiler.BeginSample("FastSpringBone.ReconstructBuffers.ScheduleLoadBufferJobs"); for (var i = 0; i < _batchedBuffers.Length; i++) { var buffer = _batchedBuffers[i]; @@ -151,10 +186,10 @@ namespace UniGLTF.SpringBoneJobs handle = new LoadTransformsJob { SrcTransforms = buffer.BlittableTransforms, - DestTransforms = - new NativeSlice(_transforms, transformOffset, + DestTransforms = new NativeSlice(_transforms, transformOffset, buffer.BlittableTransforms.Length) }.Schedule(buffer.BlittableTransforms.Length, 1, handle); + handle = new LoadSpringsJob { SrcSprings = buffer.Springs, @@ -163,18 +198,20 @@ namespace UniGLTF.SpringBoneJobs LogicsOffset = logicsOffset, TransformOffset = transformOffset, }.Schedule(buffer.Springs.Length, 1, handle); + handle = new LoadCollidersJob { SrcColliders = buffer.Colliders, - DestColliders = - new NativeSlice(_colliders, collidersOffset, buffer.Colliders.Length) + DestColliders = new NativeSlice(_colliders, collidersOffset, buffer.Colliders.Length) }.Schedule(buffer.Colliders.Length, 1, handle); + handle = new OffsetLogicsJob { SrcLogics = buffer.Logics, SrcJoints = buffer.Joints, - DestLogics = new NativeSlice(_logics, logicsOffset, buffer.Logics.Length), - DestJoints = new NativeSlice(_joints, logicsOffset, buffer.Logics.Length), + + DestLogics = new NativeSlice(_logics, logicsOffset, buffer.Logics.Length), + DestJoints = new NativeSlice(_joints, logicsOffset, buffer.Logics.Length), }.Schedule(buffer.Logics.Length, 1, handle); springsOffset += buffer.Springs.Length; @@ -183,6 +220,8 @@ namespace UniGLTF.SpringBoneJobs transformOffset += buffer.BlittableTransforms.Length; } + handle = InitCurrentTails(handle); + // TransformAccessArrayの構築と並行してJobを行うため、この時点で走らせておく JobHandle.ScheduleBatchedJobs(); Profiler.EndSample(); @@ -205,14 +244,35 @@ namespace UniGLTF.SpringBoneJobs return handle; } + /// + /// Transform から currentTail を更新。 + /// prevTail も同じ内容にする(速度0)。 + /// + /// + /// + public JobHandle InitCurrentTails(JobHandle handle) + { + return new InitCurrentTailsJob + { + Logics = Logics, + Transforms = Transforms, + CurrentTails = CurrentTails, + PrevTails = PrevTails, + NextTails = NextTails, + }.Schedule(Logics.Length, 1, handle); + } + private void DisposeAllBuffers() { - if (_springs.IsCreated) _springs.Dispose(); + if (_logics.IsCreated) _logics.Dispose(); if (_joints.IsCreated) _joints.Dispose(); + if (_prevTails.IsCreated) _prevTails.Dispose(); + if (_currentTails.IsCreated) _currentTails.Dispose(); + if (_nextTails.IsCreated) _nextTails.Dispose(); + if (_springs.IsCreated) _springs.Dispose(); + if (_colliders.IsCreated) _colliders.Dispose(); if (_transforms.IsCreated) _transforms.Dispose(); if (_transformAccessArray.isCreated) _transformAccessArray.Dispose(); - if (_colliders.IsCreated) _colliders.Dispose(); - if (_logics.IsCreated) _logics.Dispose(); } public void Dispose() @@ -275,10 +335,10 @@ namespace UniGLTF.SpringBoneJobs #endif private struct OffsetLogicsJob : IJobParallelFor { - [ReadOnly] public NativeSlice SrcLogics; - [ReadOnly] public NativeSlice SrcJoints; - [WriteOnly] public NativeSlice DestLogics; - [WriteOnly] public NativeSlice DestJoints; + [ReadOnly] public NativeSlice SrcLogics; + [ReadOnly] public NativeSlice SrcJoints; + [WriteOnly] public NativeSlice DestLogics; + [WriteOnly] public NativeSlice DestJoints; public void Execute(int index) { @@ -286,5 +346,37 @@ namespace UniGLTF.SpringBoneJobs DestJoints[index] = SrcJoints[index]; } } + +#if ENABLE_SPRINGBONE_BURST + [BurstCompile] +#endif + private struct InitCurrentTailsJob : IJobParallelFor + { + [ReadOnly] public NativeArray Logics; + [ReadOnly] public NativeArray Transforms; + [WriteOnly] public NativeSlice CurrentTails; + [WriteOnly] public NativeSlice PrevTails; + [WriteOnly] public NativeSlice NextTails; + + public void Execute(int jointIndex) + { + var tailIndex = Logics[jointIndex].tailTransformIndex; + if (tailIndex == -1) + { + // tail 無い + var tail = Transforms[Logics[jointIndex].headTransformIndex]; + CurrentTails[jointIndex] = tail.position; + PrevTails[jointIndex] = tail.position; + NextTails[jointIndex] = tail.position; + } + else + { + var tail = Transforms[tailIndex]; + CurrentTails[jointIndex] = tail.position; + PrevTails[jointIndex] = tail.position; + NextTails[jointIndex] = tail.position; + } + } + } } } \ No newline at end of file diff --git a/Assets/UniGLTF/Runtime/SpringBoneJobs/FastSpringBoneScheduler.cs b/Assets/UniGLTF/Runtime/SpringBoneJobs/FastSpringBoneScheduler.cs index cbdc158b8..7e258400f 100644 --- a/Assets/UniGLTF/Runtime/SpringBoneJobs/FastSpringBoneScheduler.cs +++ b/Assets/UniGLTF/Runtime/SpringBoneJobs/FastSpringBoneScheduler.cs @@ -31,12 +31,17 @@ namespace UniGLTF.SpringBoneJobs Transforms = _bufferCombiner.Transforms }.Schedule(_bufferCombiner.TransformAccessArray, handle); + var (current, prev, next) = _bufferCombiner.FlipBuffer(); + handle = new UpdateFastSpringBoneJob { - Colliders = _bufferCombiner.Colliders, Joints = _bufferCombiner.Joints, Logics = _bufferCombiner.Logics, + CurrentTail = current, + PrevTail = prev, + NextTail = next, Springs = _bufferCombiner.Springs, + Colliders = _bufferCombiner.Colliders, Transforms = _bufferCombiner.Transforms, DeltaTime = deltaTime, }.Schedule(_bufferCombiner.Springs.Length, 1, handle); diff --git a/Assets/UniGLTF/Runtime/SpringBoneJobs/InputPorts/FastSpringBoneBuffer.cs b/Assets/UniGLTF/Runtime/SpringBoneJobs/InputPorts/FastSpringBoneBuffer.cs index 99785caf8..da863bfa6 100644 --- a/Assets/UniGLTF/Runtime/SpringBoneJobs/InputPorts/FastSpringBoneBuffer.cs +++ b/Assets/UniGLTF/Runtime/SpringBoneJobs/InputPorts/FastSpringBoneBuffer.cs @@ -16,9 +16,9 @@ namespace UniGLTF.SpringBoneJobs.InputPorts { // NOTE: これらはFastSpringBoneBufferCombinerによってバッチングされる public NativeArray Springs { get; } - public NativeArray Joints { get; } + public NativeArray Joints { get; } public NativeArray Colliders { get; } - public NativeArray Logics { get; } + public NativeArray Logics { get; } public NativeArray BlittableTransforms { get; } public Transform[] Transforms { get; } public bool IsDisposed { get; private set; } @@ -92,9 +92,9 @@ namespace UniGLTF.SpringBoneJobs.InputPorts var externalDataPtr = (BlittableExternalData*)_externalData.GetUnsafePtr(); List blittableSprings = new(); - List blittableJoints = new(); + List blittableJoints = new(); List blittableColliders = new(); - List blittableLogics = new(); + List blittableLogics = new(); foreach (var spring in springs) { var blittableSpring = new BlittableSpring @@ -131,9 +131,9 @@ namespace UniGLTF.SpringBoneJobs.InputPorts } Springs = new NativeArray(blittableSprings.ToArray(), Allocator.Persistent); - Joints = new NativeArray(blittableJoints.ToArray(), Allocator.Persistent); + Joints = new NativeArray(blittableJoints.ToArray(), Allocator.Persistent); Colliders = new NativeArray(blittableColliders.ToArray(), Allocator.Persistent); - Logics = new NativeArray(blittableLogics.ToArray(), Allocator.Persistent); + Logics = new NativeArray(blittableLogics.ToArray(), Allocator.Persistent); BlittableTransforms = new NativeArray(Transforms.Length, Allocator.Persistent); Profiler.EndSample(); } @@ -145,15 +145,17 @@ namespace UniGLTF.SpringBoneJobs.InputPorts /// /// joint index /// - public static IEnumerable LogicFromTransform(Transform[] Transforms, FastSpringBoneSpring spring) + public static IEnumerable LogicFromTransform(Transform[] Transforms, FastSpringBoneSpring spring) { // vrm-1.0 では末端の joint は tail で処理対象でないのに注意! for (int i = 0; i < spring.joints.Length - 1; ++i) { var joint = spring.joints[i]; - var tailJoint = i + 1 < spring.joints.Length ? spring.joints[i + 1] : (FastSpringBoneJoint?)null; + Debug.Assert(i + 1 < spring.joints.Length); + var tailJoint = (i + 1 < spring.joints.Length) ? spring.joints[i + 1] : (FastSpringBoneJoint?)null; + Debug.Assert(tailJoint.HasValue); var parentJoint = i - 1 >= 0 ? spring.joints[i - 1] : (FastSpringBoneJoint?)null; - var localPosition = Vector3.zero; + Vector3 localPosition; if (tailJoint.HasValue) { localPosition = tailJoint.Value.Transform.localPosition; @@ -178,19 +180,13 @@ namespace UniGLTF.SpringBoneJobs.InputPorts localPosition.y * scale.y, localPosition.z * scale.z ); - - var worldChildPosition = joint.Transform.TransformPoint(localChildPosition); - var currentTail = spring.center != null - ? spring.center.InverseTransformPoint(worldChildPosition) - : worldChildPosition; var parent = joint.Transform.parent; - yield return new BlittableLogic + yield return new BlittableJointInit { headTransformIndex = Array.IndexOf(Transforms, joint.Transform), parentTransformIndex = Array.IndexOf(Transforms, parent), - currentTail = currentTail, - prevTail = currentTail, // same with currentTail. velocity zero. + tailTransformIndex = Array.IndexOf(Transforms, tailJoint.Value), localRotation = joint.DefaultLocalRotation, boneAxis = localChildPosition.normalized, length = localChildPosition.magnitude @@ -209,16 +205,5 @@ namespace UniGLTF.SpringBoneJobs.InputPorts Logics.Dispose(); _externalData.Dispose(); } - - public void SyncAndZeroVelocity(IReadOnlyList logics) - { - var dst = Logics; - for (int i = 0; i < logics.Count; ++i) - { - var l = logics[i]; - l.prevTail = l.currentTail; - dst[i] = l; - } - } } } \ No newline at end of file diff --git a/Assets/UniGLTF/Runtime/SpringBoneJobs/InputPorts/FastSpringBoneJoint.cs b/Assets/UniGLTF/Runtime/SpringBoneJobs/InputPorts/FastSpringBoneJoint.cs index 69cb51a80..0b230a862 100644 --- a/Assets/UniGLTF/Runtime/SpringBoneJobs/InputPorts/FastSpringBoneJoint.cs +++ b/Assets/UniGLTF/Runtime/SpringBoneJobs/InputPorts/FastSpringBoneJoint.cs @@ -8,7 +8,7 @@ namespace UniGLTF.SpringBoneJobs.InputPorts public struct FastSpringBoneJoint { public Transform Transform; - public BlittableJoint Joint; + public BlittableJointSettings Joint; public Quaternion DefaultLocalRotation; } } \ No newline at end of file diff --git a/Assets/UniGLTF/Runtime/SpringBoneJobs/UpdateFastSpringBoneJob.cs b/Assets/UniGLTF/Runtime/SpringBoneJobs/UpdateFastSpringBoneJob.cs index 05011e8f0..6ded05926 100644 --- a/Assets/UniGLTF/Runtime/SpringBoneJobs/UpdateFastSpringBoneJob.cs +++ b/Assets/UniGLTF/Runtime/SpringBoneJobs/UpdateFastSpringBoneJob.cs @@ -14,13 +14,18 @@ namespace UniGLTF.SpringBoneJobs #endif public struct UpdateFastSpringBoneJob : IJobParallelFor { - [ReadOnly] public NativeArray Springs; - [ReadOnly] public NativeArray Joints; - [ReadOnly] public NativeArray Colliders; - - [NativeDisableParallelForRestriction] public NativeArray Logics; [NativeDisableParallelForRestriction] public NativeArray Transforms; + [ReadOnly] public NativeArray Springs; + + [ReadOnly] public NativeArray Joints; + [ReadOnly] public NativeArray Logics; + [ReadOnly] public NativeArray PrevTail; + [ReadOnly] public NativeArray CurrentTail; + [NativeDisableParallelForRestriction] public NativeArray NextTail; + + [ReadOnly] public NativeArray Colliders; + public float DeltaTime; public unsafe void Execute(int index) @@ -52,11 +57,11 @@ namespace UniGLTF.SpringBoneJobs } var currentTail = centerTransform.HasValue - ? centerTransform.Value.localToWorldMatrix.MultiplyPoint3x4(logic.currentTail) - : logic.currentTail; + ? centerTransform.Value.localToWorldMatrix.MultiplyPoint3x4(CurrentTail[logicIndex]) + : CurrentTail[logicIndex]; var prevTail = centerTransform.HasValue - ? centerTransform.Value.localToWorldMatrix.MultiplyPoint3x4(logic.prevTail) - : logic.prevTail; + ? centerTransform.Value.localToWorldMatrix.MultiplyPoint3x4(PrevTail[logicIndex]) + : PrevTail[logicIndex]; var parentRotation = parentTransform?.rotation ?? Quaternion.identity; @@ -108,14 +113,10 @@ namespace UniGLTF.SpringBoneJobs } } - logic.prevTail = centerTransform.HasValue - ? centerTransform.Value.worldToLocalMatrix.MultiplyPoint3x4(currentTail) - : currentTail; - logic.currentTail = centerTransform.HasValue + NextTail[logicIndex] = centerTransform.HasValue ? centerTransform.Value.worldToLocalMatrix.MultiplyPoint3x4(nextTail) : nextTail; - //回転を適用 var rotation = parentRotation * logic.localRotation; headTransform.rotation = Quaternion.FromToRotation(rotation * logic.boneAxis, @@ -157,7 +158,6 @@ namespace UniGLTF.SpringBoneJobs // SpringBone の結果を Transform に反映しないが logic の更新は継続する。 // 再開したときに暴れない。 } - Logics[logicIndex] = logic; } } @@ -174,10 +174,10 @@ namespace UniGLTF.SpringBoneJobs Vector3 worldTail, Vector3 worldPosition, BlittableTransform headTransform, - BlittableJoint joint, + BlittableJointSettings joint, BlittableCollider collider, float maxColliderScale, - BlittableLogic logic, + BlittableJointInit logic, ref Vector3 nextTail) { var direction = worldTail - worldPosition; @@ -209,12 +209,12 @@ namespace UniGLTF.SpringBoneJobs } private static void ResolveSphereCollision( - BlittableJoint joint, + BlittableJointSettings joint, BlittableCollider collider, Vector3 worldPosition, BlittableTransform headTransform, float maxColliderScale, - BlittableLogic logic, + BlittableJointInit logic, ref Vector3 nextTail) { var r = joint.radius + collider.radius * maxColliderScale; @@ -229,7 +229,7 @@ namespace UniGLTF.SpringBoneJobs } private static void ResolveSphereCollisionInside( - BlittableJoint joint, + BlittableJointSettings joint, BlittableCollider collider, BlittableTransform colliderTransform, ref Vector3 nextTail) @@ -249,7 +249,7 @@ namespace UniGLTF.SpringBoneJobs } private static void ResolveCapsuleCollisionInside( - BlittableJoint joint, + BlittableJointSettings joint, BlittableCollider collider, BlittableTransform colliderTransform, ref Vector3 nextTail) @@ -298,7 +298,7 @@ namespace UniGLTF.SpringBoneJobs /// colliderTransform.localToWorldMatrix.MultiplyPoint3x4(collider.offset); /// result of verlet integration private static void ResolvePlaneCollision( - BlittableJoint joint, + BlittableJointSettings joint, BlittableCollider collider, BlittableTransform colliderTransform, ref Vector3 nextTail) diff --git a/Assets/VRM/Runtime/SpringBone/Jobs/FastSpringBoneReplacer.cs b/Assets/VRM/Runtime/SpringBone/Jobs/FastSpringBoneReplacer.cs index fc6a9a4a2..cfb191108 100644 --- a/Assets/VRM/Runtime/SpringBone/Jobs/FastSpringBoneReplacer.cs +++ b/Assets/VRM/Runtime/SpringBone/Jobs/FastSpringBoneReplacer.cs @@ -87,7 +87,7 @@ namespace VRM.SpringBoneJobs joints.Add(new FastSpringBoneJoint { Transform = joint.transform, - Joint = new BlittableJoint + Joint = new BlittableJointSettings { radius = spring.m_hitRadius, dragForce = spring.m_dragForce, diff --git a/Assets/VRM10/Runtime/Components/Vrm10Runtime/Vrm10RuntimeSpringBone.cs b/Assets/VRM10/Runtime/Components/Vrm10Runtime/Vrm10RuntimeSpringBone.cs index 9e0819b6a..acb899bfc 100644 --- a/Assets/VRM10/Runtime/Components/Vrm10Runtime/Vrm10RuntimeSpringBone.cs +++ b/Assets/VRM10/Runtime/Components/Vrm10Runtime/Vrm10RuntimeSpringBone.cs @@ -92,7 +92,7 @@ namespace UniVRM10 .Select(joint => new FastSpringBoneJoint { Transform = joint.transform, - Joint = new BlittableJoint + Joint = new BlittableJointSettings { radius = joint.m_jointRadius, dragForce = joint.m_dragForce, @@ -150,15 +150,7 @@ namespace UniVRM10 transform.localRotation = m_initialLocalRotations[i]; } - // 初期状態にしたtransformを使って spring logic を構築 - List blittableLogics = new(); - foreach (var spring in m_springs) - { - blittableLogics.AddRange( - FastSpringBoneBuffer.LogicFromTransform(m_fastSpringBoneBuffer.Transforms, spring)); - } - // DOTS バッファーを更新 - m_fastSpringBoneBuffer.SyncAndZeroVelocity(blittableLogics); + // TODO: } } } \ No newline at end of file From b97ffe306b7830b9ee414cf2a5f081c671896d8a Mon Sep 17 00:00:00 2001 From: ousttrue Date: Wed, 11 Sep 2024 21:09:41 +0900 Subject: [PATCH 2/5] comment --- .../SpringBoneJobs/UpdateFastSpringBoneJob.cs | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/Assets/UniGLTF/Runtime/SpringBoneJobs/UpdateFastSpringBoneJob.cs b/Assets/UniGLTF/Runtime/SpringBoneJobs/UpdateFastSpringBoneJob.cs index 6ded05926..4557a1807 100644 --- a/Assets/UniGLTF/Runtime/SpringBoneJobs/UpdateFastSpringBoneJob.cs +++ b/Assets/UniGLTF/Runtime/SpringBoneJobs/UpdateFastSpringBoneJob.cs @@ -14,18 +14,23 @@ namespace UniGLTF.SpringBoneJobs #endif public struct UpdateFastSpringBoneJob : IJobParallelFor { - [NativeDisableParallelForRestriction] public NativeArray Transforms; - - [ReadOnly] public NativeArray Springs; - + // すべての spring の joint を平坦に連結した配列 + // Joints, Logics, PrevTail, CurrentTail, NextTail は同じ index [ReadOnly] public NativeArray Joints; [ReadOnly] public NativeArray Logics; [ReadOnly] public NativeArray PrevTail; [ReadOnly] public NativeArray CurrentTail; + // ランダムアクセス [NativeDisableParallelForRestriction] public NativeArray NextTail; + [ReadOnly] public NativeArray Springs; + [ReadOnly] public NativeArray Colliders; + // FastSpringBoneBuffer.Transforms を連結したもの + // ランダムアクセス + [NativeDisableParallelForRestriction] public NativeArray Transforms; + public float DeltaTime; public unsafe void Execute(int index) From 7b84b73171bf5098b28a39b23cc20972a361eea6 Mon Sep 17 00:00:00 2001 From: ousttrue Date: Tue, 17 Sep 2024 13:42:06 +0900 Subject: [PATCH 3/5] BlittableJointImmutable and BlittableJointMutable --- ...ointInit.cs => BlittableJointImmutable.cs} | 6 ++-- ...s.meta => BlittableJointImmutable.cs.meta} | 0 .../Blittables/BlittableJointMutable.cs | 21 ++++++++++++++ ....cs.meta => BlittableJointMutable.cs.meta} | 0 .../Blittables/BlittableJointSettings.cs | 18 ------------ .../FastSpringBoneBufferCombiner.cs | 28 +++++++++---------- .../InputPorts/FastSpringBoneBuffer.cs | 16 +++++------ .../InputPorts/FastSpringBoneJoint.cs | 2 +- .../SpringBoneJobs/UpdateFastSpringBoneJob.cs | 18 ++++++------ .../SpringBone/Jobs/FastSpringBoneReplacer.cs | 2 +- .../Vrm10Runtime/Vrm10RuntimeSpringBone.cs | 2 +- 11 files changed, 59 insertions(+), 54 deletions(-) rename Assets/UniGLTF/Runtime/SpringBoneJobs/Blittables/{BlittableJointInit.cs => BlittableJointImmutable.cs} (61%) rename Assets/UniGLTF/Runtime/SpringBoneJobs/Blittables/{BlittableJointInit.cs.meta => BlittableJointImmutable.cs.meta} (100%) create mode 100644 Assets/UniGLTF/Runtime/SpringBoneJobs/Blittables/BlittableJointMutable.cs rename Assets/UniGLTF/Runtime/SpringBoneJobs/Blittables/{BlittableJointSettings.cs.meta => BlittableJointMutable.cs.meta} (100%) delete mode 100644 Assets/UniGLTF/Runtime/SpringBoneJobs/Blittables/BlittableJointSettings.cs diff --git a/Assets/UniGLTF/Runtime/SpringBoneJobs/Blittables/BlittableJointInit.cs b/Assets/UniGLTF/Runtime/SpringBoneJobs/Blittables/BlittableJointImmutable.cs similarity index 61% rename from Assets/UniGLTF/Runtime/SpringBoneJobs/Blittables/BlittableJointInit.cs rename to Assets/UniGLTF/Runtime/SpringBoneJobs/Blittables/BlittableJointImmutable.cs index 2c070da6e..c185dbf43 100644 --- a/Assets/UniGLTF/Runtime/SpringBoneJobs/Blittables/BlittableJointInit.cs +++ b/Assets/UniGLTF/Runtime/SpringBoneJobs/Blittables/BlittableJointImmutable.cs @@ -4,10 +4,12 @@ using UnityEngine; namespace UniGLTF.SpringBoneJobs.Blittables { /// - /// 初期状態から計算できる Joint のパラメーター + /// Reconstruct に対して Immutable。 + /// Jointの増減、初期姿勢の変更など構成の変更は Reconstruct が必要。 + /// 変わりにくいスコープ。 /// [Serializable] - public struct BlittableJointInit + public struct BlittableJointImmutable { public int parentTransformIndex; public int headTransformIndex; diff --git a/Assets/UniGLTF/Runtime/SpringBoneJobs/Blittables/BlittableJointInit.cs.meta b/Assets/UniGLTF/Runtime/SpringBoneJobs/Blittables/BlittableJointImmutable.cs.meta similarity index 100% rename from Assets/UniGLTF/Runtime/SpringBoneJobs/Blittables/BlittableJointInit.cs.meta rename to Assets/UniGLTF/Runtime/SpringBoneJobs/Blittables/BlittableJointImmutable.cs.meta diff --git a/Assets/UniGLTF/Runtime/SpringBoneJobs/Blittables/BlittableJointMutable.cs b/Assets/UniGLTF/Runtime/SpringBoneJobs/Blittables/BlittableJointMutable.cs new file mode 100644 index 000000000..bbbd8c3ac --- /dev/null +++ b/Assets/UniGLTF/Runtime/SpringBoneJobs/Blittables/BlittableJointMutable.cs @@ -0,0 +1,21 @@ +using System; +using UnityEngine; + +namespace UniGLTF.SpringBoneJobs.Blittables +{ + /// + /// Reconstruct に対して Mutable。 + /// Reconstruct より軽量な JointReconfigure(仮) で変更できるようにする予定。 + /// おもに Editor play で設定を変更しながら動作を見る用途を想定している。 + /// JointReconfigure を呼ばなければ以前と同じで不変となる。 + /// + [Serializable] + public struct BlittableJointMutable + { + public float stiffnessForce; + public float gravityPower; + public Vector3 gravityDir; + public float dragForce; + public float radius; + } +} \ No newline at end of file diff --git a/Assets/UniGLTF/Runtime/SpringBoneJobs/Blittables/BlittableJointSettings.cs.meta b/Assets/UniGLTF/Runtime/SpringBoneJobs/Blittables/BlittableJointMutable.cs.meta similarity index 100% rename from Assets/UniGLTF/Runtime/SpringBoneJobs/Blittables/BlittableJointSettings.cs.meta rename to Assets/UniGLTF/Runtime/SpringBoneJobs/Blittables/BlittableJointMutable.cs.meta diff --git a/Assets/UniGLTF/Runtime/SpringBoneJobs/Blittables/BlittableJointSettings.cs b/Assets/UniGLTF/Runtime/SpringBoneJobs/Blittables/BlittableJointSettings.cs deleted file mode 100644 index ace72b98d..000000000 --- a/Assets/UniGLTF/Runtime/SpringBoneJobs/Blittables/BlittableJointSettings.cs +++ /dev/null @@ -1,18 +0,0 @@ -using System; -using UnityEngine; - -namespace UniGLTF.SpringBoneJobs.Blittables -{ - /// - /// - 毎フレームの変化を許可する - /// - [Serializable] - public struct BlittableJointSettings - { - public float stiffnessForce; - public float gravityPower; - public Vector3 gravityDir; - public float dragForce; - public float radius; - } -} \ No newline at end of file diff --git a/Assets/UniGLTF/Runtime/SpringBoneJobs/FastSpringBoneBufferCombiner.cs b/Assets/UniGLTF/Runtime/SpringBoneJobs/FastSpringBoneBufferCombiner.cs index d365bbc93..f3147ea78 100644 --- a/Assets/UniGLTF/Runtime/SpringBoneJobs/FastSpringBoneBufferCombiner.cs +++ b/Assets/UniGLTF/Runtime/SpringBoneJobs/FastSpringBoneBufferCombiner.cs @@ -20,8 +20,8 @@ namespace UniGLTF.SpringBoneJobs public sealed class FastSpringBoneBufferCombiner : IDisposable { // 長さと index 同じ - private NativeArray _logics; - private NativeArray _joints; + private NativeArray _logics; + private NativeArray _joints; private NativeArray _prevTails; private NativeArray _currentTails; @@ -40,8 +40,8 @@ namespace UniGLTF.SpringBoneJobs private bool _isDirty; - public NativeArray Logics => _logics; - public NativeArray Joints => _joints; + public NativeArray Logics => _logics; + public NativeArray Joints => _joints; public NativeArray PrevTails => _prevTails; public NativeArray CurrentTails => _currentTails; public NativeArray NextTails => _nextTails; @@ -114,7 +114,7 @@ namespace UniGLTF.SpringBoneJobs var length = _batchedBufferLogicSizes[i]; if (!_batchedBuffers[i].IsDisposed && length > 0) { - NativeArray.Copy(_logics, logicsIndex, _batchedBuffers[i].Logics, 0, length); + NativeArray.Copy(_logics, logicsIndex, _batchedBuffers[i].Logics, 0, length); } logicsIndex += length; @@ -160,8 +160,8 @@ namespace UniGLTF.SpringBoneJobs // バッファの構築 Profiler.BeginSample("FastSpringBone.ReconstructBuffers.CreateBuffers"); - _logics = new NativeArray(logicsCount, Allocator.Persistent); - _joints = new NativeArray(logicsCount, Allocator.Persistent); + _logics = new NativeArray(logicsCount, Allocator.Persistent); + _joints = new NativeArray(logicsCount, Allocator.Persistent); _prevTails = new NativeArray(logicsCount, Allocator.Persistent); _currentTails = new NativeArray(logicsCount, Allocator.Persistent); _nextTails = new NativeArray(logicsCount, Allocator.Persistent); @@ -210,8 +210,8 @@ namespace UniGLTF.SpringBoneJobs SrcLogics = buffer.Logics, SrcJoints = buffer.Joints, - DestLogics = new NativeSlice(_logics, logicsOffset, buffer.Logics.Length), - DestJoints = new NativeSlice(_joints, logicsOffset, buffer.Logics.Length), + DestLogics = new NativeSlice(_logics, logicsOffset, buffer.Logics.Length), + DestJoints = new NativeSlice(_joints, logicsOffset, buffer.Logics.Length), }.Schedule(buffer.Logics.Length, 1, handle); springsOffset += buffer.Springs.Length; @@ -335,10 +335,10 @@ namespace UniGLTF.SpringBoneJobs #endif private struct OffsetLogicsJob : IJobParallelFor { - [ReadOnly] public NativeSlice SrcLogics; - [ReadOnly] public NativeSlice SrcJoints; - [WriteOnly] public NativeSlice DestLogics; - [WriteOnly] public NativeSlice DestJoints; + [ReadOnly] public NativeSlice SrcLogics; + [ReadOnly] public NativeSlice SrcJoints; + [WriteOnly] public NativeSlice DestLogics; + [WriteOnly] public NativeSlice DestJoints; public void Execute(int index) { @@ -352,7 +352,7 @@ namespace UniGLTF.SpringBoneJobs #endif private struct InitCurrentTailsJob : IJobParallelFor { - [ReadOnly] public NativeArray Logics; + [ReadOnly] public NativeArray Logics; [ReadOnly] public NativeArray Transforms; [WriteOnly] public NativeSlice CurrentTails; [WriteOnly] public NativeSlice PrevTails; diff --git a/Assets/UniGLTF/Runtime/SpringBoneJobs/InputPorts/FastSpringBoneBuffer.cs b/Assets/UniGLTF/Runtime/SpringBoneJobs/InputPorts/FastSpringBoneBuffer.cs index da863bfa6..35b36dbd8 100644 --- a/Assets/UniGLTF/Runtime/SpringBoneJobs/InputPorts/FastSpringBoneBuffer.cs +++ b/Assets/UniGLTF/Runtime/SpringBoneJobs/InputPorts/FastSpringBoneBuffer.cs @@ -16,9 +16,9 @@ namespace UniGLTF.SpringBoneJobs.InputPorts { // NOTE: これらはFastSpringBoneBufferCombinerによってバッチングされる public NativeArray Springs { get; } - public NativeArray Joints { get; } + public NativeArray Joints { get; } public NativeArray Colliders { get; } - public NativeArray Logics { get; } + public NativeArray Logics { get; } public NativeArray BlittableTransforms { get; } public Transform[] Transforms { get; } public bool IsDisposed { get; private set; } @@ -92,9 +92,9 @@ namespace UniGLTF.SpringBoneJobs.InputPorts var externalDataPtr = (BlittableExternalData*)_externalData.GetUnsafePtr(); List blittableSprings = new(); - List blittableJoints = new(); + List blittableJoints = new(); List blittableColliders = new(); - List blittableLogics = new(); + List blittableLogics = new(); foreach (var spring in springs) { var blittableSpring = new BlittableSpring @@ -131,9 +131,9 @@ namespace UniGLTF.SpringBoneJobs.InputPorts } Springs = new NativeArray(blittableSprings.ToArray(), Allocator.Persistent); - Joints = new NativeArray(blittableJoints.ToArray(), Allocator.Persistent); + Joints = new NativeArray(blittableJoints.ToArray(), Allocator.Persistent); Colliders = new NativeArray(blittableColliders.ToArray(), Allocator.Persistent); - Logics = new NativeArray(blittableLogics.ToArray(), Allocator.Persistent); + Logics = new NativeArray(blittableLogics.ToArray(), Allocator.Persistent); BlittableTransforms = new NativeArray(Transforms.Length, Allocator.Persistent); Profiler.EndSample(); } @@ -145,7 +145,7 @@ namespace UniGLTF.SpringBoneJobs.InputPorts /// /// joint index /// - public static IEnumerable LogicFromTransform(Transform[] Transforms, FastSpringBoneSpring spring) + public static IEnumerable LogicFromTransform(Transform[] Transforms, FastSpringBoneSpring spring) { // vrm-1.0 では末端の joint は tail で処理対象でないのに注意! for (int i = 0; i < spring.joints.Length - 1; ++i) @@ -182,7 +182,7 @@ namespace UniGLTF.SpringBoneJobs.InputPorts ); var parent = joint.Transform.parent; - yield return new BlittableJointInit + yield return new BlittableJointImmutable { headTransformIndex = Array.IndexOf(Transforms, joint.Transform), parentTransformIndex = Array.IndexOf(Transforms, parent), diff --git a/Assets/UniGLTF/Runtime/SpringBoneJobs/InputPorts/FastSpringBoneJoint.cs b/Assets/UniGLTF/Runtime/SpringBoneJobs/InputPorts/FastSpringBoneJoint.cs index 0b230a862..2d8a0119d 100644 --- a/Assets/UniGLTF/Runtime/SpringBoneJobs/InputPorts/FastSpringBoneJoint.cs +++ b/Assets/UniGLTF/Runtime/SpringBoneJobs/InputPorts/FastSpringBoneJoint.cs @@ -8,7 +8,7 @@ namespace UniGLTF.SpringBoneJobs.InputPorts public struct FastSpringBoneJoint { public Transform Transform; - public BlittableJointSettings Joint; + public BlittableJointMutable Joint; public Quaternion DefaultLocalRotation; } } \ No newline at end of file diff --git a/Assets/UniGLTF/Runtime/SpringBoneJobs/UpdateFastSpringBoneJob.cs b/Assets/UniGLTF/Runtime/SpringBoneJobs/UpdateFastSpringBoneJob.cs index 4557a1807..c6d0e2f9a 100644 --- a/Assets/UniGLTF/Runtime/SpringBoneJobs/UpdateFastSpringBoneJob.cs +++ b/Assets/UniGLTF/Runtime/SpringBoneJobs/UpdateFastSpringBoneJob.cs @@ -16,8 +16,8 @@ namespace UniGLTF.SpringBoneJobs { // すべての spring の joint を平坦に連結した配列 // Joints, Logics, PrevTail, CurrentTail, NextTail は同じ index - [ReadOnly] public NativeArray Joints; - [ReadOnly] public NativeArray Logics; + [ReadOnly] public NativeArray Joints; + [ReadOnly] public NativeArray Logics; [ReadOnly] public NativeArray PrevTail; [ReadOnly] public NativeArray CurrentTail; // ランダムアクセス @@ -179,10 +179,10 @@ namespace UniGLTF.SpringBoneJobs Vector3 worldTail, Vector3 worldPosition, BlittableTransform headTransform, - BlittableJointSettings joint, + BlittableJointMutable joint, BlittableCollider collider, float maxColliderScale, - BlittableJointInit logic, + BlittableJointImmutable logic, ref Vector3 nextTail) { var direction = worldTail - worldPosition; @@ -214,12 +214,12 @@ namespace UniGLTF.SpringBoneJobs } private static void ResolveSphereCollision( - BlittableJointSettings joint, + BlittableJointMutable joint, BlittableCollider collider, Vector3 worldPosition, BlittableTransform headTransform, float maxColliderScale, - BlittableJointInit logic, + BlittableJointImmutable logic, ref Vector3 nextTail) { var r = joint.radius + collider.radius * maxColliderScale; @@ -234,7 +234,7 @@ namespace UniGLTF.SpringBoneJobs } private static void ResolveSphereCollisionInside( - BlittableJointSettings joint, + BlittableJointMutable joint, BlittableCollider collider, BlittableTransform colliderTransform, ref Vector3 nextTail) @@ -254,7 +254,7 @@ namespace UniGLTF.SpringBoneJobs } private static void ResolveCapsuleCollisionInside( - BlittableJointSettings joint, + BlittableJointMutable joint, BlittableCollider collider, BlittableTransform colliderTransform, ref Vector3 nextTail) @@ -303,7 +303,7 @@ namespace UniGLTF.SpringBoneJobs /// colliderTransform.localToWorldMatrix.MultiplyPoint3x4(collider.offset); /// result of verlet integration private static void ResolvePlaneCollision( - BlittableJointSettings joint, + BlittableJointMutable joint, BlittableCollider collider, BlittableTransform colliderTransform, ref Vector3 nextTail) diff --git a/Assets/VRM/Runtime/SpringBone/Jobs/FastSpringBoneReplacer.cs b/Assets/VRM/Runtime/SpringBone/Jobs/FastSpringBoneReplacer.cs index cfb191108..e7c32945b 100644 --- a/Assets/VRM/Runtime/SpringBone/Jobs/FastSpringBoneReplacer.cs +++ b/Assets/VRM/Runtime/SpringBone/Jobs/FastSpringBoneReplacer.cs @@ -87,7 +87,7 @@ namespace VRM.SpringBoneJobs joints.Add(new FastSpringBoneJoint { Transform = joint.transform, - Joint = new BlittableJointSettings + Joint = new BlittableJointMutable { radius = spring.m_hitRadius, dragForce = spring.m_dragForce, diff --git a/Assets/VRM10/Runtime/Components/Vrm10Runtime/Vrm10RuntimeSpringBone.cs b/Assets/VRM10/Runtime/Components/Vrm10Runtime/Vrm10RuntimeSpringBone.cs index acb899bfc..d14e0e9e7 100644 --- a/Assets/VRM10/Runtime/Components/Vrm10Runtime/Vrm10RuntimeSpringBone.cs +++ b/Assets/VRM10/Runtime/Components/Vrm10Runtime/Vrm10RuntimeSpringBone.cs @@ -92,7 +92,7 @@ namespace UniVRM10 .Select(joint => new FastSpringBoneJoint { Transform = joint.transform, - Joint = new BlittableJointSettings + Joint = new BlittableJointMutable { radius = joint.m_jointRadius, dragForce = joint.m_dragForce, From c7f1bbd9920365950ccf6a7afbbbb3a0e5369854 Mon Sep 17 00:00:00 2001 From: ousttrue Date: Tue, 17 Sep 2024 14:32:44 +0900 Subject: [PATCH 4/5] fix Flip bug ! --- .../FastSpringBoneBufferCombiner.cs | 19 +++++-------------- .../SpringBoneJobs/FastSpringBoneScheduler.cs | 8 ++++---- 2 files changed, 9 insertions(+), 18 deletions(-) diff --git a/Assets/UniGLTF/Runtime/SpringBoneJobs/FastSpringBoneBufferCombiner.cs b/Assets/UniGLTF/Runtime/SpringBoneJobs/FastSpringBoneBufferCombiner.cs index f3147ea78..3ca90fcd0 100644 --- a/Assets/UniGLTF/Runtime/SpringBoneJobs/FastSpringBoneBufferCombiner.cs +++ b/Assets/UniGLTF/Runtime/SpringBoneJobs/FastSpringBoneBufferCombiner.cs @@ -55,22 +55,13 @@ namespace UniGLTF.SpringBoneJobs public bool HasBuffer => _batchedBuffers != null && _batchedBuffers.Length > 0; - int flipPhase = 0; - public (NativeArray current, NativeArray prev, NativeArray next) FlipBuffer() + public void FlipBuffer() { - switch (flipPhase++ % 3) - { - case 0: return (_currentTails, _prevTails, _nextTails); - case 1: return (_nextTails, _currentTails, _prevTails); - case 2: return (_prevTails, _nextTails, _currentTails); - default: - throw new Exception(); - } // dispose が狂う?? - // var tmp = _prevTails; - // _currentTails = _nextTails; - // _prevTails = _currentTails; - // _nextTails = tmp; + var tmp = _prevTails; + _prevTails = _currentTails; + _currentTails = _nextTails; + _nextTails = tmp; } public void Register(FastSpringBoneBuffer buffer) diff --git a/Assets/UniGLTF/Runtime/SpringBoneJobs/FastSpringBoneScheduler.cs b/Assets/UniGLTF/Runtime/SpringBoneJobs/FastSpringBoneScheduler.cs index 7e258400f..b35e7ec99 100644 --- a/Assets/UniGLTF/Runtime/SpringBoneJobs/FastSpringBoneScheduler.cs +++ b/Assets/UniGLTF/Runtime/SpringBoneJobs/FastSpringBoneScheduler.cs @@ -31,15 +31,15 @@ namespace UniGLTF.SpringBoneJobs Transforms = _bufferCombiner.Transforms }.Schedule(_bufferCombiner.TransformAccessArray, handle); - var (current, prev, next) = _bufferCombiner.FlipBuffer(); + _bufferCombiner.FlipBuffer(); handle = new UpdateFastSpringBoneJob { Joints = _bufferCombiner.Joints, Logics = _bufferCombiner.Logics, - CurrentTail = current, - PrevTail = prev, - NextTail = next, + CurrentTail = _bufferCombiner.CurrentTails, + PrevTail = _bufferCombiner.PrevTails, + NextTail = _bufferCombiner.NextTails, Springs = _bufferCombiner.Springs, Colliders = _bufferCombiner.Colliders, Transforms = _bufferCombiner.Transforms, From 0f9be690a5855eb226f0d8093a002a07829a9348 Mon Sep 17 00:00:00 2001 From: ousttrue Date: Wed, 18 Sep 2024 12:55:45 +0900 Subject: [PATCH 5/5] =?UTF-8?q?=E3=82=B3=E3=83=A1=E3=83=B3=E3=83=88?= =?UTF-8?q?=E6=B6=88=E3=81=97=E5=BF=98=E3=82=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Runtime/SpringBoneJobs/FastSpringBoneBufferCombiner.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/Assets/UniGLTF/Runtime/SpringBoneJobs/FastSpringBoneBufferCombiner.cs b/Assets/UniGLTF/Runtime/SpringBoneJobs/FastSpringBoneBufferCombiner.cs index 3ca90fcd0..6e9f77614 100644 --- a/Assets/UniGLTF/Runtime/SpringBoneJobs/FastSpringBoneBufferCombiner.cs +++ b/Assets/UniGLTF/Runtime/SpringBoneJobs/FastSpringBoneBufferCombiner.cs @@ -57,7 +57,6 @@ namespace UniGLTF.SpringBoneJobs public void FlipBuffer() { - // dispose が狂う?? var tmp = _prevTails; _prevTails = _currentTails; _currentTails = _nextTails;