BlittableJointImmutable and BlittableJointMutable

This commit is contained in:
ousttrue 2024-09-17 13:42:06 +09:00
parent b97ffe306b
commit 7b84b73171
11 changed files with 59 additions and 54 deletions

View File

@ -4,10 +4,12 @@ using UnityEngine;
namespace UniGLTF.SpringBoneJobs.Blittables
{
/// <summary>
/// 初期状態から計算できる Joint のパラメーター
/// Reconstruct に対して Immutable。
/// Jointの増減、初期姿勢の変更など構成の変更は Reconstruct が必要。
/// 変わりにくいスコープ。
/// </summary>
[Serializable]
public struct BlittableJointInit
public struct BlittableJointImmutable
{
public int parentTransformIndex;
public int headTransformIndex;

View File

@ -0,0 +1,21 @@
using System;
using UnityEngine;
namespace UniGLTF.SpringBoneJobs.Blittables
{
/// <summary>
/// Reconstruct に対して Mutable。
/// Reconstruct より軽量な JointReconfigure(仮) で変更できるようにする予定。
/// おもに Editor play で設定を変更しながら動作を見る用途を想定している。
/// JointReconfigure を呼ばなければ以前と同じで不変となる。
/// </summary>
[Serializable]
public struct BlittableJointMutable
{
public float stiffnessForce;
public float gravityPower;
public Vector3 gravityDir;
public float dragForce;
public float radius;
}
}

View File

@ -1,18 +0,0 @@
using System;
using UnityEngine;
namespace UniGLTF.SpringBoneJobs.Blittables
{
/// <summary>
/// - 毎フレームの変化を許可する
/// </summary>
[Serializable]
public struct BlittableJointSettings
{
public float stiffnessForce;
public float gravityPower;
public Vector3 gravityDir;
public float dragForce;
public float radius;
}
}

View File

@ -20,8 +20,8 @@ namespace UniGLTF.SpringBoneJobs
public sealed class FastSpringBoneBufferCombiner : IDisposable
{
// 長さと index 同じ
private NativeArray<BlittableJointInit> _logics;
private NativeArray<BlittableJointSettings> _joints;
private NativeArray<BlittableJointImmutable> _logics;
private NativeArray<BlittableJointMutable> _joints;
private NativeArray<Vector3> _prevTails;
private NativeArray<Vector3> _currentTails;
@ -40,8 +40,8 @@ namespace UniGLTF.SpringBoneJobs
private bool _isDirty;
public NativeArray<BlittableJointInit> Logics => _logics;
public NativeArray<BlittableJointSettings> Joints => _joints;
public NativeArray<BlittableJointImmutable> Logics => _logics;
public NativeArray<BlittableJointMutable> Joints => _joints;
public NativeArray<Vector3> PrevTails => _prevTails;
public NativeArray<Vector3> CurrentTails => _currentTails;
public NativeArray<Vector3> NextTails => _nextTails;
@ -114,7 +114,7 @@ namespace UniGLTF.SpringBoneJobs
var length = _batchedBufferLogicSizes[i];
if (!_batchedBuffers[i].IsDisposed && length > 0)
{
NativeArray<BlittableJointInit>.Copy(_logics, logicsIndex, _batchedBuffers[i].Logics, 0, length);
NativeArray<BlittableJointImmutable>.Copy(_logics, logicsIndex, _batchedBuffers[i].Logics, 0, length);
}
logicsIndex += length;
@ -160,8 +160,8 @@ namespace UniGLTF.SpringBoneJobs
// バッファの構築
Profiler.BeginSample("FastSpringBone.ReconstructBuffers.CreateBuffers");
_logics = new NativeArray<BlittableJointInit>(logicsCount, Allocator.Persistent);
_joints = new NativeArray<BlittableJointSettings>(logicsCount, Allocator.Persistent);
_logics = new NativeArray<BlittableJointImmutable>(logicsCount, Allocator.Persistent);
_joints = new NativeArray<BlittableJointMutable>(logicsCount, Allocator.Persistent);
_prevTails = new NativeArray<Vector3>(logicsCount, Allocator.Persistent);
_currentTails = new NativeArray<Vector3>(logicsCount, Allocator.Persistent);
_nextTails = new NativeArray<Vector3>(logicsCount, Allocator.Persistent);
@ -210,8 +210,8 @@ namespace UniGLTF.SpringBoneJobs
SrcLogics = buffer.Logics,
SrcJoints = buffer.Joints,
DestLogics = new NativeSlice<BlittableJointInit>(_logics, logicsOffset, buffer.Logics.Length),
DestJoints = new NativeSlice<BlittableJointSettings>(_joints, logicsOffset, buffer.Logics.Length),
DestLogics = new NativeSlice<BlittableJointImmutable>(_logics, logicsOffset, buffer.Logics.Length),
DestJoints = new NativeSlice<BlittableJointMutable>(_joints, logicsOffset, buffer.Logics.Length),
}.Schedule(buffer.Logics.Length, 1, handle);
springsOffset += buffer.Springs.Length;
@ -335,10 +335,10 @@ namespace UniGLTF.SpringBoneJobs
#endif
private struct OffsetLogicsJob : IJobParallelFor
{
[ReadOnly] public NativeSlice<BlittableJointInit> SrcLogics;
[ReadOnly] public NativeSlice<BlittableJointSettings> SrcJoints;
[WriteOnly] public NativeSlice<BlittableJointInit> DestLogics;
[WriteOnly] public NativeSlice<BlittableJointSettings> DestJoints;
[ReadOnly] public NativeSlice<BlittableJointImmutable> SrcLogics;
[ReadOnly] public NativeSlice<BlittableJointMutable> SrcJoints;
[WriteOnly] public NativeSlice<BlittableJointImmutable> DestLogics;
[WriteOnly] public NativeSlice<BlittableJointMutable> DestJoints;
public void Execute(int index)
{
@ -352,7 +352,7 @@ namespace UniGLTF.SpringBoneJobs
#endif
private struct InitCurrentTailsJob : IJobParallelFor
{
[ReadOnly] public NativeArray<BlittableJointInit> Logics;
[ReadOnly] public NativeArray<BlittableJointImmutable> Logics;
[ReadOnly] public NativeArray<BlittableTransform> Transforms;
[WriteOnly] public NativeSlice<Vector3> CurrentTails;
[WriteOnly] public NativeSlice<Vector3> PrevTails;

View File

@ -16,9 +16,9 @@ namespace UniGLTF.SpringBoneJobs.InputPorts
{
// NOTE: これらはFastSpringBoneBufferCombinerによってバッチングされる
public NativeArray<BlittableSpring> Springs { get; }
public NativeArray<BlittableJointSettings> Joints { get; }
public NativeArray<BlittableJointMutable> Joints { get; }
public NativeArray<BlittableCollider> Colliders { get; }
public NativeArray<BlittableJointInit> Logics { get; }
public NativeArray<BlittableJointImmutable> Logics { get; }
public NativeArray<BlittableTransform> 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<BlittableSpring> blittableSprings = new();
List<BlittableJointSettings> blittableJoints = new();
List<BlittableJointMutable> blittableJoints = new();
List<BlittableCollider> blittableColliders = new();
List<BlittableJointInit> blittableLogics = new();
List<BlittableJointImmutable> blittableLogics = new();
foreach (var spring in springs)
{
var blittableSpring = new BlittableSpring
@ -131,9 +131,9 @@ namespace UniGLTF.SpringBoneJobs.InputPorts
}
Springs = new NativeArray<BlittableSpring>(blittableSprings.ToArray(), Allocator.Persistent);
Joints = new NativeArray<BlittableJointSettings>(blittableJoints.ToArray(), Allocator.Persistent);
Joints = new NativeArray<BlittableJointMutable>(blittableJoints.ToArray(), Allocator.Persistent);
Colliders = new NativeArray<BlittableCollider>(blittableColliders.ToArray(), Allocator.Persistent);
Logics = new NativeArray<BlittableJointInit>(blittableLogics.ToArray(), Allocator.Persistent);
Logics = new NativeArray<BlittableJointImmutable>(blittableLogics.ToArray(), Allocator.Persistent);
BlittableTransforms = new NativeArray<BlittableTransform>(Transforms.Length, Allocator.Persistent);
Profiler.EndSample();
}
@ -145,7 +145,7 @@ namespace UniGLTF.SpringBoneJobs.InputPorts
/// <param name="spring"></param>
/// <param name="i">joint index</param>
/// <returns></returns>
public static IEnumerable<BlittableJointInit> LogicFromTransform(Transform[] Transforms, FastSpringBoneSpring spring)
public static IEnumerable<BlittableJointImmutable> LogicFromTransform(Transform[] Transforms, FastSpringBoneSpring spring)
{
// vrm-1.0 では末端の joint は tail で処理対象でないのに注意!
for (int i = 0; i < spring.joints.Length - 1; ++i)
@ -182,7 +182,7 @@ namespace UniGLTF.SpringBoneJobs.InputPorts
);
var parent = joint.Transform.parent;
yield return new BlittableJointInit
yield return new BlittableJointImmutable
{
headTransformIndex = Array.IndexOf(Transforms, joint.Transform),
parentTransformIndex = Array.IndexOf(Transforms, parent),

View File

@ -8,7 +8,7 @@ namespace UniGLTF.SpringBoneJobs.InputPorts
public struct FastSpringBoneJoint
{
public Transform Transform;
public BlittableJointSettings Joint;
public BlittableJointMutable Joint;
public Quaternion DefaultLocalRotation;
}
}

View File

@ -16,8 +16,8 @@ namespace UniGLTF.SpringBoneJobs
{
// すべての spring の joint を平坦に連結した配列
// Joints, Logics, PrevTail, CurrentTail, NextTail は同じ index
[ReadOnly] public NativeArray<BlittableJointSettings> Joints;
[ReadOnly] public NativeArray<BlittableJointInit> Logics;
[ReadOnly] public NativeArray<BlittableJointMutable> Joints;
[ReadOnly] public NativeArray<BlittableJointImmutable> Logics;
[ReadOnly] public NativeArray<Vector3> PrevTail;
[ReadOnly] public NativeArray<Vector3> CurrentTail;
// ランダムアクセス
@ -179,10 +179,10 @@ namespace UniGLTF.SpringBoneJobs
Vector3 worldTail,
Vector3 worldPosition,
BlittableTransform headTransform,
BlittableJointSettings joint,
BlittableJointMutable joint,
BlittableCollider collider,
float maxColliderScale,
BlittableJointInit logic,
BlittableJointImmutable logic,
ref Vector3 nextTail)
{
var direction = worldTail - worldPosition;
@ -214,12 +214,12 @@ namespace UniGLTF.SpringBoneJobs
}
private static void ResolveSphereCollision(
BlittableJointSettings joint,
BlittableJointMutable joint,
BlittableCollider collider,
Vector3 worldPosition,
BlittableTransform headTransform,
float maxColliderScale,
BlittableJointInit logic,
BlittableJointImmutable logic,
ref Vector3 nextTail)
{
var r = joint.radius + collider.radius * maxColliderScale;
@ -234,7 +234,7 @@ namespace UniGLTF.SpringBoneJobs
}
private static void ResolveSphereCollisionInside(
BlittableJointSettings joint,
BlittableJointMutable joint,
BlittableCollider collider,
BlittableTransform colliderTransform,
ref Vector3 nextTail)
@ -254,7 +254,7 @@ namespace UniGLTF.SpringBoneJobs
}
private static void ResolveCapsuleCollisionInside(
BlittableJointSettings joint,
BlittableJointMutable joint,
BlittableCollider collider,
BlittableTransform colliderTransform,
ref Vector3 nextTail)
@ -303,7 +303,7 @@ namespace UniGLTF.SpringBoneJobs
/// <param name="colliderTransform">colliderTransform.localToWorldMatrix.MultiplyPoint3x4(collider.offset);</param>
/// <param name="nextTail">result of verlet integration</param>
private static void ResolvePlaneCollision(
BlittableJointSettings joint,
BlittableJointMutable joint,
BlittableCollider collider,
BlittableTransform colliderTransform,
ref Vector3 nextTail)

View File

@ -87,7 +87,7 @@ namespace VRM.SpringBoneJobs
joints.Add(new FastSpringBoneJoint
{
Transform = joint.transform,
Joint = new BlittableJointSettings
Joint = new BlittableJointMutable
{
radius = spring.m_hitRadius,
dragForce = spring.m_dragForce,

View File

@ -92,7 +92,7 @@ namespace UniVRM10
.Select(joint => new FastSpringBoneJoint
{
Transform = joint.transform,
Joint = new BlittableJointSettings
Joint = new BlittableJointMutable
{
radius = joint.m_jointRadius,
dragForce = joint.m_dragForce,