// <auto-generated/>

//------------------------------------------------------------------------------------------------
//      This file has been programatically generated; DON´T EDIT!
//------------------------------------------------------------------------------------------------

#pragma warning disable SA1001
#pragma warning disable SA1027
#pragma warning disable SA1028
#pragma warning disable SA1121
#pragma warning disable SA1205
#pragma warning disable SA1309
#pragma warning disable SA1402
#pragma warning disable SA1505
#pragma warning disable SA1507
#pragma warning disable SA1508
#pragma warning disable SA1652

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Numerics;
using System.Text.Json;

using JSONREADER = System.Text.Json.Utf8JsonReader;
using JSONWRITER = System.Text.Json.Utf8JsonWriter;
using FIELDINFO = SharpGLTF.Reflection.FieldInfo;


namespace SharpGLTF.Schema2.Tiles3D
{
	using Collections;

	/// <summary>
	/// The element type.
	/// </summary>
	public enum ElementType
	{
		SCALAR,
		VEC2,
		VEC3,
		VEC4,
		MAT2,
		MAT3,
		MAT4,
		STRING,
		BOOLEAN,
		ENUM,
	}


	/// <summary>
	/// The datatype of the element's components. Only applicable to `SCALAR`, `VECN`, and `MATN` types.
	/// </summary>
	public enum DataType
	{
		INT8,
		UINT8,
		INT16,
		UINT16,
		INT32,
		UINT32,
		INT64,
		UINT64,
		FLOAT32,
		FLOAT64,
	}


	/// <summary>
	/// The type of the integer enum value.
	/// </summary>
	public enum IntegerType
	{
		INT8,
		UINT8,
		INT16,
		UINT16,
		INT32,
		UINT32,
		INT64,
		UINT64,
	}


	/// <summary>
	/// The type of values in `stringOffsets`.
	/// </summary>
	public enum ArrayOffsetType
	{
		UINT8,
		UINT16,
		UINT32,
		UINT64,
	}


