mirror of
https://github.com/vrm-c/UniVRM.git
synced 2026-07-31 06:56:40 -05:00
LoadBytesAsync
This commit is contained in:
parent
1ca7a8684d
commit
2efcf65e60
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user