From 84b64c0be28d37a189a648c2ab9a497007ef6ed4 Mon Sep 17 00:00:00 2001 From: ousttrue Date: Mon, 18 Nov 2024 16:30:16 +0900 Subject: [PATCH] use spring.transformIndexOffset --- .../FastSpringBoneBufferCombiner.cs | 4 - .../FastSpringBoneConbinedBuffer.cs | 93 ++++++++++--------- .../InputPorts/FastSpringBoneBuffer.cs | 12 --- .../FastSpringBoneBufferFactory.cs | 3 +- 4 files changed, 49 insertions(+), 63 deletions(-) diff --git a/Assets/UniGLTF/Runtime/SpringBoneJobs/FastSpringBoneBufferCombiner.cs b/Assets/UniGLTF/Runtime/SpringBoneJobs/FastSpringBoneBufferCombiner.cs index cc4a9da2d..016cbcd96 100644 --- a/Assets/UniGLTF/Runtime/SpringBoneJobs/FastSpringBoneBufferCombiner.cs +++ b/Assets/UniGLTF/Runtime/SpringBoneJobs/FastSpringBoneBufferCombiner.cs @@ -60,10 +60,6 @@ namespace UniGLTF.SpringBoneJobs Profiler.BeginSample("FastSpringBone.ReconstructBuffers.DisposeBuffers"); if (_combinedBuffer is FastSpringBoneCombinedBuffer combined) { - Profiler.BeginSample("FastSpringBone.ReconstructBuffers.SaveToSourceBuffer"); - combined.SaveToSourceBuffer(); - Profiler.EndSample(); - // TODO: Dispose せずに再利用? combined.Dispose(); } diff --git a/Assets/UniGLTF/Runtime/SpringBoneJobs/FastSpringBoneConbinedBuffer.cs b/Assets/UniGLTF/Runtime/SpringBoneJobs/FastSpringBoneConbinedBuffer.cs index d6bd83c05..34410ece7 100644 --- a/Assets/UniGLTF/Runtime/SpringBoneJobs/FastSpringBoneConbinedBuffer.cs +++ b/Assets/UniGLTF/Runtime/SpringBoneJobs/FastSpringBoneConbinedBuffer.cs @@ -97,7 +97,7 @@ namespace UniGLTF.SpringBoneJobs springsCount += buffer.Springs.Length; collidersCount += buffer.Colliders.Length; logicsCount += buffer.Logics.Length; - transformsCount += buffer.BlittableTransforms.Length; + transformsCount += buffer.Transforms.Length; } Profiler.EndSample(); @@ -112,6 +112,23 @@ namespace UniGLTF.SpringBoneJobs private JobHandle Batching(JobHandle handle) { + // TransformAccessArrayの構築 + Profiler.BeginSample("FastSpringBone.ReconstructBuffers.LoadTransformAccessArray"); + var transforms = new Transform[_transforms.Length]; + var transformAccessArrayOffset = 0; + foreach (var buffer in _batchedBuffers) + { + Array.Copy(buffer.Transforms, 0, transforms, transformAccessArrayOffset, buffer.Transforms.Length); + transformAccessArrayOffset += buffer.Transforms.Length; + } + _transformAccessArray = new TransformAccessArray(transforms); + Profiler.EndSample(); + + handle = new PullTransformJob + { + Transforms = Transforms + }.Schedule(TransformAccessArray, handle); + Profiler.BeginSample("FastSpringBone.ReconstructBuffers.ScheduleLoadBufferJobs"); var springsOffset = 0; var collidersOffset = 0; @@ -129,14 +146,6 @@ namespace UniGLTF.SpringBoneJobs _jointMap.Add(buffer.Transforms[head], logicsOffset + j); } - // バッファの読み込みをスケジュール - handle = new LoadTransformsJob - { - SrcTransforms = buffer.BlittableTransforms, - DestTransforms = new NativeSlice(_transforms, transformOffset, - buffer.BlittableTransforms.Length) - }.Schedule(buffer.BlittableTransforms.Length, 1, handle); - handle = new LoadSpringsJob { ModelIndex = i, @@ -165,26 +174,9 @@ namespace UniGLTF.SpringBoneJobs springsOffset += buffer.Springs.Length; collidersOffset += buffer.Colliders.Length; logicsOffset += buffer.Logics.Length; - transformOffset += buffer.BlittableTransforms.Length; + transformOffset += buffer.Transforms.Length; } - handle = InitCurrentTails(handle); - - // TransformAccessArrayの構築と並行してJobを行うため、この時点で走らせておく - JobHandle.ScheduleBatchedJobs(); - Profiler.EndSample(); - - // TransformAccessArrayの構築 - Profiler.BeginSample("FastSpringBone.ReconstructBuffers.LoadTransformAccessArray"); - var transforms = new Transform[_transforms.Length]; - var transformAccessArrayOffset = 0; - foreach (var buffer in _batchedBuffers) - { - Array.Copy(buffer.Transforms, 0, transforms, transformAccessArrayOffset, buffer.Transforms.Length); - transformAccessArrayOffset += buffer.BlittableTransforms.Length; - } - - _transformAccessArray = new TransformAccessArray(transforms); Profiler.EndSample(); return handle; @@ -328,29 +320,36 @@ namespace UniGLTF.SpringBoneJobs #endif private struct InitCurrentTailsJob : IJobParallelFor { + [ReadOnly] public NativeArray Springs; + [ReadOnly] public NativeArray Logics; [ReadOnly] public NativeArray Transforms; - [WriteOnly] public NativeSlice CurrentTails; - [WriteOnly] public NativeSlice PrevTails; - [WriteOnly] public NativeSlice NextTails; + [NativeDisableParallelForRestriction] public NativeSlice CurrentTails; + [NativeDisableParallelForRestriction] public NativeSlice PrevTails; + [NativeDisableParallelForRestriction] public NativeSlice NextTails; - public void Execute(int jointIndex) + public void Execute(int springIndex) { - var tailIndex = Logics[jointIndex].tailTransformIndex; - if (tailIndex == -1) + var spring = Springs[springIndex]; + for (int jointIndex = spring.logicSpan.startIndex; jointIndex < spring.logicSpan.EndIndex; ++jointIndex) { - // tail 無い - var tail = Transforms[Logics[jointIndex].headTransformIndex]; - CurrentTails[jointIndex] = tail.position; - PrevTails[jointIndex] = tail.position; - NextTails[jointIndex] = tail.position; - } - else - { - var tail = Transforms[tailIndex]; - CurrentTails[jointIndex] = tail.position; - PrevTails[jointIndex] = tail.position; - NextTails[jointIndex] = tail.position; + var tailIndex = Logics[jointIndex].tailTransformIndex; + if (tailIndex == -1) + { + // tail 無い + var index = springIndex + Logics[jointIndex].headTransformIndex; + var tail = Transforms[index]; + CurrentTails[jointIndex] = tail.position; + PrevTails[jointIndex] = tail.position; + NextTails[jointIndex] = tail.position; + } + else + { + var tail = Transforms[spring.transformIndexOffset + tailIndex]; + CurrentTails[jointIndex] = tail.position; + PrevTails[jointIndex] = tail.position; + NextTails[jointIndex] = tail.position; + } } } } @@ -365,12 +364,14 @@ namespace UniGLTF.SpringBoneJobs { return new InitCurrentTailsJob { + Springs = Springs, + Logics = Logics, Transforms = Transforms, CurrentTails = CurrentTails, PrevTails = PrevTails, NextTails = NextTails, - }.Schedule(Logics.Length, 1, handle); + }.Schedule(Springs.Length, 1, handle); } public void InitializeJointsLocalRotation(FastSpringBoneBuffer buffer) diff --git a/Assets/UniGLTF/Runtime/SpringBoneJobs/InputPorts/FastSpringBoneBuffer.cs b/Assets/UniGLTF/Runtime/SpringBoneJobs/InputPorts/FastSpringBoneBuffer.cs index 9e9887176..07c0de741 100644 --- a/Assets/UniGLTF/Runtime/SpringBoneJobs/InputPorts/FastSpringBoneBuffer.cs +++ b/Assets/UniGLTF/Runtime/SpringBoneJobs/InputPorts/FastSpringBoneBuffer.cs @@ -22,7 +22,6 @@ namespace UniGLTF.SpringBoneJobs.InputPorts public NativeArray Joints { get; } public NativeArray Colliders { get; } public NativeArray Logics { get; } - public NativeArray BlittableTransforms { get; } public Transform[] Transforms { get; } public bool IsDisposed { get; private set; } @@ -103,16 +102,6 @@ namespace UniGLTF.SpringBoneJobs.InputPorts Joints = new NativeArray(blittableJoints.ToArray(), Allocator.Persistent); Colliders = new NativeArray(blittableColliders.ToArray(), Allocator.Persistent); Logics = new NativeArray(blittableLogics.ToArray(), Allocator.Persistent); - BlittableTransforms = new NativeArray(Transforms.Select(transform => new BlittableTransform - { - position = transform.position, - rotation = transform.rotation, - localPosition = transform.localPosition, - localRotation = transform.localRotation, - localScale = transform.localScale, - localToWorldMatrix = transform.localToWorldMatrix, - worldToLocalMatrix = transform.worldToLocalMatrix - }).ToArray(), Allocator.Persistent); Profiler.EndSample(); } @@ -157,7 +146,6 @@ namespace UniGLTF.SpringBoneJobs.InputPorts IsDisposed = true; Springs.Dispose(); Joints.Dispose(); - BlittableTransforms.Dispose(); Colliders.Dispose(); Logics.Dispose(); } diff --git a/Assets/VRM10/Runtime/Components/Vrm10Runtime/FastSpringBoneBufferFactory.cs b/Assets/VRM10/Runtime/Components/Vrm10Runtime/FastSpringBoneBufferFactory.cs index a6a03f23c..c84f58de0 100644 --- a/Assets/VRM10/Runtime/Components/Vrm10Runtime/FastSpringBoneBufferFactory.cs +++ b/Assets/VRM10/Runtime/Components/Vrm10Runtime/FastSpringBoneBufferFactory.cs @@ -26,6 +26,7 @@ namespace UniVRM10 if (fastSpringBoneBuffer != null) { fastSpringBoneBuffer.Dispose(); + fastSpringBoneBuffer = null; } Func GetOrAddDefaultTransformState = (Transform tf) => @@ -41,7 +42,7 @@ namespace UniVRM10 // create(Spring情報の再収集。設定変更の反映) var springs = vrm.SpringBone.Springs.Select(spring => new FastSpringBoneSpring - { + { center = spring.Center, colliders = spring.ColliderGroups .SelectMany(group => group.Colliders)