mirror of
https://github.com/vrm-c/UniVRM.git
synced 2026-04-25 07:28:51 -05:00
BlittableJointImmutable and BlittableJointMutable
This commit is contained in:
parent
b97ffe306b
commit
7b84b73171
|
|
@ -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;
|
||||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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),
|
||||
|
|
|
|||
|
|
@ -8,7 +8,7 @@ namespace UniGLTF.SpringBoneJobs.InputPorts
|
|||
public struct FastSpringBoneJoint
|
||||
{
|
||||
public Transform Transform;
|
||||
public BlittableJointSettings Joint;
|
||||
public BlittableJointMutable Joint;
|
||||
public Quaternion DefaultLocalRotation;
|
||||
}
|
||||
}
|
||||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user