diff --git a/Assets/UniGLTF/Runtime/SpringBoneJobs/Blittables/BlittableJoint.cs b/Assets/UniGLTF/Runtime/SpringBoneJobs/Blittables/BlittableJoint.cs deleted file mode 100644 index c7d79a95d..000000000 --- a/Assets/UniGLTF/Runtime/SpringBoneJobs/Blittables/BlittableJoint.cs +++ /dev/null @@ -1,18 +0,0 @@ -using System; -using UnityEngine; - -namespace UniGLTF.SpringBoneJobs.Blittables -{ - /// - /// SpringBoneの各関節を表すデータ型 - /// - [Serializable] - public struct BlittableJoint - { - public float stiffnessForce; - public float gravityPower; - public Vector3 gravityDir; - public float dragForce; - public float radius; - } -} diff --git a/Assets/UniGLTF/Runtime/SpringBoneJobs/Blittables/BlittableLogic.cs b/Assets/UniGLTF/Runtime/SpringBoneJobs/Blittables/BlittableJointImmutable.cs similarity index 55% rename from Assets/UniGLTF/Runtime/SpringBoneJobs/Blittables/BlittableLogic.cs rename to Assets/UniGLTF/Runtime/SpringBoneJobs/Blittables/BlittableJointImmutable.cs index 547ca4cbe..c185dbf43 100644 --- a/Assets/UniGLTF/Runtime/SpringBoneJobs/Blittables/BlittableLogic.cs +++ b/Assets/UniGLTF/Runtime/SpringBoneJobs/Blittables/BlittableJointImmutable.cs @@ -4,16 +4,17 @@ using UnityEngine; namespace UniGLTF.SpringBoneJobs.Blittables { /// - /// SpringBoneの各関節に紐付いた計算情報を表すデータ型 + /// Reconstruct に対して Immutable。 + /// Jointの増減、初期姿勢の変更など構成の変更は Reconstruct が必要。 + /// 変わりにくいスコープ。 /// [Serializable] - public struct BlittableLogic + public struct BlittableJointImmutable { 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/BlittableJointImmutable.cs.meta similarity index 100% rename from Assets/UniGLTF/Runtime/SpringBoneJobs/Blittables/BlittableLogic.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/BlittableJoint.cs.meta b/Assets/UniGLTF/Runtime/SpringBoneJobs/Blittables/BlittableJointMutable.cs.meta similarity index 100% rename from Assets/UniGLTF/Runtime/SpringBoneJobs/Blittables/BlittableJoint.cs.meta rename to Assets/UniGLTF/Runtime/SpringBoneJobs/Blittables/BlittableJointMutable.cs.meta diff --git a/Assets/UniGLTF/Runtime/SpringBoneJobs/FastSpringBoneBufferCombiner.cs b/Assets/UniGLTF/Runtime/SpringBoneJobs/FastSpringBoneBufferCombiner.cs index 82d400e8a..6e9f77614 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,29 @@ 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; + public void FlipBuffer() + { + var tmp = _prevTails; + _prevTails = _currentTails; + _currentTails = _nextTails; + _nextTails = tmp; + } + public void Register(FastSpringBoneBuffer buffer) { _buffers.AddLast(buffer); @@ -82,7 +104,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 +145,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 +176,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 +188,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 +210,8 @@ namespace UniGLTF.SpringBoneJobs transformOffset += buffer.BlittableTransforms.Length; } + handle = InitCurrentTails(handle); + // TransformAccessArrayの構築と並行してJobを行うため、この時点で走らせておく JobHandle.ScheduleBatchedJobs(); Profiler.EndSample(); @@ -205,14 +234,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 +325,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 +336,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..b35e7ec99 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); + _bufferCombiner.FlipBuffer(); + handle = new UpdateFastSpringBoneJob { - Colliders = _bufferCombiner.Colliders, Joints = _bufferCombiner.Joints, Logics = _bufferCombiner.Logics, + CurrentTail = _bufferCombiner.CurrentTails, + PrevTail = _bufferCombiner.PrevTails, + NextTail = _bufferCombiner.NextTails, 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..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,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 BlittableJointImmutable { 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..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 BlittableJoint 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 05011e8f0..c6d0e2f9a 100644 --- a/Assets/UniGLTF/Runtime/SpringBoneJobs/UpdateFastSpringBoneJob.cs +++ b/Assets/UniGLTF/Runtime/SpringBoneJobs/UpdateFastSpringBoneJob.cs @@ -14,11 +14,21 @@ namespace UniGLTF.SpringBoneJobs #endif public struct UpdateFastSpringBoneJob : IJobParallelFor { + // すべての 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 Joints; + [ReadOnly] public NativeArray Colliders; - [NativeDisableParallelForRestriction] public NativeArray Logics; + // FastSpringBoneBuffer.Transforms を連結したもの + // ランダムアクセス [NativeDisableParallelForRestriction] public NativeArray Transforms; public float DeltaTime; @@ -52,11 +62,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 +118,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 +163,6 @@ namespace UniGLTF.SpringBoneJobs // SpringBone の結果を Transform に反映しないが logic の更新は継続する。 // 再開したときに暴れない。 } - Logics[logicIndex] = logic; } } @@ -174,10 +179,10 @@ namespace UniGLTF.SpringBoneJobs Vector3 worldTail, Vector3 worldPosition, BlittableTransform headTransform, - BlittableJoint joint, + BlittableJointMutable joint, BlittableCollider collider, float maxColliderScale, - BlittableLogic logic, + BlittableJointImmutable logic, ref Vector3 nextTail) { var direction = worldTail - worldPosition; @@ -209,12 +214,12 @@ namespace UniGLTF.SpringBoneJobs } private static void ResolveSphereCollision( - BlittableJoint joint, + BlittableJointMutable joint, BlittableCollider collider, Vector3 worldPosition, BlittableTransform headTransform, float maxColliderScale, - BlittableLogic logic, + BlittableJointImmutable logic, ref Vector3 nextTail) { var r = joint.radius + collider.radius * maxColliderScale; @@ -229,7 +234,7 @@ namespace UniGLTF.SpringBoneJobs } private static void ResolveSphereCollisionInside( - BlittableJoint joint, + BlittableJointMutable joint, BlittableCollider collider, BlittableTransform colliderTransform, ref Vector3 nextTail) @@ -249,7 +254,7 @@ namespace UniGLTF.SpringBoneJobs } private static void ResolveCapsuleCollisionInside( - BlittableJoint joint, + BlittableJointMutable joint, BlittableCollider collider, BlittableTransform colliderTransform, ref Vector3 nextTail) @@ -298,7 +303,7 @@ namespace UniGLTF.SpringBoneJobs /// colliderTransform.localToWorldMatrix.MultiplyPoint3x4(collider.offset); /// result of verlet integration private static void ResolvePlaneCollision( - BlittableJoint 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 fc6a9a4a2..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 BlittableJoint + 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 9e0819b6a..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 BlittableJoint + Joint = new BlittableJointMutable { 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