using UniGLTF; namespace UniVRM10.VRM10Viewer { public sealed class OrderedMaterialDescriptorGenerator : IMaterialDescriptorGenerator { private IMaterialImporter[] _importers; public UrpGltfDefaultMaterialImporter DefaultMaterialImporter { get; } = new(); /// /// 順に TryCreateParam を実行して最初に成功したら終わる。 /// 全て失敗したら UrpGltfDefaultMaterialImporter を実行する。 /// 通常 vrm-1.0, unlit, pbr の順に試行する。 /// /// public OrderedMaterialDescriptorGenerator(params IMaterialImporter[] importers) { _importers = importers; } public MaterialDescriptor Get(GltfData data, int i) { foreach (var importer in _importers) { if (importer.TryCreateParam(data, i, out var param)) { return param; } } // NOTE: Fallback to default material if (Symbols.VRM_DEVELOP) { UniGLTFLogger.Warning($"material: {i} out of range. fallback"); } return GetGltfDefault(GltfMaterialImportUtils.ImportMaterialName(i, null)); } public MaterialDescriptor GetGltfDefault(string materialName = null) => DefaultMaterialImporter.CreateParam(materialName); } }