mirror of
https://github.com/vrm-c/UniVRM.git
synced 2026-08-20 17:45:22 -05:00
buffer.BackupCurrentTails を buffer 増減の直前にする
This commit is contained in:
@@ -5,6 +5,7 @@ using UnityEngine.Profiling;
|
||||
using UniGLTF.SpringBoneJobs.InputPorts;
|
||||
using UnityEngine;
|
||||
using Unity.Collections;
|
||||
using System.Linq;
|
||||
|
||||
namespace UniGLTF.SpringBoneJobs
|
||||
{
|
||||
@@ -21,37 +22,17 @@ namespace UniGLTF.SpringBoneJobs
|
||||
private FastSpringBoneCombinedBuffer _combinedBuffer;
|
||||
public FastSpringBoneCombinedBuffer Combined => _combinedBuffer;
|
||||
private readonly LinkedList<FastSpringBoneBuffer> _buffers = new LinkedList<FastSpringBoneBuffer>();
|
||||
private bool _isDirty;
|
||||
private Queue<(bool isAdd, FastSpringBoneBuffer buffer)> _request = new();
|
||||
public bool HasBuffer => _buffers.Count > 0 && _combinedBuffer != null;
|
||||
|
||||
public void Register(FastSpringBoneBuffer buffer)
|
||||
{
|
||||
_buffers.AddLast(buffer);
|
||||
_isDirty = true;
|
||||
_request.Enqueue((true, buffer));
|
||||
}
|
||||
|
||||
public void Unregister(FastSpringBoneBuffer remove)
|
||||
public void Unregister(FastSpringBoneBuffer buffer)
|
||||
{
|
||||
// index が変わる前に シミュレーションの状態を保存する。
|
||||
// 状態の保存場所が BlittableJoint から CurrentTails に移動しているのでここでやる。
|
||||
if (_combinedBuffer is FastSpringBoneCombinedBuffer combined)
|
||||
{
|
||||
var logicsIndex = 0;
|
||||
foreach (var buffer in _buffers)
|
||||
{
|
||||
if (buffer == remove)
|
||||
{
|
||||
// 削除するので skip
|
||||
// joint の位置が変わる可能性があるので状態を保存せずに速度を0にする方がよい
|
||||
continue;
|
||||
}
|
||||
buffer.BackupCurrentTails(combined.CurrentTails, logicsIndex);
|
||||
logicsIndex += buffer.Logics.Length;
|
||||
}
|
||||
}
|
||||
|
||||
_buffers.Remove(remove);
|
||||
_isDirty = true;
|
||||
_request.Enqueue((false, buffer));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -59,14 +40,45 @@ namespace UniGLTF.SpringBoneJobs
|
||||
/// </summary>
|
||||
public JobHandle ReconstructIfDirty(JobHandle handle)
|
||||
{
|
||||
if (_isDirty)
|
||||
if (_request.Count == 0)
|
||||
{
|
||||
var result = ReconstructBuffers(handle);
|
||||
_isDirty = false;
|
||||
return result;
|
||||
return handle;
|
||||
}
|
||||
|
||||
return handle;
|
||||
if (_combinedBuffer is FastSpringBoneCombinedBuffer combined)
|
||||
{
|
||||
// index が変わる前に シミュレーションの状態を保存する。
|
||||
// 状態の保存場所が BlittableJoint から CurrentTails に移動しているのでここでやる。
|
||||
var logicsIndex = 0;
|
||||
foreach (var buffer in _buffers)
|
||||
{
|
||||
if (_request.Any(x => !x.isAdd && x.buffer == buffer))
|
||||
{
|
||||
// 削除するので skip
|
||||
continue;
|
||||
}
|
||||
buffer.BackupCurrentTails(combined.CurrentTails, logicsIndex);
|
||||
logicsIndex += buffer.Logics.Length;
|
||||
}
|
||||
}
|
||||
|
||||
// buffer 増減
|
||||
while (_request.Count > 0)
|
||||
{
|
||||
var (isAdd, buffer) = _request.Dequeue();
|
||||
if (isAdd)
|
||||
{
|
||||
// 速度 0 にする
|
||||
_buffers.AddLast(buffer);
|
||||
}
|
||||
else
|
||||
{
|
||||
_buffers.Remove(buffer);
|
||||
}
|
||||
}
|
||||
|
||||
// 再構築
|
||||
return ReconstructBuffers(handle);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
||||
Reference in New Issue
Block a user