diff --git a/Assets/VRM10/Runtime/Components/Vrm10Runtime/Vrm10RuntimeSpringBone .cs b/Assets/VRM10/Runtime/Components/Vrm10Runtime/Vrm10RuntimeSpringBone .cs index 8ede70a88..f3a47dcad 100644 --- a/Assets/VRM10/Runtime/Components/Vrm10Runtime/Vrm10RuntimeSpringBone .cs +++ b/Assets/VRM10/Runtime/Components/Vrm10Runtime/Vrm10RuntimeSpringBone .cs @@ -15,6 +15,7 @@ namespace UniVRM10 private readonly IReadOnlyDictionary m_defaultTransformStates; private readonly FastSpringBoneService m_fastSpringBoneService; + private FastSpringBoneBufferBuilder m_initialData; private FastSpringBoneBuffer m_fastSpringBoneBuffer; public Vector3 ExternalForce { @@ -48,10 +49,8 @@ namespace UniVRM10 if (Application.isPlaying) { m_fastSpringBoneService = FastSpringBoneService.Instance; - m_fastSpringBoneBuffer = CreateFastSpringBoneBuffer(m_instance.SpringBone); - m_fastSpringBoneService.BufferCombiner.Register(m_fastSpringBoneBuffer); + ReconstructSpringBone(); } - } public void Dispose() @@ -66,17 +65,15 @@ namespace UniVRM10 /// public void ReconstructSpringBone() { - m_fastSpringBoneService.BufferCombiner.Unregister(m_fastSpringBoneBuffer); + // rerelase + if (m_fastSpringBoneBuffer != null) + { + m_fastSpringBoneService.BufferCombiner.Unregister(m_fastSpringBoneBuffer); + m_fastSpringBoneBuffer.Dispose(); + } - m_fastSpringBoneBuffer.Dispose(); - m_fastSpringBoneBuffer = CreateFastSpringBoneBuffer(m_instance.SpringBone); - - m_fastSpringBoneService.BufferCombiner.Register(m_fastSpringBoneBuffer); - } - - private FastSpringBoneBuffer CreateFastSpringBoneBuffer(Vrm10InstanceSpringBone springBone) - { - var b = new FastSpringBoneBufferBuilder(springBone.Springs.Select(spring => new FastSpringBoneSpring + // create + var springs = m_instance.SpringBone.Springs.Select(spring => new FastSpringBoneSpring { center = spring.Center, colliders = spring.ColliderGroups @@ -106,9 +103,11 @@ namespace UniVRM10 }, DefaultLocalRotation = GetOrAddDefaultTransformState(joint.transform).LocalRotation, }).ToArray(), - })); + }).ToArray(); - return new FastSpringBoneBuffer(b); + m_initialData = new FastSpringBoneBufferBuilder(springs); + m_fastSpringBoneBuffer = new FastSpringBoneBuffer(m_initialData); + m_fastSpringBoneService.BufferCombiner.Register(m_fastSpringBoneBuffer); } private TransformState GetOrAddDefaultTransformState(Transform tf) diff --git a/Assets/VRM10/Runtime/FastSpringBone/InputPorts/FastSpringBoneBufferBuilder.cs b/Assets/VRM10/Runtime/FastSpringBone/InputPorts/FastSpringBoneBufferBuilder.cs index dc239064b..64e47fbdd 100644 --- a/Assets/VRM10/Runtime/FastSpringBone/InputPorts/FastSpringBoneBufferBuilder.cs +++ b/Assets/VRM10/Runtime/FastSpringBone/InputPorts/FastSpringBoneBufferBuilder.cs @@ -14,7 +14,7 @@ namespace UniVRM10.FastSpringBones.System public readonly List BlittableLogics = new(); public readonly Transform[] Transforms; - public FastSpringBoneBufferBuilder(IEnumerable springs, bool simulateLastBone = false) + public FastSpringBoneBufferBuilder(IReadOnlyList springs, bool simulateLastBone = false) { Profiler.BeginSample("FastSpringBone.ConstructBuffers.BufferBuilder"); var transformHashSet = new HashSet();