// SPDX-FileCopyrightText: 2024 Unity Technologies and the glTFast authors
// SPDX-License-Identifier: Apache-2.0
using System;
using System.Collections.Generic;
namespace GLTFast.Schema
{
///
/// KHR_materials_variants extension.
///
/// KHR_materials_variants extension
[Serializable]
public class MaterialsVariantsRootExtension
{
///
/// Collection of material variants
///
public List variants;
///
public bool JsonUtilityCleanup()
{
return variants != null;
}
internal void GltfSerialize(JsonWriter writer)
{
writer.AddObject();
writer.AddArray("variants");
foreach (var variant in variants)
{
variant.GltfSerialize(writer);
}
writer.CloseArray();
writer.Close();
}
}
///
/// Named materials variant.
///
/// KHR_materials_variants extension
[Serializable]
public class MaterialsVariant : NamedObject
{
internal void GltfSerialize(JsonWriter writer)
{
GltfSerializeName(writer);
}
}
///
/// Mesh primitive level KHR_materials_variants extension.
///
/// KHR_materials_variants extension
[Serializable]
public class MaterialsVariantsMeshPrimitiveExtension
{
///
/// List of material to variants mapping.
///
public List mappings;
///
/// Retrieves the index of the material that corresponds to a material variant.
/// If there's no match for this variant index, it returns false. In this case the default material has to be
/// applied.
///
/// glTF materials variant index.
/// glTF material index.
/// True if there's a matching mapping with the provided variant index. False otherwise.
public bool TryGetMaterialIndex(int variantIndex, out int materialIndex)
{
foreach (var mapping in mappings)
{
foreach (var i in mapping.variants)
{
if (variantIndex == i)
{
materialIndex = mapping.material;
return true;
}
}
}
materialIndex = -1;
return false;
}
internal void GltfSerialize(JsonWriter writer)
{
writer.AddObject();
writer.AddArray("mappings");
foreach (var mapping in mappings)
{
mapping.GltfSerialize(writer);
}
writer.CloseArray();
writer.Close();
}
}
///
/// Maps a material index to one or more materials variants indices.
///
[Serializable]
public class MaterialVariantsMapping
{
/// Material index.
public int material;
/// Materials variants indices.
public int[] variants;
internal void GltfSerialize(JsonWriter writer)
{
writer.AddObject();
writer.AddProperty("material", material);
writer.AddArrayProperty("variants", variants);
writer.Close();
}
}
}