diff --git a/Assets/VRM10/Runtime/Migration/Migration.cs b/Assets/VRM10/Runtime/Migration/Migration.cs index 8f15afb7b..16b042c3e 100644 --- a/Assets/VRM10/Runtime/Migration/Migration.cs +++ b/Assets/VRM10/Runtime/Migration/Migration.cs @@ -25,6 +25,108 @@ namespace UniVRM10 return false; } + // { + // "bone": "hips", + // "node": 14, + // "useDefaultValues": true, + // "min": { + // "x": 0, + // "y": 0, + // "z": 0 + // }, + // "max": { + // "x": 0, + // "y": 0, + // "z": 0 + // }, + // "center": { + // "x": 0, + // "y": 0, + // "z": 0 + // }, + // "axisLength": 0 + // }, + static UniGLTF.Extensions.VRMC_vrm.HumanBone MigrateHumanoidBone(ListTreeNode vrm0) + { + return new HumanBone + { + Node = vrm0["node"].GetInt32(), + }; + } + + static UniGLTF.Extensions.VRMC_vrm.Humanoid MigrateHumanoid(ListTreeNode vrm0) + { + var humanoid = new UniGLTF.Extensions.VRMC_vrm.Humanoid + { + HumanBones = new HumanBones() + }; + + foreach (var humanoidBone in vrm0["humanBones"].ArrayItems()) + { + var boneType = humanoidBone["bone"].GetString(); + switch (boneType) + { + case "hips": humanoid.HumanBones.Hips = MigrateHumanoidBone(humanoidBone); break; + case "leftUpperLeg,": break; + case "rightUpperLeg,": break; + case "leftLowerLeg,": break; + case "rightLowerLeg,": break; + case "leftFoot,": break; + case "rightFoot,": break; + case "spine,": break; + case "chest,": break; + case "neck,": break; + case "head,": break; + case "leftShoulder,": break; + case "rightShoulder,": break; + case "leftUpperArm,": break; + case "rightUpperArm,": break; + case "leftLowerArm,": break; + case "rightLowerArm,": break; + case "leftHand,": break; + case "rightHand,": break; + case "leftToes,": break; + case "rightToes,": break; + case "leftEye,": break; + case "rightEye,": break; + case "jaw,": break; + case "leftThumbProximal,": break; + case "leftThumbIntermediate,": break; + case "leftThumbDistal,": break; + case "leftIndexProximal,": break; + case "leftIndexIntermediate,": break; + case "leftIndexDistal,": break; + case "leftMiddleProximal,": break; + case "leftMiddleIntermediate,": break; + case "leftMiddleDistal,": break; + case "leftRingProximal,": break; + case "leftRingIntermediate,": break; + case "leftRingDistal,": break; + case "leftLittleProximal,": break; + case "leftLittleIntermediate,": break; + case "leftLittleDistal,": break; + case "rightThumbProximal,": break; + case "rightThumbIntermediate,": break; + case "rightThumbDistal,": break; + case "rightIndexProximal,": break; + case "rightIndexIntermediate,": break; + case "rightIndexDistal,": break; + case "rightMiddleProximal,": break; + case "rightMiddleIntermediate,": break; + case "rightMiddleDistal,": break; + case "rightRingProximal,": break; + case "rightRingIntermediate,": break; + case "rightRingDistal,": break; + case "rightLittleProximal,": break; + case "rightLittleIntermediate,": break; + case "rightLittleDistal,": break; + case "upperChest,": break; + } + } + + return humanoid; + } + public static byte[] Migrate(byte[] src) { var glb = UniGLTF.Glb.Parse(src); @@ -42,6 +144,9 @@ namespace UniVRM10 { var vrm1 = new VRMC_vrm(); + var vrm0 = json["extensions"]["VRM"]; + vrm1.Humanoid = MigrateHumanoid(vrm0["humanoid"]); + var f = new JsonFormatter(); GltfSerializer.Serialize(f, vrm1); gltf.extensions = new UniGLTF.glTFExtensionExport().Add(VRMC_vrm.ExtensionName, f.GetStoreBytes()); @@ -56,5 +161,82 @@ namespace UniVRM10 return UniGLTF.Glb.Create(vrm1Json, glb.Binary.Bytes).ToBytes(); } + + #region for UnitTest + public static void CheckBone(string bone, ListTreeNode vrm0, UniGLTF.Extensions.VRMC_vrm.HumanBone vrm1) + { + var vrm0NodeIndex = vrm0["node"].GetInt32(); + if (vrm0NodeIndex != vrm1.Node) + { + throw new Exception($"different {bone}: {vrm0NodeIndex} != {vrm1.Node}"); + } + } + + public static void CheckHumanoid(ListTreeNode vrm0, UniGLTF.Extensions.VRMC_vrm.Humanoid vrm1) + { + foreach (var humanoidBone in vrm0["humanBones"].ArrayItems()) + { + var boneType = humanoidBone["bone"].GetString(); + switch (boneType) + { + case "hips": CheckBone(boneType, humanoidBone, vrm1.HumanBones.Hips); break; + case "leftUpperLeg,": break; + case "rightUpperLeg,": break; + case "leftLowerLeg,": break; + case "rightLowerLeg,": break; + case "leftFoot,": break; + case "rightFoot,": break; + case "spine,": break; + case "chest,": break; + case "neck,": break; + case "head,": break; + case "leftShoulder,": break; + case "rightShoulder,": break; + case "leftUpperArm,": break; + case "rightUpperArm,": break; + case "leftLowerArm,": break; + case "rightLowerArm,": break; + case "leftHand,": break; + case "rightHand,": break; + case "leftToes,": break; + case "rightToes,": break; + case "leftEye,": break; + case "rightEye,": break; + case "jaw,": break; + case "leftThumbProximal,": break; + case "leftThumbIntermediate,": break; + case "leftThumbDistal,": break; + case "leftIndexProximal,": break; + case "leftIndexIntermediate,": break; + case "leftIndexDistal,": break; + case "leftMiddleProximal,": break; + case "leftMiddleIntermediate,": break; + case "leftMiddleDistal,": break; + case "leftRingProximal,": break; + case "leftRingIntermediate,": break; + case "leftRingDistal,": break; + case "leftLittleProximal,": break; + case "leftLittleIntermediate,": break; + case "leftLittleDistal,": break; + case "rightThumbProximal,": break; + case "rightThumbIntermediate,": break; + case "rightThumbDistal,": break; + case "rightIndexProximal,": break; + case "rightIndexIntermediate,": break; + case "rightIndexDistal,": break; + case "rightMiddleProximal,": break; + case "rightMiddleIntermediate,": break; + case "rightMiddleDistal,": break; + case "rightRingProximal,": break; + case "rightRingIntermediate,": break; + case "rightRingDistal,": break; + case "rightLittleProximal,": break; + case "rightLittleIntermediate,": break; + case "rightLittleDistal,": break; + case "upperChest,": break; + } + } + } + #endregion } } diff --git a/Assets/VRM10/Tests/MigrationTests.cs b/Assets/VRM10/Tests/MigrationTests.cs index fd70d6b45..12c6b0e2d 100644 --- a/Assets/VRM10/Tests/MigrationTests.cs +++ b/Assets/VRM10/Tests/MigrationTests.cs @@ -2,6 +2,7 @@ using NUnit.Framework; using UnityEngine; using UniJSON; +using System; namespace UniVRM10 { @@ -16,7 +17,7 @@ namespace UniVRM10 } } - UniGLTF.Extensions.VRMC_vrm.VRMC_vrm GetVRM(UniGLTF.glTFExtension extensions) + UniGLTF.Extensions.VRMC_vrm.VRMC_vrm GetVRMC_vrm(UniGLTF.glTFExtension extensions) { if (extensions is UniGLTF.glTFExtensionImport import) { @@ -32,16 +33,28 @@ namespace UniVRM10 return default; } + + static ListTreeNode GetVRM0(byte[] bytes) + { + var glb = UniGLTF.Glb.Parse(bytes); + var json = glb.Json.Bytes.ParseAsJson(); + return json["extensions"]["VRM"]; + } + [Test] public void Migrate0to1() { - var vrm0 = File.ReadAllBytes(AliciaPath); - var vrm1 = Migration.Migrate(vrm0); + var vrm0Bytes = File.ReadAllBytes(AliciaPath); + var vrm0Json = GetVRM0(vrm0Bytes); + + var vrm1 = Migration.Migrate(vrm0Bytes); var glb = UniGLTF.Glb.Parse(vrm1); var json = glb.Json.Bytes.ParseAsJson(); var gltf = UniGLTF.GltfDeserializer.Deserialize(json); - var vrm = GetVRM(gltf.extensions); - Assert.NotNull(vrm); + var VRMC_vrm = GetVRMC_vrm(gltf.extensions); + Assert.NotNull(VRMC_vrm); + + Migration.CheckHumanoid(vrm0Json["humanoid"], VRMC_vrm.Humanoid); } } }