mirror of
https://github.com/vrm-c/UniVRM.git
synced 2026-05-24 11:57:21 -05:00
Merge pull request #1628 from notargs/feature/fix_reset_springbone_on_reconstruct
ReconstructBuffers時に、揺れものの状態がリセットされる問題を修正しました
This commit is contained in:
commit
56b6af9e51
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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];
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user