diff --git a/Assets/VRM10/Runtime/FastSpringBone/Blittables/BlittableCollider.cs b/Assets/VRM10/Runtime/FastSpringBone/Blittables/BlittableCollider.cs index baa5920c2..f92ca4cdd 100644 --- a/Assets/VRM10/Runtime/FastSpringBone/Blittables/BlittableCollider.cs +++ b/Assets/VRM10/Runtime/FastSpringBone/Blittables/BlittableCollider.cs @@ -3,18 +3,11 @@ using UnityEngine; namespace UniVRM10.FastSpringBones.Blittables { /// - /// VRMSpringBoneのSphereColliderをBlittableにしたもの - /// 位置情報は親であるColliderGroupが持つ + /// Blittableなコライダ /// - public readonly struct BlittableCollider - { - public Vector3 Offset { get; } - public float Radius { get; } - - public BlittableCollider(Vector3 offset, float radius) - { - Offset = offset; - Radius = radius; - } + public struct BlittableCollider + { + public Vector3 Offset; + public float Radius; } } \ No newline at end of file diff --git a/Assets/VRM10/Runtime/FastSpringBone/Blittables/BlittableColliderGroup.cs b/Assets/VRM10/Runtime/FastSpringBone/Blittables/BlittableColliderGroup.cs deleted file mode 100644 index 2bc6d1dc8..000000000 --- a/Assets/VRM10/Runtime/FastSpringBone/Blittables/BlittableColliderGroup.cs +++ /dev/null @@ -1,20 +0,0 @@ -using Unity.Collections; -using Unity.Collections.LowLevel.Unsafe; - -namespace UniVRM10.FastSpringBones.Blittables -{ - /// - /// VRMSpringBoneのColliderGroupをBlittableにしたもの - /// - public readonly struct BlittableColliderGroup - { - public BlittableColliders Colliders { get; } - public unsafe BlittableTransform* Transform { get; } - - public unsafe BlittableColliderGroup(NativeArray colliders, BlittableTransform* transform) - { - Colliders = new BlittableColliders((BlittableCollider*)colliders.GetUnsafePtr(), colliders.Length); - Transform = transform; - } - } -} \ No newline at end of file diff --git a/Assets/VRM10/Runtime/FastSpringBone/Blittables/BlittableColliderGroup.cs.meta b/Assets/VRM10/Runtime/FastSpringBone/Blittables/BlittableColliderGroup.cs.meta deleted file mode 100644 index 222c88810..000000000 --- a/Assets/VRM10/Runtime/FastSpringBone/Blittables/BlittableColliderGroup.cs.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: 478b0f68277d5a346a9e909e398451aa -timeCreated: 1550223602 \ No newline at end of file diff --git a/Assets/VRM10/Runtime/FastSpringBone/Blittables/BlittableColliderGroups.cs b/Assets/VRM10/Runtime/FastSpringBone/Blittables/BlittableColliderGroups.cs deleted file mode 100644 index 8762d62ee..000000000 --- a/Assets/VRM10/Runtime/FastSpringBone/Blittables/BlittableColliderGroups.cs +++ /dev/null @@ -1,34 +0,0 @@ -using UnityEngine; - -namespace UniVRM10.FastSpringBones.Blittables -{ - /// - /// BlittableColliderGroupのポインタの配列 - /// - public readonly unsafe struct BlittableColliderGroups - { - private readonly BlittableColliderGroup* _data; - public int Length { get; } - - public BlittableColliderGroup this[int i] => _data[i]; - - public void DrawGizmos() - { - for (var i = 0; i < Length; i++) - { - var group = this[i]; - var colliders = group.Colliders; - for (var j = 0; j < colliders.Count; ++j) - { - Gizmos.DrawWireSphere(group.Transform->WorldPosition, colliders[j].Radius); - } - } - } - - public BlittableColliderGroups(BlittableColliderGroup* data, int length) - { - _data = data; - Length = length; - } - } -} \ No newline at end of file diff --git a/Assets/VRM10/Runtime/FastSpringBone/Blittables/BlittableColliderGroups.cs.meta b/Assets/VRM10/Runtime/FastSpringBone/Blittables/BlittableColliderGroups.cs.meta deleted file mode 100644 index d15dc6a18..000000000 --- a/Assets/VRM10/Runtime/FastSpringBone/Blittables/BlittableColliderGroups.cs.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: d8ecae557f477ff4fa60ef840e6b6167 -timeCreated: 1550563011 \ No newline at end of file diff --git a/Assets/VRM10/Runtime/FastSpringBone/Blittables/BlittableColliders.cs b/Assets/VRM10/Runtime/FastSpringBone/Blittables/BlittableColliders.cs deleted file mode 100644 index 137fc6ab9..000000000 --- a/Assets/VRM10/Runtime/FastSpringBone/Blittables/BlittableColliders.cs +++ /dev/null @@ -1,19 +0,0 @@ -namespace UniVRM10.FastSpringBones.Blittables -{ - /// - /// BlittableColliderのポインタの配列 - /// - public unsafe struct BlittableColliders - { - private readonly BlittableCollider* _colliders; - public int Count { get; } - - public BlittableCollider this[int i] => _colliders[i]; - - public BlittableColliders(BlittableCollider* colliders, int count) - { - _colliders = colliders; - Count = count; - } - } -} \ No newline at end of file diff --git a/Assets/VRM10/Runtime/FastSpringBone/Blittables/BlittableColliders.cs.meta b/Assets/VRM10/Runtime/FastSpringBone/Blittables/BlittableColliders.cs.meta deleted file mode 100644 index 2bdef092c..000000000 --- a/Assets/VRM10/Runtime/FastSpringBone/Blittables/BlittableColliders.cs.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: 14be485b03404da4a9a5ba19211f9c1b -timeCreated: 1550562383 \ No newline at end of file diff --git a/Assets/VRM10/Runtime/FastSpringBone/Blittables/BlittableJoint.cs b/Assets/VRM10/Runtime/FastSpringBone/Blittables/BlittableJoint.cs new file mode 100644 index 000000000..83c889667 --- /dev/null +++ b/Assets/VRM10/Runtime/FastSpringBone/Blittables/BlittableJoint.cs @@ -0,0 +1,17 @@ +using Unity.Collections; +using UnityEngine; + +namespace UniVRM10.FastSpringBones.Blittables +{ + /// + /// SpringBoneの各関節を表すデータ型 + /// + public struct BlittableJoint + { + public float StiffnessForce; + public float GravityPower; + public Vector3 GravityDir; + public float DragForce; + public float Radius; + } +} diff --git a/Assets/VRM10/Runtime/FastSpringBone/Blittables/BlittablePoint.cs.meta b/Assets/VRM10/Runtime/FastSpringBone/Blittables/BlittableJoint.cs.meta similarity index 100% rename from Assets/VRM10/Runtime/FastSpringBone/Blittables/BlittablePoint.cs.meta rename to Assets/VRM10/Runtime/FastSpringBone/Blittables/BlittableJoint.cs.meta diff --git a/Assets/VRM10/Runtime/FastSpringBone/Blittables/BlittableLogic.cs b/Assets/VRM10/Runtime/FastSpringBone/Blittables/BlittableLogic.cs new file mode 100644 index 000000000..09b351927 --- /dev/null +++ b/Assets/VRM10/Runtime/FastSpringBone/Blittables/BlittableLogic.cs @@ -0,0 +1,17 @@ +using UnityEngine; + +namespace UniVRM10.FastSpringBones.Blittables +{ + /// + /// SpringBoneの各関節を表すデータ型 + /// + public struct BlittableLogic + { + public float Length; + public Vector3 CurrentTail; + public Vector3 PrevTail; + public Vector3 LocalDir; + public Quaternion LocalRotation; + public Vector3 BoneAxis; + } +} \ No newline at end of file diff --git a/Assets/VRM10/Runtime/FastSpringBone/Blittables/BlittableLogic.cs.meta b/Assets/VRM10/Runtime/FastSpringBone/Blittables/BlittableLogic.cs.meta new file mode 100644 index 000000000..c317dbb9b --- /dev/null +++ b/Assets/VRM10/Runtime/FastSpringBone/Blittables/BlittableLogic.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: e9731a165cdc47b5a6c9452cdab150a5 +timeCreated: 1633060275 \ No newline at end of file diff --git a/Assets/VRM10/Runtime/FastSpringBone/Blittables/BlittablePoint.cs b/Assets/VRM10/Runtime/FastSpringBone/Blittables/BlittablePoint.cs deleted file mode 100644 index 62fe3d9c0..000000000 --- a/Assets/VRM10/Runtime/FastSpringBone/Blittables/BlittablePoint.cs +++ /dev/null @@ -1,149 +0,0 @@ -using UnityEngine; - -namespace UniVRM10.FastSpringBones.Blittables -{ - /// - /// VRMSpringBoneLogicをBlittableにしたもの - /// ベルレ積分など、コアな計算を行う - /// - public unsafe struct BlittablePoint - { - private readonly float _length; - private readonly Quaternion _localRotation; - private readonly Vector3 _boneAxis; - private readonly float _radius; - private Vector3 _prevPosition; - - private readonly BlittableColliderGroups* _blittableColliderGroups; - private readonly BlittableTransform* _center; - - public Vector3 CurrentPosition { get; private set; } - - private readonly BlittableTransform* _transform; - - public BlittablePoint( - Transform transform, - float radius, - BlittableTransform* center, - BlittableColliderGroups* blittableColliderGroups, - BlittableTransform* blittableTransform) - { - Vector3 localPosition; - if (transform.childCount == 0) - { - var delta = transform.position - transform.parent.position; - var childPosition = transform.position + delta.normalized * 0.07f; - localPosition = transform.worldToLocalMatrix.MultiplyPoint(childPosition); - } - else - { - var firstChild = transform.GetChild(0); - var scale = firstChild.lossyScale; - localPosition = firstChild.localPosition; - localPosition.x *= scale.x; - localPosition.y *= scale.y; - localPosition.z *= scale.z; - } - - var worldChildPosition = (Vector3)transform.TransformPoint(localPosition); - _prevPosition = CurrentPosition = center != null ? center->LocalToWorld.inverse.MultiplyPoint3x4(worldChildPosition) : worldChildPosition; - - _localRotation = transform.localRotation; - _boneAxis = localPosition.normalized; - _length = localPosition.magnitude; - _radius = radius; - _blittableColliderGroups = blittableColliderGroups; - _transform = blittableTransform; - _center = center; - } - - public void Update(float stiffnessForce, float dragForce, Vector3 external) - { - // 親のRotationが変わっている可能性があるので更新する - _transform->UpdateLocalToWorldMatrix(); - - Vector3 currentPosition; - Vector3 prevPosition; - - if (_center == null) - { - currentPosition = CurrentPosition; - prevPosition = _prevPosition; - } - else - { - var centerLocalToWorld = _center->LocalToWorld; - currentPosition = centerLocalToWorld.MultiplyPoint3x4(CurrentPosition); - prevPosition = centerLocalToWorld.MultiplyPoint3x4(_prevPosition); - } - - // verlet積分で次の位置を計算 - var nextPosition = currentPosition - + (currentPosition - prevPosition) * (1.0f - dragForce) // 前フレームの移動を継続する(減衰もあるよ) - + _transform->ParentWorldRotation * _localRotation * _boneAxis * stiffnessForce // 親の回転による子ボーンの移動目標 - + external; // 外力による移動量 - - // 長さをboneLengthに強制 - var position = _transform->WorldPosition; - nextPosition = position + (nextPosition - position).normalized * _length; - - nextPosition = Collision(nextPosition, position); - - if (_center == null) - { - _prevPosition = currentPosition; - CurrentPosition = nextPosition; - } - else - { - var centerWorldToLocal = _center->LocalToWorld.inverse; - _prevPosition = centerWorldToLocal.MultiplyPoint3x4(currentPosition); - CurrentPosition = centerWorldToLocal.MultiplyPoint3x4(nextPosition); - } - - //回転を適用 - _transform->SetWorldRotation(ApplyRotation(nextPosition)); - } - - private Vector3 Collision(Vector3 nextPosition, Vector3 position) - { - for (var i = 0; i < _blittableColliderGroups->Length; ++i) - { - var colliderGroup = (*_blittableColliderGroups)[i]; - - for (var j = 0; j < colliderGroup.Colliders.Count; ++j) - { - var collider = colliderGroup.Colliders[j]; - var colliderPosition = colliderGroup.Transform->TransformPoint(collider.Offset); - var r = _radius + collider.Radius; - - if (!((nextPosition - colliderPosition).sqrMagnitude <= (r * r))) continue; - - // ヒット。Colliderの半径方向に押し出す - var normal = (nextPosition - colliderPosition).normalized; - var posFromCollider = colliderPosition + normal * (_radius + collider.Radius); - - // 長さをboneLengthに強制 - nextPosition = position + (posFromCollider - position).normalized * _length; - } - } - return nextPosition; - } - - private static Quaternion FromToRotation(Vector3 from, Vector3 to) - => Quaternion.AxisAngle( - angle: Mathf.Acos(Mathf.Clamp(Vector3.Dot(from.normalized, to.normalized), -1f, 1f)), - axis: Vector3.Cross(from, to).normalized - ); - - private Quaternion ApplyRotation(Vector3 nextTail) - { - var rotation = _transform->ParentWorldRotation * _localRotation; - return - FromToRotation( - rotation * _boneAxis, - nextTail - _transform->WorldPosition) * - rotation; - } - } -} diff --git a/Assets/VRM10/Runtime/FastSpringBone/Blittables/BlittablePoints.cs b/Assets/VRM10/Runtime/FastSpringBone/Blittables/BlittablePoints.cs deleted file mode 100644 index 62c6f0e3e..000000000 --- a/Assets/VRM10/Runtime/FastSpringBone/Blittables/BlittablePoints.cs +++ /dev/null @@ -1,23 +0,0 @@ -namespace UniVRM10.FastSpringBones.Blittables -{ - /// - /// BlittablePointのポインタの配列 - /// - public unsafe struct BlittablePoints - { - private readonly BlittablePoint* _points; - public int Count { get; } - - public BlittablePoint this[int i] - { - get => _points[i]; - set => _points[i] = value; - } - - public BlittablePoints(BlittablePoint* points, int count) - { - _points = points; - Count = count; - } - } -} \ No newline at end of file diff --git a/Assets/VRM10/Runtime/FastSpringBone/Blittables/BlittablePoints.cs.meta b/Assets/VRM10/Runtime/FastSpringBone/Blittables/BlittablePoints.cs.meta deleted file mode 100644 index 322e60643..000000000 --- a/Assets/VRM10/Runtime/FastSpringBone/Blittables/BlittablePoints.cs.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: 55f68ce7085cb7640a50cb133741361b -timeCreated: 1550721598 \ No newline at end of file diff --git a/Assets/VRM10/Runtime/FastSpringBone/Blittables/BlittableRootBone.cs b/Assets/VRM10/Runtime/FastSpringBone/Blittables/BlittableRootBone.cs deleted file mode 100644 index 2bb270d17..000000000 --- a/Assets/VRM10/Runtime/FastSpringBone/Blittables/BlittableRootBone.cs +++ /dev/null @@ -1,64 +0,0 @@ -using UnityEngine; - -namespace UniVRM10.FastSpringBones.Blittables -{ - /// - /// 1本の毛束を示すBlittable型 - /// - public unsafe readonly struct BlittableRootBone - { - private readonly float _gravityPower; - private readonly Vector3 _gravityDir; - private readonly float _dragForce; - private readonly float _stiffnessForce; - private readonly BlittablePoints* _blittablePoints; - - public void DrawGizmos() - { - for (var i = 0; i < _blittablePoints->Count; i++) - { - var point = (*_blittablePoints)[i]; - Gizmos.DrawWireSphere(point.CurrentPosition, 0.05f); - } - for (var i = 0; i < _blittablePoints->Count - 1; i++) - { - var point1 = (*_blittablePoints)[i]; - var point2 = (*_blittablePoints)[i + 1]; - Gizmos.DrawLine(point1.CurrentPosition, point2.CurrentPosition); - } - } - - public BlittableRootBone( - float gravityPower, - Vector3 gravityDir, - float dragForce, - float stiffnessForce, - BlittablePoints* blittablePoints) - { - _gravityPower = gravityPower; - _gravityDir = gravityDir; - _dragForce = dragForce; - _stiffnessForce = stiffnessForce; - _blittablePoints = blittablePoints; - } - - public void Update(float deltaTime) - { - var stiffness = _stiffnessForce * deltaTime; - var external = _gravityDir * (_gravityPower * deltaTime); - for (var i = 0; i < _blittablePoints->Count; i++) - { - var point = (*_blittablePoints)[i]; - - // Pointを更新 - point.Update( - stiffness, - _dragForce, - external - ); - - (*_blittablePoints)[i] = point; - } - } - } -} \ No newline at end of file diff --git a/Assets/VRM10/Runtime/FastSpringBone/Blittables/BlittableSpan.cs b/Assets/VRM10/Runtime/FastSpringBone/Blittables/BlittableSpan.cs new file mode 100644 index 000000000..5cec66dd2 --- /dev/null +++ b/Assets/VRM10/Runtime/FastSpringBone/Blittables/BlittableSpan.cs @@ -0,0 +1,8 @@ +namespace UniVRM10.FastSpringBones.Blittables +{ + public struct BlittableSpan + { + public int StartIndex; + public int Count; + } +} \ No newline at end of file diff --git a/Assets/VRM10/Runtime/FastSpringBone/Blittables/BlittableSpan.cs.meta b/Assets/VRM10/Runtime/FastSpringBone/Blittables/BlittableSpan.cs.meta new file mode 100644 index 000000000..0a4f1b455 --- /dev/null +++ b/Assets/VRM10/Runtime/FastSpringBone/Blittables/BlittableSpan.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 47daa1c068464f44987de43eba2210dc +timeCreated: 1633067618 \ No newline at end of file diff --git a/Assets/VRM10/Runtime/FastSpringBone/Blittables/BlittableSpring.cs b/Assets/VRM10/Runtime/FastSpringBone/Blittables/BlittableSpring.cs new file mode 100644 index 000000000..d5de54667 --- /dev/null +++ b/Assets/VRM10/Runtime/FastSpringBone/Blittables/BlittableSpring.cs @@ -0,0 +1,11 @@ +namespace UniVRM10.FastSpringBones.Blittables +{ + /// + /// 1本の毛束を表すデータ型 + /// + public struct BlittableSpring + { + public BlittableSpan ColliderSpan; + public BlittableSpan JointSpan; + } +} \ No newline at end of file diff --git a/Assets/VRM10/Runtime/FastSpringBone/Blittables/BlittableRootBone.cs.meta b/Assets/VRM10/Runtime/FastSpringBone/Blittables/BlittableSpring.cs.meta similarity index 100% rename from Assets/VRM10/Runtime/FastSpringBone/Blittables/BlittableRootBone.cs.meta rename to Assets/VRM10/Runtime/FastSpringBone/Blittables/BlittableSpring.cs.meta diff --git a/Assets/VRM10/Runtime/FastSpringBone/Blittables/BlittableTransform.cs b/Assets/VRM10/Runtime/FastSpringBone/Blittables/BlittableTransform.cs index 04c4e393d..787f11d0e 100644 --- a/Assets/VRM10/Runtime/FastSpringBone/Blittables/BlittableTransform.cs +++ b/Assets/VRM10/Runtime/FastSpringBone/Blittables/BlittableTransform.cs @@ -1,72 +1,18 @@ using UnityEngine; -using UnityEngine.Jobs; namespace UniVRM10.FastSpringBones.Blittables { /// /// Transformの必要な機能だけを絞り、Blittableに対応させたクラス /// - public unsafe struct BlittableTransform + public struct BlittableTransform { - private readonly BlittableTransform* _parent; - private Quaternion _worldRotation; - private Vector3 _localPosition; - private Vector3 _localScale; - private Quaternion _localRotation; - private Matrix4x4 _localToWorld; - - public Vector3 WorldPosition { get; private set; } - - public void SetWorldRotation(Quaternion rotation) - { - var parentWorldRotation = ParentWorldRotation; - _localRotation = Quaternion.Inverse(parentWorldRotation) * rotation; - UpdateLocalToWorldMatrix(); - } - - public Matrix4x4 LocalToWorld => _localToWorld; - - private Matrix4x4 LocalTransform => Matrix4x4.TRS(_localPosition, _localRotation, _localScale); - - public Quaternion ParentWorldRotation => _parent != null ? _parent->_worldRotation : Quaternion.identity; - - public BlittableTransform(BlittableTransform* parent, Transform transform) - { - _parent = parent; - - WorldPosition = transform.position; - _worldRotation = transform.rotation; - _localPosition = transform.localPosition; - _localRotation = transform.localRotation; - _localScale = transform.localScale; - - _localToWorld = transform.localToWorldMatrix; - } - - public void PullFrom(TransformAccess transform) - { - WorldPosition = transform.position; - _worldRotation = transform.rotation; - _localPosition = transform.localPosition; - _localRotation = transform.localRotation; - _localScale = transform.localScale; - - _localToWorld = transform.localToWorldMatrix; - } - - public void PushTo(TransformAccess transform) - { - transform.localPosition = _localPosition; - transform.localRotation = _localRotation; - } - - public Vector3 TransformPoint(Vector3 offset) => _localToWorld.MultiplyPoint3x4(offset); - - public void UpdateLocalToWorldMatrix() - { - _localToWorld = _parent == null ? LocalTransform : _parent->_localToWorld * LocalTransform; - WorldPosition = _localToWorld.MultiplyPoint3x4(Vector3.zero); - _worldRotation = _localToWorld.rotation; - } + public Vector3 Position; + public Quaternion Rotation; + public Vector3 LocalPosition; + public Quaternion LocalRotation; + public Vector3 LocalScale; + public Matrix4x4 LocalToWorldMatrix; + public Matrix4x4 WorldToLocalMatrix; } -} +} \ No newline at end of file diff --git a/Assets/VRM10/Runtime/FastSpringBone/Components/FastSpringBoneColliderGroup.cs b/Assets/VRM10/Runtime/FastSpringBone/Components/FastSpringBoneColliderGroup.cs deleted file mode 100644 index 64ee4c6c1..000000000 --- a/Assets/VRM10/Runtime/FastSpringBone/Components/FastSpringBoneColliderGroup.cs +++ /dev/null @@ -1,31 +0,0 @@ -using UnityEngine; -using UniVRM10.FastSpringBones.Blittables; -using UniVRM10.FastSpringBones.NativeWrappers; -using UniVRM10.FastSpringBones.Registries; - -namespace UniVRM10.FastSpringBones.Components -{ - /// - /// VRMSpringBoneColliderGroupに対応したクラス - /// バッファの作成も行う - /// - public sealed unsafe class FastSpringBoneColliderGroup : MonoBehaviour - { - private NativeTransform _nativeTransform; - private NativeColliderGroup _nativeColliderGroup; - - public BlittableColliderGroup* ColliderGroupPtr => _nativeColliderGroup.GetUnsafePtr(); - - public void Initialize(TransformRegistry transformRegistry, BlittableCollider[] colliders) - { - _nativeTransform = new NativeTransform(transformRegistry, TransformSynchronizationType.PullOnly, transform); - _nativeColliderGroup = new NativeColliderGroup(colliders, _nativeTransform); - } - - private void OnDestroy() - { - _nativeTransform?.Dispose(); - _nativeColliderGroup?.Dispose(); - } - } -} diff --git a/Assets/VRM10/Runtime/FastSpringBone/Components/FastSpringBoneColliderGroup.cs.meta b/Assets/VRM10/Runtime/FastSpringBone/Components/FastSpringBoneColliderGroup.cs.meta deleted file mode 100644 index 2d20097b1..000000000 --- a/Assets/VRM10/Runtime/FastSpringBone/Components/FastSpringBoneColliderGroup.cs.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: b5fe6672f5b7b1049bb9e1bed44ee015 -timeCreated: 1550213674 \ No newline at end of file diff --git a/Assets/VRM10/Runtime/FastSpringBone/Components/FastSpringBoneScheduler.cs b/Assets/VRM10/Runtime/FastSpringBone/Components/FastSpringBoneScheduler.cs deleted file mode 100644 index 6691e16da..000000000 --- a/Assets/VRM10/Runtime/FastSpringBone/Components/FastSpringBoneScheduler.cs +++ /dev/null @@ -1,100 +0,0 @@ -using Unity.Jobs; -using UnityEngine; -using UnityEngine.Profiling; -using UniVRM10.FastSpringBones.Registries; -using UniVRM10.FastSpringBones.Schedulers; - -namespace UniVRM10.FastSpringBones.Components -{ - /// - /// Jobを連続して発火させるComponent - /// シーンに1つだけあればいい - /// - [DefaultExecutionOrder(11000)] - public sealed class FastSpringBoneScheduler : MonoBehaviour - { - [SerializeField] private bool showGizmos; - - private CustomSampler _updateSampler; - - private PullTransformJobScheduler _pullTransformJobScheduler; - private PushTransformJobScheduler _pushTransformJobScheduler; - private UpdateSpringBoneJobScheduler _updateSpringBoneJobScheduler; - - private RootBoneRegistry _rootBoneRegistry; - private ColliderGroupRegistry _colliderGroupRegistry; - - private JobHandle _prevJobHandle; - - public bool ShowGizmos { get => showGizmos; set => showGizmos = value; } - - public void Initialize( - RootBoneRegistry rootBoneRegistry, - TransformRegistry transformRegistry, - ColliderGroupRegistry colliderGroupRegistry) - { - _rootBoneRegistry = rootBoneRegistry; - _colliderGroupRegistry = colliderGroupRegistry; - - _updateSampler = CustomSampler.Create("FastSpringBone(Update)"); - - _pullTransformJobScheduler = new PullTransformJobScheduler(transformRegistry); - _pushTransformJobScheduler = new PushTransformJobScheduler(transformRegistry); - _updateSpringBoneJobScheduler = new UpdateSpringBoneJobScheduler(_rootBoneRegistry); - - _rootBoneRegistry.SubscribeOnValueChanged(OnRootBoneChanged); - } - - private void OnDestroy() - { - _rootBoneRegistry.UnSubscribeOnValueChanged(OnRootBoneChanged); - _prevJobHandle.Complete(); - - _pullTransformJobScheduler.Dispose(); - _pushTransformJobScheduler.Dispose(); - _updateSpringBoneJobScheduler.Dispose(); - } - - private void OnRootBoneChanged() - { - _prevJobHandle.Complete(); - } - -#if UNITY_EDITOR - private void OnDrawGizmos() - { - if (!ShowGizmos) return; - - _prevJobHandle.Complete(); - - Gizmos.color = Color.blue; - foreach (var rootBoneWrapper in _rootBoneRegistry.Items) - { - rootBoneWrapper.Value.DrawGizmos(); - } - - Gizmos.color = Color.yellow; - foreach (var colliderGroup in _colliderGroupRegistry.Items) - { - colliderGroup.DrawGizmos(); - } - } -#endif - - private void LateUpdate() - { - _updateSampler.Begin(); - - _prevJobHandle.Complete(); - - var tempJobHandle = default(JobHandle); - tempJobHandle = _pullTransformJobScheduler.Schedule(tempJobHandle); - tempJobHandle = _updateSpringBoneJobScheduler.Schedule(tempJobHandle); - tempJobHandle = _pushTransformJobScheduler.Schedule(tempJobHandle); - - _prevJobHandle = tempJobHandle; - - _updateSampler.End(); - } - } -} \ No newline at end of file diff --git a/Assets/VRM10/Runtime/FastSpringBone/Components/FastSpringBoneScheduler.cs.meta b/Assets/VRM10/Runtime/FastSpringBone/Components/FastSpringBoneScheduler.cs.meta deleted file mode 100644 index 2f156ce92..000000000 --- a/Assets/VRM10/Runtime/FastSpringBone/Components/FastSpringBoneScheduler.cs.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: 3affa859639024f439b13d4cd4a9b0f6 -timeCreated: 1549521562 \ No newline at end of file diff --git a/Assets/VRM10/Runtime/FastSpringBone/Components/FastSpringRootBone.cs b/Assets/VRM10/Runtime/FastSpringBone/Components/FastSpringRootBone.cs deleted file mode 100644 index 704982a04..000000000 --- a/Assets/VRM10/Runtime/FastSpringBone/Components/FastSpringRootBone.cs +++ /dev/null @@ -1,124 +0,0 @@ -using System; -using System.Collections.Generic; -using UnityEngine; -using UniVRM10.FastSpringBones.Blittables; -using UniVRM10.FastSpringBones.NativeWrappers; -using UniVRM10.FastSpringBones.Registries; - -namespace UniVRM10.FastSpringBones.Components -{ - /// - /// SpringBoneの1本の毛束の処理を担当するクラス - /// - public sealed class FastSpringRootBone : IDisposable - { - private readonly TransformRegistry _transformRegistry; - private readonly RootBoneRegistry _rootBoneRegistry; - private readonly ColliderGroupRegistry _colliderGroupRegistry; - private readonly Transform _transform; - - private float _radius; - private NativeTransform _center; - - private IReadOnlyDictionary _transformIndexMap; - private NativeColliderGroups _nativeColliderGroups; - - private NativePoints _nativePoints; - private NativePointer _rootBoneWrapper; - - private readonly IList _transformWrappers = new List(); - private readonly IList> _points = new List>(); - - public FastSpringRootBone( - TransformRegistry transformRegistry, - Transform transform, - RootBoneRegistry rootBoneRegistry, - ColliderGroupRegistry colliderGroupRegistry - ) - { - _transformRegistry = transformRegistry; - _transform = transform; - _rootBoneRegistry = rootBoneRegistry; - _colliderGroupRegistry = colliderGroupRegistry; - } - - public IReadOnlyList ColliderGroups - { - get => _nativeColliderGroups.ColliderGroups; - set => _nativeColliderGroups.ColliderGroups = value; - } - - public unsafe void Initialize( - float gravityPower, - Vector3 gravityDir, - float dragForce, - float stiffnessForce, - IReadOnlyList colliderGroups, - float radius, - Transform center) - { - _radius = radius; - if (center != null) - { - _center = new NativeTransform(_transformRegistry, TransformSynchronizationType.PullOnly, center); - } - - _nativeColliderGroups = new NativeColliderGroups(colliderGroups); - - NativeTransform parent = null; - if (_transform.parent) - { - parent = new NativeTransform(_transformRegistry, TransformSynchronizationType.PullOnly, _transform.parent); - } - SetupRecursive(_transform, parent); - - _nativePoints = new NativePoints(_points); - - _rootBoneWrapper = new NativePointer(new BlittableRootBone(gravityPower, gravityDir, dragForce, stiffnessForce, _nativePoints.GetUnsafePtr())); - _rootBoneRegistry.Register(_rootBoneWrapper); - _colliderGroupRegistry.Register(_nativeColliderGroups); - } - - public void Dispose() - { - _colliderGroupRegistry.Unregister(_nativeColliderGroups); - _rootBoneRegistry.Unregister(_rootBoneWrapper); - - foreach (var transformWrapper in _transformWrappers) - { - transformWrapper.Dispose(); - } - - foreach (var point in _points) - { - point.Dispose(); - } - - _center?.Dispose(); - _nativeColliderGroups?.Dispose(); - _nativePoints.Dispose(); - _rootBoneWrapper.Dispose(); - } - - private unsafe void SetupRecursive(Transform trs, NativeTransform parent = null) - { - var transformWrapper = new NativeTransform(_transformRegistry, TransformSynchronizationType.PushOnly, trs, parent); - _transformWrappers.Add(transformWrapper); - - var point = new NativePointer( - new BlittablePoint( - trs, - _radius, - _center != null ? _center.GetUnsafePtr() : null, - _nativeColliderGroups.GetUnsafePtr(), - transformWrapper.GetUnsafePtr()) - ); - _points.Add(point); - - for (var i = 0; i < trs.childCount; ++i) - { - SetupRecursive(trs.GetChild(i), transformWrapper); - } - } - } -} diff --git a/Assets/VRM10/Runtime/FastSpringBone/Components/FastSpringRootBone.cs.meta b/Assets/VRM10/Runtime/FastSpringBone/Components/FastSpringRootBone.cs.meta deleted file mode 100644 index d92fb08fa..000000000 --- a/Assets/VRM10/Runtime/FastSpringBone/Components/FastSpringRootBone.cs.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: 03e3a3dad32f6e64a9fd0327d74c8305 -timeCreated: 1550036996 \ No newline at end of file diff --git a/Assets/VRM10/Runtime/FastSpringBone/Components.meta b/Assets/VRM10/Runtime/FastSpringBone/InputPorts.meta similarity index 77% rename from Assets/VRM10/Runtime/FastSpringBone/Components.meta rename to Assets/VRM10/Runtime/FastSpringBone/InputPorts.meta index 93cfd9293..b894d56db 100644 --- a/Assets/VRM10/Runtime/FastSpringBone/Components.meta +++ b/Assets/VRM10/Runtime/FastSpringBone/InputPorts.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 57b934d4e245cef49acc06524c3e1f7d +guid: bc529d8de129fe44ca6bfa94972f8951 folderAsset: yes DefaultImporter: externalObjects: {} diff --git a/Assets/VRM10/Runtime/FastSpringBone/InputPorts/FastSpringBoneCollider.cs b/Assets/VRM10/Runtime/FastSpringBone/InputPorts/FastSpringBoneCollider.cs new file mode 100644 index 000000000..b8386924c --- /dev/null +++ b/Assets/VRM10/Runtime/FastSpringBone/InputPorts/FastSpringBoneCollider.cs @@ -0,0 +1,13 @@ +using System; +using UnityEngine; +using UniVRM10.FastSpringBones.Blittables; + +namespace UniVRM10.FastSpringBones.System +{ + [Serializable] + public struct FastSpringBoneCollider + { + public Transform Transform; + public BlittableCollider Collider; + } +} \ No newline at end of file diff --git a/Assets/VRM10/Runtime/FastSpringBone/InputPorts/FastSpringBoneCollider.cs.meta b/Assets/VRM10/Runtime/FastSpringBone/InputPorts/FastSpringBoneCollider.cs.meta new file mode 100644 index 000000000..8b31e8850 --- /dev/null +++ b/Assets/VRM10/Runtime/FastSpringBone/InputPorts/FastSpringBoneCollider.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: ffca416cb15a43239b73ed6067076458 +timeCreated: 1633066289 \ No newline at end of file diff --git a/Assets/VRM10/Runtime/FastSpringBone/InputPorts/FastSpringBoneJoint.cs b/Assets/VRM10/Runtime/FastSpringBone/InputPorts/FastSpringBoneJoint.cs new file mode 100644 index 000000000..7aff7cf71 --- /dev/null +++ b/Assets/VRM10/Runtime/FastSpringBone/InputPorts/FastSpringBoneJoint.cs @@ -0,0 +1,13 @@ +using System; +using UnityEngine; +using UniVRM10.FastSpringBones.Blittables; + +namespace UniVRM10.FastSpringBones.System +{ + [Serializable] + public struct FastSpringBoneJoint + { + public Transform Transform; + public BlittableJoint Joint; + } +} \ No newline at end of file diff --git a/Assets/VRM10/Runtime/FastSpringBone/InputPorts/FastSpringBoneJoint.cs.meta b/Assets/VRM10/Runtime/FastSpringBone/InputPorts/FastSpringBoneJoint.cs.meta new file mode 100644 index 000000000..d47bfbc18 --- /dev/null +++ b/Assets/VRM10/Runtime/FastSpringBone/InputPorts/FastSpringBoneJoint.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: b6742aa2a6a34bd395add629c17ab952 +timeCreated: 1633066253 \ No newline at end of file diff --git a/Assets/VRM10/Runtime/FastSpringBone/InputPorts/FastSpringBoneSpring.cs b/Assets/VRM10/Runtime/FastSpringBone/InputPorts/FastSpringBoneSpring.cs new file mode 100644 index 000000000..e8af6da8e --- /dev/null +++ b/Assets/VRM10/Runtime/FastSpringBone/InputPorts/FastSpringBoneSpring.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; + +namespace UniVRM10.FastSpringBones.System +{ + [Serializable] + public struct FastSpringBoneSpring + { + public FastSpringBoneJoint[] Joints; + public FastSpringBoneCollider[] Colliders; + } +} \ No newline at end of file diff --git a/Assets/VRM10/Runtime/FastSpringBone/InputPorts/FastSpringBoneSpring.cs.meta b/Assets/VRM10/Runtime/FastSpringBone/InputPorts/FastSpringBoneSpring.cs.meta new file mode 100644 index 000000000..ea46ccb63 --- /dev/null +++ b/Assets/VRM10/Runtime/FastSpringBone/InputPorts/FastSpringBoneSpring.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: e0a972985499416e8e95acdf16fae6ba +timeCreated: 1633066412 \ No newline at end of file diff --git a/Assets/VRM10/Runtime/FastSpringBone/NativeWrappers/NativeColliderGroup.cs b/Assets/VRM10/Runtime/FastSpringBone/NativeWrappers/NativeColliderGroup.cs deleted file mode 100644 index c0a3a566c..000000000 --- a/Assets/VRM10/Runtime/FastSpringBone/NativeWrappers/NativeColliderGroup.cs +++ /dev/null @@ -1,31 +0,0 @@ -using System; -using Unity.Collections; -using UniVRM10.FastSpringBones.Blittables; - -namespace UniVRM10.FastSpringBones.NativeWrappers -{ - /// - /// BlittableColliderGroupのライフサイクルを管理するWrapper - /// - public sealed unsafe class NativeColliderGroup : IDisposable - { - private readonly NativePointer _nativePointer; - - private NativeArray Colliders { get; } - - public BlittableColliderGroup* GetUnsafePtr() => _nativePointer.GetUnsafePtr(); - - public NativeColliderGroup(BlittableCollider[] colliders, NativeTransform nativeTransform) - { - Colliders = new NativeArray(colliders, Allocator.Persistent); - _nativePointer = new NativePointer(new BlittableColliderGroup(Colliders, nativeTransform.GetUnsafePtr())); - } - - public void Dispose() - { - if (Colliders.IsCreated) Colliders.Dispose(); - - _nativePointer.Dispose(); - } - } -} diff --git a/Assets/VRM10/Runtime/FastSpringBone/NativeWrappers/NativeColliderGroup.cs.meta b/Assets/VRM10/Runtime/FastSpringBone/NativeWrappers/NativeColliderGroup.cs.meta deleted file mode 100644 index 3c88d6a2d..000000000 --- a/Assets/VRM10/Runtime/FastSpringBone/NativeWrappers/NativeColliderGroup.cs.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: a8d248be1ab9abe46abd06caa4758d6b -timeCreated: 1550640666 \ No newline at end of file diff --git a/Assets/VRM10/Runtime/FastSpringBone/NativeWrappers/NativeColliderGroups.cs b/Assets/VRM10/Runtime/FastSpringBone/NativeWrappers/NativeColliderGroups.cs deleted file mode 100644 index cc97d5909..000000000 --- a/Assets/VRM10/Runtime/FastSpringBone/NativeWrappers/NativeColliderGroups.cs +++ /dev/null @@ -1,78 +0,0 @@ -using System; -using System.Collections.Generic; -using Unity.Collections; -using Unity.Collections.LowLevel.Unsafe; -using UniVRM10.FastSpringBones.Blittables; -using UniVRM10.FastSpringBones.Components; - -namespace UniVRM10.FastSpringBones.NativeWrappers -{ - /// - /// BlittableColliderGroupsのライフサイクルを管理するWrapper - /// - public sealed unsafe class NativeColliderGroups : IDisposable - { - private readonly NativePointer _nativePointer = new NativePointer(); - private NativeArray _colliderGroupArray; - private IReadOnlyList _colliderGroups; - - //Disposeされた後にUpdateColliderGroupsが呼ばれるのを防ぐためのフラグ - private bool _isDisposed; - - public BlittableColliderGroups* GetUnsafePtr() => _nativePointer.GetUnsafePtr(); - public void DrawGizmos() => _nativePointer.Value.DrawGizmos(); - - public IReadOnlyList ColliderGroups - { - get => _colliderGroups; - set - { - _colliderGroups = value; - UpdateColliderGroups(); - } - } - - private void UpdateColliderGroups() - { - if (_isDisposed) return; - if (_colliderGroupArray.IsCreated) - { - _colliderGroupArray.Dispose(); - } - CreateColliderGroupArray(_colliderGroups); - UpdateData(); - } - - public NativeColliderGroups(IReadOnlyList colliderGroups) - { - _colliderGroups = colliderGroups; - UpdateColliderGroups(); - } - - public void Dispose() - { - if (_colliderGroupArray.IsCreated) - { - _colliderGroupArray.Dispose(); - _isDisposed = true; - } - _nativePointer.Dispose(); - } - - private void CreateColliderGroupArray(IReadOnlyList colliderGroups) - { - _colliderGroupArray = new NativeArray(colliderGroups.Count, Allocator.Persistent); - for (var i = 0; i < _colliderGroupArray.Length; ++i) - { - _colliderGroupArray[i] = *colliderGroups[i].ColliderGroupPtr; - } - } - - private void UpdateData() - { - _nativePointer.Value = new BlittableColliderGroups( - (BlittableColliderGroup*)_colliderGroupArray.GetUnsafePtr(), - _colliderGroupArray.Length); - } - } -} diff --git a/Assets/VRM10/Runtime/FastSpringBone/NativeWrappers/NativeColliderGroups.cs.meta b/Assets/VRM10/Runtime/FastSpringBone/NativeWrappers/NativeColliderGroups.cs.meta deleted file mode 100644 index 65493a207..000000000 --- a/Assets/VRM10/Runtime/FastSpringBone/NativeWrappers/NativeColliderGroups.cs.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: 73c3eb940b180fc48a3e7cdacc621543 -timeCreated: 1550645184 \ No newline at end of file diff --git a/Assets/VRM10/Runtime/FastSpringBone/NativeWrappers/NativePointer.cs b/Assets/VRM10/Runtime/FastSpringBone/NativeWrappers/NativePointer.cs deleted file mode 100644 index 55640c242..000000000 --- a/Assets/VRM10/Runtime/FastSpringBone/NativeWrappers/NativePointer.cs +++ /dev/null @@ -1,35 +0,0 @@ -using System; -using Unity.Collections; -using Unity.Collections.LowLevel.Unsafe; - -namespace UniVRM10.FastSpringBones.NativeWrappers -{ - public sealed class NativePointer : IDisposable where T : unmanaged - { - private readonly unsafe T* _unsafePtr; - - public unsafe T* GetUnsafePtr() => _unsafePtr; - - public unsafe T Value - { - get => *_unsafePtr; - set => *_unsafePtr = value; - } - - public unsafe NativePointer() - { - _unsafePtr = (T*)UnsafeUtility.Malloc(sizeof(T), 16, Allocator.Persistent); - } - - public unsafe NativePointer(T value) - { - _unsafePtr = (T*)UnsafeUtility.Malloc(sizeof(T), 16, Allocator.Persistent); - Value = value; - } - - public unsafe void Dispose() - { - UnsafeUtility.Free(_unsafePtr, Allocator.Persistent); - } - } -} diff --git a/Assets/VRM10/Runtime/FastSpringBone/NativeWrappers/NativePointer.cs.meta b/Assets/VRM10/Runtime/FastSpringBone/NativeWrappers/NativePointer.cs.meta deleted file mode 100644 index 00bbc2603..000000000 --- a/Assets/VRM10/Runtime/FastSpringBone/NativeWrappers/NativePointer.cs.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: 7c4d1058273489b478b053eb13702d6e -timeCreated: 1595316733 \ No newline at end of file diff --git a/Assets/VRM10/Runtime/FastSpringBone/NativeWrappers/NativePoints.cs b/Assets/VRM10/Runtime/FastSpringBone/NativeWrappers/NativePoints.cs deleted file mode 100644 index 31b1ef4dc..000000000 --- a/Assets/VRM10/Runtime/FastSpringBone/NativeWrappers/NativePoints.cs +++ /dev/null @@ -1,39 +0,0 @@ -using System; -using System.Collections.Generic; -using Unity.Collections; -using Unity.Collections.LowLevel.Unsafe; -using UniVRM10.FastSpringBones.Blittables; - -namespace UniVRM10.FastSpringBones.NativeWrappers -{ - /// - /// BlittablePointsGroupのライフサイクルを管理するWrapper - /// - public sealed unsafe class NativePoints : IDisposable - { - private readonly NativePointer _nativePointer; - private NativeArray _buffer; - - public BlittablePoints* GetUnsafePtr() => _nativePointer.GetUnsafePtr(); - - public NativePoints(IList> points) - { - _buffer = new NativeArray(points.Count, Allocator.Persistent); - for (var i = 0; i < _buffer.Length; ++i) - { - _buffer[i] = points[i].Value; - } - - _nativePointer = new NativePointer(new BlittablePoints((BlittablePoint*) _buffer.GetUnsafePtr(), _buffer.Length)); - } - - public void Dispose() - { - if (_buffer.IsCreated) - { - _buffer.Dispose(); - } - _nativePointer.Dispose(); - } - } -} \ No newline at end of file diff --git a/Assets/VRM10/Runtime/FastSpringBone/NativeWrappers/NativePoints.cs.meta b/Assets/VRM10/Runtime/FastSpringBone/NativeWrappers/NativePoints.cs.meta deleted file mode 100644 index 9be582f2d..000000000 --- a/Assets/VRM10/Runtime/FastSpringBone/NativeWrappers/NativePoints.cs.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: 91cb239111add8342b25267432c53894 -timeCreated: 1550723674 \ No newline at end of file diff --git a/Assets/VRM10/Runtime/FastSpringBone/NativeWrappers/NativeTransform.cs b/Assets/VRM10/Runtime/FastSpringBone/NativeWrappers/NativeTransform.cs deleted file mode 100644 index bf7ed646f..000000000 --- a/Assets/VRM10/Runtime/FastSpringBone/NativeWrappers/NativeTransform.cs +++ /dev/null @@ -1,43 +0,0 @@ -using System; -using UnityEngine; -using UniVRM10.FastSpringBones.Blittables; -using UniVRM10.FastSpringBones.Registries; - -namespace UniVRM10.FastSpringBones.NativeWrappers -{ - /// - /// BlittableTransformのライフサイクルを管理するWrapper - /// - public sealed class NativeTransform : IDisposable - { - private readonly NativePointer _nativePointer; - public Transform Transform { get; } - - private readonly TransformRegistry _transformRegistry; - - public unsafe BlittableTransform* GetUnsafePtr() => _nativePointer.GetUnsafePtr(); - public BlittableTransform Value => _nativePointer.Value; - - public unsafe NativeTransform( - TransformRegistry transformRegistry, - TransformSynchronizationType transformSynchronizationType, - Transform transform, - NativeTransform parent = null - ) - { - _nativePointer = new NativePointer(new BlittableTransform(parent != null ? parent.GetUnsafePtr() : null, transform)); - - Transform = transform; - - _transformRegistry = transformRegistry; - _transformRegistry.Register(this, transformSynchronizationType); - } - - public void Dispose() - { - _transformRegistry.Unregister(this); - - _nativePointer.Dispose(); - } - } -} diff --git a/Assets/VRM10/Runtime/FastSpringBone/NativeWrappers/NativeTransform.cs.meta b/Assets/VRM10/Runtime/FastSpringBone/NativeWrappers/NativeTransform.cs.meta deleted file mode 100644 index 5b2c5ab2d..000000000 --- a/Assets/VRM10/Runtime/FastSpringBone/NativeWrappers/NativeTransform.cs.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: 31fdb7a504d498242a3e459e3a63bf2d -timeCreated: 1550545201 \ No newline at end of file diff --git a/Assets/VRM10/Runtime/FastSpringBone/Registries.meta b/Assets/VRM10/Runtime/FastSpringBone/Registries.meta deleted file mode 100644 index eac274d9b..000000000 --- a/Assets/VRM10/Runtime/FastSpringBone/Registries.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: a590127469e104049996cf9b123db183 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/VRM10/Runtime/FastSpringBone/Registries/ColliderGroupRegistry.cs b/Assets/VRM10/Runtime/FastSpringBone/Registries/ColliderGroupRegistry.cs deleted file mode 100644 index 8bc1fd0d2..000000000 --- a/Assets/VRM10/Runtime/FastSpringBone/Registries/ColliderGroupRegistry.cs +++ /dev/null @@ -1,8 +0,0 @@ -using UniVRM10.FastSpringBones.NativeWrappers; - -namespace UniVRM10.FastSpringBones.Registries -{ - public sealed class ColliderGroupRegistry : Registry - { - } -} diff --git a/Assets/VRM10/Runtime/FastSpringBone/Registries/ColliderGroupRegistry.cs.meta b/Assets/VRM10/Runtime/FastSpringBone/Registries/ColliderGroupRegistry.cs.meta deleted file mode 100644 index 8be0a80f7..000000000 --- a/Assets/VRM10/Runtime/FastSpringBone/Registries/ColliderGroupRegistry.cs.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: 9f5847b2d8bb16242aac76bda14b0202 -timeCreated: 1594963749 \ No newline at end of file diff --git a/Assets/VRM10/Runtime/FastSpringBone/Registries/Registry.cs b/Assets/VRM10/Runtime/FastSpringBone/Registries/Registry.cs deleted file mode 100644 index 24efde31e..000000000 --- a/Assets/VRM10/Runtime/FastSpringBone/Registries/Registry.cs +++ /dev/null @@ -1,28 +0,0 @@ -using System; -using System.Collections.Generic; - -namespace UniVRM10.FastSpringBones.Registries -{ - public class Registry - { - private readonly List _items = new List(); - private Action _onValueChanged; - - public IReadOnlyList Items => _items; - - public void Register(T value) - { - _items.Add(value); - _onValueChanged?.Invoke(); - } - - public void Unregister(T value) - { - _items.Remove(value); - _onValueChanged?.Invoke(); - } - - public void SubscribeOnValueChanged(Action action) => _onValueChanged += action; - public void UnSubscribeOnValueChanged(Action action) => _onValueChanged -= action; - } -} diff --git a/Assets/VRM10/Runtime/FastSpringBone/Registries/Registry.cs.meta b/Assets/VRM10/Runtime/FastSpringBone/Registries/Registry.cs.meta deleted file mode 100644 index c16cd67d9..000000000 --- a/Assets/VRM10/Runtime/FastSpringBone/Registries/Registry.cs.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: 9d127e4a4d5d05a46929eb3d3692d720 -timeCreated: 1595407071 \ No newline at end of file diff --git a/Assets/VRM10/Runtime/FastSpringBone/Registries/RootBoneRegistry.cs b/Assets/VRM10/Runtime/FastSpringBone/Registries/RootBoneRegistry.cs deleted file mode 100644 index 29509be7f..000000000 --- a/Assets/VRM10/Runtime/FastSpringBone/Registries/RootBoneRegistry.cs +++ /dev/null @@ -1,12 +0,0 @@ -using UniVRM10.FastSpringBones.Blittables; -using UniVRM10.FastSpringBones.NativeWrappers; - -namespace UniVRM10.FastSpringBones.Registries -{ - /// - /// 今生きているRootBoneの一覧を返すクラス - /// - public sealed class RootBoneRegistry : Registry> - { - } -} \ No newline at end of file diff --git a/Assets/VRM10/Runtime/FastSpringBone/Registries/RootBoneRegistry.cs.meta b/Assets/VRM10/Runtime/FastSpringBone/Registries/RootBoneRegistry.cs.meta deleted file mode 100644 index 89ea5400e..000000000 --- a/Assets/VRM10/Runtime/FastSpringBone/Registries/RootBoneRegistry.cs.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: 34da1f63315656e479315841b7112d7c -timeCreated: 1550734399 \ No newline at end of file diff --git a/Assets/VRM10/Runtime/FastSpringBone/Registries/TransformRegistry.cs b/Assets/VRM10/Runtime/FastSpringBone/Registries/TransformRegistry.cs deleted file mode 100644 index 8fc0d45cf..000000000 --- a/Assets/VRM10/Runtime/FastSpringBone/Registries/TransformRegistry.cs +++ /dev/null @@ -1,60 +0,0 @@ -using System; -using System.Collections.Generic; -using UniVRM10.FastSpringBones.NativeWrappers; - -namespace UniVRM10.FastSpringBones.Registries -{ - /// - /// 今生きているTransformの一覧を返すクラス - /// - public sealed class TransformRegistry - { - private readonly List _transforms = new List(); - public IReadOnlyList Transforms => _transforms; - - private readonly List _pullTargets = new List(); - public IReadOnlyList PullTargets => _pullTargets; - - private readonly List _pushTargets = new List(); - public IReadOnlyList PushTargets => _pushTargets; - - private Action _onValueChanged; - - public void SubscribeOnValueChanged(Action action) => _onValueChanged += action; - - public void UnSubscribeOnValueChanged(Action action) => _onValueChanged -= action; - - public void Register(NativeTransform nativeTransform, TransformSynchronizationType synchronizationType) - { - _transforms.Add(nativeTransform); - switch (synchronizationType) - { - case TransformSynchronizationType.PullOnly: - _pullTargets.Add(nativeTransform); - break; - case TransformSynchronizationType.PushOnly: - _pushTargets.Add(nativeTransform); - break; - default: - throw new ArgumentOutOfRangeException(nameof(synchronizationType), synchronizationType, null); - } - _onValueChanged?.Invoke(); - } - - public void Unregister(NativeTransform nativeTransform) - { - _transforms.Remove(nativeTransform); - - if (_pullTargets.Contains(nativeTransform)) - { - _pullTargets.Remove(nativeTransform); - } - - if (_pushTargets.Contains(nativeTransform)) - { - _pushTargets.Remove(nativeTransform); - } - _onValueChanged?.Invoke(); - } - } -} \ No newline at end of file diff --git a/Assets/VRM10/Runtime/FastSpringBone/Registries/TransformRegistry.cs.meta b/Assets/VRM10/Runtime/FastSpringBone/Registries/TransformRegistry.cs.meta deleted file mode 100644 index d22ac48d1..000000000 --- a/Assets/VRM10/Runtime/FastSpringBone/Registries/TransformRegistry.cs.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: 0603b4348a649df4fa966eeb3cd1011a -timeCreated: 1550666913 \ No newline at end of file diff --git a/Assets/VRM10/Runtime/FastSpringBone/Registries/TransformSynchronizationType.cs b/Assets/VRM10/Runtime/FastSpringBone/Registries/TransformSynchronizationType.cs deleted file mode 100644 index 1dccb0525..000000000 --- a/Assets/VRM10/Runtime/FastSpringBone/Registries/TransformSynchronizationType.cs +++ /dev/null @@ -1,8 +0,0 @@ -namespace UniVRM10.FastSpringBones.Registries -{ - public enum TransformSynchronizationType - { - PullOnly, - PushOnly, - } -} \ No newline at end of file diff --git a/Assets/VRM10/Runtime/FastSpringBone/Registries/TransformSynchronizationType.cs.meta b/Assets/VRM10/Runtime/FastSpringBone/Registries/TransformSynchronizationType.cs.meta deleted file mode 100644 index c3ef76238..000000000 --- a/Assets/VRM10/Runtime/FastSpringBone/Registries/TransformSynchronizationType.cs.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: 03978423768dd5542875359a745a0d6d -timeCreated: 1551169872 \ No newline at end of file diff --git a/Assets/VRM10/Runtime/FastSpringBone/Schedulers.meta b/Assets/VRM10/Runtime/FastSpringBone/Schedulers.meta deleted file mode 100644 index 2a3440920..000000000 --- a/Assets/VRM10/Runtime/FastSpringBone/Schedulers.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 160bc0dc84d022a48862d46add47a26c -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/VRM10/Runtime/FastSpringBone/Schedulers/PullTransformJobScheduler.cs b/Assets/VRM10/Runtime/FastSpringBone/Schedulers/PullTransformJobScheduler.cs deleted file mode 100644 index 450d26e26..000000000 --- a/Assets/VRM10/Runtime/FastSpringBone/Schedulers/PullTransformJobScheduler.cs +++ /dev/null @@ -1,119 +0,0 @@ -using System; -using System.Collections.Generic; -#if ENABLE_SPRINGBONE_BURST -using Unity.Burst; -#endif -using Unity.Collections; -using Unity.Collections.LowLevel.Unsafe; -using Unity.Jobs; -using UnityEngine.Jobs; -using UnityEngine.Profiling; -using UniVRM10.FastSpringBones.Blittables; -using UniVRM10.FastSpringBones.NativeWrappers; -using UniVRM10.FastSpringBones.Registries; - -namespace UniVRM10.FastSpringBones.Schedulers -{ - /// - /// GameObjectの世界からBlittableな世界へTransformを複製する処理を行うクラス - /// - public sealed unsafe class PullTransformJobScheduler : IDisposable - { - private BlittableTransform** _transformPointers; - private TransformAccessArray _transformAccessArray; - - private readonly CustomSampler _sampler = CustomSampler.Create("Schedule CopyFromTransformJob"); - private readonly TransformRegistry _transformRegistry; - - private bool _dirty = true; - - private IReadOnlyList Targets => _transformRegistry.PullTargets; - - public PullTransformJobScheduler(TransformRegistry transformRegistry) - { - _transformRegistry = transformRegistry; - - _transformRegistry.SubscribeOnValueChanged(OnTransformChanged); - } - - private void OnTransformChanged() - { - _dirty = true; - } - - public JobHandle Schedule(JobHandle dependOn = default(JobHandle)) - { - if (Targets.Count == 0) - { - return dependOn; - } - - _sampler.Begin(); - - // リストが変更されていたらバッファを再構築 - if (_dirty) - { - ReconstructBuffers(); - - _dirty = false; - } - - // ジョブを発火 - var job = new Job { TransformPointers = _transformPointers }; - var jobHandle = job.Schedule(_transformAccessArray, dependOn); - - _sampler.End(); - - return jobHandle; - } - - private void ReconstructBuffers() - { - ReleaseBuffers(); - - var transforms = Targets; - _transformPointers = (BlittableTransform**)UnsafeUtility.Malloc( - sizeof(BlittableTransform*) * transforms.Count, - 16, - Allocator.Persistent - ); - - _transformAccessArray = new TransformAccessArray(transforms.Count); - - for (var i = 0; i < transforms.Count; i++) - { - _transformPointers[i] = transforms[i].GetUnsafePtr(); - _transformAccessArray.Add(transforms[i].Transform); - } - } - - public void Dispose() - { - ReleaseBuffers(); - _transformRegistry.UnSubscribeOnValueChanged(OnTransformChanged); - } - - private void ReleaseBuffers() - { - if (_transformAccessArray.isCreated) _transformAccessArray.Dispose(); - if (_transformPointers != null) - { - UnsafeUtility.Free(_transformPointers, Allocator.Persistent); - _transformPointers = null; - } - } - -#if ENABLE_SPRINGBONE_BURST - [BurstCompile] -#endif - private struct Job : IJobParallelForTransform - { - [NativeDisableUnsafePtrRestriction] public BlittableTransform** TransformPointers; - - public void Execute(int index, TransformAccess transform) - { - TransformPointers[index]->PullFrom(transform); - } - } - } -} diff --git a/Assets/VRM10/Runtime/FastSpringBone/Schedulers/PullTransformJobScheduler.cs.meta b/Assets/VRM10/Runtime/FastSpringBone/Schedulers/PullTransformJobScheduler.cs.meta deleted file mode 100644 index 6443d9e8d..000000000 --- a/Assets/VRM10/Runtime/FastSpringBone/Schedulers/PullTransformJobScheduler.cs.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: 4ac8728e24e9f5240aa45867878dcc10 -timeCreated: 1550547066 \ No newline at end of file diff --git a/Assets/VRM10/Runtime/FastSpringBone/Schedulers/PushTransformJobScheduler.cs b/Assets/VRM10/Runtime/FastSpringBone/Schedulers/PushTransformJobScheduler.cs deleted file mode 100644 index 619d0e659..000000000 --- a/Assets/VRM10/Runtime/FastSpringBone/Schedulers/PushTransformJobScheduler.cs +++ /dev/null @@ -1,119 +0,0 @@ -using System; -using System.Collections.Generic; -#if ENABLE_SPRINGBONE_BURST -using Unity.Burst; -#endif -using Unity.Collections; -using Unity.Collections.LowLevel.Unsafe; -using Unity.Jobs; -using UnityEngine.Jobs; -using UnityEngine.Profiling; -using UniVRM10.FastSpringBones.Blittables; -using UniVRM10.FastSpringBones.NativeWrappers; -using UniVRM10.FastSpringBones.Registries; - -namespace UniVRM10.FastSpringBones.Schedulers -{ - /// - /// Blittableな世界からGameObjectの世界へTransformを送り込む処理を行うクラス - /// - public sealed unsafe class PushTransformJobScheduler : IDisposable - { - private BlittableTransform** _transformPointers; - private TransformAccessArray _transformAccessArray; - - private readonly CustomSampler _sampler = CustomSampler.Create("Schedule CopyFromTransformJob"); - private readonly TransformRegistry _transformRegistry; - - private bool _dirty = true; - - private IReadOnlyList Targets => _transformRegistry.PushTargets; - - public PushTransformJobScheduler(TransformRegistry transformRegistry) - { - _transformRegistry = transformRegistry; - - _transformRegistry.SubscribeOnValueChanged(OnTransformChanged); - } - - private void OnTransformChanged() - { - _dirty = true; - } - - public JobHandle Schedule(JobHandle dependOn = default(JobHandle)) - { - if (Targets.Count == 0) - { - return dependOn; - } - - _sampler.Begin(); - - // リストが変更されていたらバッファを再構築 - if (_dirty) - { - ReconstructBuffers(); - - _dirty = false; - } - - // Jobを発火 - var job = new Job { TransformPointers = _transformPointers }; - var jobHandle = job.Schedule(_transformAccessArray, dependOn); - - _sampler.End(); - - return jobHandle; - } - - private void ReconstructBuffers() - { - ReleaseBuffers(); - - var transforms = Targets; - _transformPointers = (BlittableTransform**)UnsafeUtility.Malloc( - sizeof(BlittableTransform*) * transforms.Count, - 16, - Allocator.Persistent - ); - - _transformAccessArray = new TransformAccessArray(transforms.Count); - - for (var i = 0; i < transforms.Count; i++) - { - _transformPointers[i] = transforms[i].GetUnsafePtr(); - _transformAccessArray.Add(transforms[i].Transform); - } - } - - public void Dispose() - { - ReleaseBuffers(); - _transformRegistry.UnSubscribeOnValueChanged(OnTransformChanged); - } - - private void ReleaseBuffers() - { - if (_transformAccessArray.isCreated) _transformAccessArray.Dispose(); - if (_transformPointers != null) - { - UnsafeUtility.Free(_transformPointers, Allocator.Persistent); - _transformPointers = null; - } - } - -#if ENABLE_SPRINGBONE_BURST - [BurstCompile] -#endif - private struct Job : IJobParallelForTransform - { - [NativeDisableUnsafePtrRestriction] public BlittableTransform** TransformPointers; - - public void Execute(int index, TransformAccess transform) - { - TransformPointers[index]->PushTo(transform); - } - } - } -} diff --git a/Assets/VRM10/Runtime/FastSpringBone/Schedulers/PushTransformJobScheduler.cs.meta b/Assets/VRM10/Runtime/FastSpringBone/Schedulers/PushTransformJobScheduler.cs.meta deleted file mode 100644 index cf42b82ad..000000000 --- a/Assets/VRM10/Runtime/FastSpringBone/Schedulers/PushTransformJobScheduler.cs.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: 91e1bc2d3c93f1b4db3e08534237e6a0 -timeCreated: 1550717407 \ No newline at end of file diff --git a/Assets/VRM10/Runtime/FastSpringBone/Schedulers/UpdateSpringBoneJobScheduler.cs b/Assets/VRM10/Runtime/FastSpringBone/Schedulers/UpdateSpringBoneJobScheduler.cs deleted file mode 100644 index 88e2dc96a..000000000 --- a/Assets/VRM10/Runtime/FastSpringBone/Schedulers/UpdateSpringBoneJobScheduler.cs +++ /dev/null @@ -1,113 +0,0 @@ -using System; -using System.Collections.Generic; -#if ENABLE_SPRINGBONE_BURST -using Unity.Burst; -#endif -using Unity.Collections; -using Unity.Collections.LowLevel.Unsafe; -using Unity.Jobs; -using UnityEngine; -using UnityEngine.Profiling; -using UniVRM10.FastSpringBones.Blittables; -using UniVRM10.FastSpringBones.NativeWrappers; -using UniVRM10.FastSpringBones.Registries; - -namespace UniVRM10.FastSpringBones.Schedulers -{ - /// - /// SpringBoneを更新する処理を行うクラス - /// - public sealed unsafe class UpdateSpringBoneJobScheduler : IDisposable - { - private BlittableRootBone** _rootBonePointers; - - private readonly RootBoneRegistry _rootBoneRegistry; - private readonly CustomSampler _sampler = CustomSampler.Create("Schedule CopyFromTransformJob"); - - private bool _dirty = true; - - private IReadOnlyList> Targets => _rootBoneRegistry.Items; - - public UpdateSpringBoneJobScheduler(RootBoneRegistry rootBoneRegistry) - { - _rootBoneRegistry = rootBoneRegistry; - - _rootBoneRegistry.SubscribeOnValueChanged(OnRootBoneChanged); - } - - public void Dispose() - { - ReleaseBuffer(); - _rootBoneRegistry.UnSubscribeOnValueChanged(OnRootBoneChanged); - } - - private void OnRootBoneChanged() - { - _dirty = true; - } - - public JobHandle Schedule(JobHandle dependOn = default(JobHandle)) - { - if (Targets.Count == 0) - { - return dependOn; - } - - _sampler.Begin(); - - // リストが変更されていたらバッファを再構築 - if (_dirty) - { - ReconstructBuffers(); - - _dirty = false; - } - - // Jobを発火 - var job = new Job { RootBonePointers = _rootBonePointers, DeltaTime = Time.deltaTime }; - var jobHandle = job.Schedule(Targets.Count, 0, dependOn); - - _sampler.End(); - - return jobHandle; - } - - private void ReconstructBuffers() - { - ReleaseBuffer(); - - _rootBonePointers = (BlittableRootBone**)UnsafeUtility.Malloc( - sizeof(BlittableTransform*) * Targets.Count, - 16, - Allocator.Persistent - ); - - for (var i = 0; i < Targets.Count; i++) - { - _rootBonePointers[i] = Targets[i].GetUnsafePtr(); - } - } - - private void ReleaseBuffer() - { - if (_rootBonePointers == null) return; - UnsafeUtility.Free(_rootBonePointers, Allocator.Persistent); - _rootBonePointers = null; - } - -#if ENABLE_SPRINGBONE_BURST - [BurstCompile] -#endif - private struct Job : IJobParallelFor - { - [NativeDisableUnsafePtrRestriction] public BlittableRootBone** RootBonePointers; - public float DeltaTime; - - public void Execute(int index) - { - // 各点を更新する - RootBonePointers[index]->Update(DeltaTime); - } - } - } -} diff --git a/Assets/VRM10/Runtime/FastSpringBone/Schedulers/UpdateSpringBoneJobScheduler.cs.meta b/Assets/VRM10/Runtime/FastSpringBone/Schedulers/UpdateSpringBoneJobScheduler.cs.meta deleted file mode 100644 index 963580382..000000000 --- a/Assets/VRM10/Runtime/FastSpringBone/Schedulers/UpdateSpringBoneJobScheduler.cs.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: 39839e9c65fc7a54abacaadf2d519fbf -timeCreated: 1549516763 \ No newline at end of file diff --git a/Assets/VRM10/Runtime/FastSpringBone/NativeWrappers.meta b/Assets/VRM10/Runtime/FastSpringBone/System.meta similarity index 77% rename from Assets/VRM10/Runtime/FastSpringBone/NativeWrappers.meta rename to Assets/VRM10/Runtime/FastSpringBone/System.meta index 5b4b75b94..47ac6e8e5 100644 --- a/Assets/VRM10/Runtime/FastSpringBone/NativeWrappers.meta +++ b/Assets/VRM10/Runtime/FastSpringBone/System.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: b6633497ce721ce4c81d514187ef4407 +guid: af417d77d895bc84ba5d2c8f0542bdd8 folderAsset: yes DefaultImporter: externalObjects: {} diff --git a/Assets/VRM10/Runtime/FastSpringBone/System/CopyToNativeArrayTransformJob.cs b/Assets/VRM10/Runtime/FastSpringBone/System/CopyToNativeArrayTransformJob.cs new file mode 100644 index 000000000..1792f0ea7 --- /dev/null +++ b/Assets/VRM10/Runtime/FastSpringBone/System/CopyToNativeArrayTransformJob.cs @@ -0,0 +1,28 @@ +using Unity.Burst; +using Unity.Collections; +using UnityEngine.Jobs; +using UniVRM10.FastSpringBones.Blittables; + +namespace UniVRM10.FastSpringBones.System +{ + [BurstCompile] + public struct PullTransformJob : IJobParallelForTransform + { + [WriteOnly] public NativeArray Transforms; + + public void Execute(int index, TransformAccess transform) + { + Transforms[index] = new BlittableTransform + { + Position = transform.position, + Rotation = transform.rotation, + LocalPosition = transform.localPosition, + LocalRotation = transform.localRotation, + LocalScale = transform.localScale, + LocalToWorldMatrix = transform.localToWorldMatrix, + WorldToLocalMatrix = transform.worldToLocalMatrix + }; + } + } +} + \ No newline at end of file diff --git a/Assets/VRM10/Runtime/FastSpringBone/System/CopyToNativeArrayTransformJob.cs.meta b/Assets/VRM10/Runtime/FastSpringBone/System/CopyToNativeArrayTransformJob.cs.meta new file mode 100644 index 000000000..78bdc82fe --- /dev/null +++ b/Assets/VRM10/Runtime/FastSpringBone/System/CopyToNativeArrayTransformJob.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: b9fd53b4431b41909c1b1d882a2d446b +timeCreated: 1633072084 \ No newline at end of file diff --git a/Assets/VRM10/Runtime/FastSpringBone/System/FastSpringBoneBuffers.cs b/Assets/VRM10/Runtime/FastSpringBone/System/FastSpringBoneBuffers.cs new file mode 100644 index 000000000..3e0cef9ef --- /dev/null +++ b/Assets/VRM10/Runtime/FastSpringBone/System/FastSpringBoneBuffers.cs @@ -0,0 +1,110 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using Unity.Collections; +using UnityEngine.Jobs; +using UniVRM10.FastSpringBones.Blittables; + +namespace UniVRM10.FastSpringBones.System +{ + public sealed class FastSpringBoneBuffers : IDisposable + { + private NativeArray _springs; + + private NativeArray _joints; + private NativeArray _jointTransforms; + private TransformAccessArray _jointsTransformAccessArray; + + private NativeArray _colliders; + private NativeArray _colliderTransforms; + private TransformAccessArray _colliderTransformAccessArray; + + public NativeArray Springs => _springs; + + public NativeArray Joints => _joints; + public NativeArray JointTransforms => _jointTransforms; + public TransformAccessArray JointsTransformAccessArray => _jointsTransformAccessArray; + + public NativeArray Colliders => _colliders; + public NativeArray ColliderTransforms => _colliderTransforms; + public TransformAccessArray ColliderTransformAccessArray => _colliderTransformAccessArray; + + public FastSpringBoneBuffers(IReadOnlyList springs) + { + _springs = new NativeArray(springs.Count, Allocator.Persistent); + + // _springsを構築しつつ、joints, collidersの総数を数える + ConstructBlittableSprings(springs, out var jointsCount, out var collidersCount); + + // 各種bufferの初期化 + _joints = new NativeArray(jointsCount, Allocator.Persistent); + _jointTransforms = new NativeArray(jointsCount, Allocator.Persistent); + _jointsTransformAccessArray = new TransformAccessArray(jointsCount); + + _colliders = new NativeArray(collidersCount, Allocator.Persistent); + _colliderTransforms = new NativeArray(collidersCount, Allocator.Persistent); + _colliderTransformAccessArray = new TransformAccessArray(collidersCount); + + // 各種bufferの構築 + var jointIndex = 0; + var colliderIndex = 0; + foreach (var spring in springs) + { + foreach (var joint in spring.Joints) + { + var parent = joint.Transform.parent; + + _joints[jointIndex] = joint.Joint; + _jointsTransformAccessArray.Add(joint.Transform); + _jointTransforms[jointIndex] = new BlittableTransform(); + ++jointIndex; + } + + foreach (var collider in spring.Colliders) + { + var parent = collider.Transform.parent; + + _colliders[colliderIndex] = collider.Collider; + _colliderTransformAccessArray.Add(collider.Transform); + _colliderTransforms[colliderIndex] = new BlittableTransform(); + ++colliderIndex; + } + } + } + + /// + /// _springsを構築しつつ、joints, collidersの総数を数える + /// + private void ConstructBlittableSprings(IReadOnlyList springs, out int jointsCount, + out int collidersCount) + { + jointsCount = 0; + collidersCount = 0; + for (var i = 0; i < springs.Count; i++) + { + var spring = springs[i]; + var blittableSpring = new BlittableSpring(); + + blittableSpring.JointSpan.StartIndex = jointsCount; + blittableSpring.ColliderSpan.StartIndex = jointsCount; + blittableSpring.JointSpan.Count = spring.Joints.Length; + blittableSpring.ColliderSpan.Count = spring.Colliders.Length; + _springs[i] = blittableSpring; + + jointsCount += spring.Joints.Length; + collidersCount += spring.Colliders.Length; + } + } + + public void Dispose() + { + _springs.Dispose(); + _joints.Dispose(); + _jointTransforms.Dispose(); + _jointsTransformAccessArray.Dispose(); + _colliders.Dispose(); + _colliderTransforms.Dispose(); + _colliderTransformAccessArray.Dispose(); + } + } +} \ No newline at end of file diff --git a/Assets/VRM10/Runtime/FastSpringBone/System/FastSpringBoneBuffers.cs.meta b/Assets/VRM10/Runtime/FastSpringBone/System/FastSpringBoneBuffers.cs.meta new file mode 100644 index 000000000..ce9f4ec5a --- /dev/null +++ b/Assets/VRM10/Runtime/FastSpringBone/System/FastSpringBoneBuffers.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 2b0299bf5bfe431e8e18a9b033b719a3 +timeCreated: 1633072502 \ No newline at end of file diff --git a/Assets/VRM10/Runtime/FastSpringBone/System/FastSpringBoneScheduler.cs b/Assets/VRM10/Runtime/FastSpringBone/System/FastSpringBoneScheduler.cs new file mode 100644 index 000000000..1b1382ec3 --- /dev/null +++ b/Assets/VRM10/Runtime/FastSpringBone/System/FastSpringBoneScheduler.cs @@ -0,0 +1,48 @@ +using System; +using System.Collections.Generic; +using Unity.Jobs; +using UnityEngine.Jobs; + +namespace UniVRM10.FastSpringBones.System +{ + public sealed class FastSpringBoneScheduler : IDisposable + { + private readonly FastSpringBoneBuffers _fastSpringBoneBuffers; + + public FastSpringBoneScheduler(IReadOnlyList springs) + { + _fastSpringBoneBuffers = new FastSpringBoneBuffers(springs); + } + + public void Schedule() + { + var handle = JobHandle.CombineDependencies( + new PullTransformJob + { + Transforms = _fastSpringBoneBuffers.ColliderTransforms + }.Schedule(_fastSpringBoneBuffers.ColliderTransformAccessArray), + new PullTransformJob + { + Transforms = _fastSpringBoneBuffers.JointTransforms + }.Schedule(_fastSpringBoneBuffers.JointsTransformAccessArray)); + + handle = JobHandle.CombineDependencies( + new PushTransformJob() + { + Transforms = _fastSpringBoneBuffers.ColliderTransforms + }.Schedule(_fastSpringBoneBuffers.ColliderTransformAccessArray, handle), + new PushTransformJob() + { + Transforms = _fastSpringBoneBuffers.JointTransforms + }.Schedule(_fastSpringBoneBuffers.JointsTransformAccessArray, handle)); + + + handle.Complete(); + } + + public void Dispose() + { + _fastSpringBoneBuffers.Dispose(); + } + } +} \ No newline at end of file diff --git a/Assets/VRM10/Runtime/FastSpringBone/System/FastSpringBoneScheduler.cs.meta b/Assets/VRM10/Runtime/FastSpringBone/System/FastSpringBoneScheduler.cs.meta new file mode 100644 index 000000000..3ebe6c1c4 --- /dev/null +++ b/Assets/VRM10/Runtime/FastSpringBone/System/FastSpringBoneScheduler.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 897b4e814c0b5dc4d8d1f8a859ef746b +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/VRM10/Runtime/FastSpringBone/System/FastSpringBoneTest.cs b/Assets/VRM10/Runtime/FastSpringBone/System/FastSpringBoneTest.cs new file mode 100644 index 000000000..dfac14149 --- /dev/null +++ b/Assets/VRM10/Runtime/FastSpringBone/System/FastSpringBoneTest.cs @@ -0,0 +1,26 @@ +using UnityEngine; + +namespace UniVRM10.FastSpringBones.System +{ + public sealed class FastSpringBoneTest : MonoBehaviour + { + [SerializeField] private FastSpringBoneSpring[] springs; + + private FastSpringBoneScheduler _scheduler; + + private void Start() + { + _scheduler = new FastSpringBoneScheduler(springs); + } + + private void LateUpdate() + { + _scheduler.Schedule(); + } + + private void OnDestroy() + { + _scheduler.Dispose(); + } + } +} \ No newline at end of file diff --git a/Assets/VRM10/Runtime/FastSpringBone/System/FastSpringBoneTest.cs.meta b/Assets/VRM10/Runtime/FastSpringBone/System/FastSpringBoneTest.cs.meta new file mode 100644 index 000000000..eb6020064 --- /dev/null +++ b/Assets/VRM10/Runtime/FastSpringBone/System/FastSpringBoneTest.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 13e3ed9705fb4aca9601f6dc764830d9 +timeCreated: 1633073221 \ No newline at end of file diff --git a/Assets/VRM10/Runtime/FastSpringBone/System/PushTransformJob.cs b/Assets/VRM10/Runtime/FastSpringBone/System/PushTransformJob.cs new file mode 100644 index 000000000..078ec1f31 --- /dev/null +++ b/Assets/VRM10/Runtime/FastSpringBone/System/PushTransformJob.cs @@ -0,0 +1,19 @@ +using Unity.Burst; +using Unity.Collections; +using UnityEngine.Jobs; +using UniVRM10.FastSpringBones.Blittables; + +namespace UniVRM10.FastSpringBones.System +{ + [BurstCompile] + public struct PushTransformJob : IJobParallelForTransform + { + [ReadOnly] + public NativeArray Transforms; + + public void Execute(int index, TransformAccess transform) + { + transform.localRotation = Transforms[index].LocalRotation; + } + } +} \ No newline at end of file diff --git a/Assets/VRM10/Runtime/FastSpringBone/System/PushTransformJob.cs.meta b/Assets/VRM10/Runtime/FastSpringBone/System/PushTransformJob.cs.meta new file mode 100644 index 000000000..dea0f1598 --- /dev/null +++ b/Assets/VRM10/Runtime/FastSpringBone/System/PushTransformJob.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: fd0a0bfba0ec4bc6b050527b92d4decf +timeCreated: 1633075989 \ No newline at end of file