diff --git a/Assets/VRM/Editor/Format/VRMEditorExporter.cs b/Assets/VRM/Editor/Format/VRMEditorExporter.cs index c4489d7a4..6e48f7d88 100644 --- a/Assets/VRM/Editor/Format/VRMEditorExporter.cs +++ b/Assets/VRM/Editor/Format/VRMEditorExporter.cs @@ -16,12 +16,17 @@ namespace VRM /// /// 出力先 /// エクスポート設定 - public static byte[] Export(GameObject exportRoot, VRMMetaObject meta, VRMExportSettings settings) + public static byte[] Export( + GameObject exportRoot, + VRMMetaObject meta, + VRMExportSettings settings, + IMaterialExporter materialExporter = null + ) { List destroy = new List(); try { - return Export(exportRoot, meta, settings, destroy); + return Export(exportRoot, meta, settings, materialExporter, destroy); } finally { @@ -143,9 +148,12 @@ namespace VRM /// /// /// 作業が終わったらDestoryするべき一時オブジェクト - static byte[] Export(GameObject exportRoot, VRMMetaObject meta, - VRMExportSettings settings, - List destroy) + private static byte[] Export( + GameObject exportRoot, + VRMMetaObject meta, + VRMExportSettings settings, + IMaterialExporter materialExporter, + List destroy) { var target = exportRoot; @@ -227,6 +235,7 @@ namespace VRM var gltfExportSettings = settings.GltfExportSettings; using (var exporter = new VRMExporter(data, gltfExportSettings, animationExporter: settings.KeepAnimation ? new EditorAnimationExporter() : null, + materialExporter: materialExporter, textureSerializer: new EditorTextureSerializer())) { exporter.Prepare(target); diff --git a/Assets/VRM/Tests/SampleTests/VRMImportExportTests.cs b/Assets/VRM/Tests/SampleTests/VRMImportExportTests.cs index 9cf0e3591..d0ce6b581 100644 --- a/Assets/VRM/Tests/SampleTests/VRMImportExportTests.cs +++ b/Assets/VRM/Tests/SampleTests/VRMImportExportTests.cs @@ -33,9 +33,11 @@ namespace VRM.Samples public void ImportExportTest() { var path = AliciaPath; - using (var data = new GlbFileParser(path).Parse()) - using (var context = new VRMImporterContext(new VRMData(data))) - using (var loaded = context.Load()) + using var data = new GlbFileParser(path).Parse(); + var vrmData = new VRMData(data); + var materialGenerator = new BuiltInVrmMaterialDescriptorGenerator(vrmData.VrmExtension); + using var context = new VRMImporterContext(vrmData, materialGenerator: materialGenerator); + using var loaded = context.Load(); { loaded.ShowMeshes(); loaded.EnableUpdateWhenOffscreen(); @@ -126,9 +128,11 @@ namespace VRM.Samples public void MeshCopyTest() { var path = AliciaPath; - using (var data = new GlbFileParser(path).Parse()) - using (var context = new VRMImporterContext(new VRMData(data))) - using (var loaded = context.Load()) + using var data = new GlbFileParser(path).Parse(); + var vrmData = new VRMData(data); + var materialGenerator = new BuiltInVrmMaterialDescriptorGenerator(vrmData.VrmExtension); + using var context = new VRMImporterContext(vrmData, materialGenerator: materialGenerator); + using var loaded = context.Load(); { loaded.ShowMeshes(); loaded.EnableUpdateWhenOffscreen(); @@ -147,8 +151,10 @@ namespace VRM.Samples // Aliciaを古いデシリアライザでロードする var path = AliciaPath; - using (var data = new GlbFileParser(path).Parse()) - using (var context = new VRMImporterContext(new VRMData(data))) + using var data = new GlbFileParser(path).Parse(); + var vrmData = new VRMData(data); + var materialGenerator = new BuiltInVrmMaterialDescriptorGenerator(vrmData.VrmExtension); + using var context = new VRMImporterContext(vrmData, materialGenerator: materialGenerator); { var oldJson = context.GLTF.ToJson().ParseAsJson().ToString(" "); diff --git a/Assets/VRM/Tests/TestVrm0X.cs b/Assets/VRM/Tests/TestVrm0X.cs new file mode 100644 index 000000000..6f99e905d --- /dev/null +++ b/Assets/VRM/Tests/TestVrm0X.cs @@ -0,0 +1,32 @@ +using UniGLTF; +using UnityEngine; + +namespace VRM +{ + public static class TestVrm0X + { + public static RuntimeGltfInstance LoadBytesAsBuiltInRP(byte[] bytes) + { + return VrmUtility.LoadBytesAsync( + "", + bytes, + awaitCaller: new ImmediateCaller(), + materialGeneratorCallback: x => new BuiltInVrmMaterialDescriptorGenerator(x) + ).Result; + } + + public static RuntimeGltfInstance LoadPathAsBuiltInRP(string path) + { + return VrmUtility.LoadAsync( + path, + awaitCaller: new ImmediateCaller(), + materialGeneratorCallback: x => new BuiltInVrmMaterialDescriptorGenerator(x) + ).Result; + } + + public static byte[] ExportAsBuiltInRP(GameObject gameObject, VRMExportSettings exportSettings) + { + return VRMEditorExporter.Export(gameObject, null, exportSettings, new BuiltInVrmMaterialExporter()); + } + } +} \ No newline at end of file diff --git a/Assets/VRM/Tests/TestVrm0X.cs.meta b/Assets/VRM/Tests/TestVrm0X.cs.meta new file mode 100644 index 000000000..32d715a00 --- /dev/null +++ b/Assets/VRM/Tests/TestVrm0X.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 47b1209d83114ccbaa0bf02436b8eb04 +timeCreated: 1722265572 \ No newline at end of file diff --git a/Assets/VRM/Tests/VRMLookAtTests.cs b/Assets/VRM/Tests/VRMLookAtTests.cs index a9a07b4a3..40d9424aa 100644 --- a/Assets/VRM/Tests/VRMLookAtTests.cs +++ b/Assets/VRM/Tests/VRMLookAtTests.cs @@ -21,11 +21,8 @@ namespace VRM [Test] public void VRMLookAtTest() { - var data = new GlbFileParser(AliciaPath).Parse(); byte[] bytes = default; - using (data) - using (var loader = new VRMImporterContext(new VRMData(data))) - using (var loaded = loader.Load()) + using var loaded = TestVrm0X.LoadPathAsBuiltInRP(AliciaPath); { loaded.ShowMeshes(); @@ -35,12 +32,12 @@ namespace VRM var lookAt = go.AddComponent(); var settings = (VRMExportSettings)ScriptableObject.CreateInstance(); settings.PoseFreeze = true; - bytes = VRMEditorExporter.Export(go, null, settings); - } + bytes = TestVrm0X.ExportAsBuiltInRP(go, settings); + } - using (var data2 = new GlbLowLevelParser(AliciaPath, bytes).Parse()) - using (var loader2 = new VRMImporterContext(new VRMData(data2))) { + using var data2 = new GlbLowLevelParser(AliciaPath, bytes).Parse(); + using var loader2 = new VRMImporterContext(new VRMData(data2)); Assert.AreEqual(LookAtType.BlendShape, loader2.VRM.firstPerson.lookAtType); } } @@ -48,13 +45,10 @@ namespace VRM [Test] public void VRMLookAtCurveMapWithFreezeTest() { - var data = new GlbFileParser(AliciaPath).Parse(); - byte[] bytes = default; + byte[] bytes; CurveMapper horizontalInner = default; - using (data) - using (var loader = new VRMImporterContext(new VRMData(data))) - using (var loaded = loader.Load()) { + using var loaded = TestVrm0X.LoadPathAsBuiltInRP(AliciaPath); loaded.ShowMeshes(); var go = loaded.gameObject; @@ -63,13 +57,11 @@ namespace VRM horizontalInner = lookAt.HorizontalInner; var settings = ScriptableObject.CreateInstance(); settings.PoseFreeze = true; - bytes = VRMEditorExporter.Export(go, null, settings); + bytes = TestVrm0X.ExportAsBuiltInRP(go, settings); } - using (var data2 = new GlbLowLevelParser(AliciaPath, bytes).Parse()) - using (var loader = new VRMImporterContext(new VRMData(data2))) - using (var loaded = loader.Load()) { + using var loaded = TestVrm0X.LoadBytesAsBuiltInRP(bytes); loaded.ShowMeshes(); var lookAt = loaded.GetComponent(); @@ -81,13 +73,10 @@ namespace VRM [Test] public void VRMLookAtCurveMapTest() { - var data = new GlbFileParser(AliciaPath).Parse(); - byte[] bytes = default; + byte[] bytes; CurveMapper horizontalInner = default; - using (data) - using (var loader = new VRMImporterContext(new VRMData(data))) - using (var loaded = loader.Load()) { + using var loaded = TestVrm0X.LoadPathAsBuiltInRP(AliciaPath); loaded.ShowMeshes(); var go = loaded.gameObject; @@ -96,13 +85,11 @@ namespace VRM horizontalInner = lookAt.HorizontalInner; var settings = (VRMExportSettings)ScriptableObject.CreateInstance(); settings.PoseFreeze = false; - bytes = VRMEditorExporter.Export(go, null, settings); + bytes = TestVrm0X.ExportAsBuiltInRP(go, settings); } - using (var data2 = new GlbLowLevelParser(AliciaPath, bytes).Parse()) - using (var loader = new VRMImporterContext(new VRMData(data2))) - using (var loaded = loader.Load()) { + using var loaded = TestVrm0X.LoadBytesAsBuiltInRP(bytes); loaded.ShowMeshes(); var lookAt = loaded.GetComponent(); diff --git a/Assets/VRM/Tests/VrmDividedMeshTests.cs b/Assets/VRM/Tests/VrmDividedMeshTests.cs index 543b10486..658cda4eb 100644 --- a/Assets/VRM/Tests/VrmDividedMeshTests.cs +++ b/Assets/VRM/Tests/VrmDividedMeshTests.cs @@ -67,13 +67,21 @@ namespace VRM var path = AliciaPath; var loaded = Load(File.ReadAllBytes(path), path); - var exported = VRMExporter.Export(new UniGLTF.GltfExportSettings + var exportSettings = new GltfExportSettings { DivideVertexBuffer = true, // test this ExportOnlyBlendShapePosition = true, ExportTangents = false, UseSparseAccessorForMorphTarget = true, - }, loaded, new EditorTextureSerializer()); + }; + var exported = new ExportingGltfData(); + using var exporter = new VRMExporter( + exported, + exportSettings, + textureSerializer: new EditorTextureSerializer(), + materialExporter: new BuiltInVrmMaterialExporter()); + exporter.Prepare(loaded); + exporter.Export(); var bytes = exported.ToGlbBytes(); var divided = Load(bytes, path);