From 4a6ea2082553a7a7d5c242fb0dcc5cd0dd3c11d4 Mon Sep 17 00:00:00 2001 From: ousttrue Date: Thu, 5 Sep 2024 17:43:31 +0900 Subject: [PATCH] =?UTF-8?q?LINQ=E7=9A=84=E5=89=8A=E6=B8=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../InputPorts/FastSpringBoneBuffer.cs | 4 +- .../SpringBone/Jobs/FastSpringBoneReplacer.cs | 64 ++++++------------- 2 files changed, 21 insertions(+), 47 deletions(-) diff --git a/Assets/UniGLTF/Runtime/SpringBoneJobs/InputPorts/FastSpringBoneBuffer.cs b/Assets/UniGLTF/Runtime/SpringBoneJobs/InputPorts/FastSpringBoneBuffer.cs index 4a7180312..99785caf8 100644 --- a/Assets/UniGLTF/Runtime/SpringBoneJobs/InputPorts/FastSpringBoneBuffer.cs +++ b/Assets/UniGLTF/Runtime/SpringBoneJobs/InputPorts/FastSpringBoneBuffer.cs @@ -57,7 +57,7 @@ namespace UniGLTF.SpringBoneJobs.InputPorts /// /// /// - static Transform[] MakeFlattenTransformList(IReadOnlyList springs) + static Transform[] MakeFlattenTransformList(FastSpringBoneSpring[] springs) { var transformHashSet = new HashSet(); foreach (var spring in springs) @@ -79,7 +79,7 @@ namespace UniGLTF.SpringBoneJobs.InputPorts return Transforms; } - public unsafe FastSpringBoneBuffer(IReadOnlyList springs) + public unsafe FastSpringBoneBuffer(FastSpringBoneSpring[] springs) { Profiler.BeginSample("FastSpringBone.ConstructBuffers.BufferBuilder"); Transforms = MakeFlattenTransformList(springs); diff --git a/Assets/VRM/Runtime/SpringBone/Jobs/FastSpringBoneReplacer.cs b/Assets/VRM/Runtime/SpringBone/Jobs/FastSpringBoneReplacer.cs index 837e38ffb..fc6a9a4a2 100644 --- a/Assets/VRM/Runtime/SpringBone/Jobs/FastSpringBoneReplacer.cs +++ b/Assets/VRM/Runtime/SpringBone/Jobs/FastSpringBoneReplacer.cs @@ -1,5 +1,3 @@ -using System; -using System.Linq; using System.Collections.Generic; using UnityEngine; using UniGLTF.SpringBoneJobs.InputPorts; @@ -26,19 +24,20 @@ namespace VRM.SpringBoneJobs sb.m_updateType = VRMSpringBone.SpringBoneUpdateType.Manual; } - var springs = new List(); - foreach (var component in components) + var springs = new FastSpringBoneSpring[components.Length]; + for (int i = 0; i < components.Length; ++i) { - if (awaitCaller != null) - { - await awaitCaller.NextFrame(); - token.ThrowIfCancellationRequested(); - } - + var component = components[i]; var colliders = new List(); foreach (var group in component.ColliderGroups) { if (group == null) continue; + if (awaitCaller != null) + { + await awaitCaller.NextFrame(); + token.ThrowIfCancellationRequested(); + } + foreach (var collider in group.Colliders) { if (collider == null) continue; @@ -62,10 +61,13 @@ namespace VRM.SpringBoneJobs foreach (var springRoot in component.RootBones) { if (springRoot == null) continue; - foreach (var joint in Traverse(component, springRoot)) + if (awaitCaller != null) { - joints.Add(joint); + await awaitCaller.NextFrame(); + token.ThrowIfCancellationRequested(); } + + Traverse(joints, component, springRoot); } var spring = new FastSpringBoneSpring @@ -74,15 +76,15 @@ namespace VRM.SpringBoneJobs colliders = colliders.ToArray(), joints = joints.ToArray(), }; - springs.Add(spring); + springs[i] = spring; } return new FastSpringBoneBuffer(springs); } - static IEnumerable Traverse(VRMSpringBone spring, Transform joint) + static void Traverse(List joints, VRMSpringBone spring, Transform joint) { - yield return new FastSpringBoneJoint + joints.Add(new FastSpringBoneJoint { Transform = joint.transform, Joint = new BlittableJoint @@ -94,39 +96,11 @@ namespace VRM.SpringBoneJobs stiffnessForce = spring.m_stiffnessForce }, DefaultLocalRotation = joint.transform.localRotation, - }; + }); foreach (Transform child in joint) { - foreach (var x in Traverse(spring, child)) - { - yield return x; - } + Traverse(joints, spring, child); } - - // TODO: 詳細分岐 - - // 7cm tail - - // var springRootBones = - // ( - // from springBone in springBones - // from rootBone in springBone.RootBones - // select (springBone, rootBone) - // ).ToList(); - - // for (var i = 0; i < springRootBones.Count; i++) - // { - // var current = springRootBones[i]; - - // // 他のRootBoneのどれかが、自分の親(もしくは同じTransform)なら自分自身を削除する - // if (springRootBones - // .Where(other => other != current) - // .Any(other => current.rootBone.IsChildOf(other.rootBone))) - // { - // springRootBones.RemoveAt(i); - // --i; - // } - // } } } } \ No newline at end of file