From 44b216c906c817fe3d7557be17c9681b76ebad94 Mon Sep 17 00:00:00 2001 From: ousttrue Date: Wed, 21 Apr 2021 15:06:09 +0900 Subject: [PATCH 1/2] add test --- Assets/VRM/Editor/Format/VRMEditorExporter.cs | 20 +++----- Assets/VRM/Editor/Format/VRMExporterWizard.cs | 11 ++++- .../VRM/Runtime/FirstPerson/VRMFirstPerson.cs | 3 +- Assets/VRM/Tests/VRM.Tests.asmdef | 3 +- Assets/VRM/Tests/VRMLookAtTests.cs | 48 +++++++++++++++++++ Assets/VRM/Tests/VRMLookAtTests.cs.meta | 11 +++++ 6 files changed, 79 insertions(+), 17 deletions(-) create mode 100644 Assets/VRM/Tests/VRMLookAtTests.cs create mode 100644 Assets/VRM/Tests/VRMLookAtTests.cs.meta diff --git a/Assets/VRM/Editor/Format/VRMEditorExporter.cs b/Assets/VRM/Editor/Format/VRMEditorExporter.cs index 2fce5b9f0..3c765525c 100644 --- a/Assets/VRM/Editor/Format/VRMEditorExporter.cs +++ b/Assets/VRM/Editor/Format/VRMEditorExporter.cs @@ -1,10 +1,8 @@ using System; using System.Collections.Generic; -using System.IO; using System.Linq; using System.Text; using UniGLTF; -using UnityEditor; using UnityEngine; using VRMShaders; @@ -17,12 +15,12 @@ namespace VRM /// /// 出力先 /// エクスポート設定 - public static void Export(string path, GameObject exportRoot, VRMMetaObject meta, VRMExportSettings settings, IReadOnlyList info) + public static byte[] Export(GameObject exportRoot, VRMMetaObject meta, VRMExportSettings settings) { List destroy = new List(); try { - Export(path, exportRoot, meta, settings, info, destroy); + return Export(exportRoot, meta, settings, destroy); } finally { @@ -137,8 +135,8 @@ namespace VRM /// /// /// 作業が終わったらDestoryするべき一時オブジェクト - static void Export(string path, GameObject exportRoot, VRMMetaObject meta, - VRMExportSettings settings, IReadOnlyList info, + static byte[] Export(GameObject exportRoot, VRMMetaObject meta, + VRMExportSettings settings, List destroy) { var target = exportRoot; @@ -201,6 +199,8 @@ namespace VRM destroy.Add(target); } + var fp = target.GetComponent(); + // 元のBlendShapeClipに変更を加えないように複製 var proxy = target.GetComponent(); if (proxy != null) @@ -228,14 +228,8 @@ namespace VRM exporter.Export(settings.MeshExportSettings, AssetTextureUtil.IsTextureEditorAsset, AssetTextureUtil.GetTextureBytesWithMime); } var bytes = gltf.ToGlbBytes(); - File.WriteAllBytes(path, bytes); Debug.LogFormat("Export elapsed {0}", sw.Elapsed); - - if (path.StartsWithUnityAssetPath()) - { - // 出力ファイルのインポートを発動 - AssetDatabase.ImportAsset(path.ToUnityRelativePath()); - } + return bytes; } } } diff --git a/Assets/VRM/Editor/Format/VRMExporterWizard.cs b/Assets/VRM/Editor/Format/VRMExporterWizard.cs index 1bb73b27a..3b914c4e1 100644 --- a/Assets/VRM/Editor/Format/VRMExporterWizard.cs +++ b/Assets/VRM/Editor/Format/VRMExporterWizard.cs @@ -4,6 +4,7 @@ using UnityEditor; using UnityEngine; using UniGLTF; using UniGLTF.M17N; +using System.IO; namespace VRM { @@ -157,7 +158,15 @@ namespace VRM protected override void ExportPath(string path) { - VRMEditorExporter.Export(path, State.ExportRoot, Meta != null ? Meta : m_tmpMeta, m_settings, m_meshes.Meshes); + var bytes = VRMEditorExporter.Export(State.ExportRoot, Meta != null ? Meta : m_tmpMeta, m_settings); + + File.WriteAllBytes(path, bytes); + + if (path.StartsWithUnityAssetPath()) + { + // 出力ファイルのインポートを発動 + AssetDatabase.ImportAsset(path.ToUnityRelativePath()); + } } protected override bool DoGUI() diff --git a/Assets/VRM/Runtime/FirstPerson/VRMFirstPerson.cs b/Assets/VRM/Runtime/FirstPerson/VRMFirstPerson.cs index 3f5224173..78b2b10cd 100644 --- a/Assets/VRM/Runtime/FirstPerson/VRMFirstPerson.cs +++ b/Assets/VRM/Runtime/FirstPerson/VRMFirstPerson.cs @@ -57,7 +57,8 @@ namespace VRM dst.FirstPersonOffset = FirstPersonOffset; dst.Renderers = Renderers.Select(x => { - var renderer = map[x.Renderer.transform].GetComponent(); + var mapped = map[x.Renderer.transform]; + var renderer = mapped.GetComponent(); return new VRMFirstPerson.RendererFirstPersonFlags { Renderer = renderer, diff --git a/Assets/VRM/Tests/VRM.Tests.asmdef b/Assets/VRM/Tests/VRM.Tests.asmdef index 92d27823b..b11a29829 100644 --- a/Assets/VRM/Tests/VRM.Tests.asmdef +++ b/Assets/VRM/Tests/VRM.Tests.asmdef @@ -2,10 +2,9 @@ "name": "VRM.Tests", "references": [ "VRM", + "UniVRM.Editor", "UniGLTF", "UniGLTF.Editor", - "MeshUtility", - "MeshUtility.Editor", "VRMShaders.GLTF.IO.Runtime", "VRMShaders.GLTF.IO.Editor" ], diff --git a/Assets/VRM/Tests/VRMLookAtTests.cs b/Assets/VRM/Tests/VRMLookAtTests.cs new file mode 100644 index 000000000..fe01e118e --- /dev/null +++ b/Assets/VRM/Tests/VRMLookAtTests.cs @@ -0,0 +1,48 @@ + +using System.IO; +using NUnit.Framework; +using UniGLTF; +using UnityEngine; + +namespace VRM +{ + public class VRMLookAtTests + { + static string AliciaPath + { + get + { + return Path.GetFullPath(Application.dataPath + "/../Tests/Models/Alicia_vrm-0.51/AliciaSolid_vrm-0.51.vrm") + .Replace("\\", "/"); + } + } + + [Test] + public void VRMLookAtTest() + { + var parser = new GltfParser(); + parser.ParsePath(AliciaPath); + byte[] bytes = default; + using (var loader = new VRMImporterContext(parser)) + { + loader.Load(); + loader.ShowMeshes(); + + var go = loader.Root; + var fp = go.GetComponent(); + GameObject.DestroyImmediate(go.GetComponent()); + go.AddComponent(); + bytes = VRMEditorExporter.Export(go, null, new VRMExportSettings + { + PoseFreeze = true, + }); + } + + var parser2 = new GltfParser(); + parser2.Parse(AliciaPath, bytes); + var loader2 = new VRMImporterContext(parser2); + + Assert.AreEqual(LookAtType.BlendShape, loader2.VRM.firstPerson.lookAtType); + } + } +} diff --git a/Assets/VRM/Tests/VRMLookAtTests.cs.meta b/Assets/VRM/Tests/VRMLookAtTests.cs.meta new file mode 100644 index 000000000..ec3dbbafa --- /dev/null +++ b/Assets/VRM/Tests/VRMLookAtTests.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: e7b3adead70dd34489ba7921d5ccef1c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: From 89634978d19a6b82a16d852542ef397e4ecd792c Mon Sep 17 00:00:00 2001 From: ousttrue Date: Wed, 21 Apr 2021 15:06:28 +0900 Subject: [PATCH 2/2] fix LookAt copy --- .../SkinnedMeshUtility/VRMBoneNormalizer.cs | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/Assets/VRM/Runtime/SkinnedMeshUtility/VRMBoneNormalizer.cs b/Assets/VRM/Runtime/SkinnedMeshUtility/VRMBoneNormalizer.cs index 9fbdcf5d8..d15039a33 100644 --- a/Assets/VRM/Runtime/SkinnedMeshUtility/VRMBoneNormalizer.cs +++ b/Assets/VRM/Runtime/SkinnedMeshUtility/VRMBoneNormalizer.cs @@ -214,6 +214,30 @@ namespace VRM src.CopyTo(root, map); } } + { + // look at + var src = go.GetComponent(); + if (src != null) + { + var dst = root.AddComponent(); + } + } + { + // bone applier + var src = go.GetComponent(); + if (src != null) + { + var dst = root.AddComponent(); + } + } + { + // blendshape applier + var src = go.GetComponent(); + if (src != null) + { + var dst = root.AddComponent(); + } + } { // humanoid