mirror of
https://github.com/vrm-c/UniVRM.git
synced 2026-08-26 04:39:51 -05:00
TextureDeserializer can await.
This commit is contained in:
@@ -220,29 +220,33 @@ namespace UniGLTF
|
||||
await awaitCaller.NextFrame();
|
||||
}
|
||||
|
||||
public async Task LoadTexturesAsync()
|
||||
public async Task LoadTexturesAsync(IAwaitCaller awaitCaller = null)
|
||||
{
|
||||
awaitCaller = awaitCaller ?? new ImmediateCaller();
|
||||
|
||||
var textures = TextureDescriptorGenerator.Get().GetEnumerable();
|
||||
foreach (var param in textures)
|
||||
{
|
||||
var tex = await TextureFactory.GetTextureAsync(param);
|
||||
var tex = await TextureFactory.GetTextureAsync(param, awaitCaller);
|
||||
}
|
||||
}
|
||||
|
||||
public async Task LoadMaterialsAsync()
|
||||
public async Task LoadMaterialsAsync(IAwaitCaller awaitCaller = null)
|
||||
{
|
||||
awaitCaller = awaitCaller ?? new ImmediateCaller();
|
||||
|
||||
if (Parser.GLTF.materials == null || Parser.GLTF.materials.Count == 0)
|
||||
{
|
||||
// no material. work around.
|
||||
var param = MaterialDescriptorGenerator.Get(Parser, 0);
|
||||
var material = await MaterialFactory.LoadAsync(param, TextureFactory.GetTextureAsync);
|
||||
var material = await MaterialFactory.LoadAsync(param, TextureFactory.GetTextureAsync, awaitCaller);
|
||||
}
|
||||
else
|
||||
{
|
||||
for (int i = 0; i < Parser.GLTF.materials.Count; ++i)
|
||||
{
|
||||
var param = MaterialDescriptorGenerator.Get(Parser, i);
|
||||
var material = await MaterialFactory.LoadAsync(param, TextureFactory.GetTextureAsync);
|
||||
var material = await MaterialFactory.LoadAsync(param, TextureFactory.GetTextureAsync, awaitCaller);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
using System;
|
||||
using UnityEngine;
|
||||
using VRMShaders;
|
||||
|
||||
namespace UniGLTF
|
||||
{
|
||||
@@ -11,7 +12,7 @@ namespace UniGLTF
|
||||
public static RuntimeGltfInstance Load(this ImporterContext self)
|
||||
{
|
||||
var meassureTime = new ImporterContextSpeedLog();
|
||||
var task = self.LoadAsync(default(ImmediateCaller), meassureTime.MeasureTime);
|
||||
var task = self.LoadAsync(new ImmediateCaller(), meassureTime.MeasureTime);
|
||||
if (!task.IsCompleted)
|
||||
{
|
||||
throw new Exception();
|
||||
|
||||
@@ -6,6 +6,7 @@ using UniGLTF;
|
||||
using UniHumanoid;
|
||||
using UnityEngine;
|
||||
using UnityEngine.UI;
|
||||
using VRMShaders;
|
||||
|
||||
|
||||
namespace VRM.Samples
|
||||
@@ -89,7 +90,7 @@ namespace VRM.Samples
|
||||
|
||||
public async Task UpdateMetaAsync(VRMImporterContext context)
|
||||
{
|
||||
var meta = await context.ReadMetaAsync(default(TaskCaller), true);
|
||||
var meta = await context.ReadMetaAsync(new TaskCaller(), true);
|
||||
|
||||
m_textModelTitle.text = meta.Title;
|
||||
m_textModelVersion.text = meta.Version;
|
||||
|
||||
@@ -285,10 +285,7 @@ namespace VRM
|
||||
|
||||
public async Task<VRMMetaObject> ReadMetaAsync(IAwaitCaller awaitCaller = null, bool createThumbnail = false)
|
||||
{
|
||||
if (awaitCaller == null)
|
||||
{
|
||||
awaitCaller = default(ImmediateCaller);
|
||||
}
|
||||
awaitCaller = awaitCaller ?? new ImmediateCaller();
|
||||
|
||||
var meta = ScriptableObject.CreateInstance<VRMMetaObject>();
|
||||
meta.name = "Meta";
|
||||
@@ -303,7 +300,7 @@ namespace VRM
|
||||
if (gltfMeta.texture >= 0)
|
||||
{
|
||||
var (key, param) = GltfTextureImporter.CreateSRGB(Parser, gltfMeta.texture, Vector2.zero, Vector2.one);
|
||||
meta.Thumbnail = await TextureFactory.GetTextureAsync(param) as Texture2D;
|
||||
meta.Thumbnail = await TextureFactory.GetTextureAsync(param, awaitCaller) as Texture2D;
|
||||
}
|
||||
meta.AllowedUser = gltfMeta.allowedUser;
|
||||
meta.ViolentUssage = gltfMeta.violentUssage;
|
||||
|
||||
@@ -1,10 +1,12 @@
|
||||
namespace VRM
|
||||
using VRMShaders;
|
||||
|
||||
namespace VRM
|
||||
{
|
||||
public static class VRMImporterContextExtensions
|
||||
{
|
||||
public static VRMMetaObject ReadMeta(this VRMImporterContext context, bool createThumbnail = false)
|
||||
{
|
||||
var task = context.ReadMetaAsync(default(UniGLTF.ImmediateCaller), createThumbnail);
|
||||
var task = context.ReadMetaAsync(new ImmediateCaller(), createThumbnail);
|
||||
task.Wait();
|
||||
return task.Result;
|
||||
}
|
||||
|
||||
@@ -299,7 +299,7 @@ namespace UniVRM10
|
||||
}
|
||||
if (Vrm10TextureDescriptorGenerator.TryGetMetaThumbnailTextureImportParam(Parser, vrmExtension, out (SubAssetKey, VRMShaders.TextureDescriptor Param) kv))
|
||||
{
|
||||
var texture = await TextureFactory.GetTextureAsync(kv.Param);
|
||||
var texture = await TextureFactory.GetTextureAsync(kv.Param, awaitCaller);
|
||||
if (texture is Texture2D tex2D)
|
||||
{
|
||||
meta.Thumbnail = tex2D;
|
||||
|
||||
@@ -1,8 +1,7 @@
|
||||
using System;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace UniGLTF
|
||||
namespace VRMShaders
|
||||
{
|
||||
/// <summary>
|
||||
/// ImporterContext の 非同期実行 LoadAsync を補助する。
|
||||
@@ -37,7 +36,7 @@ namespace UniGLTF
|
||||
/// <summary>
|
||||
/// 同期実行
|
||||
/// </summary>
|
||||
public struct ImmediateCaller : IAwaitCaller
|
||||
public sealed class ImmediateCaller : IAwaitCaller
|
||||
{
|
||||
public Task NextFrame()
|
||||
{
|
||||
@@ -59,7 +58,7 @@ namespace UniGLTF
|
||||
/// <summary>
|
||||
/// 非同期実行
|
||||
/// </summary>
|
||||
public class TaskCaller : IAwaitCaller
|
||||
public sealed class TaskCaller : IAwaitCaller
|
||||
{
|
||||
public Task NextFrame()
|
||||
{
|
||||
@@ -16,6 +16,6 @@ namespace VRMShaders
|
||||
/// <param name="useMipmap">Texture2D の mipmap が生成されるべきか否か</param>
|
||||
/// <param name="colorSpace">Texture2D の色空間</param>
|
||||
/// <returns></returns>
|
||||
Task<Texture2D> LoadTextureAsync(byte[] imageData, bool useMipmap, ColorSpace colorSpace);
|
||||
Task<Texture2D> LoadTextureAsync(byte[] imageData, bool useMipmap, ColorSpace colorSpace, IAwaitCaller awaitCaller);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6,7 +6,7 @@ using UnityEngine;
|
||||
|
||||
namespace VRMShaders
|
||||
{
|
||||
public delegate Task<Texture> GetTextureAsyncFunc(TextureDescriptor texDesc);
|
||||
public delegate Task<Texture> GetTextureAsyncFunc(TextureDescriptor texDesc, IAwaitCaller awaitCaller);
|
||||
|
||||
public class MaterialFactory : IResponsibilityForDestroyObjects
|
||||
{
|
||||
@@ -100,7 +100,7 @@ namespace VRMShaders
|
||||
return m_materials[index].Asset;
|
||||
}
|
||||
|
||||
public async Task<Material> LoadAsync(MaterialDescriptor matDesc, GetTextureAsyncFunc getTexture)
|
||||
public async Task<Material> LoadAsync(MaterialDescriptor matDesc, GetTextureAsyncFunc getTexture, IAwaitCaller awaitCaller)
|
||||
{
|
||||
if (m_externalMap.TryGetValue(matDesc.SubAssetKey, out Material material))
|
||||
{
|
||||
@@ -110,7 +110,7 @@ namespace VRMShaders
|
||||
|
||||
if (getTexture == null)
|
||||
{
|
||||
getTexture = (_) => Task.FromResult<Texture>(null);
|
||||
getTexture = (x, y) => Task.FromResult<Texture>(null);
|
||||
}
|
||||
|
||||
var shaderName = matDesc.ShaderName;
|
||||
@@ -135,7 +135,7 @@ namespace VRMShaders
|
||||
|
||||
foreach (var kv in matDesc.TextureSlots)
|
||||
{
|
||||
var texture = await getTexture(kv.Value);
|
||||
var texture = await getTexture(kv.Value, awaitCaller);
|
||||
if (texture != null)
|
||||
{
|
||||
material.SetTexture(kv.Key, texture);
|
||||
|
||||
@@ -56,7 +56,7 @@ namespace VRMShaders
|
||||
/// テクスチャ生成情報を基に、テクスチャ生成を行う。
|
||||
/// SubAssetKey が同じ場合はキャッシュを返す。
|
||||
/// </summary>
|
||||
public async Task<Texture> GetTextureAsync(TextureDescriptor texDesc)
|
||||
public async Task<Texture> GetTextureAsync(TextureDescriptor texDesc, IAwaitCaller awaitCaller)
|
||||
{
|
||||
var subAssetKey = texDesc.SubAssetKey;
|
||||
|
||||
@@ -79,7 +79,7 @@ namespace VRMShaders
|
||||
// > contrary to Unity’s usual convention of using Y as “up”
|
||||
// https://docs.unity3d.com/2018.4/Documentation/Manual/StandardShaderMaterialParameterNormalMap.html
|
||||
var data0 = await texDesc.Index0();
|
||||
var rawTexture = await TextureDeserializer.LoadTextureAsync(data0, texDesc.Sampler.EnableMipMap, ColorSpace.Linear);
|
||||
var rawTexture = await TextureDeserializer.LoadTextureAsync(data0, texDesc.Sampler.EnableMipMap, ColorSpace.Linear, awaitCaller);
|
||||
rawTexture.name = subAssetKey.Name;
|
||||
rawTexture.SetSampler(texDesc.Sampler);
|
||||
_textureCache.Add(subAssetKey, rawTexture);
|
||||
@@ -94,12 +94,12 @@ namespace VRMShaders
|
||||
if (texDesc.Index0 != null)
|
||||
{
|
||||
var data0 = await texDesc.Index0();
|
||||
metallicRoughnessTexture = await TextureDeserializer.LoadTextureAsync(data0, texDesc.Sampler.EnableMipMap, ColorSpace.Linear);
|
||||
metallicRoughnessTexture = await TextureDeserializer.LoadTextureAsync(data0, texDesc.Sampler.EnableMipMap, ColorSpace.Linear, awaitCaller);
|
||||
}
|
||||
if (texDesc.Index1 != null)
|
||||
{
|
||||
var data1 = await texDesc.Index1();
|
||||
occlusionTexture = await TextureDeserializer.LoadTextureAsync(data1, texDesc.Sampler.EnableMipMap, ColorSpace.Linear);
|
||||
occlusionTexture = await TextureDeserializer.LoadTextureAsync(data1, texDesc.Sampler.EnableMipMap, ColorSpace.Linear, awaitCaller);
|
||||
}
|
||||
|
||||
var combinedTexture = OcclusionMetallicRoughnessConverter.Import(metallicRoughnessTexture,
|
||||
@@ -115,7 +115,7 @@ namespace VRMShaders
|
||||
case TextureImportTypes.sRGB:
|
||||
{
|
||||
var data0 = await texDesc.Index0();
|
||||
var rawTexture = await TextureDeserializer.LoadTextureAsync(data0, texDesc.Sampler.EnableMipMap, ColorSpace.sRGB);
|
||||
var rawTexture = await TextureDeserializer.LoadTextureAsync(data0, texDesc.Sampler.EnableMipMap, ColorSpace.sRGB, awaitCaller);
|
||||
rawTexture.name = subAssetKey.Name;
|
||||
rawTexture.SetSampler(texDesc.Sampler);
|
||||
_textureCache.Add(subAssetKey, rawTexture);
|
||||
@@ -124,7 +124,7 @@ namespace VRMShaders
|
||||
case TextureImportTypes.Linear:
|
||||
{
|
||||
var data0 = await texDesc.Index0();
|
||||
var rawTexture = await TextureDeserializer.LoadTextureAsync(data0, texDesc.Sampler.EnableMipMap, ColorSpace.Linear);
|
||||
var rawTexture = await TextureDeserializer.LoadTextureAsync(data0, texDesc.Sampler.EnableMipMap, ColorSpace.Linear, awaitCaller);
|
||||
rawTexture.name = subAssetKey.Name;
|
||||
rawTexture.SetSampler(texDesc.Sampler);
|
||||
_textureCache.Add(subAssetKey, rawTexture);
|
||||
|
||||
@@ -9,12 +9,13 @@ namespace VRMShaders
|
||||
/// </summary>
|
||||
public sealed class UnityTextureDeserializer : ITextureDeserializer
|
||||
{
|
||||
public async Task<Texture2D> LoadTextureAsync(byte[] imageData, bool useMipmap, ColorSpace colorSpace)
|
||||
public async Task<Texture2D> LoadTextureAsync(byte[] imageData, bool useMipmap, ColorSpace colorSpace, IAwaitCaller awaitCaller)
|
||||
{
|
||||
var texture = new Texture2D(2, 2, TextureFormat.ARGB32, useMipmap, colorSpace == ColorSpace.Linear);
|
||||
if (imageData != null)
|
||||
{
|
||||
texture.LoadImage(imageData);
|
||||
await awaitCaller.NextFrame();
|
||||
}
|
||||
|
||||
return texture;
|
||||
|
||||
Reference in New Issue
Block a user