using System; using System.Collections.Generic; using UniGLTF; using UnityEngine; using VRMShaders; namespace VRM { public sealed class VrmTextureDescriptorGenerator : ITextureDescriptorGenerator { private readonly GltfData m_data; private readonly glTF_VRM_extensions m_vrm; private TextureDescriptorSet _textureDescriptorSet; public VrmTextureDescriptorGenerator(GltfData data, glTF_VRM_extensions vrm) { m_data = data; m_vrm = vrm; } public TextureDescriptorSet Get() { if (_textureDescriptorSet == null) { _textureDescriptorSet = new TextureDescriptorSet(); foreach (var (_, param) in EnumerateAllTextures(m_data, m_vrm)) { _textureDescriptorSet.Add(param); } } return _textureDescriptorSet; } private static IEnumerable<(SubAssetKey, TextureDescriptor)> EnumerateAllTextures(GltfData data, glTF_VRM_extensions vrm) { // Materials for (var materialIdx = 0; materialIdx < data.GLTF.materials.Count; ++materialIdx) { var material = data.GLTF.materials[materialIdx]; var vrmMaterial = vrm.materialProperties[materialIdx]; if (vrmMaterial.shader == VRM.glTF_VRM_Material.VRM_USE_GLTFSHADER) { // Unlit or PBR foreach (var kv in GltfPbrTextureImporter.EnumerateAllTextures(data, materialIdx)) { yield return kv; } } else { // MToon など任意の shader foreach (var kv in VRMMToonTextureImporter.EnumerateAllTextures(data, vrm, materialIdx)) { yield return kv; } } } // Thumbnail if (TryGetThumbnailTexture(data, vrm, out var thumbnail)) { yield return thumbnail; } } private static bool TryGetThumbnailTexture(GltfData data, glTF_VRM_extensions vrm, out (SubAssetKey, TextureDescriptor) texture) { if (vrm.meta.texture > -1) { texture = GltfTextureImporter.CreateSrgb(data, vrm.meta.texture, Vector2.zero, Vector2.one); return true; } texture = default; return false; } } }