diff --git a/Assets/UniGLTF/Runtime/UniGLTF/IO/MeshIO/MeshUploader.cs b/Assets/UniGLTF/Runtime/UniGLTF/IO/MeshIO/MeshUploader.cs index 63f5dbebb..99adf2c88 100644 --- a/Assets/UniGLTF/Runtime/UniGLTF/IO/MeshIO/MeshUploader.cs +++ b/Assets/UniGLTF/Runtime/UniGLTF/IO/MeshIO/MeshUploader.cs @@ -56,12 +56,12 @@ namespace UniGLTF }); Profiler.BeginSample("MeshUploader.BuildBlendShapeAsync"); - if (blendShape.Positions.Count > 0) + if (positions.Length > 0) { - if (blendShape.Positions.Count == mesh.vertexCount) + if (positions.Length == mesh.vertexCount) { mesh.AddBlendShapeFrame(blendShape.Name, FrameWeight, - blendShape.Positions.ToArray(), + positions, normals.Length == mesh.vertexCount && normals.Length == positions.Length ? normals : null, null ); diff --git a/Assets/UniGLTF/Runtime/UniGLTF/IO/NativeArrayManager.cs b/Assets/UniGLTF/Runtime/UniGLTF/IO/NativeArrayManager.cs index 3fdce7985..58e0b833b 100644 --- a/Assets/UniGLTF/Runtime/UniGLTF/IO/NativeArrayManager.cs +++ b/Assets/UniGLTF/Runtime/UniGLTF/IO/NativeArrayManager.cs @@ -69,9 +69,14 @@ namespace UniGLTF public NativeArray CreateNativeArray(ArraySegment data) where T : struct { var array = CreateNativeArray(data.Count); +#if UNITY_2022_2_OR_NEWER var toSpan = array.AsSpan(); var fromSpan = data.AsSpan(); fromSpan.CopyTo(toSpan); +#else + for (int i = 0; i < data.Count; i++) + array[i] = data.Array[data.Offset + i]; +#endif return array; } diff --git a/Assets/UniGLTF/Runtime/UniGLTF/PackageVersion.cs b/Assets/UniGLTF/Runtime/UniGLTF/PackageVersion.cs index 95405defb..8261452a4 100644 --- a/Assets/UniGLTF/Runtime/UniGLTF/PackageVersion.cs +++ b/Assets/UniGLTF/Runtime/UniGLTF/PackageVersion.cs @@ -5,7 +5,7 @@ namespace UniGLTF { public const int MAJOR = 0; public const int MINOR = 129; - public const int PATCH = 0; - public const string VERSION = "0.129.0"; + public const int PATCH = 1; + public const string VERSION = "0.129.1"; } } diff --git a/Assets/UniGLTF/Runtime/UniGLTF/UniGLTFVersion.cs b/Assets/UniGLTF/Runtime/UniGLTF/UniGLTFVersion.cs index 46eda9198..b81fd8008 100644 --- a/Assets/UniGLTF/Runtime/UniGLTF/UniGLTFVersion.cs +++ b/Assets/UniGLTF/Runtime/UniGLTF/UniGLTFVersion.cs @@ -5,7 +5,7 @@ namespace UniGLTF { public const int MAJOR = 2; public const int MINOR = 65; - public const int PATCH = 0; - public const string VERSION = "2.65.0"; + public const int PATCH = 1; + public const string VERSION = "2.65.1"; } } diff --git a/Assets/UniGLTF/package.json b/Assets/UniGLTF/package.json index c04ee73c8..378ea1c48 100644 --- a/Assets/UniGLTF/package.json +++ b/Assets/UniGLTF/package.json @@ -1,6 +1,6 @@ { "name": "com.vrmc.gltf", - "version": "0.129.0", + "version": "0.129.1", "displayName": "UniGLTF", "description": "GLTF importer and exporter", "unity": "2021.3", @@ -11,7 +11,10 @@ "name": "VRM Consortium" }, "dependencies": { - "com.unity.modules.animation": "1.0.0" + "com.unity.modules.animation": "1.0.0", + "com.unity.modules.imgui": "1.0.0", + "com.unity.modules.imageconversion": "1.0.0", + "com.unity.test-framework": "1.4.6" }, "samples": [ { diff --git a/Assets/VRM/Editor/Format/VRMVersionMenu.cs b/Assets/VRM/Editor/Format/VRMVersionMenu.cs index 86266ed4b..65514ae25 100644 --- a/Assets/VRM/Editor/Format/VRMVersionMenu.cs +++ b/Assets/VRM/Editor/Format/VRMVersionMenu.cs @@ -169,7 +169,10 @@ namespace UniGLTF ""name"": ""VRM Consortium"" }}, ""dependencies"": {{ - ""com.unity.modules.animation"": ""1.0.0"" + ""com.unity.modules.animation"": ""1.0.0"", + ""com.unity.modules.imgui"": ""1.0.0"", + ""com.unity.modules.imageconversion"": ""1.0.0"", + ""com.unity.test-framework"": ""1.4.6"" }}, ""samples"": [ {{ diff --git a/Assets/VRM/Editor/SpringBone/VRMSpringBoneColliderGroupEditor.cs b/Assets/VRM/Editor/SpringBone/VRMSpringBoneColliderGroupEditor.cs index fee110aa3..096cbfa45 100644 --- a/Assets/VRM/Editor/SpringBone/VRMSpringBoneColliderGroupEditor.cs +++ b/Assets/VRM/Editor/SpringBone/VRMSpringBoneColliderGroupEditor.cs @@ -16,6 +16,30 @@ namespace VRM m_target = (VRMSpringBoneColliderGroup)target; } + private void OnSceneGUI() + { + Undo.RecordObject(m_target, "VRMSpringBoneColliderGroupEditor"); + + Handles.matrix = m_target.transform.localToWorldMatrix; + Gizmos.color = Color.green; + + bool changed = false; + + foreach (var x in m_target.Colliders) + { + var offset = Handles.PositionHandle(x.Offset, Quaternion.identity); + if (offset != x.Offset) + { + changed = true; + x.Offset = offset; + } + } + + if (changed) + { + EditorUtility.SetDirty(m_target); + } + } override public void OnInspectorGUI() { @@ -55,6 +79,28 @@ namespace VRM target.Colliders = target.Colliders.OrderBy(x => -x.Radius).ToArray(); } + [MenuItem("CONTEXT/VRMSpringBoneColliderGroup/Sort Colliders Reversed")] + private static void SortReverse(MenuCommand command) + { + var target = command.context as VRMSpringBoneColliderGroup; + if (target == null) return; + + Undo.RecordObject(target, "Sort Colliders Reversed"); + + target.Colliders = target.Colliders.Reverse().ToArray(); + } + + [MenuItem("CONTEXT/VRMSpringBoneColliderGroup/Sort Colliders by Offset X")] + private static void SortByOffsetX(MenuCommand command) + { + var target = command.context as VRMSpringBoneColliderGroup; + if (target == null) return; + + Undo.RecordObject(target, "Sort Colliders by Offset X"); + + target.Colliders = target.Colliders.OrderBy(x => x.Offset.x).ToArray(); + } + [MenuItem("CONTEXT/VRMSpringBoneColliderGroup/Sort Colliders by Offset Y")] private static void SortByOffsetY(MenuCommand command) { @@ -63,7 +109,18 @@ namespace VRM Undo.RecordObject(target, "Sort Colliders by Offset Y"); - target.Colliders = target.Colliders.OrderBy(x => -x.Offset.y).ToArray(); + target.Colliders = target.Colliders.OrderBy(x => x.Offset.y).ToArray(); + } + + [MenuItem("CONTEXT/VRMSpringBoneColliderGroup/Sort Colliders by Offset Z")] + private static void SortByOffsetZ(MenuCommand command) + { + var target = command.context as VRMSpringBoneColliderGroup; + if (target == null) return; + + Undo.RecordObject(target, "Sort Colliders by Offset Z"); + + target.Colliders = target.Colliders.OrderBy(x => x.Offset.z).ToArray(); } } } diff --git a/Assets/VRM/package.json b/Assets/VRM/package.json index 6eaa69bc8..07572e3f1 100644 --- a/Assets/VRM/package.json +++ b/Assets/VRM/package.json @@ -1,6 +1,6 @@ { "name": "com.vrmc.univrm", - "version": "0.129.0", + "version": "0.129.1", "displayName": "VRM", "description": "VRM importer", "unity": "2021.3", @@ -14,7 +14,7 @@ "name": "VRM Consortium" }, "dependencies": { - "com.vrmc.gltf": "0.129.0", + "com.vrmc.gltf": "0.129.1", "com.unity.ugui": "1.0.0" }, "samples": [ diff --git a/Assets/VRM10/Runtime/Components/Vrm10Instance/Vrm10Instance.cs b/Assets/VRM10/Runtime/Components/Vrm10Instance/Vrm10Instance.cs index 5ee3fc67e..c8cacae73 100644 --- a/Assets/VRM10/Runtime/Components/Vrm10Instance/Vrm10Instance.cs +++ b/Assets/VRM10/Runtime/Components/Vrm10Instance/Vrm10Instance.cs @@ -139,7 +139,18 @@ namespace UniVRM10 { // importer 内で InitializeAsync が呼び出し済み } - return new Vrm10Runtime(this, useControlRig, m_springBoneRuntime); + + var runtime = GetComponent(); + + // Vrm10Runtimeが使う初期姿勢を固定する。SpringBone や Constraint の初期姿勢になる。 + var initPose = runtime != null + // RuntimeGltfInstance があるとき => RuntimeLoad => 初期姿勢は glTF の node に由来する + ? runtime.InitialTransformStates.ToDictionary((kv) => kv.Key, (kv) => kv.Value) + // RuntimeGltfInstance が無いとき => Scene 配置の prefab など。シーンの現状を代用する。既に T-Pose でないかもしれない。 + : GetComponentsInChildren().ToDictionary(x => x, x => new TransformState(x)) + ; + + return new Vrm10Runtime(this, useControlRig, m_springBoneRuntime, initPose); } public Vrm10Runtime Runtime diff --git a/Assets/VRM10/Runtime/Components/Vrm10Runtime/Vrm10Runtime.cs b/Assets/VRM10/Runtime/Components/Vrm10Runtime/Vrm10Runtime.cs index 3d628b13d..c6e8661e2 100644 --- a/Assets/VRM10/Runtime/Components/Vrm10Runtime/Vrm10Runtime.cs +++ b/Assets/VRM10/Runtime/Components/Vrm10Runtime/Vrm10Runtime.cs @@ -49,25 +49,21 @@ namespace UniVRM10 } } - Dictionary _initPose; + IReadOnlyDictionary _initPose; - public Vrm10Runtime(Vrm10Instance instance, bool useControlRig, IVrm10SpringBoneRuntime springBoneRuntime) + public Vrm10Runtime(Vrm10Instance instance, bool useControlRig, IVrm10SpringBoneRuntime springBoneRuntime, + IReadOnlyDictionary initPose) { if (!Application.isPlaying) { UniGLTFLogger.Warning($"{nameof(Vrm10Runtime)} expects runtime behaviour."); } - if (instance == null) - { - m_instance = null; - return; - } - if (m_instance != instance) + _initPose = initPose; + m_instance = instance; + if (m_instance == null) { - m_instance = instance; - var runtime = m_instance.GetComponent(); - _initPose = runtime.InitialTransformStates.ToDictionary((kv) => kv.Key, (kv) => kv.Value); + return; } if (!instance.TryGetBoneTransform(HumanBodyBones.Head, out m_head)) diff --git a/Assets/VRM10/package.json b/Assets/VRM10/package.json index 4d1b6bf6d..c9dd836eb 100644 --- a/Assets/VRM10/package.json +++ b/Assets/VRM10/package.json @@ -1,6 +1,6 @@ { "name": "com.vrmc.vrm", - "version": "0.129.0", + "version": "0.129.1", "displayName": "VRM-1.0", "description": "VRM-1.0 importer", "unity": "2021.3", @@ -15,7 +15,7 @@ }, "dependencies": { "com.unity.timeline": "1.7.6", - "com.vrmc.gltf": "0.129.0" + "com.vrmc.gltf": "0.129.1" }, "samples": [ {