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