// 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);
}
}
}