// SPDX-FileCopyrightText: 2024 Unity Technologies and the glTFast authors // SPDX-License-Identifier: Apache-2.0 using System; using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; using UnityEngine; namespace GLTFast { /// /// Allows switching the materials variant of a glTF scene instance. /// /// KHR_materials_variants extension public class MaterialsVariantsControl : IMaterialsVariantsProvider { IMaterialProvider m_MaterialProvider; IReadOnlyCollection m_Slots; int m_CurrentVariantIndex; internal MaterialsVariantsControl(IMaterialProvider materialProvider, IReadOnlyCollection slots) { m_MaterialProvider = materialProvider; m_Slots = slots; } /// /// Applies a materials variant. /// /// glTF materials variant index. /// Token to submit cancellation requests. The default value is None. /// A task that represents the completion of the method. public async Task ApplyMaterialsVariantAsync(int variantIndex, CancellationToken cancellationToken = default) { var materials = new List(); var tasks = new List(); foreach (var instanceSlot in m_Slots) { tasks.Add(instanceSlot.ApplyMaterialsVariantAsync(variantIndex, m_MaterialProvider, materials, cancellationToken)); } await Task.WhenAll(tasks); m_CurrentVariantIndex = variantIndex; } /// public int MaterialsVariantsCount => m_MaterialProvider.MaterialsVariantsCount; /// public string GetMaterialsVariantName(int index) { return m_MaterialProvider.GetMaterialsVariantName(index); } } }