mirror of
https://github.com/vrm-c/UniVRM.git
synced 2026-05-13 22:09:53 -05:00
Ignore using Task<T>.Wait()
This commit is contained in:
parent
1fe6d0f780
commit
2e3a60f81e
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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))
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user