Merge pull request #2614 from ousttrue/fix/springbone_reconstruct_colliders

[SpringBone] reconstruct 時の center の index の offset 足し忘れを修正
This commit is contained in:
ousttrue 2025-03-18 12:51:21 +09:00 committed by GitHub
commit d3c408abbf
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 42 additions and 42 deletions

View File

@ -21,18 +21,20 @@ 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)
public void Register(FastSpringBoneBuffer add, FastSpringBoneBuffer remove)
{
_request.Enqueue((true, buffer));
}
public void Unregister(FastSpringBoneBuffer buffer)
{
_request.Enqueue((false, buffer));
_request.Enqueue(new Request { Remove = remove, Add = add });
}
/// <summary>
@ -60,14 +62,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>
/// Job向けに、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();
@ -300,7 +303,9 @@ namespace UniGLTF.SpringBoneJobs
public void Execute(int springIndex)
{
var spring = Springs[springIndex];
var center = spring.centerTransformIndex >= 0 ? Transforms[spring.centerTransformIndex] : (BlittableTransform?)null;
var center = spring.centerTransformIndex >= 0
? Transforms[spring.transformIndexOffset + spring.centerTransformIndex]
: (BlittableTransform?)null;
for (int jointIndex = spring.logicSpan.startIndex; jointIndex < spring.logicSpan.EndIndex; ++jointIndex)
{
if (float.IsNaN(CurrentTails[jointIndex].x))

View File

@ -57,7 +57,7 @@ namespace VRM
return;
}
m_service.BufferCombiner.Unregister(m_buffer);
m_service.BufferCombiner.Register(add: null, remove: m_buffer);
m_buffer.Dispose();
m_buffer = null;
}
@ -67,7 +67,7 @@ namespace VRM
Debug.Assert(m_buffer == null);
var buffer = await SpringBoneJobs.FastSpringBoneReplacer.MakeBufferAsync(m_vrm, awaitCaller);
m_buffer = buffer;
SpringBoneJobs.FastSpringBoneService.Instance.BufferCombiner.Register(buffer);
SpringBoneJobs.FastSpringBoneService.Instance.BufferCombiner.Register(add: buffer, remove: null);
}

View File

@ -55,7 +55,7 @@ namespace UniVRM10
{
if (m_fastSpringBoneBuffer != null)
{
m_fastSpringBoneService.BufferCombiner.Unregister(m_fastSpringBoneBuffer);
m_fastSpringBoneService.BufferCombiner.Register(add: null, remove: m_fastSpringBoneBuffer);
m_fastSpringBoneBuffer.Dispose();
}
}
@ -87,16 +87,10 @@ namespace UniVRM10
}
m_building = true;
// 登録削除
if (m_fastSpringBoneBuffer != null)
{
m_fastSpringBoneService.BufferCombiner.Unregister(m_fastSpringBoneBuffer);
}
var fastSpringBoneBuffer = await FastSpringBoneBufferFactory.ConstructSpringBoneAsync(awaitCaller, m_instance, m_fastSpringBoneBuffer);
m_fastSpringBoneBuffer = await FastSpringBoneBufferFactory.ConstructSpringBoneAsync(awaitCaller, m_instance, m_fastSpringBoneBuffer);
// 登録
m_fastSpringBoneService.BufferCombiner.Register(m_fastSpringBoneBuffer);
m_fastSpringBoneService.BufferCombiner.Register(add: fastSpringBoneBuffer, remove: m_fastSpringBoneBuffer);
m_fastSpringBoneBuffer = fastSpringBoneBuffer;
m_building = false;
return true;

View File

@ -54,7 +54,7 @@ namespace UniVRM10
public void Dispose()
{
m_bufferCombiner.Unregister(m_fastSpringBoneBuffer);
m_bufferCombiner.Register(add: null, remove: m_fastSpringBoneBuffer);
m_fastSpringBoneBuffer.Dispose();
m_fastSpringBoneScheduler.Dispose();
@ -88,16 +88,9 @@ namespace UniVRM10
}
m_building = true;
// 登録削除
if (m_fastSpringBoneBuffer != null)
{
m_bufferCombiner.Unregister(m_fastSpringBoneBuffer);
}
m_fastSpringBoneBuffer = await FastSpringBoneBufferFactory.ConstructSpringBoneAsync(awaitCaller, m_instance, m_fastSpringBoneBuffer);
// 登録
m_bufferCombiner.Register(m_fastSpringBoneBuffer);
var fastSpringBoneBuffer = await FastSpringBoneBufferFactory.ConstructSpringBoneAsync(awaitCaller, m_instance, m_fastSpringBoneBuffer);
m_bufferCombiner.Register(add: fastSpringBoneBuffer, remove: m_fastSpringBoneBuffer);
m_fastSpringBoneBuffer = fastSpringBoneBuffer;
m_building = false;
return true;