Ignore using Task<T>.Wait()

This commit is contained in:
Masataka SUMI 2024-07-28 19:23:07 +09:00
parent 1fe6d0f780
commit 2e3a60f81e
4 changed files with 47 additions and 39 deletions

View File

@ -307,7 +307,7 @@ namespace UniGLTF
using (MeasureTime("BuildMesh"))
{
var meshWithMaterials = await MeshUploader.BuildMeshAndUploadAsync(awaitCaller, meshData,
(int? materialIndex) =>
async materialIndex =>
{
if (materialIndex.HasValidIndex())
{
@ -315,7 +315,7 @@ namespace UniGLTF
}
else
{
return MaterialFactory.DefaultMaterial;
return await MaterialFactory.GetDefaultMaterialAsync(awaitCaller);
}
});
var mesh = meshWithMaterials.Mesh;

View File

@ -11,28 +11,17 @@ namespace UniGLTF
{
private readonly IReadOnlyDictionary<SubAssetKey, Material> m_externalMap;
MaterialDescriptor m_defaultMaterialParams;
/// <summary>
/// デフォルトマテリアルの MaterialDescriptor は IMaterialDescriptorGenerator の実装によって異なるので外から渡す
/// </summary>
private readonly MaterialDescriptor m_defaultMaterialParams;
/// <summary>
/// gltfPritmitive.material が無い場合のデフォルトマテリアル
/// https://www.khronos.org/registry/glTF/specs/2.0/glTF-2.0.html#default-material
///
/// </summary>
Material m_defaultMaterial;
public Material DefaultMaterial
{
get
{
if (m_defaultMaterial == null)
{
// default material にバリエーションがある?
var task = LoadAsync(m_defaultMaterialParams, (_x, _y) => Task.FromResult<Texture>(null), new ImmediateCaller());
task.Wait();
m_defaultMaterial = task.Result;
}
return m_defaultMaterial;
}
}
private Material m_defaultMaterial;
public MaterialFactory(IReadOnlyDictionary<SubAssetKey, Material> externalMaterialMap, MaterialDescriptor defaultMaterialParams)
{
@ -110,6 +99,16 @@ namespace UniGLTF
return m_materials[index].Asset;
}
public async Task<Material> GetDefaultMaterialAsync(IAwaitCaller awaitCaller)
{
if (m_defaultMaterial == null)
{
m_defaultMaterial = await LoadAsync(m_defaultMaterialParams, (_, _) => null, awaitCaller);
}
return m_defaultMaterial;
}
public async Task<Material> LoadAsync(MaterialDescriptor matDesc, GetTextureAsyncFunc getTexture, IAwaitCaller awaitCaller)
{
if (m_externalMap.TryGetValue(matDesc.SubAssetKey, out Material material))

View File

@ -89,7 +89,7 @@ namespace UniGLTF
public static async Task<MeshWithMaterials> BuildMeshAndUploadAsync(
IAwaitCaller awaitCaller,
MeshData data,
Func<int?, Material> materialFromIndex)
Func<int?, Task<Material>> materialFromIndex)
{
//Debug.Log(prims.ToJson());
@ -117,10 +117,16 @@ namespace UniGLTF
mesh.RecalculateTangents();
await awaitCaller.NextFrame();
var materials = new Material[data.MaterialIndices.Count];
for (var idx = 0; idx < data.MaterialIndices.Count; ++idx)
{
materials[idx] = await materialFromIndex(data.MaterialIndices[idx]);
}
var result = new MeshWithMaterials
{
Mesh = mesh,
Materials = data.MaterialIndices.Select(materialFromIndex).ToArray(),
Materials = materials,
ShouldSetRendererNodeAsBone = data.ShouldSetRendererNodeAsBone,
};
await awaitCaller.NextFrame();

View File

@ -238,7 +238,7 @@ namespace UniVRM10
continue;
}
CreateRenderer(node, go, map, MaterialFactory);
await CreateRendererAsync(node, go, map, MaterialFactory, awaitCaller);
await awaitCaller.NextFrame();
}
}
@ -799,7 +799,7 @@ namespace UniVRM10
/// <summary>
/// MeshFilter + MeshRenderer もしくは SkinnedMeshRenderer を構築する
/// </summary>
public static Renderer CreateRenderer(VrmLib.Node node, GameObject go, ModelMap map, MaterialFactory materialFactory)
public static async Task<Renderer> CreateRendererAsync(VrmLib.Node node, GameObject go, ModelMap map, MaterialFactory materialFactory, IAwaitCaller awaitCaller)
{
Renderer renderer = null;
var hasBlendShape = node.MeshGroup.Meshes[0].MorphTargets.Any();
@ -833,35 +833,38 @@ namespace UniVRM10
}
else if (node.MeshGroup.Meshes.Count == 1)
{
var materials = node.MeshGroup.Meshes[0].Submeshes.Select(
x =>
var materialCount = node.MeshGroup.Meshes[0].Submeshes.Count;
var materials = new Material[materialCount];
for (var idx = 0; idx < materialCount; ++idx)
{
var materialIndex = node.MeshGroup.Meshes[0].Submeshes[idx].Material;
if (materialIndex.HasValidIndex())
{
if (x.Material.HasValidIndex())
{
return materialFactory.Materials[x.Material.Value].Asset;
}
else
{
return materialFactory.DefaultMaterial;
}
materials[idx] = materialFactory.Materials[materialIndex.Value].Asset;
}
).ToArray();
else
{
materials[idx] = await materialFactory.GetDefaultMaterialAsync(awaitCaller);
}
}
renderer.sharedMaterials = materials;
}
else
{
var materials = node.MeshGroup.Meshes.Select(x =>
var materialCount = node.MeshGroup.Meshes.Count;
var materials = new Material[materialCount];
for (var idx = 0; idx < materialCount; ++idx)
{
if (x.Submeshes[0].Material.HasValidIndex())
var materialIndex = node.MeshGroup.Meshes[idx].Submeshes[0].Material;
if (materialIndex.HasValidIndex())
{
return materialFactory.Materials[x.Submeshes[0].Material.Value].Asset;
materials[idx] = materialFactory.Materials[materialIndex.Value].Asset;
}
else
{
return materialFactory.DefaultMaterial;
materials[idx] = await materialFactory.GetDefaultMaterialAsync(awaitCaller);
}
}
).ToArray();
renderer.sharedMaterials = materials;
}