diff --git a/Assets/VRM10/Runtime/Components/Vrm10Runtime/Vrm10Runtime.cs b/Assets/VRM10/Runtime/Components/Vrm10Runtime/Vrm10Runtime.cs index efaefef26..7c1d11a61 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); @@ -97,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