This commit is contained in:
ousttrue
2025-03-14 18:35:54 +09:00
parent 38c4313d95
commit f0d59ae948
2 changed files with 38 additions and 13 deletions

View File

@@ -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);
}
}

View File

@@ -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();