From 2efcf65e60b145fc1f6304728b3d5a0d44cc5fdb Mon Sep 17 00:00:00 2001 From: ousttrue Date: Mon, 22 Aug 2022 13:00:05 +0900 Subject: [PATCH] LoadBytesAsync --- .../UniGLTF/Runtime/UniGLTF/IO/GltfUtility.cs | 50 +++++--- Assets/VRM/Runtime/IO/VrmUtility.cs | 121 ++++++++++-------- Assets/VRM_Samples/SimpleViewer/ViewerUI.cs | 7 +- 3 files changed, 104 insertions(+), 74 deletions(-) diff --git a/Assets/UniGLTF/Runtime/UniGLTF/IO/GltfUtility.cs b/Assets/UniGLTF/Runtime/UniGLTF/IO/GltfUtility.cs index 666a74e86..dd2238c18 100644 --- a/Assets/UniGLTF/Runtime/UniGLTF/IO/GltfUtility.cs +++ b/Assets/UniGLTF/Runtime/UniGLTF/IO/GltfUtility.cs @@ -1,3 +1,4 @@ +using System; using System.IO; using System.Threading.Tasks; using UnityEngine; @@ -7,28 +8,43 @@ namespace UniGLTF { public static class GltfUtility { - public static async Task LoadAsync(string path, IAwaitCaller awaitCaller = null, IMaterialDescriptorGenerator materialGenerator = null, byte[] bytes = null) + public static async Task LoadAsync(string path, IAwaitCaller awaitCaller = null, IMaterialDescriptorGenerator materialGenerator = null) + { + if (!File.Exists(path)) + { + throw new FileNotFoundException(path); + } + + if (awaitCaller == null) + { + Debug.LogWarning("GltfUtility.LoadAsync: awaitCaller argument is null. ImmediateCaller is used as the default fallback. When playing, we recommend RuntimeOnlyAwaitCaller."); + awaitCaller = new ImmediateCaller(); + } + + using (GltfData data = new AutoGltfFileParser(path).Parse()) + using (var loader = new UniGLTF.ImporterContext(data, materialGenerator: materialGenerator)) + { + return await loader.LoadAsync(awaitCaller); + } + } + + public static async Task LoadBytesAsync(string path, byte[] bytes, IAwaitCaller awaitCaller = null, IMaterialDescriptorGenerator materialGenerator = null) { if (bytes == null) { - if (!File.Exists(path)) - { - throw new FileNotFoundException(path); - } - Debug.LogFormat("{0}", path); - using (GltfData data = new AutoGltfFileParser(path).Parse()) - using (var loader = new UniGLTF.ImporterContext(data, materialGenerator: materialGenerator)) - { - return await loader.LoadAsync(awaitCaller); - } + throw new ArgumentNullException("bytes"); } - else + + if (awaitCaller == null) { - using (GltfData data = new GlbBinaryParser(bytes, path).Parse()) - using (var loader = new UniGLTF.ImporterContext(data, materialGenerator: materialGenerator)) - { - return await loader.LoadAsync(awaitCaller); - } + Debug.LogWarning("GltfUtility.LoadAsync: awaitCaller argument is null. ImmediateCaller is used as the default fallback. When playing, we recommend RuntimeOnlyAwaitCaller."); + awaitCaller = new ImmediateCaller(); + } + + using (GltfData data = new GlbBinaryParser(bytes, path).Parse()) + using (var loader = new UniGLTF.ImporterContext(data, materialGenerator: materialGenerator)) + { + return await loader.LoadAsync(awaitCaller); } } } diff --git a/Assets/VRM/Runtime/IO/VrmUtility.cs b/Assets/VRM/Runtime/IO/VrmUtility.cs index 7efa02322..fec35b4d7 100644 --- a/Assets/VRM/Runtime/IO/VrmUtility.cs +++ b/Assets/VRM/Runtime/IO/VrmUtility.cs @@ -15,84 +15,99 @@ namespace VRM IAwaitCaller awaitCaller = null, MaterialGeneratorCallback materialGeneratorCallback = null, MetaCallback metaCallback = null, - bool loadAnimation = false, - byte[] bytes = null + bool loadAnimation = false ) { + if (!File.Exists(path)) + { + throw new FileNotFoundException(path); + } + if (awaitCaller == null) { Debug.LogWarning("VrmUtility.LoadAsync: awaitCaller argument is null. ImmediateCaller is used as the default fallback. When playing, we recommend RuntimeOnlyAwaitCaller."); awaitCaller = new ImmediateCaller(); } - if (bytes == null) + using (GltfData data = new AutoGltfFileParser(path).Parse()) { - if (!File.Exists(path)) + try { - throw new FileNotFoundException(path); - } - - using (GltfData data = new AutoGltfFileParser(path).Parse()) - { - try + var vrm = new VRMData(data); + IMaterialDescriptorGenerator materialGen = default; + if (materialGeneratorCallback != null) { - var vrm = new VRMData(data); - IMaterialDescriptorGenerator materialGen = default; - if (materialGeneratorCallback != null) - { - materialGen = materialGeneratorCallback(vrm.VrmExtension); - } - using (var loader = new VRMImporterContext(vrm, materialGenerator: materialGen, loadAnimation: loadAnimation)) - { - if (metaCallback != null) - { - var meta = await loader.ReadMetaAsync(awaitCaller, true); - metaCallback(meta); - } - return await loader.LoadAsync(awaitCaller); - } + materialGen = materialGeneratorCallback(vrm.VrmExtension); } - catch (NotVrm0Exception) + using (var loader = new VRMImporterContext(vrm, materialGenerator: materialGen, loadAnimation: loadAnimation)) { - // retry - Debug.LogWarning("file extension is vrm. but not vrm ?"); - using (var loader = new UniGLTF.ImporterContext(data)) + if (metaCallback != null) { - return await loader.LoadAsync(awaitCaller); + var meta = await loader.ReadMetaAsync(awaitCaller, true); + metaCallback(meta); } + return await loader.LoadAsync(awaitCaller); + } + } + catch (NotVrm0Exception) + { + // retry + Debug.LogWarning("file extension is vrm. but not vrm ?"); + using (var loader = new UniGLTF.ImporterContext(data)) + { + return await loader.LoadAsync(awaitCaller); } } } - else + } + + + public static async Task LoadBytesAsync(string path, + byte[] bytes, + IAwaitCaller awaitCaller = null, + MaterialGeneratorCallback materialGeneratorCallback = null, + MetaCallback metaCallback = null, + bool loadAnimation = false + ) + { + if (bytes == null) { - using (GltfData data = new GlbBinaryParser(bytes, path).Parse()) + throw new ArgumentNullException("bytes"); + } + + if (awaitCaller == null) + { + Debug.LogWarning("VrmUtility.LoadAsync: awaitCaller argument is null. ImmediateCaller is used as the default fallback. When playing, we recommend RuntimeOnlyAwaitCaller."); + awaitCaller = new ImmediateCaller(); + } + + using (GltfData data = new GlbBinaryParser(bytes, path).Parse()) + { + try { - try + var vrm = new VRMData(data); + IMaterialDescriptorGenerator materialGen = default; + if (materialGeneratorCallback != null) { - var vrm = new VRMData(data); - IMaterialDescriptorGenerator materialGen = default; - if (materialGeneratorCallback != null) - { - materialGen = materialGeneratorCallback(vrm.VrmExtension); - } - using (var loader = new VRMImporterContext(vrm, materialGenerator: materialGen, loadAnimation: loadAnimation)) - { - if (metaCallback != null) - { - var meta = await loader.ReadMetaAsync(awaitCaller, true); - metaCallback(meta); - } - return await loader.LoadAsync(awaitCaller); - } + materialGen = materialGeneratorCallback(vrm.VrmExtension); } - catch (NotVrm0Exception) + using (var loader = new VRMImporterContext(vrm, materialGenerator: materialGen, loadAnimation: loadAnimation)) { - // retry - Debug.LogWarning("file extension is vrm. but not vrm ?"); - using (var loader = new UniGLTF.ImporterContext(data)) + if (metaCallback != null) { - return await loader.LoadAsync(awaitCaller); + var meta = await loader.ReadMetaAsync(awaitCaller, true); + metaCallback(meta); } + return await loader.LoadAsync(awaitCaller); + } + } + catch (NotVrm0Exception) + { + // retry + Debug.LogWarning("file extension is vrm. but not vrm ?"); + using (var loader = new UniGLTF.ImporterContext(data)) + { + return await loader.LoadAsync(awaitCaller); } } } diff --git a/Assets/VRM_Samples/SimpleViewer/ViewerUI.cs b/Assets/VRM_Samples/SimpleViewer/ViewerUI.cs index 6d6e0d20c..b9e034fdc 100644 --- a/Assets/VRM_Samples/SimpleViewer/ViewerUI.cs +++ b/Assets/VRM_Samples/SimpleViewer/ViewerUI.cs @@ -406,10 +406,9 @@ namespace VRM.SimpleViewer case ".glb": case ".zip": { - var instance = await GltfUtility.LoadAsync(path, + var instance = await GltfUtility.LoadBytesAsync(path, bytes, GetIAwaitCaller(m_useAsync.isOn), - GetGltfMaterialGenerator(m_useUrpMaterial.isOn), - bytes: bytes); + GetGltfMaterialGenerator(m_useUrpMaterial.isOn)); break; } @@ -417,7 +416,7 @@ namespace VRM.SimpleViewer { VrmUtility.MaterialGeneratorCallback materialCallback = (VRM.glTF_VRM_extensions vrm) => GetVrmMaterialGenerator(m_useUrpMaterial.isOn, vrm); VrmUtility.MetaCallback metaCallback = m_texts.UpdateMeta; - var instance = await VrmUtility.LoadAsync(path, GetIAwaitCaller(m_useAsync.isOn), materialCallback, metaCallback, loadAnimation: m_loadAnimation.isOn, bytes: bytes); + var instance = await VrmUtility.LoadBytesAsync(path, bytes, GetIAwaitCaller(m_useAsync.isOn), materialCallback, metaCallback, loadAnimation: m_loadAnimation.isOn); SetModel(instance); break; }