diff --git a/Assets/VRM10/Runtime/FastSpringBone/Blittables/BlittableSpring.cs b/Assets/VRM10/Runtime/FastSpringBone/Blittables/BlittableSpring.cs index 36f6d7401..4657e68fd 100644 --- a/Assets/VRM10/Runtime/FastSpringBone/Blittables/BlittableSpring.cs +++ b/Assets/VRM10/Runtime/FastSpringBone/Blittables/BlittableSpring.cs @@ -1,5 +1,5 @@ using System; -using UnityEngine.Serialization; +using UnityEngine; namespace UniVRM10.FastSpringBones.Blittables { @@ -13,5 +13,6 @@ namespace UniVRM10.FastSpringBones.Blittables public BlittableSpan logicSpan; public int centerTransformIndex; public int transformIndexOffset; + public Vector3 externalForce; } } \ No newline at end of file diff --git a/Assets/VRM10/Runtime/FastSpringBone/System/FastSpringBoneBufferCombiner.cs b/Assets/VRM10/Runtime/FastSpringBone/System/FastSpringBoneBufferCombiner.cs index b1b513c69..8d547d6ab 100644 --- a/Assets/VRM10/Runtime/FastSpringBone/System/FastSpringBoneBufferCombiner.cs +++ b/Assets/VRM10/Runtime/FastSpringBone/System/FastSpringBoneBufferCombiner.cs @@ -38,6 +38,8 @@ namespace UniVRM10.FastSpringBones.System public NativeArray Colliders => _colliders; public NativeArray Logics => _logics; + public bool HasBuffer => _batchedBuffers != null && _batchedBuffers.Length > 0; + public void Register(FastSpringBoneBuffer buffer) { _buffers.AddLast(buffer); diff --git a/Assets/VRM10/Runtime/FastSpringBone/System/FastSpringBoneScheduler.cs b/Assets/VRM10/Runtime/FastSpringBone/System/FastSpringBoneScheduler.cs index 064d37360..3df9b05d8 100644 --- a/Assets/VRM10/Runtime/FastSpringBone/System/FastSpringBoneScheduler.cs +++ b/Assets/VRM10/Runtime/FastSpringBone/System/FastSpringBoneScheduler.cs @@ -8,6 +8,7 @@ namespace UniVRM10.FastSpringBones.System public sealed class FastSpringBoneScheduler : IDisposable { private readonly FastSpringBoneBufferCombiner _bufferCombiner; + public Vector3 ExternalForce { get; set; } public FastSpringBoneScheduler(FastSpringBoneBufferCombiner bufferCombiner) { @@ -18,6 +19,10 @@ namespace UniVRM10.FastSpringBones.System { var handle = default(JobHandle); handle = _bufferCombiner.ReconstructIfDirty(handle); + if (!_bufferCombiner.HasBuffer) + { + return handle; + } handle = new PullTransformJob { @@ -32,6 +37,7 @@ namespace UniVRM10.FastSpringBones.System Springs = _bufferCombiner.Springs, Transforms = _bufferCombiner.Transforms, DeltaTime = Time.deltaTime, + ExternalForce = ExternalForce }.Schedule(_bufferCombiner.Springs.Length, 1, handle); handle = new PushTransformJob diff --git a/Assets/VRM10/Runtime/FastSpringBone/System/FastSpringBoneService.cs b/Assets/VRM10/Runtime/FastSpringBone/System/FastSpringBoneService.cs index d3e103977..597d963c3 100644 --- a/Assets/VRM10/Runtime/FastSpringBone/System/FastSpringBoneService.cs +++ b/Assets/VRM10/Runtime/FastSpringBone/System/FastSpringBoneService.cs @@ -27,6 +27,12 @@ namespace UniVRM10.FastSpringBones.System } } + public Vector3 ExternalForce + { + get => _fastSpringBoneScheduler.ExternalForce; + set => _fastSpringBoneScheduler.ExternalForce = value; + } + /// /// 専有しているインスタンスを破棄する /// diff --git a/Assets/VRM10/Runtime/FastSpringBone/System/UpdateFastSpringBoneJob.cs b/Assets/VRM10/Runtime/FastSpringBone/System/UpdateFastSpringBoneJob.cs index 6c2315861..8f74e0182 100644 --- a/Assets/VRM10/Runtime/FastSpringBone/System/UpdateFastSpringBoneJob.cs +++ b/Assets/VRM10/Runtime/FastSpringBone/System/UpdateFastSpringBoneJob.cs @@ -22,6 +22,7 @@ namespace UniVRM10.FastSpringBones.System [NativeDisableParallelForRestriction] public NativeArray Transforms; public float DeltaTime; + public Vector3 ExternalForce; public void Execute(int index) { @@ -43,7 +44,6 @@ namespace UniVRM10.FastSpringBones.System ? Transforms[spring.centerTransformIndex + transformIndexOffset] : (BlittableTransform?)null; - // 親があったら、親に依存するTransformを再計算 if (parentTransform.HasValue) { @@ -62,7 +62,7 @@ namespace UniVRM10.FastSpringBones.System var parentRotation = parentTransform?.rotation ?? Quaternion.identity; // verlet積分で次の位置を計算 - var external = joint.gravityDir * joint.gravityPower * DeltaTime; + var external = (joint.gravityDir * joint.gravityPower + ExternalForce) * DeltaTime; var nextTail = currentTail + (currentTail - prevTail) * (1.0f - joint.dragForce) // 前フレームの移動を継続する(減衰もあるよ) + parentRotation * logic.localRotation * logic.boneAxis *