From 7da431a9566a4634596272a2047d5a5f42fa099b Mon Sep 17 00:00:00 2001 From: Masataka SUMI Date: Tue, 15 Mar 2022 20:31:15 +0900 Subject: [PATCH 01/11] Fix a migration error of FirstPerson. --- .../MigrationVrmFirstPersonAndLookAt.cs | 43 ++++++++++--------- 1 file changed, 23 insertions(+), 20 deletions(-) diff --git a/Assets/VRM10/Runtime/Migration/MigrationVrmFirstPersonAndLookAt.cs b/Assets/VRM10/Runtime/Migration/MigrationVrmFirstPersonAndLookAt.cs index 1313adf21..a112214ba 100644 --- a/Assets/VRM10/Runtime/Migration/MigrationVrmFirstPersonAndLookAt.cs +++ b/Assets/VRM10/Runtime/Migration/MigrationVrmFirstPersonAndLookAt.cs @@ -1,10 +1,7 @@ using System; -using System.Collections.Generic; -using System.Linq; using UniGLTF; using UniGLTF.Extensions.VRMC_vrm; using UniJSON; -using UnityEngine; namespace UniVRM10 { @@ -61,30 +58,36 @@ namespace UniVRM10 }; if (vrm0.TryGet("meshAnnotations", out JsonNode meshAnnotations)) { - Func meshIndexToRenderNodeIndex = meshIndex => - { - for (int i = 0; i < gltf.nodes.Count; ++i) - { - var node = gltf.nodes[i]; - if (node.mesh == meshIndex) - { - return i; - } - } - throw new NotImplementedException("mesh is not used"); - }; foreach (var x in meshAnnotations.ArrayItems()) { - var a = new MeshAnnotation + var renderNodeIndex = FindRenderNodeIndexFromMeshIndex(gltf, x["mesh"].GetInt32()); + if (renderNodeIndex.HasValue) { - Node = meshIndexToRenderNodeIndex(x["mesh"].GetInt32()), - Type = MigrateFirstPersonType(x["firstPersonFlag"]), - }; - firstPerson.MeshAnnotations.Add(a); + firstPerson.MeshAnnotations.Add(new MeshAnnotation + { + Node = renderNodeIndex.Value, + Type = MigrateFirstPersonType(x["firstPersonFlag"]), + }); + } } }; return (lookAt, firstPerson); } + + private static int? FindRenderNodeIndexFromMeshIndex(glTF gltf, int meshIndex) + { + for (var i = 0; i < gltf.nodes.Count; ++i) + { + var node = gltf.nodes[i]; + if (node.mesh == meshIndex) + { + return i; + } + } + + // NOTE: VRM をベースに改造した VRM モデルなど、Renderer の増減に対して FirstPerson の設定が追従しないまま null が出力されていることが多い. + return default; + } } } From 14fcc1c251c62a2c1afa312daee5431e0eb38e9b Mon Sep 17 00:00:00 2001 From: Masataka SUMI Date: Tue, 15 Mar 2022 20:47:49 +0900 Subject: [PATCH 02/11] Stop using Enum.Parse --- .../MigrationVrmFirstPersonAndLookAt.cs | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/Assets/VRM10/Runtime/Migration/MigrationVrmFirstPersonAndLookAt.cs b/Assets/VRM10/Runtime/Migration/MigrationVrmFirstPersonAndLookAt.cs index a112214ba..b42803b61 100644 --- a/Assets/VRM10/Runtime/Migration/MigrationVrmFirstPersonAndLookAt.cs +++ b/Assets/VRM10/Runtime/Migration/MigrationVrmFirstPersonAndLookAt.cs @@ -29,9 +29,21 @@ namespace UniVRM10 throw new NotImplementedException(); } - static FirstPersonType MigrateFirstPersonType(JsonNode vrm0) + private static FirstPersonType MigrateFirstPersonType(JsonNode vrm0) { - return (FirstPersonType)Enum.Parse(typeof(FirstPersonType), vrm0.GetString(), true); + switch (vrm0.GetString().ToLowerInvariant()) + { + case "auto": + return FirstPersonType.auto; + case "both": + return FirstPersonType.both; + case "thirdpersononly": + return FirstPersonType.thirdPersonOnly; + case "firstpersononly": + return FirstPersonType.firstPersonOnly; + default: + return FirstPersonType.auto; + } } public static (LookAt, FirstPerson) Migrate(glTF gltf, JsonNode vrm0) From f70f9e8202ae1def2e914cb98616ef28b49d9106 Mon Sep 17 00:00:00 2001 From: Masataka SUMI Date: Tue, 15 Mar 2022 20:48:34 +0900 Subject: [PATCH 03/11] Add null JSON checks. --- .../Migration/MigrationVrmFirstPersonAndLookAt.cs | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/Assets/VRM10/Runtime/Migration/MigrationVrmFirstPersonAndLookAt.cs b/Assets/VRM10/Runtime/Migration/MigrationVrmFirstPersonAndLookAt.cs index b42803b61..b07da8ffb 100644 --- a/Assets/VRM10/Runtime/Migration/MigrationVrmFirstPersonAndLookAt.cs +++ b/Assets/VRM10/Runtime/Migration/MigrationVrmFirstPersonAndLookAt.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using UniGLTF; using UniGLTF.Extensions.VRMC_vrm; using UniJSON; @@ -66,19 +67,22 @@ namespace UniVRM10 // VRM1 // firstPersonBoneOffset は廃止されます。LookAt.OffsetFromHeadBone を使ってください。 // firstPersonBone は廃止されます。Head 固定です。 - MeshAnnotations = new System.Collections.Generic.List(), + MeshAnnotations = new List(), }; - if (vrm0.TryGet("meshAnnotations", out JsonNode meshAnnotations)) + if (vrm0.TryGet("meshAnnotations", out var meshAnnotationArrayNode)) { - foreach (var x in meshAnnotations.ArrayItems()) + foreach (var x in meshAnnotationArrayNode.ArrayItems()) { - var renderNodeIndex = FindRenderNodeIndexFromMeshIndex(gltf, x["mesh"].GetInt32()); + if (!x.TryGet("mesh", out var meshIndexNode)) continue; + if (!x.TryGet("firstPersonFlag", out var firstPersonFlagNode)) continue; + + var renderNodeIndex = FindRenderNodeIndexFromMeshIndex(gltf, meshIndexNode.GetInt32()); if (renderNodeIndex.HasValue) { firstPerson.MeshAnnotations.Add(new MeshAnnotation { Node = renderNodeIndex.Value, - Type = MigrateFirstPersonType(x["firstPersonFlag"]), + Type = MigrateFirstPersonType(firstPersonFlagNode), }); } } From 8910c9baeaf924a9b74ca0fdfc8b2ab412ed26ed Mon Sep 17 00:00:00 2001 From: Masataka SUMI Date: Tue, 15 Mar 2022 20:51:46 +0900 Subject: [PATCH 04/11] Ignore exception --- .../MigrationVrmFirstPersonAndLookAt.cs | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/Assets/VRM10/Runtime/Migration/MigrationVrmFirstPersonAndLookAt.cs b/Assets/VRM10/Runtime/Migration/MigrationVrmFirstPersonAndLookAt.cs index b07da8ffb..7449ce0df 100644 --- a/Assets/VRM10/Runtime/Migration/MigrationVrmFirstPersonAndLookAt.cs +++ b/Assets/VRM10/Runtime/Migration/MigrationVrmFirstPersonAndLookAt.cs @@ -1,8 +1,8 @@ -using System; using System.Collections.Generic; using UniGLTF; using UniGLTF.Extensions.VRMC_vrm; using UniJSON; +using UnityEngine; namespace UniVRM10 { @@ -19,15 +19,19 @@ namespace UniVRM10 }; } - static LookAtType MigrateLookAtType(JsonNode vrm0) + private static LookAtType MigrateLookAtType(JsonNode vrm0) { - switch (vrm0.GetString().ToLower()) + var typeString = vrm0.GetString().ToLowerInvariant(); + switch (typeString) { - case "bone": return LookAtType.bone; - case "blendshape": return LookAtType.expression; - + case "bone": + return LookAtType.bone; + case "blendshape": + return LookAtType.expression; + default: + Debug.LogWarning($"Unknown {nameof(LookAtType)}: {typeString}"); + return LookAtType.bone; } - throw new NotImplementedException(); } private static FirstPersonType MigrateFirstPersonType(JsonNode vrm0) From 727f45c26607f02ea3db3d278e421b1a716312c7 Mon Sep 17 00:00:00 2001 From: Masataka SUMI Date: Tue, 15 Mar 2022 21:14:26 +0900 Subject: [PATCH 05/11] Supress null JSON access in migrating LookAt & FirstPerson --- .../MigrationVrmFirstPersonAndLookAt.cs | 114 +++++++++++------- 1 file changed, 72 insertions(+), 42 deletions(-) diff --git a/Assets/VRM10/Runtime/Migration/MigrationVrmFirstPersonAndLookAt.cs b/Assets/VRM10/Runtime/Migration/MigrationVrmFirstPersonAndLookAt.cs index 7449ce0df..d7d294f8e 100644 --- a/Assets/VRM10/Runtime/Migration/MigrationVrmFirstPersonAndLookAt.cs +++ b/Assets/VRM10/Runtime/Migration/MigrationVrmFirstPersonAndLookAt.cs @@ -1,68 +1,86 @@ +using System; using System.Collections.Generic; using UniGLTF; using UniGLTF.Extensions.VRMC_vrm; using UniJSON; -using UnityEngine; namespace UniVRM10 { public static class MigrationVrmLookAtAndFirstPerson { - static LookAtRangeMap MigrateLookAtRangeMap(JsonNode vrm0) + private static LookAtRangeMap MigrateLookAtRangeMap(JsonNode vrm0, string key, float defaultXRange, float defaultYRange) { - // VRM1 - // curve は廃止されます - return new LookAtRangeMap + // NOTE: Curve は VRM 1.0 では廃止されるため, 考慮しません. + if (vrm0.TryGet(key, out var curveMapperNode) && + curveMapperNode.TryGet("xRange", out var xRangeNode) && + curveMapperNode.TryGet("yRange", out var yRangeNode)) { - InputMaxValue = vrm0["xRange"].GetSingle(), - OutputScale = vrm0["yRange"].GetSingle(), - }; - } - - private static LookAtType MigrateLookAtType(JsonNode vrm0) - { - var typeString = vrm0.GetString().ToLowerInvariant(); - switch (typeString) + return new LookAtRangeMap + { + InputMaxValue = xRangeNode.GetSingle(), + OutputScale = yRangeNode.GetSingle(), + }; + } + else { - case "bone": - return LookAtType.bone; - case "blendshape": - return LookAtType.expression; - default: - Debug.LogWarning($"Unknown {nameof(LookAtType)}: {typeString}"); - return LookAtType.bone; + return new LookAtRangeMap + { + InputMaxValue = defaultXRange, + OutputScale = defaultYRange, + }; } } - private static FirstPersonType MigrateFirstPersonType(JsonNode vrm0) + private static LookAtType MigrateLookAtType(JsonNode vrm0, string key) { - switch (vrm0.GetString().ToLowerInvariant()) + if (vrm0.TryGet(key, out var lookAtTypeStringNode)) { - case "auto": - return FirstPersonType.auto; - case "both": - return FirstPersonType.both; - case "thirdpersononly": - return FirstPersonType.thirdPersonOnly; - case "firstpersononly": - return FirstPersonType.firstPersonOnly; - default: - return FirstPersonType.auto; + switch (lookAtTypeStringNode.GetString().ToLowerInvariant()) + { + case "bone": + return LookAtType.bone; + case "blendshape": + return LookAtType.expression; + } } + + return LookAtType.bone; + } + + private static FirstPersonType MigrateFirstPersonType(JsonNode vrm0, string key) + { + if (vrm0.TryGet(key, out var firstPersonTypeStringNode)) + { + switch (firstPersonTypeStringNode.GetString().ToLowerInvariant()) + { + case "auto": + return FirstPersonType.auto; + case "both": + return FirstPersonType.both; + case "thirdpersononly": + return FirstPersonType.thirdPersonOnly; + case "firstpersononly": + return FirstPersonType.firstPersonOnly; + } + } + + return FirstPersonType.auto; } public static (LookAt, FirstPerson) Migrate(glTF gltf, JsonNode vrm0) { // VRM1 // firstPerson に同居していた LookAt は独立します - LookAt lookAt = default; - lookAt = new LookAt + var lookAtType = MigrateLookAtType(vrm0, "lookAtTypeName"); + var defaultXRangeValue = 90f; + var defaultYRangeValue = GetDefaultCurveMapperYRangeValue(lookAtType); + var lookAt = new LookAt { - RangeMapHorizontalInner = MigrateLookAtRangeMap(vrm0["lookAtHorizontalInner"]), - RangeMapHorizontalOuter = MigrateLookAtRangeMap(vrm0["lookAtHorizontalOuter"]), - RangeMapVerticalDown = MigrateLookAtRangeMap(vrm0["lookAtVerticalDown"]), - RangeMapVerticalUp = MigrateLookAtRangeMap(vrm0["lookAtVerticalUp"]), - Type = MigrateLookAtType(vrm0["lookAtTypeName"]), + Type = lookAtType, + RangeMapHorizontalInner = MigrateLookAtRangeMap(vrm0, "lookAtHorizontalInner", defaultXRangeValue, defaultYRangeValue), + RangeMapHorizontalOuter = MigrateLookAtRangeMap(vrm0, "lookAtHorizontalOuter", defaultXRangeValue, defaultYRangeValue), + RangeMapVerticalDown = MigrateLookAtRangeMap(vrm0, "lookAtVerticalDown", defaultXRangeValue, defaultYRangeValue), + RangeMapVerticalUp = MigrateLookAtRangeMap(vrm0, "lookAtVerticalUp", defaultXRangeValue, defaultYRangeValue), OffsetFromHeadBone = MigrateVector3.Migrate(vrm0, "firstPersonBoneOffset"), }; @@ -78,7 +96,6 @@ namespace UniVRM10 foreach (var x in meshAnnotationArrayNode.ArrayItems()) { if (!x.TryGet("mesh", out var meshIndexNode)) continue; - if (!x.TryGet("firstPersonFlag", out var firstPersonFlagNode)) continue; var renderNodeIndex = FindRenderNodeIndexFromMeshIndex(gltf, meshIndexNode.GetInt32()); if (renderNodeIndex.HasValue) @@ -86,7 +103,7 @@ namespace UniVRM10 firstPerson.MeshAnnotations.Add(new MeshAnnotation { Node = renderNodeIndex.Value, - Type = MigrateFirstPersonType(firstPersonFlagNode), + Type = MigrateFirstPersonType(x, "firstPersonFlag"), }); } } @@ -109,5 +126,18 @@ namespace UniVRM10 // NOTE: VRM をベースに改造した VRM モデルなど、Renderer の増減に対して FirstPerson の設定が追従しないまま null が出力されていることが多い. return default; } + + private static float GetDefaultCurveMapperYRangeValue(LookAtType type) + { + switch (type) + { + case LookAtType.bone: + return 10f; + case LookAtType.expression: + return 1f; + default: + throw new ArgumentOutOfRangeException(nameof(type), type, null); + } + } } } From 61f29b55bcde3ff76ea966b4c5741caa36be0c23 Mon Sep 17 00:00:00 2001 From: Masataka SUMI Date: Tue, 15 Mar 2022 21:20:52 +0900 Subject: [PATCH 06/11] refactor --- .../Migration/MigrationVrmFirstPersonAndLookAt.cs | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/Assets/VRM10/Runtime/Migration/MigrationVrmFirstPersonAndLookAt.cs b/Assets/VRM10/Runtime/Migration/MigrationVrmFirstPersonAndLookAt.cs index d7d294f8e..61cf83d86 100644 --- a/Assets/VRM10/Runtime/Migration/MigrationVrmFirstPersonAndLookAt.cs +++ b/Assets/VRM10/Runtime/Migration/MigrationVrmFirstPersonAndLookAt.cs @@ -21,14 +21,12 @@ namespace UniVRM10 OutputScale = yRangeNode.GetSingle(), }; } - else + + return new LookAtRangeMap { - return new LookAtRangeMap - { - InputMaxValue = defaultXRange, - OutputScale = defaultYRange, - }; - } + InputMaxValue = defaultXRange, + OutputScale = defaultYRange, + }; } private static LookAtType MigrateLookAtType(JsonNode vrm0, string key) From 0018be92539f9ac4a104765adccaa0f2c744ea9d Mon Sep 17 00:00:00 2001 From: Masataka SUMI Date: Tue, 15 Mar 2022 21:29:29 +0900 Subject: [PATCH 07/11] refactor --- .../Migration/MigrationVrmFirstPersonAndLookAt.cs | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/Assets/VRM10/Runtime/Migration/MigrationVrmFirstPersonAndLookAt.cs b/Assets/VRM10/Runtime/Migration/MigrationVrmFirstPersonAndLookAt.cs index 61cf83d86..04a95be36 100644 --- a/Assets/VRM10/Runtime/Migration/MigrationVrmFirstPersonAndLookAt.cs +++ b/Assets/VRM10/Runtime/Migration/MigrationVrmFirstPersonAndLookAt.cs @@ -65,6 +65,17 @@ namespace UniVRM10 return FirstPersonType.auto; } + private static int? MigrateFirstPersonMeshIndex(JsonNode vrm0, string key, glTF gltf) + { + if (vrm0.TryGet(key, out var meshIndexNode)) + { + var meshIndex = meshIndexNode.GetInt32(); + return FindRenderNodeIndexFromMeshIndex(gltf, meshIndex); + } + + return default; + } + public static (LookAt, FirstPerson) Migrate(glTF gltf, JsonNode vrm0) { // VRM1 @@ -93,9 +104,7 @@ namespace UniVRM10 { foreach (var x in meshAnnotationArrayNode.ArrayItems()) { - if (!x.TryGet("mesh", out var meshIndexNode)) continue; - - var renderNodeIndex = FindRenderNodeIndexFromMeshIndex(gltf, meshIndexNode.GetInt32()); + var renderNodeIndex = MigrateFirstPersonMeshIndex(x, "mesh", gltf); if (renderNodeIndex.HasValue) { firstPerson.MeshAnnotations.Add(new MeshAnnotation From 0dc1f4b6e1984b1528ba6f23a38e9083da68d052 Mon Sep 17 00:00:00 2001 From: Masataka SUMI Date: Tue, 15 Mar 2022 21:32:11 +0900 Subject: [PATCH 08/11] refactor --- .../MigrationVrmFirstPersonAndLookAt.cs | 29 +++++++------------ 1 file changed, 11 insertions(+), 18 deletions(-) diff --git a/Assets/VRM10/Runtime/Migration/MigrationVrmFirstPersonAndLookAt.cs b/Assets/VRM10/Runtime/Migration/MigrationVrmFirstPersonAndLookAt.cs index 04a95be36..d0c0de203 100644 --- a/Assets/VRM10/Runtime/Migration/MigrationVrmFirstPersonAndLookAt.cs +++ b/Assets/VRM10/Runtime/Migration/MigrationVrmFirstPersonAndLookAt.cs @@ -67,12 +67,20 @@ namespace UniVRM10 private static int? MigrateFirstPersonMeshIndex(JsonNode vrm0, string key, glTF gltf) { - if (vrm0.TryGet(key, out var meshIndexNode)) + if (vrm0.TryGet(key, out var meshIndexJsonNode)) { - var meshIndex = meshIndexNode.GetInt32(); - return FindRenderNodeIndexFromMeshIndex(gltf, meshIndex); + var meshIndex = meshIndexJsonNode.GetInt32(); + for (var gltfNodeIndex = 0; gltfNodeIndex < gltf.nodes.Count; ++gltfNodeIndex) + { + var node = gltf.nodes[gltfNodeIndex]; + if (node.mesh == meshIndex) + { + return gltfNodeIndex; + } + } } + // NOTE: VRM をベースに改造した VRM モデルなど、Renderer の増減に対して FirstPerson の設定が追従しないまま null が出力されていることが多い. return default; } @@ -119,21 +127,6 @@ namespace UniVRM10 return (lookAt, firstPerson); } - private static int? FindRenderNodeIndexFromMeshIndex(glTF gltf, int meshIndex) - { - for (var i = 0; i < gltf.nodes.Count; ++i) - { - var node = gltf.nodes[i]; - if (node.mesh == meshIndex) - { - return i; - } - } - - // NOTE: VRM をベースに改造した VRM モデルなど、Renderer の増減に対して FirstPerson の設定が追従しないまま null が出力されていることが多い. - return default; - } - private static float GetDefaultCurveMapperYRangeValue(LookAtType type) { switch (type) From 95184dcd944bce7bfc08d5983d09c0edbee22700 Mon Sep 17 00:00:00 2001 From: Masataka SUMI Date: Tue, 15 Mar 2022 21:41:03 +0900 Subject: [PATCH 09/11] rename & comment --- .../MigrationVrmFirstPersonAndLookAt.cs | 55 ++++++++++--------- 1 file changed, 28 insertions(+), 27 deletions(-) diff --git a/Assets/VRM10/Runtime/Migration/MigrationVrmFirstPersonAndLookAt.cs b/Assets/VRM10/Runtime/Migration/MigrationVrmFirstPersonAndLookAt.cs index d0c0de203..4989760bc 100644 --- a/Assets/VRM10/Runtime/Migration/MigrationVrmFirstPersonAndLookAt.cs +++ b/Assets/VRM10/Runtime/Migration/MigrationVrmFirstPersonAndLookAt.cs @@ -8,17 +8,17 @@ namespace UniVRM10 { public static class MigrationVrmLookAtAndFirstPerson { - private static LookAtRangeMap MigrateLookAtRangeMap(JsonNode vrm0, string key, float defaultXRange, float defaultYRange) + private static LookAtRangeMap MigrateLookAtRangeMap(JsonNode firstPersonJsonNode, string key, float defaultXRange, float defaultYRange) { // NOTE: Curve は VRM 1.0 では廃止されるため, 考慮しません. - if (vrm0.TryGet(key, out var curveMapperNode) && - curveMapperNode.TryGet("xRange", out var xRangeNode) && - curveMapperNode.TryGet("yRange", out var yRangeNode)) + if (firstPersonJsonNode.TryGet(key, out var curveMapperJsonNode) && + curveMapperJsonNode.TryGet("xRange", out var xRangeJsonNode) && + curveMapperJsonNode.TryGet("yRange", out var yRangeJsonNode)) { return new LookAtRangeMap { - InputMaxValue = xRangeNode.GetSingle(), - OutputScale = yRangeNode.GetSingle(), + InputMaxValue = xRangeJsonNode.GetSingle(), + OutputScale = yRangeJsonNode.GetSingle(), }; } @@ -29,11 +29,11 @@ namespace UniVRM10 }; } - private static LookAtType MigrateLookAtType(JsonNode vrm0, string key) + private static LookAtType MigrateLookAtType(JsonNode firstPersonJsonNode, string key) { - if (vrm0.TryGet(key, out var lookAtTypeStringNode)) + if (firstPersonJsonNode.TryGet(key, out var lookAtTypeStringJsonNode)) { - switch (lookAtTypeStringNode.GetString().ToLowerInvariant()) + switch (lookAtTypeStringJsonNode.GetString().ToLowerInvariant()) { case "bone": return LookAtType.bone; @@ -45,11 +45,11 @@ namespace UniVRM10 return LookAtType.bone; } - private static FirstPersonType MigrateFirstPersonType(JsonNode vrm0, string key) + private static FirstPersonType MigrateFirstPersonType(JsonNode firstPersonJsonNode, string key) { - if (vrm0.TryGet(key, out var firstPersonTypeStringNode)) + if (firstPersonJsonNode.TryGet(key, out var firstPersonTypeStringJsonNode)) { - switch (firstPersonTypeStringNode.GetString().ToLowerInvariant()) + switch (firstPersonTypeStringJsonNode.GetString().ToLowerInvariant()) { case "auto": return FirstPersonType.auto; @@ -65,11 +65,14 @@ namespace UniVRM10 return FirstPersonType.auto; } - private static int? MigrateFirstPersonMeshIndex(JsonNode vrm0, string key, glTF gltf) + private static int? MigrateFirstPersonMeshIndex(JsonNode firstPersonJsonNode, string key, glTF gltf) { - if (vrm0.TryGet(key, out var meshIndexJsonNode)) + if (firstPersonJsonNode.TryGet(key, out var meshIndexJsonNode)) { var meshIndex = meshIndexJsonNode.GetInt32(); + + // NOTE: VRM 1.0 では glTF の Node Index を記録するため、それに変換する. + // TODO: mesh が共有されたノードの場合はどうなる? 0x の場合はどうなっていたかを調べて挙動を追従する. for (var gltfNodeIndex = 0; gltfNodeIndex < gltf.nodes.Count; ++gltfNodeIndex) { var node = gltf.nodes[gltfNodeIndex]; @@ -84,31 +87,29 @@ namespace UniVRM10 return default; } - public static (LookAt, FirstPerson) Migrate(glTF gltf, JsonNode vrm0) + public static (LookAt, FirstPerson) Migrate(glTF gltf, JsonNode firstPersonJsonNode) { - // VRM1 - // firstPerson に同居していた LookAt は独立します - var lookAtType = MigrateLookAtType(vrm0, "lookAtTypeName"); + // NOTE: VRM 1.0 では, LookAt の情報は FirstPerson から独立した型に保存されます. + var lookAtType = MigrateLookAtType(firstPersonJsonNode, "lookAtTypeName"); var defaultXRangeValue = 90f; var defaultYRangeValue = GetDefaultCurveMapperYRangeValue(lookAtType); var lookAt = new LookAt { Type = lookAtType, - RangeMapHorizontalInner = MigrateLookAtRangeMap(vrm0, "lookAtHorizontalInner", defaultXRangeValue, defaultYRangeValue), - RangeMapHorizontalOuter = MigrateLookAtRangeMap(vrm0, "lookAtHorizontalOuter", defaultXRangeValue, defaultYRangeValue), - RangeMapVerticalDown = MigrateLookAtRangeMap(vrm0, "lookAtVerticalDown", defaultXRangeValue, defaultYRangeValue), - RangeMapVerticalUp = MigrateLookAtRangeMap(vrm0, "lookAtVerticalUp", defaultXRangeValue, defaultYRangeValue), - OffsetFromHeadBone = MigrateVector3.Migrate(vrm0, "firstPersonBoneOffset"), + RangeMapHorizontalInner = MigrateLookAtRangeMap(firstPersonJsonNode, "lookAtHorizontalInner", defaultXRangeValue, defaultYRangeValue), + RangeMapHorizontalOuter = MigrateLookAtRangeMap(firstPersonJsonNode, "lookAtHorizontalOuter", defaultXRangeValue, defaultYRangeValue), + RangeMapVerticalDown = MigrateLookAtRangeMap(firstPersonJsonNode, "lookAtVerticalDown", defaultXRangeValue, defaultYRangeValue), + RangeMapVerticalUp = MigrateLookAtRangeMap(firstPersonJsonNode, "lookAtVerticalUp", defaultXRangeValue, defaultYRangeValue), + OffsetFromHeadBone = MigrateVector3.Migrate(firstPersonJsonNode, "firstPersonBoneOffset"), }; var firstPerson = new FirstPerson { - // VRM1 - // firstPersonBoneOffset は廃止されます。LookAt.OffsetFromHeadBone を使ってください。 - // firstPersonBone は廃止されます。Head 固定です。 + // NOTE: VRM 1.0 では firstPersonBone は廃止され, Head Bone 固定になります. + // NOTE: VRM 1.0 では firstPersonBoneOffset は FirstPerson 拡張ではなく LookAt 拡張の OffsetFromHeadBone に移行します. MeshAnnotations = new List(), }; - if (vrm0.TryGet("meshAnnotations", out var meshAnnotationArrayNode)) + if (firstPersonJsonNode.TryGet("meshAnnotations", out var meshAnnotationArrayNode)) { foreach (var x in meshAnnotationArrayNode.ArrayItems()) { From 1abdb0690d479ae6110b402e94d0aad16ccde631 Mon Sep 17 00:00:00 2001 From: Masataka SUMI Date: Tue, 15 Mar 2022 21:48:12 +0900 Subject: [PATCH 10/11] rename --- .../Migration/MigrationVrmFirstPersonAndLookAt.cs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Assets/VRM10/Runtime/Migration/MigrationVrmFirstPersonAndLookAt.cs b/Assets/VRM10/Runtime/Migration/MigrationVrmFirstPersonAndLookAt.cs index 4989760bc..9ca9460c9 100644 --- a/Assets/VRM10/Runtime/Migration/MigrationVrmFirstPersonAndLookAt.cs +++ b/Assets/VRM10/Runtime/Migration/MigrationVrmFirstPersonAndLookAt.cs @@ -45,9 +45,9 @@ namespace UniVRM10 return LookAtType.bone; } - private static FirstPersonType MigrateFirstPersonType(JsonNode firstPersonJsonNode, string key) + private static FirstPersonType MigrateFirstPersonType(JsonNode meshAnnotationJsonNode, string key) { - if (firstPersonJsonNode.TryGet(key, out var firstPersonTypeStringJsonNode)) + if (meshAnnotationJsonNode.TryGet(key, out var firstPersonTypeStringJsonNode)) { switch (firstPersonTypeStringJsonNode.GetString().ToLowerInvariant()) { @@ -109,17 +109,17 @@ namespace UniVRM10 // NOTE: VRM 1.0 では firstPersonBoneOffset は FirstPerson 拡張ではなく LookAt 拡張の OffsetFromHeadBone に移行します. MeshAnnotations = new List(), }; - if (firstPersonJsonNode.TryGet("meshAnnotations", out var meshAnnotationArrayNode)) + if (firstPersonJsonNode.TryGet("meshAnnotations", out var meshAnnotationArrayJsonNode)) { - foreach (var x in meshAnnotationArrayNode.ArrayItems()) + foreach (var meshAnnotationJsonNode in meshAnnotationArrayJsonNode.ArrayItems()) { - var renderNodeIndex = MigrateFirstPersonMeshIndex(x, "mesh", gltf); + var renderNodeIndex = MigrateFirstPersonMeshIndex(meshAnnotationJsonNode, "mesh", gltf); if (renderNodeIndex.HasValue) { firstPerson.MeshAnnotations.Add(new MeshAnnotation { Node = renderNodeIndex.Value, - Type = MigrateFirstPersonType(x, "firstPersonFlag"), + Type = MigrateFirstPersonType(meshAnnotationJsonNode, "firstPersonFlag"), }); } } From 8cffd2ccfaf13df973a6e5aeb2cc46b6b79354d1 Mon Sep 17 00:00:00 2001 From: Masataka SUMI Date: Tue, 15 Mar 2022 21:49:24 +0900 Subject: [PATCH 11/11] rename --- .../Runtime/Migration/MigrationVrmFirstPersonAndLookAt.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Assets/VRM10/Runtime/Migration/MigrationVrmFirstPersonAndLookAt.cs b/Assets/VRM10/Runtime/Migration/MigrationVrmFirstPersonAndLookAt.cs index 9ca9460c9..b950f6603 100644 --- a/Assets/VRM10/Runtime/Migration/MigrationVrmFirstPersonAndLookAt.cs +++ b/Assets/VRM10/Runtime/Migration/MigrationVrmFirstPersonAndLookAt.cs @@ -65,9 +65,9 @@ namespace UniVRM10 return FirstPersonType.auto; } - private static int? MigrateFirstPersonMeshIndex(JsonNode firstPersonJsonNode, string key, glTF gltf) + private static int? MigrateFirstPersonMeshIndex(JsonNode meshAnnotationJsonNode, string key, glTF gltf) { - if (firstPersonJsonNode.TryGet(key, out var meshIndexJsonNode)) + if (meshAnnotationJsonNode.TryGet(key, out var meshIndexJsonNode)) { var meshIndex = meshIndexJsonNode.GetInt32();