Merge pull request #1628 from notargs/feature/fix_reset_springbone_on_reconstruct

ReconstructBuffers時に、揺れものの状態がリセットされる問題を修正しました
This commit is contained in:
ousttrue 2022-04-22 19:08:55 +09:00 committed by GitHub
commit 56b6af9e51
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 33 additions and 8 deletions

View File

@ -1,6 +1,5 @@
using System;
using UnityEngine;
using UnityEngine.Serialization;
namespace UniVRM10.FastSpringBones.Blittables
{
@ -10,6 +9,7 @@ namespace UniVRM10.FastSpringBones.Blittables
[Serializable]
public struct BlittableLogic
{
public int transformIndexOffset;
public int parentTransformIndex;
public int headTransformIndex;
public float length;

View File

@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
using System.Linq;
using Unity.Collections;
using Unity.Jobs;
using UnityEngine;
@ -25,6 +26,7 @@ namespace UniVRM10.FastSpringBones.System
private TransformAccessArray _transformAccessArray;
private readonly LinkedList<FastSpringBoneBuffer> _buffers = new LinkedList<FastSpringBoneBuffer>();
private FastSpringBoneBuffer[] _batchedBuffers;
private bool _isDirty;
@ -62,14 +64,34 @@ namespace UniVRM10.FastSpringBones.System
return handle;
}
/// <summary>
/// バッチングされたバッファから、個々のバッファへと値を戻す
/// バッファの再構築前にこの処理を行わないと、揺れの状態がリセットされてしまい、不自然な挙動になる
/// </summary>
private void SaveToSourceBuffer()
{
if (_batchedBuffers == null) return;
var logicsIndex = 0;
foreach (var buffer in _batchedBuffers)
{
var length = buffer.Logics.Length;
NativeArray<BlittableLogic>.Copy(_logics, logicsIndex, buffer.Logics, 0, length);
logicsIndex += length;
}
}
/// <summary>
/// バッファを再構築する
/// TODO: 最適化
/// </summary>
private JobHandle ReconstructBuffers(JobHandle handle)
{
Profiler.BeginSample("FastSpringBone.ReconstructBuffers");
Profiler.BeginSample("FastSpringBone.ReconstructBuffers.SaveToSourceBuffer");
SaveToSourceBuffer();
Profiler.EndSample();
Profiler.BeginSample("FastSpringBone.ReconstructBuffers.DisposeBuffers");
DisposeAllBuffers();
Profiler.EndSample();
@ -79,6 +101,10 @@ namespace UniVRM10.FastSpringBones.System
var logicsCount = 0;
var transformsCount = 0;
Profiler.BeginSample("FastSpringBone.ReconstructBuffers.CopyToBatchedBuffers");
_batchedBuffers = _buffers.ToArray();
Profiler.EndSample();
Profiler.BeginSample("FastSpringBone.ReconstructBuffers.CountBufferSize");
foreach (var buffer in _buffers)
{
@ -250,8 +276,7 @@ namespace UniVRM10.FastSpringBones.System
public void Execute(int index)
{
var logic = SrcLogics[index];
logic.headTransformIndex += TransformOffset;
if (logic.parentTransformIndex >= 0) logic.parentTransformIndex += TransformOffset;
logic.transformIndexOffset = TransformOffset;
DestLogics[index] = logic;
DestJoints[index] = SrcJoints[index];
}

View File

@ -34,12 +34,12 @@ namespace UniVRM10.FastSpringBones.System
var logic = Logics[logicIndex];
var joint = Joints[logicIndex];
var headTransform = Transforms[logic.headTransformIndex];
var headTransform = Transforms[logic.headTransformIndex + logic.transformIndexOffset];
var parentTransform = logic.parentTransformIndex >= 0
? Transforms[logic.parentTransformIndex]
? Transforms[logic.parentTransformIndex + logic.transformIndexOffset]
: (BlittableTransform?)null;
var centerTransform = spring.centerTransformIndex >= 0
? Transforms[spring.centerTransformIndex]
? Transforms[spring.centerTransformIndex + logic.transformIndexOffset]
: (BlittableTransform?)null;
@ -130,7 +130,7 @@ namespace UniVRM10.FastSpringBones.System
}
// 値をバッファに戻す
Transforms[logic.headTransformIndex] = headTransform;
Transforms[logic.headTransformIndex + logic.transformIndexOffset] = headTransform;
Logics[logicIndex] = logic;
}
}