From 2e3a60f81efd4e45d3fd9bc44a2dcc23207fce2d Mon Sep 17 00:00:00 2001 From: Masataka SUMI Date: Sun, 28 Jul 2024 19:23:07 +0900 Subject: [PATCH] Ignore using Task.Wait() --- .../Runtime/UniGLTF/IO/ImporterContext.cs | 4 +- .../IO/MaterialIO/Import/MaterialFactory.cs | 33 ++++++++-------- .../Runtime/UniGLTF/IO/MeshIO/MeshUploader.cs | 10 ++++- Assets/VRM10/Runtime/IO/Vrm10Importer.cs | 39 ++++++++++--------- 4 files changed, 47 insertions(+), 39 deletions(-) diff --git a/Assets/UniGLTF/Runtime/UniGLTF/IO/ImporterContext.cs b/Assets/UniGLTF/Runtime/UniGLTF/IO/ImporterContext.cs index 967fb0c07..d7c56f709 100644 --- a/Assets/UniGLTF/Runtime/UniGLTF/IO/ImporterContext.cs +++ b/Assets/UniGLTF/Runtime/UniGLTF/IO/ImporterContext.cs @@ -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; diff --git a/Assets/UniGLTF/Runtime/UniGLTF/IO/MaterialIO/Import/MaterialFactory.cs b/Assets/UniGLTF/Runtime/UniGLTF/IO/MaterialIO/Import/MaterialFactory.cs index f54b4d160..ccf38deb0 100644 --- a/Assets/UniGLTF/Runtime/UniGLTF/IO/MaterialIO/Import/MaterialFactory.cs +++ b/Assets/UniGLTF/Runtime/UniGLTF/IO/MaterialIO/Import/MaterialFactory.cs @@ -11,28 +11,17 @@ namespace UniGLTF { private readonly IReadOnlyDictionary m_externalMap; - MaterialDescriptor m_defaultMaterialParams; + /// + /// デフォルトマテリアルの MaterialDescriptor は IMaterialDescriptorGenerator の実装によって異なるので外から渡す + /// + private readonly MaterialDescriptor m_defaultMaterialParams; /// /// gltfPritmitive.material が無い場合のデフォルトマテリアル /// https://www.khronos.org/registry/glTF/specs/2.0/glTF-2.0.html#default-material + /// /// - Material m_defaultMaterial; - - public Material DefaultMaterial - { - get - { - if (m_defaultMaterial == null) - { - // default material にバリエーションがある? - var task = LoadAsync(m_defaultMaterialParams, (_x, _y) => Task.FromResult(null), new ImmediateCaller()); - task.Wait(); - m_defaultMaterial = task.Result; - } - return m_defaultMaterial; - } - } + private Material m_defaultMaterial; public MaterialFactory(IReadOnlyDictionary externalMaterialMap, MaterialDescriptor defaultMaterialParams) { @@ -110,6 +99,16 @@ namespace UniGLTF return m_materials[index].Asset; } + public async Task GetDefaultMaterialAsync(IAwaitCaller awaitCaller) + { + if (m_defaultMaterial == null) + { + m_defaultMaterial = await LoadAsync(m_defaultMaterialParams, (_, _) => null, awaitCaller); + } + return m_defaultMaterial; + } + + public async Task LoadAsync(MaterialDescriptor matDesc, GetTextureAsyncFunc getTexture, IAwaitCaller awaitCaller) { if (m_externalMap.TryGetValue(matDesc.SubAssetKey, out Material material)) diff --git a/Assets/UniGLTF/Runtime/UniGLTF/IO/MeshIO/MeshUploader.cs b/Assets/UniGLTF/Runtime/UniGLTF/IO/MeshIO/MeshUploader.cs index 337e30af9..98450f1c9 100644 --- a/Assets/UniGLTF/Runtime/UniGLTF/IO/MeshIO/MeshUploader.cs +++ b/Assets/UniGLTF/Runtime/UniGLTF/IO/MeshIO/MeshUploader.cs @@ -89,7 +89,7 @@ namespace UniGLTF public static async Task BuildMeshAndUploadAsync( IAwaitCaller awaitCaller, MeshData data, - Func materialFromIndex) + Func> 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(); diff --git a/Assets/VRM10/Runtime/IO/Vrm10Importer.cs b/Assets/VRM10/Runtime/IO/Vrm10Importer.cs index 6fb7d0a1f..96918786d 100644 --- a/Assets/VRM10/Runtime/IO/Vrm10Importer.cs +++ b/Assets/VRM10/Runtime/IO/Vrm10Importer.cs @@ -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 /// /// MeshFilter + MeshRenderer もしくは SkinnedMeshRenderer を構築する /// - public static Renderer CreateRenderer(VrmLib.Node node, GameObject go, ModelMap map, MaterialFactory materialFactory) + public static async Task 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; }