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