From 904b82c1148c6e8e739f691f333bf53dad9c1b77 Mon Sep 17 00:00:00 2001 From: amamagi Date: Wed, 22 Jun 2022 19:46:18 +0900 Subject: [PATCH 1/4] =?UTF-8?q?Vrm10Runtime.ReconstructSpringBone=E3=82=92?= =?UTF-8?q?=E5=91=BC=E3=82=93=E3=81=A0=E6=99=82=E7=82=B9=E3=81=AESpringBon?= =?UTF-8?q?e=E3=81=AE=E5=BD=A2=E7=8A=B6=E3=82=92=E7=B6=AD=E6=8C=81?= =?UTF-8?q?=E3=81=99=E3=82=8B=E6=96=B9=E5=90=91=E3=81=AB=E5=89=9B=E6=80=A7?= =?UTF-8?q?=E3=81=8C=E5=83=8D=E3=81=84=E3=81=A6=E3=81=97=E3=81=BE=E3=81=86?= =?UTF-8?q?=E5=95=8F=E9=A1=8C=E3=82=92=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Runtime/Components/Vrm10Runtime/Vrm10Runtime.cs | 10 +++++++++- .../FastSpringBone/InputPorts/FastSpringBoneBuffer.cs | 2 +- .../FastSpringBone/InputPorts/FastSpringBoneJoint.cs | 1 + 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/Assets/VRM10/Runtime/Components/Vrm10Runtime/Vrm10Runtime.cs b/Assets/VRM10/Runtime/Components/Vrm10Runtime/Vrm10Runtime.cs index efaefef26..f293005e0 100644 --- a/Assets/VRM10/Runtime/Components/Vrm10Runtime/Vrm10Runtime.cs +++ b/Assets/VRM10/Runtime/Components/Vrm10Runtime/Vrm10Runtime.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using System.Linq; using UnityEngine; using UniVRM10.FastSpringBones.Blittables; @@ -15,6 +16,8 @@ namespace UniVRM10 private readonly IVrm10Constraint[] m_constraints; private readonly Transform m_head; private readonly FastSpringBoneService m_fastSpringBoneService; + private readonly Dictionary m_initialLocalRotations = new Dictionary(); + private readonly bool m_initialized; private FastSpringBoneBuffer m_fastSpringBoneBuffer; @@ -51,6 +54,7 @@ namespace UniVRM10 m_fastSpringBoneService = FastSpringBoneService.Instance; m_fastSpringBoneBuffer = CreateFastSpringBoneBuffer(m_target.SpringBone); m_fastSpringBoneService.BufferCombiner.Register(m_fastSpringBoneBuffer); + m_initialized = true; } /// @@ -97,7 +101,11 @@ namespace UniVRM10 gravityDir = joint.m_gravityDir, gravityPower = joint.m_gravityPower, stiffnessForce = joint.m_stiffnessForce - } + }, + InitialLocalRotation = + m_initialized && m_initialLocalRotations.TryGetValue(joint.transform, out var initialLocalRotation) + ? initialLocalRotation + : m_initialLocalRotations[joint.transform] = joint.transform.localRotation }).ToArray(), }).ToArray()); } diff --git a/Assets/VRM10/Runtime/FastSpringBone/InputPorts/FastSpringBoneBuffer.cs b/Assets/VRM10/Runtime/FastSpringBone/InputPorts/FastSpringBoneBuffer.cs index 84186af62..1d6d7da7a 100644 --- a/Assets/VRM10/Runtime/FastSpringBone/InputPorts/FastSpringBoneBuffer.cs +++ b/Assets/VRM10/Runtime/FastSpringBone/InputPorts/FastSpringBoneBuffer.cs @@ -108,7 +108,7 @@ namespace UniVRM10.FastSpringBones.System parentTransformIndex = parent != null ? transformIndexDictionary[parent] : -1, currentTail = currentTail, prevTail = currentTail, - localRotation = joint.Transform.localRotation, + localRotation = joint.InitialLocalRotation, boneAxis = localChildPosition.normalized, length = localChildPosition.magnitude }); diff --git a/Assets/VRM10/Runtime/FastSpringBone/InputPorts/FastSpringBoneJoint.cs b/Assets/VRM10/Runtime/FastSpringBone/InputPorts/FastSpringBoneJoint.cs index 7aff7cf71..25e70f94b 100644 --- a/Assets/VRM10/Runtime/FastSpringBone/InputPorts/FastSpringBoneJoint.cs +++ b/Assets/VRM10/Runtime/FastSpringBone/InputPorts/FastSpringBoneJoint.cs @@ -9,5 +9,6 @@ namespace UniVRM10.FastSpringBones.System { public Transform Transform; public BlittableJoint Joint; + public Quaternion InitialLocalRotation; } } \ No newline at end of file From 63eb58d6b74806a68472cb98fa4a939715fafb2f Mon Sep 17 00:00:00 2001 From: amamagi Date: Mon, 27 Jun 2022 10:43:21 +0900 Subject: [PATCH 2/4] =?UTF-8?q?Revert=20"Vrm10Runtime.ReconstructSpringBon?= =?UTF-8?q?e=E3=82=92=E5=91=BC=E3=82=93=E3=81=A0=E6=99=82=E7=82=B9?= =?UTF-8?q?=E3=81=AESpringBone=E3=81=AE=E5=BD=A2=E7=8A=B6=E3=82=92?= =?UTF-8?q?=E7=B6=AD=E6=8C=81=E3=81=99=E3=82=8B=E6=96=B9=E5=90=91=E3=81=AB?= =?UTF-8?q?=E5=89=9B=E6=80=A7=E3=81=8C=E5=83=8D=E3=81=84=E3=81=A6=E3=81=97?= =?UTF-8?q?=E3=81=BE=E3=81=86=E5=95=8F=E9=A1=8C=E3=82=92=E4=BF=AE=E6=AD=A3?= =?UTF-8?q?"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit 904b82c1148c6e8e739f691f333bf53dad9c1b77. --- .../Runtime/Components/Vrm10Runtime/Vrm10Runtime.cs | 10 +--------- .../FastSpringBone/InputPorts/FastSpringBoneBuffer.cs | 2 +- .../FastSpringBone/InputPorts/FastSpringBoneJoint.cs | 1 - 3 files changed, 2 insertions(+), 11 deletions(-) diff --git a/Assets/VRM10/Runtime/Components/Vrm10Runtime/Vrm10Runtime.cs b/Assets/VRM10/Runtime/Components/Vrm10Runtime/Vrm10Runtime.cs index f293005e0..efaefef26 100644 --- a/Assets/VRM10/Runtime/Components/Vrm10Runtime/Vrm10Runtime.cs +++ b/Assets/VRM10/Runtime/Components/Vrm10Runtime/Vrm10Runtime.cs @@ -1,5 +1,4 @@ using System; -using System.Collections.Generic; using System.Linq; using UnityEngine; using UniVRM10.FastSpringBones.Blittables; @@ -16,8 +15,6 @@ namespace UniVRM10 private readonly IVrm10Constraint[] m_constraints; private readonly Transform m_head; private readonly FastSpringBoneService m_fastSpringBoneService; - private readonly Dictionary m_initialLocalRotations = new Dictionary(); - private readonly bool m_initialized; private FastSpringBoneBuffer m_fastSpringBoneBuffer; @@ -54,7 +51,6 @@ namespace UniVRM10 m_fastSpringBoneService = FastSpringBoneService.Instance; m_fastSpringBoneBuffer = CreateFastSpringBoneBuffer(m_target.SpringBone); m_fastSpringBoneService.BufferCombiner.Register(m_fastSpringBoneBuffer); - m_initialized = true; } /// @@ -101,11 +97,7 @@ namespace UniVRM10 gravityDir = joint.m_gravityDir, gravityPower = joint.m_gravityPower, stiffnessForce = joint.m_stiffnessForce - }, - InitialLocalRotation = - m_initialized && m_initialLocalRotations.TryGetValue(joint.transform, out var initialLocalRotation) - ? initialLocalRotation - : m_initialLocalRotations[joint.transform] = joint.transform.localRotation + } }).ToArray(), }).ToArray()); } diff --git a/Assets/VRM10/Runtime/FastSpringBone/InputPorts/FastSpringBoneBuffer.cs b/Assets/VRM10/Runtime/FastSpringBone/InputPorts/FastSpringBoneBuffer.cs index 1d6d7da7a..84186af62 100644 --- a/Assets/VRM10/Runtime/FastSpringBone/InputPorts/FastSpringBoneBuffer.cs +++ b/Assets/VRM10/Runtime/FastSpringBone/InputPorts/FastSpringBoneBuffer.cs @@ -108,7 +108,7 @@ namespace UniVRM10.FastSpringBones.System parentTransformIndex = parent != null ? transformIndexDictionary[parent] : -1, currentTail = currentTail, prevTail = currentTail, - localRotation = joint.InitialLocalRotation, + localRotation = joint.Transform.localRotation, boneAxis = localChildPosition.normalized, length = localChildPosition.magnitude }); diff --git a/Assets/VRM10/Runtime/FastSpringBone/InputPorts/FastSpringBoneJoint.cs b/Assets/VRM10/Runtime/FastSpringBone/InputPorts/FastSpringBoneJoint.cs index 25e70f94b..7aff7cf71 100644 --- a/Assets/VRM10/Runtime/FastSpringBone/InputPorts/FastSpringBoneJoint.cs +++ b/Assets/VRM10/Runtime/FastSpringBone/InputPorts/FastSpringBoneJoint.cs @@ -9,6 +9,5 @@ namespace UniVRM10.FastSpringBones.System { public Transform Transform; public BlittableJoint Joint; - public Quaternion InitialLocalRotation; } } \ No newline at end of file From b537a4a3eaaff0be12f12e42bc72cb0296cb269a Mon Sep 17 00:00:00 2001 From: amamagi Date: Mon, 27 Jun 2022 12:53:21 +0900 Subject: [PATCH 3/4] add default transform states --- .../Components/Vrm10Runtime/Vrm10Runtime.cs | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/Assets/VRM10/Runtime/Components/Vrm10Runtime/Vrm10Runtime.cs b/Assets/VRM10/Runtime/Components/Vrm10Runtime/Vrm10Runtime.cs index efaefef26..07adca4d6 100644 --- a/Assets/VRM10/Runtime/Components/Vrm10Runtime/Vrm10Runtime.cs +++ b/Assets/VRM10/Runtime/Components/Vrm10Runtime/Vrm10Runtime.cs @@ -1,5 +1,7 @@ using System; +using System.Collections.Generic; using System.Linq; +using UniGLTF; using UnityEngine; using UniVRM10.FastSpringBones.Blittables; using UniVRM10.FastSpringBones.System; @@ -15,6 +17,7 @@ namespace UniVRM10 private readonly IVrm10Constraint[] m_constraints; private readonly Transform m_head; private readonly FastSpringBoneService m_fastSpringBoneService; + private readonly Dictionary m_defaultTransformStates; private FastSpringBoneBuffer m_fastSpringBoneBuffer; @@ -47,6 +50,18 @@ namespace UniVRM10 // for UnitTest return; } + + var instance = target.GetComponent(); + if (instance != null) + { + // ランタイムインポートならここに到達してほぼゼロコストになる + m_defaultTransformStates = instance.Nodes.ToDictionary(tf=> tf, tf=>(tf.position, tf.rotation)); + } + else + { + // エディタでプレハブ配置してる奴ならこっちに到達して収集する + m_defaultTransformStates = target.GetComponentsInChildren().ToDictionary(tf=> tf, tf=>(tf.position, tf.rotation)); + } m_fastSpringBoneService = FastSpringBoneService.Instance; m_fastSpringBoneBuffer = CreateFastSpringBoneBuffer(m_target.SpringBone); From b8ae94ddea3b0282f0a2ac5b6b096e22a5d419b6 Mon Sep 17 00:00:00 2001 From: amamagi Date: Mon, 27 Jun 2022 13:26:36 +0900 Subject: [PATCH 4/4] use cached local rotation for spring bone calculation --- .../Runtime/Components/Vrm10Runtime/Vrm10Runtime.cs | 12 +++++++++++- .../InputPorts/FastSpringBoneBuffer.cs | 2 +- .../FastSpringBone/InputPorts/FastSpringBoneJoint.cs | 1 + 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/Assets/VRM10/Runtime/Components/Vrm10Runtime/Vrm10Runtime.cs b/Assets/VRM10/Runtime/Components/Vrm10Runtime/Vrm10Runtime.cs index 07adca4d6..7c1d11a61 100644 --- a/Assets/VRM10/Runtime/Components/Vrm10Runtime/Vrm10Runtime.cs +++ b/Assets/VRM10/Runtime/Components/Vrm10Runtime/Vrm10Runtime.cs @@ -112,11 +112,21 @@ namespace UniVRM10 gravityDir = joint.m_gravityDir, gravityPower = joint.m_gravityPower, stiffnessForce = joint.m_stiffnessForce - } + }, + DefaultLocalRotation = GetOrAddDefaultTransformState(joint.transform).rotation }).ToArray(), }).ToArray()); } + private (Vector3 position, Quaternion rotation) GetOrAddDefaultTransformState(Transform tf) + { + if (m_defaultTransformStates.TryGetValue(tf, out var defaultTransformState)) + { + return defaultTransformState; + } + return m_defaultTransformStates[tf] = (tf.position, tf.rotation); + } + private static BlittableColliderType TranslateColliderType(VRM10SpringBoneColliderTypes colliderType) { switch (colliderType) diff --git a/Assets/VRM10/Runtime/FastSpringBone/InputPorts/FastSpringBoneBuffer.cs b/Assets/VRM10/Runtime/FastSpringBone/InputPorts/FastSpringBoneBuffer.cs index 84186af62..89df4753b 100644 --- a/Assets/VRM10/Runtime/FastSpringBone/InputPorts/FastSpringBoneBuffer.cs +++ b/Assets/VRM10/Runtime/FastSpringBone/InputPorts/FastSpringBoneBuffer.cs @@ -108,7 +108,7 @@ namespace UniVRM10.FastSpringBones.System parentTransformIndex = parent != null ? transformIndexDictionary[parent] : -1, currentTail = currentTail, prevTail = currentTail, - localRotation = joint.Transform.localRotation, + localRotation = joint.DefaultLocalRotation, boneAxis = localChildPosition.normalized, length = localChildPosition.magnitude }); diff --git a/Assets/VRM10/Runtime/FastSpringBone/InputPorts/FastSpringBoneJoint.cs b/Assets/VRM10/Runtime/FastSpringBone/InputPorts/FastSpringBoneJoint.cs index 7aff7cf71..98d1a8e65 100644 --- a/Assets/VRM10/Runtime/FastSpringBone/InputPorts/FastSpringBoneJoint.cs +++ b/Assets/VRM10/Runtime/FastSpringBone/InputPorts/FastSpringBoneJoint.cs @@ -9,5 +9,6 @@ namespace UniVRM10.FastSpringBones.System { public Transform Transform; public BlittableJoint Joint; + public Quaternion DefaultLocalRotation; } } \ No newline at end of file