	/// <summary>
	/// A class property.
	/// </summary>
	#if NET6_0_OR_GREATER
	[System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicConstructors | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicConstructors)]
	#endif
	[global::System.CodeDom.Compiler.GeneratedCodeAttribute("SharpGLTF.CodeGen", "1.0.0.0")]
	partial class StructuralMetadataClassProperty : ExtraProperties
	{
	
		#region reflection
	
		public new const string SCHEMANAME = "property";
		protected override string GetSchemaName() => SCHEMANAME;
	
		protected override IEnumerable<string> ReflectFieldsNames()
		{
			yield return "array";
			yield return "componentType";
			yield return "count";
			yield return "default";
			yield return "description";
			yield return "enumType";
			yield return "max";
			yield return "min";
			yield return "name";
			yield return "noData";
			yield return "normalized";
			yield return "offset";
			yield return "required";
			yield return "scale";
			yield return "semantic";
			yield return "type";
			foreach(var f in base.ReflectFieldsNames()) yield return f;
		}
		protected override bool TryReflectField(string name, out FIELDINFO value)
		{
			switch(name)
			{
				case "array": value = FIELDINFO.From("array",this, instance => instance._array ?? false); return true;
				case "componentType": value = FIELDINFO.From("componentType",this, instance => instance._componentType); return true;
				case "count": value = FIELDINFO.From("count",this, instance => instance._count); return true;
				case "default": value = FIELDINFO.From("default",this, instance => instance._default); return true;
				case "description": value = FIELDINFO.From("description",this, instance => instance._description); return true;
				case "enumType": value = FIELDINFO.From("enumType",this, instance => instance._enumType); return true;
				case "max": value = FIELDINFO.From("max",this, instance => instance._max); return true;
				case "min": value = FIELDINFO.From("min",this, instance => instance._min); return true;
				case "name": value = FIELDINFO.From("name",this, instance => instance._name); return true;
				case "noData": value = FIELDINFO.From("noData",this, instance => instance._noData); return true;
				case "normalized": value = FIELDINFO.From("normalized",this, instance => instance._normalized ?? false); return true;
				case "offset": value = FIELDINFO.From("offset",this, instance => instance._offset); return true;
				case "required": value = FIELDINFO.From("required",this, instance => instance._required ?? false); return true;
				case "scale": value = FIELDINFO.From("scale",this, instance => instance._scale); return true;
				case "semantic": value = FIELDINFO.From("semantic",this, instance => instance._semantic); return true;
				case "type": value = FIELDINFO.From("type",this, instance => instance._type); return true;
				default: return base.TryReflectField(name, out value);
			}
		}
	
		#endregion
	
		#region data
	
		private static readonly Boolean _arrayDefault = false;
		private Boolean? _array = _arrayDefault;
		
		private DataType? _componentType;
		
		private const Int32 _countMinimum = 2;
		private Int32? _count;
		
		private System.Text.Json.Nodes.JsonNode _default;
		
		private String _description;
		
		private String _enumType;
		
		private System.Text.Json.Nodes.JsonNode _max;
		
		private System.Text.Json.Nodes.JsonNode _min;
		
		private String _name;
		
		private System.Text.Json.Nodes.JsonNode _noData;
		
		private static readonly Boolean _normalizedDefault = false;
		private Boolean? _normalized = _normalizedDefault;
		
		private System.Text.Json.Nodes.JsonNode _offset;
		
		private static readonly Boolean _requiredDefault = false;
		private Boolean? _required = _requiredDefault;
		
		private System.Text.Json.Nodes.JsonNode _scale;
		
		private String _semantic;
		
		private ElementType _type;
		
		#endregion
	
		#region serialization
	
		protected override void SerializeProperties(JSONWRITER writer)
		{
			base.SerializeProperties(writer);
			SerializeProperty(writer, "array", _array, _arrayDefault);
			SerializePropertyEnumSymbol<DataType>(writer, "componentType", _componentType);
			SerializeProperty(writer, "count", _count);
			SerializeProperty(writer, "default", _default);
			SerializeProperty(writer, "description", _description);
			SerializeProperty(writer, "enumType", _enumType);
			SerializeProperty(writer, "max", _max);
			SerializeProperty(writer, "min", _min);
			SerializeProperty(writer, "name", _name);
			SerializeProperty(writer, "noData", _noData);
			SerializeProperty(writer, "normalized", _normalized, _normalizedDefault);
			SerializeProperty(writer, "offset", _offset);
			SerializeProperty(writer, "required", _required, _requiredDefault);
			SerializeProperty(writer, "scale", _scale);
			SerializeProperty(writer, "semantic", _semantic);
			SerializePropertyEnumSymbol<ElementType>(writer, "type", _type);
		}
	
		protected override void DeserializeProperty(string jsonPropertyName, ref JSONREADER reader)
		{
			switch (jsonPropertyName)
			{
				case "array": DeserializePropertyValue<StructuralMetadataClassProperty, Boolean?>(ref reader, this, out _array); break;
				case "componentType": _componentType = DeserializePropertyValue<DataType>(ref reader); break;
				case "count": DeserializePropertyValue<StructuralMetadataClassProperty, Int32?>(ref reader, this, out _count); break;
				case "default": DeserializePropertyValue<StructuralMetadataClassProperty, System.Text.Json.Nodes.JsonNode>(ref reader, this, out _default); break;
				case "description": DeserializePropertyValue<StructuralMetadataClassProperty, String>(ref reader, this, out _description); break;
				case "enumType": DeserializePropertyValue<StructuralMetadataClassProperty, String>(ref reader, this, out _enumType); break;
				case "max": DeserializePropertyValue<StructuralMetadataClassProperty, System.Text.Json.Nodes.JsonNode>(ref reader, this, out _max); break;
				case "min": DeserializePropertyValue<StructuralMetadataClassProperty, System.Text.Json.Nodes.JsonNode>(ref reader, this, out _min); break;
				case "name": DeserializePropertyValue<StructuralMetadataClassProperty, String>(ref reader, this, out _name); break;
				case "noData": DeserializePropertyValue<StructuralMetadataClassProperty, System.Text.Json.Nodes.JsonNode>(ref reader, this, out _noData); break;
				case "normalized": DeserializePropertyValue<StructuralMetadataClassProperty, Boolean?>(ref reader, this, out _normalized); break;
				case "offset": DeserializePropertyValue<StructuralMetadataClassProperty, System.Text.Json.Nodes.JsonNode>(ref reader, this, out _offset); break;
				case "required": DeserializePropertyValue<StructuralMetadataClassProperty, Boolean?>(ref reader, this, out _required); break;
				case "scale": DeserializePropertyValue<StructuralMetadataClassProperty, System.Text.Json.Nodes.JsonNode>(ref reader, this, out _scale); break;
				case "semantic": DeserializePropertyValue<StructuralMetadataClassProperty, String>(ref reader, this, out _semantic); break;
				case "type": _type = DeserializePropertyValue<ElementType>(ref reader); break;
				default: base.DeserializeProperty(jsonPropertyName,ref reader); break;
			}
		}
	
		#endregion
	
	}

	/// <summary>
	/// A class containing a set of properties.
	/// </summary>
	#if NET6_0_OR_GREATER
	[System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicConstructors | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicConstructors)]
	#endif
	[global::System.CodeDom.Compiler.GeneratedCodeAttribute("SharpGLTF.CodeGen", "1.0.0.0")]
	partial class StructuralMetadataClass : ExtraProperties
	{
	
		#region reflection
	
		public new const string SCHEMANAME = "class";
		protected override string GetSchemaName() => SCHEMANAME;
	
		protected override IEnumerable<string> ReflectFieldsNames()
		{
			yield return "description";
			yield return "name";
			yield return "properties";
			foreach(var f in base.ReflectFieldsNames()) yield return f;
		}
		protected override bool TryReflectField(string name, out FIELDINFO value)
		{
			switch(name)
			{
				case "description": value = FIELDINFO.From("description",this, instance => instance._description); return true;
				case "name": value = FIELDINFO.From("name",this, instance => instance._name); return true;
				case "properties": value = FIELDINFO.From("properties",this, instance => instance._properties); return true;
				default: return base.TryReflectField(name, out value);
			}
		}
	
		#endregion
	
		#region data
	
		private String _description;
		
		private String _name;
		
		private ChildrenDictionary<StructuralMetadataClassProperty,StructuralMetadataClass> _properties;
		
		#endregion
	
		#region serialization
	
		protected override void SerializeProperties(JSONWRITER writer)
		{
			base.SerializeProperties(writer);
			SerializeProperty(writer, "description", _description);
			SerializeProperty(writer, "name", _name);
			SerializeProperty(writer, "properties", _properties);
		}
	
		protected override void DeserializeProperty(string jsonPropertyName, ref JSONREADER reader)
		{
			switch (jsonPropertyName)
			{
				case "description": DeserializePropertyValue<StructuralMetadataClass, String>(ref reader, this, out _description); break;
				case "name": DeserializePropertyValue<StructuralMetadataClass, String>(ref reader, this, out _name); break;
				case "properties": DeserializePropertyDictionary<StructuralMetadataClass, StructuralMetadataClassProperty>(ref reader, this, _properties); break;
				default: base.DeserializeProperty(jsonPropertyName,ref reader); break;
			}
		}
	
		#endregion
	
	}

	/// <summary>
	/// An enum value.
	/// </summary>
	#if NET6_0_OR_GREATER
	[System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicConstructors | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicConstructors)]
	#endif
	[global::System.CodeDom.Compiler.GeneratedCodeAttribute("SharpGLTF.CodeGen", "1.0.0.0")]
	partial class StructuralMetadataEnumValue : ExtraProperties
	{
	
		#region reflection
	
		public new const string SCHEMANAME = "value";
		protected override string GetSchemaName() => SCHEMANAME;
	
		protected override IEnumerable<string> ReflectFieldsNames()
		{
			yield return "description";
			yield return "name";
			yield return "value";
			foreach(var f in base.ReflectFieldsNames()) yield return f;
		}
		protected override bool TryReflectField(string name, out FIELDINFO value)
		{
			switch(name)
			{
				case "description": value = FIELDINFO.From("description",this, instance => instance._description); return true;
				case "name": value = FIELDINFO.From("name",this, instance => instance._name); return true;
				case "value": value = FIELDINFO.From("value",this, instance => instance._value); return true;
				default: return base.TryReflectField(name, out value);
			}
		}
	
		#endregion
	
		#region data
	
		private String _description;
		
		private String _name;
		
		private Int32 _value;
		
		#endregion
	
		#region serialization
	
		protected override void SerializeProperties(JSONWRITER writer)
		{
			base.SerializeProperties(writer);
			SerializeProperty(writer, "description", _description);
			SerializeProperty(writer, "name", _name);
			SerializeProperty(writer, "value", _value);
		}
	
		protected override void DeserializeProperty(string jsonPropertyName, ref JSONREADER reader)
		{
			switch (jsonPropertyName)
			{
				case "description": DeserializePropertyValue<StructuralMetadataEnumValue, String>(ref reader, this, out _description); break;
				case "name": DeserializePropertyValue<StructuralMetadataEnumValue, String>(ref reader, this, out _name); break;
				case "value": DeserializePropertyValue<StructuralMetadataEnumValue, Int32>(ref reader, this, out _value); break;
				default: base.DeserializeProperty(jsonPropertyName,ref reader); break;
			}
		}
	
		#endregion
	
	}

	/// <summary>
	/// An object defining the values of an enum.
	/// </summary>
	#if NET6_0_OR_GREATER
	[System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicConstructors | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicConstructors)]
	#endif
	[global::System.CodeDom.Compiler.GeneratedCodeAttribute("SharpGLTF.CodeGen", "1.0.0.0")]
	partial class StructuralMetadataEnum : ExtraProperties
	{
	
		#region reflection
	
		public new const string SCHEMANAME = "enum";
		protected override string GetSchemaName() => SCHEMANAME;
	
		protected override IEnumerable<string> ReflectFieldsNames()
		{
			yield return "description";
			yield return "name";
			yield return "valueType";
			yield return "values";
			foreach(var f in base.ReflectFieldsNames()) yield return f;
		}
		protected override bool TryReflectField(string name, out FIELDINFO value)
		{
			switch(name)
			{
				case "description": value = FIELDINFO.From("description",this, instance => instance._description); return true;
				case "name": value = FIELDINFO.From("name",this, instance => instance._name); return true;
				case "valueType": value = FIELDINFO.From("valueType",this, instance => instance._valueType ?? IntegerType.UINT16); return true;
				case "values": value = FIELDINFO.From("values",this, instance => instance._values); return true;
				default: return base.TryReflectField(name, out value);
			}
		}
	
		#endregion
	
		#region data
	
		private String _description;
		
		private String _name;
		
		private const IntegerType _valueTypeDefault = IntegerType.UINT16;
		private IntegerType? _valueType = _valueTypeDefault;
		
		private const int _valuesMinItems = 1;
		private ChildrenList<StructuralMetadataEnumValue,StructuralMetadataEnum> _values;
		
		#endregion
	
		#region serialization
	
		protected override void SerializeProperties(JSONWRITER writer)
		{
			base.SerializeProperties(writer);
			SerializeProperty(writer, "description", _description);
			SerializeProperty(writer, "name", _name);
			SerializePropertyEnumSymbol<IntegerType>(writer, "valueType", _valueType, _valueTypeDefault);
			SerializeProperty(writer, "values", _values, _valuesMinItems);
		}
	
		protected override void DeserializeProperty(string jsonPropertyName, ref JSONREADER reader)
		{
			switch (jsonPropertyName)
			{
				case "description": DeserializePropertyValue<StructuralMetadataEnum, String>(ref reader, this, out _description); break;
				case "name": DeserializePropertyValue<StructuralMetadataEnum, String>(ref reader, this, out _name); break;
				case "valueType": _valueType = DeserializePropertyValue<IntegerType>(ref reader); break;
				case "values": DeserializePropertyList<StructuralMetadataEnum, StructuralMetadataEnumValue>(ref reader, this, _values); break;
				default: base.DeserializeProperty(jsonPropertyName,ref reader); break;
			}
		}
	
		#endregion
	
	}

	/// <summary>
	/// An object defining classes and enums.
	/// </summary>
	#if NET6_0_OR_GREATER
	[System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicConstructors | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicConstructors)]
	#endif
	[global::System.CodeDom.Compiler.GeneratedCodeAttribute("SharpGLTF.CodeGen", "1.0.0.0")]
	partial class StructuralMetadataSchema : ExtraProperties
	{
	
		#region reflection
	
		public new const string SCHEMANAME = "schema";
		protected override string GetSchemaName() => SCHEMANAME;
	
		protected override IEnumerable<string> ReflectFieldsNames()
		{
			yield return "classes";
			yield return "description";
			yield return "enums";
			yield return "id";
			yield return "name";
			yield return "version";
			foreach(var f in base.ReflectFieldsNames()) yield return f;
		}
		protected override bool TryReflectField(string name, out FIELDINFO value)
		{
			switch(name)
			{
				case "classes": value = FIELDINFO.From("classes",this, instance => instance._classes); return true;
				case "description": value = FIELDINFO.From("description",this, instance => instance._description); return true;
				case "enums": value = FIELDINFO.From("enums",this, instance => instance._enums); return true;
				case "id": value = FIELDINFO.From("id",this, instance => instance._id); return true;
				case "name": value = FIELDINFO.From("name",this, instance => instance._name); return true;
				case "version": value = FIELDINFO.From("version",this, instance => instance._version); return true;
				default: return base.TryReflectField(name, out value);
			}
		}
	
		#endregion
	
		#region data
	
		private ChildrenDictionary<StructuralMetadataClass,StructuralMetadataSchema> _classes;
		
		private String _description;
		
		private ChildrenDictionary<StructuralMetadataEnum,StructuralMetadataSchema> _enums;
		
		private String _id;
		
		private String _name;
		
		private String _version;
		
		#endregion
	
		#region serialization
	
		protected override void SerializeProperties(JSONWRITER writer)
		{
			base.SerializeProperties(writer);
			SerializeProperty(writer, "classes", _classes);
			SerializeProperty(writer, "description", _description);
			SerializeProperty(writer, "enums", _enums);
			SerializeProperty(writer, "id", _id);
			SerializeProperty(writer, "name", _name);
			SerializeProperty(writer, "version", _version);
		}
	
		protected override void DeserializeProperty(string jsonPropertyName, ref JSONREADER reader)
		{
			switch (jsonPropertyName)
			{
				case "classes": DeserializePropertyDictionary<StructuralMetadataSchema, StructuralMetadataClass>(ref reader, this, _classes); break;
				case "description": DeserializePropertyValue<StructuralMetadataSchema, String>(ref reader, this, out _description); break;
				case "enums": DeserializePropertyDictionary<StructuralMetadataSchema, StructuralMetadataEnum>(ref reader, this, _enums); break;
				case "id": DeserializePropertyValue<StructuralMetadataSchema, String>(ref reader, this, out _id); break;
				case "name": DeserializePropertyValue<StructuralMetadataSchema, String>(ref reader, this, out _name); break;
				case "version": DeserializePropertyValue<StructuralMetadataSchema, String>(ref reader, this, out _version); break;
				default: base.DeserializeProperty(jsonPropertyName,ref reader); break;
			}
		}
	
		#endregion
	
	}

	/// <summary>
	/// An array of binary property values.
	/// </summary>
	#if NET6_0_OR_GREATER
	[System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicConstructors | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicConstructors)]
	#endif
	[global::System.CodeDom.Compiler.GeneratedCodeAttribute("SharpGLTF.CodeGen", "1.0.0.0")]
	partial class PropertyTableProperty : ExtraProperties
	{
	
		#region reflection
	
		public new const string SCHEMANAME = "property";
		protected override string GetSchemaName() => SCHEMANAME;
	
		protected override IEnumerable<string> ReflectFieldsNames()
		{
			yield return "arrayOffsetType";
			yield return "arrayOffsets";
			yield return "max";
			yield return "min";
			yield return "offset";
			yield return "scale";
			yield return "stringOffsetType";
			yield return "stringOffsets";
			yield return "values";
			foreach(var f in base.ReflectFieldsNames()) yield return f;
		}
		protected override bool TryReflectField(string name, out FIELDINFO value)
		{
			switch(name)
			{
				case "arrayOffsetType": value = FIELDINFO.From("arrayOffsetType",this, instance => instance._arrayOffsetType ?? ArrayOffsetType.UINT32); return true;
				case "arrayOffsets": value = FIELDINFO.From("arrayOffsets",this, instance => instance._arrayOffsets); return true;
				case "max": value = FIELDINFO.From("max",this, instance => instance._max); return true;
				case "min": value = FIELDINFO.From("min",this, instance => instance._min); return true;
				case "offset": value = FIELDINFO.From("offset",this, instance => instance._offset); return true;
				case "scale": value = FIELDINFO.From("scale",this, instance => instance._scale); return true;
				case "stringOffsetType": value = FIELDINFO.From("stringOffsetType",this, instance => instance._stringOffsetType ?? ArrayOffsetType.UINT32); return true;
				case "stringOffsets": value = FIELDINFO.From("stringOffsets",this, instance => instance._stringOffsets); return true;
				case "values": value = FIELDINFO.From("values",this, instance => instance._values); return true;
				default: return base.TryReflectField(name, out value);
			}
		}
	
		#endregion
	
		#region data
	
		private const ArrayOffsetType _arrayOffsetTypeDefault = ArrayOffsetType.UINT32;
		private ArrayOffsetType? _arrayOffsetType = _arrayOffsetTypeDefault;
		
		private Int32? _arrayOffsets;
		
		private System.Text.Json.Nodes.JsonNode _max;
		
		private System.Text.Json.Nodes.JsonNode _min;
		
		private System.Text.Json.Nodes.JsonNode _offset;
		
		private System.Text.Json.Nodes.JsonNode _scale;
		
		private const ArrayOffsetType _stringOffsetTypeDefault = ArrayOffsetType.UINT32;
		private ArrayOffsetType? _stringOffsetType = _stringOffsetTypeDefault;
		
		private Int32? _stringOffsets;
		
		private Int32 _values;
		
		#endregion
	
		#region serialization
	
		protected override void SerializeProperties(JSONWRITER writer)
		{
			base.SerializeProperties(writer);
			SerializePropertyEnumSymbol<ArrayOffsetType>(writer, "arrayOffsetType", _arrayOffsetType, _arrayOffsetTypeDefault);
			SerializeProperty(writer, "arrayOffsets", _arrayOffsets);
			SerializeProperty(writer, "max", _max);
			SerializeProperty(writer, "min", _min);
			SerializeProperty(writer, "offset", _offset);
			SerializeProperty(writer, "scale", _scale);
			SerializePropertyEnumSymbol<ArrayOffsetType>(writer, "stringOffsetType", _stringOffsetType, _stringOffsetTypeDefault);
			SerializeProperty(writer, "stringOffsets", _stringOffsets);
			SerializeProperty(writer, "values", _values);
		}
	
		protected override void DeserializeProperty(string jsonPropertyName, ref JSONREADER reader)
		{
			switch (jsonPropertyName)
			{
				case "arrayOffsetType": _arrayOffsetType = DeserializePropertyValue<ArrayOffsetType>(ref reader); break;
				case "arrayOffsets": DeserializePropertyValue<PropertyTableProperty, Int32?>(ref reader, this, out _arrayOffsets); break;
				case "max": DeserializePropertyValue<PropertyTableProperty, System.Text.Json.Nodes.JsonNode>(ref reader, this, out _max); break;
				case "min": DeserializePropertyValue<PropertyTableProperty, System.Text.Json.Nodes.JsonNode>(ref reader, this, out _min); break;
				case "offset": DeserializePropertyValue<PropertyTableProperty, System.Text.Json.Nodes.JsonNode>(ref reader, this, out _offset); break;
				case "scale": DeserializePropertyValue<PropertyTableProperty, System.Text.Json.Nodes.JsonNode>(ref reader, this, out _scale); break;
				case "stringOffsetType": _stringOffsetType = DeserializePropertyValue<ArrayOffsetType>(ref reader); break;
				case "stringOffsets": DeserializePropertyValue<PropertyTableProperty, Int32?>(ref reader, this, out _stringOffsets); break;
				case "values": DeserializePropertyValue<PropertyTableProperty, Int32>(ref reader, this, out _values); break;
				default: base.DeserializeProperty(jsonPropertyName,ref reader); break;
			}
		}
	
		#endregion
	
	}

	/// <summary>
	/// Properties conforming to a class, organized as property values stored in binary columnar arrays.
	/// </summary>
	#if NET6_0_OR_GREATER
	[System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicConstructors | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicConstructors)]
	#endif
	[global::System.CodeDom.Compiler.GeneratedCodeAttribute("SharpGLTF.CodeGen", "1.0.0.0")]
	partial class PropertyTable : ExtraProperties
	{
	
		#region reflection
	
		public new const string SCHEMANAME = "propertyTable";
		protected override string GetSchemaName() => SCHEMANAME;
	
		protected override IEnumerable<string> ReflectFieldsNames()
		{
			yield return "class";
			yield return "count";
			yield return "name";
			yield return "properties";
			foreach(var f in base.ReflectFieldsNames()) yield return f;
		}
		protected override bool TryReflectField(string name, out FIELDINFO value)
		{
			switch(name)
			{
				case "class": value = FIELDINFO.From("class",this, instance => instance._class); return true;
				case "count": value = FIELDINFO.From("count",this, instance => instance._count); return true;
				case "name": value = FIELDINFO.From("name",this, instance => instance._name); return true;
				case "properties": value = FIELDINFO.From("properties",this, instance => instance._properties); return true;
				default: return base.TryReflectField(name, out value);
			}
		}
	
		#endregion
	
		#region data
	
		private String _class;
		
		private const Int32 _countMinimum = 1;
		private Int32 _count;
		
		private String _name;
		
		private ChildrenDictionary<PropertyTableProperty,PropertyTable> _properties;
		
		#endregion
	
		#region serialization
	
		protected override void SerializeProperties(JSONWRITER writer)
		{
			base.SerializeProperties(writer);
			SerializeProperty(writer, "class", _class);
			SerializeProperty(writer, "count", _count);
			SerializeProperty(writer, "name", _name);
			SerializeProperty(writer, "properties", _properties);
		}
	
		protected override void DeserializeProperty(string jsonPropertyName, ref JSONREADER reader)
		{
			switch (jsonPropertyName)
			{
				case "class": DeserializePropertyValue<PropertyTable, String>(ref reader, this, out _class); break;
				case "count": DeserializePropertyValue<PropertyTable, Int32>(ref reader, this, out _count); break;
				case "name": DeserializePropertyValue<PropertyTable, String>(ref reader, this, out _name); break;
				case "properties": DeserializePropertyDictionary<PropertyTable, PropertyTableProperty>(ref reader, this, _properties); break;
				default: base.DeserializeProperty(jsonPropertyName,ref reader); break;
			}
		}
	
		#endregion
	
	}

	/// <summary>
	/// A texture containing property values.
	/// </summary>
	#if NET6_0_OR_GREATER
	[System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicConstructors | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicConstructors)]
	#endif
	[global::System.CodeDom.Compiler.GeneratedCodeAttribute("SharpGLTF.CodeGen", "1.0.0.0")]
	partial class PropertyTextureProperty : TextureInfo
	{
	
		#region reflection
	
		public new const string SCHEMANAME = "propertyTexture";
		protected override string GetSchemaName() => SCHEMANAME;
	
		protected override IEnumerable<string> ReflectFieldsNames()
		{
			yield return "channels";
			yield return "max";
			yield return "min";
			yield return "offset";
			yield return "scale";
			foreach(var f in base.ReflectFieldsNames()) yield return f;
		}
		protected override bool TryReflectField(string name, out FIELDINFO value)
		{
			switch(name)
			{
				case "channels": value = FIELDINFO.From("channels",this, instance => instance._channels); return true;
				case "max": value = FIELDINFO.From("max",this, instance => instance._max); return true;
				case "min": value = FIELDINFO.From("min",this, instance => instance._min); return true;
				case "offset": value = FIELDINFO.From("offset",this, instance => instance._offset); return true;
				case "scale": value = FIELDINFO.From("scale",this, instance => instance._scale); return true;
				default: return base.TryReflectField(name, out value);
			}
		}
	
		#endregion
	
		#region data
	
		private const int _channelsMinItems = 1;
		private List<Int32> _channels;
		
		private System.Text.Json.Nodes.JsonNode _max;
		
		private System.Text.Json.Nodes.JsonNode _min;
		
		private System.Text.Json.Nodes.JsonNode _offset;
		
		private System.Text.Json.Nodes.JsonNode _scale;
		
		#endregion
	
		#region serialization
	
		protected override void SerializeProperties(JSONWRITER writer)
		{
			base.SerializeProperties(writer);
			SerializeProperty(writer, "channels", _channels, _channelsMinItems);
			SerializeProperty(writer, "max", _max);
			SerializeProperty(writer, "min", _min);
			SerializeProperty(writer, "offset", _offset);
			SerializeProperty(writer, "scale", _scale);
		}
	
		protected override void DeserializeProperty(string jsonPropertyName, ref JSONREADER reader)
		{
			switch (jsonPropertyName)
			{
				case "channels": DeserializePropertyList<PropertyTextureProperty, Int32>(ref reader, this, _channels); break;
				case "max": DeserializePropertyValue<PropertyTextureProperty, System.Text.Json.Nodes.JsonNode>(ref reader, this, out _max); break;
				case "min": DeserializePropertyValue<PropertyTextureProperty, System.Text.Json.Nodes.JsonNode>(ref reader, this, out _min); break;
				case "offset": DeserializePropertyValue<PropertyTextureProperty, System.Text.Json.Nodes.JsonNode>(ref reader, this, out _offset); break;
				case "scale": DeserializePropertyValue<PropertyTextureProperty, System.Text.Json.Nodes.JsonNode>(ref reader, this, out _scale); break;
				default: base.DeserializeProperty(jsonPropertyName,ref reader); break;
			}
		}
	
		#endregion
	
	}

	/// <summary>
	/// Properties conforming to a class, organized as property values stored in textures.
	/// </summary>
	#if NET6_0_OR_GREATER
	[System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicConstructors | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicConstructors)]
	#endif
	[global::System.CodeDom.Compiler.GeneratedCodeAttribute("SharpGLTF.CodeGen", "1.0.0.0")]
	partial class PropertyTexture : ExtraProperties
	{
	
		#region reflection
	
		public new const string SCHEMANAME = "propertyTexture";
		protected override string GetSchemaName() => SCHEMANAME;
	
		protected override IEnumerable<string> ReflectFieldsNames()
		{
			yield return "class";
			yield return "name";
			yield return "properties";
			foreach(var f in base.ReflectFieldsNames()) yield return f;
		}
		protected override bool TryReflectField(string name, out FIELDINFO value)
		{
			switch(name)
			{
				case "class": value = FIELDINFO.From("class",this, instance => instance._class); return true;
				case "name": value = FIELDINFO.From("name",this, instance => instance._name); return true;
				case "properties": value = FIELDINFO.From("properties",this, instance => instance._properties); return true;
				default: return base.TryReflectField(name, out value);
			}
		}
	
		#endregion
	
		#region data
	
		private String _class;
		
		private String _name;
		
		private ChildrenDictionary<PropertyTextureProperty,PropertyTexture> _properties;
		
		#endregion
	
		#region serialization
	
		protected override void SerializeProperties(JSONWRITER writer)
		{
			base.SerializeProperties(writer);
			SerializeProperty(writer, "class", _class);
			SerializeProperty(writer, "name", _name);
			SerializeProperty(writer, "properties", _properties);
		}
	
		protected override void DeserializeProperty(string jsonPropertyName, ref JSONREADER reader)
		{
			switch (jsonPropertyName)
			{
				case "class": DeserializePropertyValue<PropertyTexture, String>(ref reader, this, out _class); break;
				case "name": DeserializePropertyValue<PropertyTexture, String>(ref reader, this, out _name); break;
				case "properties": DeserializePropertyDictionary<PropertyTexture, PropertyTextureProperty>(ref reader, this, _properties); break;
				default: base.DeserializeProperty(jsonPropertyName,ref reader); break;
			}
		}
	
		#endregion
	
	}

	/// <summary>
	/// An attribute containing property values.
	/// </summary>
	#if NET6_0_OR_GREATER
	[System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicConstructors | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicConstructors)]
	#endif
	[global::System.CodeDom.Compiler.GeneratedCodeAttribute("SharpGLTF.CodeGen", "1.0.0.0")]
	partial class PropertyAttributeProperty : ExtraProperties
	{
	
		#region reflection
	
		public new const string SCHEMANAME = "property";
		protected override string GetSchemaName() => SCHEMANAME;
	
		protected override IEnumerable<string> ReflectFieldsNames()
		{
			yield return "attribute";
			yield return "max";
			yield return "min";
			yield return "offset";
			yield return "scale";
			foreach(var f in base.ReflectFieldsNames()) yield return f;
		}
		protected override bool TryReflectField(string name, out FIELDINFO value)
		{
			switch(name)
			{
				case "attribute": value = FIELDINFO.From("attribute",this, instance => instance._attribute); return true;
				case "max": value = FIELDINFO.From("max",this, instance => instance._max); return true;
				case "min": value = FIELDINFO.From("min",this, instance => instance._min); return true;
				case "offset": value = FIELDINFO.From("offset",this, instance => instance._offset); return true;
				case "scale": value = FIELDINFO.From("scale",this, instance => instance._scale); return true;
				default: return base.TryReflectField(name, out value);
			}
		}
	
		#endregion
	
		#region data
	
		private String _attribute;
		
		private System.Text.Json.Nodes.JsonNode _max;
		
		private System.Text.Json.Nodes.JsonNode _min;
		
		private System.Text.Json.Nodes.JsonNode _offset;
		
		private System.Text.Json.Nodes.JsonNode _scale;
		
		#endregion
	
		#region serialization
	
		protected override void SerializeProperties(JSONWRITER writer)
		{
			base.SerializeProperties(writer);
			SerializeProperty(writer, "attribute", _attribute);
			SerializeProperty(writer, "max", _max);
			SerializeProperty(writer, "min", _min);
			SerializeProperty(writer, "offset", _offset);
			SerializeProperty(writer, "scale", _scale);
		}
	
		protected override void DeserializeProperty(string jsonPropertyName, ref JSONREADER reader)
		{
			switch (jsonPropertyName)
			{
				case "attribute": DeserializePropertyValue<PropertyAttributeProperty, String>(ref reader, this, out _attribute); break;
				case "max": DeserializePropertyValue<PropertyAttributeProperty, System.Text.Json.Nodes.JsonNode>(ref reader, this, out _max); break;
				case "min": DeserializePropertyValue<PropertyAttributeProperty, System.Text.Json.Nodes.JsonNode>(ref reader, this, out _min); break;
				case "offset": DeserializePropertyValue<PropertyAttributeProperty, System.Text.Json.Nodes.JsonNode>(ref reader, this, out _offset); break;
				case "scale": DeserializePropertyValue<PropertyAttributeProperty, System.Text.Json.Nodes.JsonNode>(ref reader, this, out _scale); break;
				default: base.DeserializeProperty(jsonPropertyName,ref reader); break;
			}
		}
	
		#endregion
	
	}

	/// <summary>
	/// Properties conforming to a class, organized as property values stored in attributes.
	/// </summary>
	#if NET6_0_OR_GREATER
	[System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicConstructors | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicConstructors)]
	#endif
	[global::System.CodeDom.Compiler.GeneratedCodeAttribute("SharpGLTF.CodeGen", "1.0.0.0")]
	partial class PropertyAttribute : ExtraProperties
	{
	
		#region reflection
	
		public new const string SCHEMANAME = "propertyAttribute";
		protected override string GetSchemaName() => SCHEMANAME;
	
		protected override IEnumerable<string> ReflectFieldsNames()
		{
			yield return "class";
			yield return "name";
			yield return "properties";
			foreach(var f in base.ReflectFieldsNames()) yield return f;
		}
		protected override bool TryReflectField(string name, out FIELDINFO value)
		{
			switch(name)
			{
				case "class": value = FIELDINFO.From("class",this, instance => instance._class); return true;
				case "name": value = FIELDINFO.From("name",this, instance => instance._name); return true;
				case "properties": value = FIELDINFO.From("properties",this, instance => instance._properties); return true;
				default: return base.TryReflectField(name, out value);
			}
		}
	
		#endregion
	
		#region data
	
		private String _class;
		
		private String _name;
		
		private ChildrenDictionary<PropertyAttributeProperty,PropertyAttribute> _properties;
		
		#endregion
	
		#region serialization
	
		protected override void SerializeProperties(JSONWRITER writer)
		{
			base.SerializeProperties(writer);
			SerializeProperty(writer, "class", _class);
			SerializeProperty(writer, "name", _name);
			SerializeProperty(writer, "properties", _properties);
		}
	
		protected override void DeserializeProperty(string jsonPropertyName, ref JSONREADER reader)
		{
			switch (jsonPropertyName)
			{
				case "class": DeserializePropertyValue<PropertyAttribute, String>(ref reader, this, out _class); break;
				case "name": DeserializePropertyValue<PropertyAttribute, String>(ref reader, this, out _name); break;
				case "properties": DeserializePropertyDictionary<PropertyAttribute, PropertyAttributeProperty>(ref reader, this, _properties); break;
				default: base.DeserializeProperty(jsonPropertyName,ref reader); break;
			}
		}
	
		#endregion
	
	}

	/// <summary>
	/// glTF extension that provides structural metadata about vertices, texels, and features in a glTF asset.
	/// </summary>
	#if NET6_0_OR_GREATER
	[System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicConstructors | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicConstructors)]
	#endif
	[global::System.CodeDom.Compiler.GeneratedCodeAttribute("SharpGLTF.CodeGen", "1.0.0.0")]
	partial class EXTStructuralMetadataRoot : ExtraProperties
	{
	
		#region reflection
	
		public new const string SCHEMANAME = "EXT_structural_metadata";
		protected override string GetSchemaName() => SCHEMANAME;
	
		protected override IEnumerable<string> ReflectFieldsNames()
		{
			yield return "propertyAttributes";
			yield return "propertyTables";
			yield return "propertyTextures";
			yield return "schema";
			yield return "schemaUri";
			foreach(var f in base.ReflectFieldsNames()) yield return f;
		}
		protected override bool TryReflectField(string name, out FIELDINFO value)
		{
			switch(name)
			{
				case "propertyAttributes": value = FIELDINFO.From("propertyAttributes",this, instance => instance._propertyAttributes); return true;
				case "propertyTables": value = FIELDINFO.From("propertyTables",this, instance => instance._propertyTables); return true;
				case "propertyTextures": value = FIELDINFO.From("propertyTextures",this, instance => instance._propertyTextures); return true;
				case "schema": value = FIELDINFO.From("schema",this, instance => instance._schema); return true;
				case "schemaUri": value = FIELDINFO.From("schemaUri",this, instance => instance._schemaUri); return true;
				default: return base.TryReflectField(name, out value);
			}
		}
	
		#endregion
	
		#region data
	
		private const int _propertyAttributesMinItems = 1;
		private ChildrenList<PropertyAttribute,EXTStructuralMetadataRoot> _propertyAttributes;
		
		private const int _propertyTablesMinItems = 1;
		private ChildrenList<PropertyTable,EXTStructuralMetadataRoot> _propertyTables;
		
		private const int _propertyTexturesMinItems = 1;
		private ChildrenList<PropertyTexture,EXTStructuralMetadataRoot> _propertyTextures;
		
		private StructuralMetadataSchema _schema;
		
		private String _schemaUri;
		
		#endregion
	
		#region serialization
	
		protected override void SerializeProperties(JSONWRITER writer)
		{
			base.SerializeProperties(writer);
			SerializeProperty(writer, "propertyAttributes", _propertyAttributes, _propertyAttributesMinItems);
			SerializeProperty(writer, "propertyTables", _propertyTables, _propertyTablesMinItems);
			SerializeProperty(writer, "propertyTextures", _propertyTextures, _propertyTexturesMinItems);
			SerializePropertyObject(writer, "schema", _schema);
			SerializeProperty(writer, "schemaUri", _schemaUri);
		}
	
		protected override void DeserializeProperty(string jsonPropertyName, ref JSONREADER reader)
		{
			switch (jsonPropertyName)
			{
				case "propertyAttributes": DeserializePropertyList<EXTStructuralMetadataRoot, PropertyAttribute>(ref reader, this, _propertyAttributes); break;
				case "propertyTables": DeserializePropertyList<EXTStructuralMetadataRoot, PropertyTable>(ref reader, this, _propertyTables); break;
				case "propertyTextures": DeserializePropertyList<EXTStructuralMetadataRoot, PropertyTexture>(ref reader, this, _propertyTextures); break;
				case "schema": DeserializePropertyValue<EXTStructuralMetadataRoot, StructuralMetadataSchema>(ref reader, this, out _schema); break;
				case "schemaUri": DeserializePropertyValue<EXTStructuralMetadataRoot, String>(ref reader, this, out _schemaUri); break;
				default: base.DeserializeProperty(jsonPropertyName,ref reader); break;
			}
		}
	
		#endregion
	
	}

}
