mirror of
https://github.com/vrm-c/UniVRM.git
synced 2026-08-26 12:55:18 -05:00
WIP MigrateHumanoid
This commit is contained in:
@@ -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
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user