mirror of
https://github.com/vrm-c/UniVRM.git
synced 2026-04-25 15:47:26 -05:00
MakeBufferAsync
This commit is contained in:
parent
f83c8260ab
commit
e7b4c6106f
|
|
@ -57,7 +57,7 @@ namespace UniGLTF.SpringBoneJobs.InputPorts
|
|||
/// </summary>
|
||||
/// <param name="springs"></param>
|
||||
/// <returns></returns>
|
||||
static Transform[] MakeFlattenTransformList(FastSpringBoneSpring[] springs)
|
||||
static Transform[] MakeFlattenTransformList(IReadOnlyList<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(FastSpringBoneSpring[] springs)
|
||||
public unsafe FastSpringBoneBuffer(IReadOnlyList<FastSpringBoneSpring> springs)
|
||||
{
|
||||
Profiler.BeginSample("FastSpringBone.ConstructBuffers.BufferBuilder");
|
||||
Transforms = MakeFlattenTransformList(springs);
|
||||
|
|
|
|||
|
|
@ -4,6 +4,9 @@ using System.Collections.Generic;
|
|||
using UnityEngine;
|
||||
using UniGLTF.SpringBoneJobs.InputPorts;
|
||||
using UniGLTF.SpringBoneJobs.Blittables;
|
||||
using UniGLTF;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
|
||||
namespace VRM.SpringBoneJobs
|
||||
|
|
@ -14,7 +17,7 @@ namespace VRM.SpringBoneJobs
|
|||
/// - 指定された GameObject 内にある SpringBone を停止させる
|
||||
/// - FastSpringBoneBuffer に変換する
|
||||
/// </summary>
|
||||
public static FastSpringBoneBuffer MakeBuffer(GameObject root)
|
||||
public static async Task<FastSpringBoneBuffer> MakeBufferAsync(GameObject root, IAwaitCaller awaitCaller = null, CancellationToken token = default)
|
||||
{
|
||||
var components = root.GetComponentsInChildren<VRMSpringBone>();
|
||||
foreach (var sb in components)
|
||||
|
|
@ -23,24 +26,56 @@ namespace VRM.SpringBoneJobs
|
|||
sb.m_updateType = VRMSpringBone.SpringBoneUpdateType.Manual;
|
||||
}
|
||||
|
||||
// create(Spring情報の再収集。設定変更の反映)
|
||||
var springs = components.Select(spring => new FastSpringBoneSpring
|
||||
var springs = new List<FastSpringBoneSpring>();
|
||||
foreach (var component in components)
|
||||
{
|
||||
center = spring.m_center,
|
||||
colliders = spring.ColliderGroups.Where(x => x != null)
|
||||
.SelectMany(group => group.Colliders.Where(x => x!=null).Select(collider => new FastSpringBoneCollider
|
||||
{
|
||||
Transform = group.transform,
|
||||
Collider = new BlittableCollider
|
||||
{
|
||||
offset = collider.Offset,
|
||||
radius = collider.Radius,
|
||||
tailOrNormal = default,
|
||||
colliderType = BlittableColliderType.Sphere
|
||||
}
|
||||
})).ToArray(),
|
||||
joints = spring.RootBones.Where(x => x!=null).Select(x => Traverse(spring, x)).SelectMany(x => x).ToArray(),
|
||||
}).ToArray();
|
||||
if (awaitCaller != null)
|
||||
{
|
||||
await awaitCaller.NextFrame();
|
||||
token.ThrowIfCancellationRequested();
|
||||
}
|
||||
|
||||
var colliders = new List<FastSpringBoneCollider>();
|
||||
foreach (var group in component.ColliderGroups)
|
||||
{
|
||||
if (group == null) continue;
|
||||
foreach (var collider in group.Colliders)
|
||||
{
|
||||
if (collider == null) continue;
|
||||
|
||||
var c = new FastSpringBoneCollider
|
||||
{
|
||||
Transform = group.transform,
|
||||
Collider = new BlittableCollider
|
||||
{
|
||||
offset = collider.Offset,
|
||||
radius = collider.Radius,
|
||||
tailOrNormal = default,
|
||||
colliderType = BlittableColliderType.Sphere
|
||||
}
|
||||
};
|
||||
colliders.Add(c);
|
||||
}
|
||||
}
|
||||
|
||||
var joints = new List<FastSpringBoneJoint>();
|
||||
foreach (var springRoot in component.RootBones)
|
||||
{
|
||||
if (springRoot == null) continue;
|
||||
foreach (var joint in Traverse(component, springRoot))
|
||||
{
|
||||
joints.Add(joint);
|
||||
}
|
||||
}
|
||||
|
||||
var spring = new FastSpringBoneSpring
|
||||
{
|
||||
center = component.m_center,
|
||||
colliders = colliders.ToArray(),
|
||||
joints = joints.ToArray(),
|
||||
};
|
||||
springs.Add(spring);
|
||||
}
|
||||
|
||||
return new FastSpringBoneBuffer(springs);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -389,7 +389,7 @@ namespace VRM.SimpleViewer
|
|||
if (m_useFastSpringBone.isOn)
|
||||
{
|
||||
// job用バッファ作成
|
||||
var buffer = SpringBoneJobs.FastSpringBoneReplacer.MakeBuffer(instance.Root);
|
||||
var buffer = await SpringBoneJobs.FastSpringBoneReplacer.MakeBufferAsync(instance.Root);
|
||||
|
||||
// 登録
|
||||
SpringBoneJobs.FastSpringBoneService.Instance.BufferCombiner.Register(buffer);
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user