WIP MigrateHumanoid

This commit is contained in:
ousttrue
2021-01-20 21:09:17 +09:00
parent 00b3c26834
commit 2d5b5a4cfd
2 changed files with 200 additions and 5 deletions

View File

@@ -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<JsonValue> vrm0)
{
return new HumanBone
{
Node = vrm0["node"].GetInt32(),
};
}
static UniGLTF.Extensions.VRMC_vrm.Humanoid MigrateHumanoid(ListTreeNode<JsonValue> 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<JsonValue> 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<JsonValue> 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
}
}

View File

@@ -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<JsonValue> 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);
}
}
}