LINQ的削減

This commit is contained in:
ousttrue 2024-09-05 17:43:31 +09:00
parent e7b4c6106f
commit 4a6ea20825
2 changed files with 21 additions and 47 deletions

View File

@ -57,7 +57,7 @@ namespace UniGLTF.SpringBoneJobs.InputPorts
/// </summary>
/// <param name="springs"></param>
/// <returns></returns>
static Transform[] MakeFlattenTransformList(IReadOnlyList<FastSpringBoneSpring> springs)
static Transform[] MakeFlattenTransformList(FastSpringBoneSpring[] springs)
{
var transformHashSet = new HashSet<Transform>();
foreach (var spring in springs)
@ -79,7 +79,7 @@ namespace UniGLTF.SpringBoneJobs.InputPorts
return Transforms;
}
public unsafe FastSpringBoneBuffer(IReadOnlyList<FastSpringBoneSpring> springs)
public unsafe FastSpringBoneBuffer(FastSpringBoneSpring[] springs)
{
Profiler.BeginSample("FastSpringBone.ConstructBuffers.BufferBuilder");
Transforms = MakeFlattenTransformList(springs);

View File

@ -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<FastSpringBoneSpring>();
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<FastSpringBoneCollider>();
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<FastSpringBoneJoint> Traverse(VRMSpringBone spring, Transform joint)
static void Traverse(List<FastSpringBoneJoint> 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;
// }
// }
}
}
}