LoadBytesAsync

This commit is contained in:
ousttrue 2022-08-22 13:00:05 +09:00
parent 1ca7a8684d
commit 2efcf65e60
3 changed files with 104 additions and 74 deletions

View File

@ -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<RuntimeGltfInstance> LoadAsync(string path, IAwaitCaller awaitCaller = null, IMaterialDescriptorGenerator materialGenerator = null, byte[] bytes = null)
public static async Task<RuntimeGltfInstance> 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<RuntimeGltfInstance> 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);
}
}
}

View File

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

View File

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