mirror of
https://github.com/vrm-c/UniVRM.git
synced 2026-09-11 05:19:14 -05:00
list
This commit is contained in:
@@ -21,18 +21,34 @@ namespace UniGLTF.SpringBoneJobs
|
||||
{
|
||||
private FastSpringBoneCombinedBuffer _combinedBuffer;
|
||||
public FastSpringBoneCombinedBuffer Combined => _combinedBuffer;
|
||||
private readonly LinkedList<FastSpringBoneBuffer> _buffers = new LinkedList<FastSpringBoneBuffer>();
|
||||
private Queue<(bool isAdd, FastSpringBoneBuffer buffer)> _request = new();
|
||||
private readonly List<FastSpringBoneBuffer> _buffers = new();
|
||||
|
||||
struct Request
|
||||
{
|
||||
public FastSpringBoneBuffer Remove;
|
||||
public FastSpringBoneBuffer Add;
|
||||
}
|
||||
private Queue<Request> _request = new();
|
||||
|
||||
public bool HasBuffer => _buffers.Count > 0 && _combinedBuffer != null;
|
||||
|
||||
public void Register(FastSpringBoneBuffer buffer)
|
||||
{
|
||||
_request.Enqueue((true, buffer));
|
||||
_request.Enqueue(new Request { Add = buffer });
|
||||
}
|
||||
|
||||
public void Unregister(FastSpringBoneBuffer buffer)
|
||||
{
|
||||
_request.Enqueue((false, buffer));
|
||||
_request.Enqueue(new Request { Remove = buffer });
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 順番が変わらないように更新する
|
||||
/// </summary>
|
||||
/// <param name="buffer"></param>
|
||||
public void ReRegister(FastSpringBoneBuffer remove, FastSpringBoneBuffer add)
|
||||
{
|
||||
_request.Enqueue(new Request { Remove = remove, Add = add });
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -60,14 +76,20 @@ namespace UniGLTF.SpringBoneJobs
|
||||
// buffer 増減
|
||||
while (_request.Count > 0)
|
||||
{
|
||||
var (isAdd, buffer) = _request.Dequeue();
|
||||
if (isAdd)
|
||||
var req = _request.Dequeue();
|
||||
if (req.Remove != null && req.Add != null)
|
||||
{
|
||||
_buffers.AddLast(buffer);
|
||||
// 順番が変わらないように入れ替える
|
||||
var index = _buffers.IndexOf(req.Remove);
|
||||
_buffers[index] = req.Add;
|
||||
}
|
||||
else
|
||||
else if (req.Add != null)
|
||||
{
|
||||
_buffers.Remove(buffer);
|
||||
_buffers.Add(req.Add);
|
||||
}
|
||||
else if (req.Remove != null)
|
||||
{
|
||||
_buffers.Remove(req.Remove);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -78,11 +78,14 @@ namespace UniGLTF.SpringBoneJobs
|
||||
_batchedBufferLogicSizes = batchedBufferLogicSizes;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Lidt<FastSpringBoneBuffer> をひとつの FastSpringBoneCombinedBuffer に統合する
|
||||
/// </summary>
|
||||
internal static JobHandle Create(JobHandle handle,
|
||||
LinkedList<FastSpringBoneBuffer> _buffers, out FastSpringBoneCombinedBuffer combined)
|
||||
IReadOnlyList<FastSpringBoneBuffer> buffers, out FastSpringBoneCombinedBuffer combined)
|
||||
{
|
||||
Profiler.BeginSample("FastSpringBone.ReconstructBuffers.CopyToBatchedBuffers");
|
||||
var batchedBuffers = _buffers.ToArray();
|
||||
var batchedBuffers = buffers.ToArray();
|
||||
var batchedBufferLogicSizes = batchedBuffers.Select(buffer => buffer.Logics.Length).ToArray();
|
||||
Profiler.EndSample();
|
||||
|
||||
@@ -92,7 +95,7 @@ namespace UniGLTF.SpringBoneJobs
|
||||
var collidersCount = 0;
|
||||
var logicsCount = 0;
|
||||
var transformsCount = 0;
|
||||
foreach (var buffer in _buffers)
|
||||
foreach (var buffer in buffers)
|
||||
{
|
||||
springsCount += buffer.Springs.Length;
|
||||
collidersCount += buffer.Colliders.Length;
|
||||
@@ -103,7 +106,7 @@ namespace UniGLTF.SpringBoneJobs
|
||||
|
||||
// バッファの構築
|
||||
Profiler.BeginSample("FastSpringBone.ReconstructBuffers.CreateBuffers");
|
||||
combined = new FastSpringBoneCombinedBuffer(logicsCount, springsCount, _buffers.Count,
|
||||
combined = new FastSpringBoneCombinedBuffer(logicsCount, springsCount, buffers.Count,
|
||||
collidersCount, transformsCount, batchedBuffers, batchedBufferLogicSizes);
|
||||
Profiler.EndSample();
|
||||
|
||||
|
||||
Reference in New Issue
Block a user