瀏覽代碼

Added mechanism to auto-assign parent to children [WIP]

Vicente Penades Armengot 10 月之前
父節點
當前提交
652990bad1
共有 33 個文件被更改,包括 314 次插入266 次删除
  1. 8 4
      build/SharpGLTF.CodeGen/CodeGen/EmitCSharp.cs
  2. 46 2
      src/SharpGLTF.Core/IO/JsonSerializable.cs
  3. 1 1
      src/SharpGLTF.Core/Schema2/Generated/ext.AnimPointer.g.cs
  4. 5 5
      src/SharpGLTF.Core/Schema2/Generated/ext.ClearCoat.g.cs
  5. 1 1
      src/SharpGLTF.Core/Schema2/Generated/ext.Ior.g.cs
  6. 6 6
      src/SharpGLTF.Core/Schema2/Generated/ext.Iridescence.g.cs
  7. 1 1
      src/SharpGLTF.Core/Schema2/Generated/ext.MSFT.TextureDDS.g.cs
  8. 1 1
      src/SharpGLTF.Core/Schema2/Generated/ext.MaterialsEmissiveStrength.g.cs
  9. 4 4
      src/SharpGLTF.Core/Schema2/Generated/ext.MaterialsVolume.g.cs
  10. 1 1
      src/SharpGLTF.Core/Schema2/Generated/ext.MeshGpuInstancing.g.cs
  11. 8 8
      src/SharpGLTF.Core/Schema2/Generated/ext.ModelLightsPunctual.g.cs
  12. 1 1
      src/SharpGLTF.Core/Schema2/Generated/ext.NodeLightsPunctual.g.cs
  13. 4 4
      src/SharpGLTF.Core/Schema2/Generated/ext.Sheen.g.cs
  14. 1 1
      src/SharpGLTF.Core/Schema2/Generated/ext.TextureKTX2.g.cs
  15. 4 4
      src/SharpGLTF.Core/Schema2/Generated/ext.TextureTransform.g.cs
  16. 1 1
      src/SharpGLTF.Core/Schema2/Generated/ext.TextureWEBP.g.cs
  17. 2 2
      src/SharpGLTF.Core/Schema2/Generated/ext.Transmission.g.cs
  18. 1 1
      src/SharpGLTF.Core/Schema2/Generated/ext.XmpJsonLinkedData.Prop.g.cs
  19. 1 1
      src/SharpGLTF.Core/Schema2/Generated/ext.XmpJsonLinkedData.Root.g.cs
  20. 4 4
      src/SharpGLTF.Core/Schema2/Generated/ext.pbrSpecular.g.cs
  21. 5 5
      src/SharpGLTF.Core/Schema2/Generated/ext.pbrSpecularGlossiness.g.cs
  22. 100 100
      src/SharpGLTF.Core/Schema2/Generated/gltf.g.cs
  23. 2 3
      src/SharpGLTF.Core/Schema2/gltf.AnimationChannelTarget.cs
  24. 4 3
      src/SharpGLTF.Core/Schema2/gltf.Asset.cs
  25. 7 7
      src/SharpGLTF.Ext.3DTiles/Schema2/Generated/Ext.CESIUM_ext_instance_features.g.cs
  26. 9 9
      src/SharpGLTF.Ext.3DTiles/Schema2/Generated/Ext.CESIUM_ext_mesh_features.g.cs
  27. 2 2
      src/SharpGLTF.Ext.3DTiles/Schema2/Generated/Ext.CESIUM_ext_structural_metadata_primitive.g.cs
  28. 65 65
      src/SharpGLTF.Ext.3DTiles/Schema2/Generated/Ext.CESIUM_ext_structural_metadata_root.g.cs
  29. 1 1
      src/SharpGLTF.Ext.3DTiles/Schema2/Generated/Ext.CESIUM_primitive_outline.g.cs
  30. 2 2
      src/SharpGLTF.Ext.Agi/Schema2/generated/ext.AgiNodeArticulations.g.cs
  31. 2 2
      src/SharpGLTF.Ext.Agi/Schema2/generated/ext.AgiNodeStkMetadata.g.cs
  32. 10 10
      src/SharpGLTF.Ext.Agi/Schema2/generated/ext.AgiRootArticulations.g.cs
  33. 4 4
      src/SharpGLTF.Ext.Agi/Schema2/generated/ext.AgiRootStkMetadata.g.cs

+ 8 - 4
build/SharpGLTF.CodeGen/CodeGen/EmitCSharp.cs

@@ -635,18 +635,22 @@ namespace SharpGLTF.CodeGen
         {
             var fname = _Emitter.GetFieldRuntimeName(f);
 
+            var ownerTypeName = _Emitter._GetRuntimeName(f.DeclaringClass);
+
             if (f.FieldType is ArrayType atype)
             {
                 var titem = _Emitter._GetRuntimeName(atype.ItemType);
-                return $"DeserializePropertyList<{titem}>({_READERMODIFIER}reader, {fname});";
+                return $"DeserializePropertyList<{ownerTypeName}, {titem}>({_READERMODIFIER}reader, this, {fname});";
             }
             else if (f.FieldType is DictionaryType dtype)
             {
                 var titem = _Emitter._GetRuntimeName(dtype.ValueType);
-                return $"DeserializePropertyDictionary<{titem}>({_READERMODIFIER}reader, {fname});";
+                return $"DeserializePropertyDictionary<{ownerTypeName}, {titem}>({_READERMODIFIER}reader, this, {fname});";
             }
+            
+            var fieldTypeName = _Emitter._GetRuntimeName(f.FieldType);            
 
-            return $"{fname} = DeserializePropertyValue<{_Emitter._GetRuntimeName(f.FieldType)}>({_READERMODIFIER}reader);";
+            return $"DeserializePropertyValue<{ownerTypeName}, {fieldTypeName}>({_READERMODIFIER}reader, this, out {fname});";
         }        
 
         public void AddFieldSerializerCase(string line) { _SerializerBody.Add(line); }
@@ -711,6 +715,6 @@ namespace SharpGLTF.CodeGen
             yield return "}";
         }
 
-#endregion
+        #endregion
     }
 }

+ 46 - 2
src/SharpGLTF.Core/IO/JsonSerializable.cs

@@ -1,4 +1,6 @@
-using System;
+using SharpGLTF.Collections;
+
+using System;
 using System.Collections.Generic;
 using System.Diagnostics.CodeAnalysis;
 using System.Linq;
@@ -401,6 +403,38 @@ namespace SharpGLTF.IO
             return (T)v;
         }
 
+        protected static void DeserializePropertyValue<TParent,
+            #if !NETSTANDARD
+            [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors | DynamicallyAccessedMemberTypes.NonPublicConstructors)]
+            #endif
+            T>(ref Utf8JsonReader reader, TParent owner, out T property)
+            where TParent: class
+        {
+            _TryCastValue<T>(ref reader, out Object v);
+
+            System.Diagnostics.Debug.Assert(reader.TokenType != JSONTOKEN.StartArray);
+            System.Diagnostics.Debug.Assert(reader.TokenType != JSONTOKEN.StartObject);
+            System.Diagnostics.Debug.Assert(reader.TokenType != JSONTOKEN.PropertyName);
+            // System.Diagnostics.Debug.Assert(reader.TokenType != JsonToken.StartConstructor);
+
+            property = (T)v;
+
+            if (property is IChildOf<TParent> child)
+            {
+                child.SetLogicalParent(owner);
+            }
+        }
+
+        protected static void DeserializePropertyList<TParent,
+            #if !NETSTANDARD
+            [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors | DynamicallyAccessedMemberTypes.NonPublicConstructors)]
+            #endif
+            T>(ref Utf8JsonReader reader, TParent owner, IList<T> list)
+            where TParent : class
+        {
+            DeserializePropertyList<T>(ref reader, list);
+        }
+
         protected static void DeserializePropertyList<
             #if !NETSTANDARD
             [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors | DynamicallyAccessedMemberTypes.NonPublicConstructors)]
@@ -431,13 +465,23 @@ namespace SharpGLTF.IO
             if (list.Count == 0) throw new JSONEXCEPTION("Empty array found.");
 
             System.Diagnostics.Debug.Assert(reader.TokenType == JSONTOKEN.EndArray);
+        }        
+
+        protected static void DeserializePropertyDictionary<TParent,
+            #if !NETSTANDARD
+            [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors | DynamicallyAccessedMemberTypes.NonPublicConstructors)]
+            #endif
+            T>(ref Utf8JsonReader reader, TParent owner, IDictionary<string, T> dict)
+            where TParent : class
+        {
+            DeserializePropertyDictionary<T>(ref reader, dict);
         }
 
         protected static void DeserializePropertyDictionary<
             #if !NETSTANDARD
             [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors | DynamicallyAccessedMemberTypes.NonPublicConstructors)]
             #endif
-            T>(ref Utf8JsonReader reader, IDictionary<string, T> dict)
+            T>(ref Utf8JsonReader reader, IDictionary<string, T> dict)            
         {
             Guard.NotNull(dict, nameof(dict));
 

+ 1 - 1
src/SharpGLTF.Core/Schema2/Generated/ext.AnimPointer.g.cs

@@ -50,7 +50,7 @@ namespace SharpGLTF.Schema2
 		{
 			switch (jsonPropertyName)
 			{
-				case "pointer": _pointer = DeserializePropertyValue<String>(ref reader); break;
+				case "pointer": DeserializePropertyValue<AnimationPointer, String>(ref reader, this, out _pointer); break;
 				default: base.DeserializeProperty(jsonPropertyName,ref reader); break;
 			}
 		}

+ 5 - 5
src/SharpGLTF.Core/Schema2/Generated/ext.ClearCoat.g.cs

@@ -68,11 +68,11 @@ namespace SharpGLTF.Schema2
 		{
 			switch (jsonPropertyName)
 			{
-				case "clearcoatFactor": _clearcoatFactor = DeserializePropertyValue<Double?>(ref reader); break;
-				case "clearcoatNormalTexture": _clearcoatNormalTexture = DeserializePropertyValue<MaterialNormalTextureInfo>(ref reader); break;
-				case "clearcoatRoughnessFactor": _clearcoatRoughnessFactor = DeserializePropertyValue<Double?>(ref reader); break;
-				case "clearcoatRoughnessTexture": _clearcoatRoughnessTexture = DeserializePropertyValue<TextureInfo>(ref reader); break;
-				case "clearcoatTexture": _clearcoatTexture = DeserializePropertyValue<TextureInfo>(ref reader); break;
+				case "clearcoatFactor": DeserializePropertyValue<MaterialClearCoat, Double?>(ref reader, this, out _clearcoatFactor); break;
+				case "clearcoatNormalTexture": DeserializePropertyValue<MaterialClearCoat, MaterialNormalTextureInfo>(ref reader, this, out _clearcoatNormalTexture); break;
+				case "clearcoatRoughnessFactor": DeserializePropertyValue<MaterialClearCoat, Double?>(ref reader, this, out _clearcoatRoughnessFactor); break;
+				case "clearcoatRoughnessTexture": DeserializePropertyValue<MaterialClearCoat, TextureInfo>(ref reader, this, out _clearcoatRoughnessTexture); break;
+				case "clearcoatTexture": DeserializePropertyValue<MaterialClearCoat, TextureInfo>(ref reader, this, out _clearcoatTexture); break;
 				default: base.DeserializeProperty(jsonPropertyName,ref reader); break;
 			}
 		}

+ 1 - 1
src/SharpGLTF.Core/Schema2/Generated/ext.Ior.g.cs

@@ -51,7 +51,7 @@ namespace SharpGLTF.Schema2
 		{
 			switch (jsonPropertyName)
 			{
-				case "ior": _ior = DeserializePropertyValue<Double?>(ref reader); break;
+				case "ior": DeserializePropertyValue<MaterialIOR, Double?>(ref reader, this, out _ior); break;
 				default: base.DeserializeProperty(jsonPropertyName,ref reader); break;
 			}
 		}

+ 6 - 6
src/SharpGLTF.Core/Schema2/Generated/ext.Iridescence.g.cs

@@ -74,12 +74,12 @@ namespace SharpGLTF.Schema2
 		{
 			switch (jsonPropertyName)
 			{
-				case "iridescenceFactor": _iridescenceFactor = DeserializePropertyValue<Double?>(ref reader); break;
-				case "iridescenceIor": _iridescenceIor = DeserializePropertyValue<Double?>(ref reader); break;
-				case "iridescenceTexture": _iridescenceTexture = DeserializePropertyValue<TextureInfo>(ref reader); break;
-				case "iridescenceThicknessMaximum": _iridescenceThicknessMaximum = DeserializePropertyValue<Double?>(ref reader); break;
-				case "iridescenceThicknessMinimum": _iridescenceThicknessMinimum = DeserializePropertyValue<Double?>(ref reader); break;
-				case "iridescenceThicknessTexture": _iridescenceThicknessTexture = DeserializePropertyValue<TextureInfo>(ref reader); break;
+				case "iridescenceFactor": DeserializePropertyValue<MaterialIridescence, Double?>(ref reader, this, out _iridescenceFactor); break;
+				case "iridescenceIor": DeserializePropertyValue<MaterialIridescence, Double?>(ref reader, this, out _iridescenceIor); break;
+				case "iridescenceTexture": DeserializePropertyValue<MaterialIridescence, TextureInfo>(ref reader, this, out _iridescenceTexture); break;
+				case "iridescenceThicknessMaximum": DeserializePropertyValue<MaterialIridescence, Double?>(ref reader, this, out _iridescenceThicknessMaximum); break;
+				case "iridescenceThicknessMinimum": DeserializePropertyValue<MaterialIridescence, Double?>(ref reader, this, out _iridescenceThicknessMinimum); break;
+				case "iridescenceThicknessTexture": DeserializePropertyValue<MaterialIridescence, TextureInfo>(ref reader, this, out _iridescenceThicknessTexture); break;
 				default: base.DeserializeProperty(jsonPropertyName,ref reader); break;
 			}
 		}

+ 1 - 1
src/SharpGLTF.Core/Schema2/Generated/ext.MSFT.TextureDDS.g.cs

@@ -50,7 +50,7 @@ namespace SharpGLTF.Schema2
 		{
 			switch (jsonPropertyName)
 			{
-				case "source": _source = DeserializePropertyValue<Int32?>(ref reader); break;
+				case "source": DeserializePropertyValue<TextureDDS, Int32?>(ref reader, this, out _source); break;
 				default: base.DeserializeProperty(jsonPropertyName,ref reader); break;
 			}
 		}

+ 1 - 1
src/SharpGLTF.Core/Schema2/Generated/ext.MaterialsEmissiveStrength.g.cs

@@ -52,7 +52,7 @@ namespace SharpGLTF.Schema2
 		{
 			switch (jsonPropertyName)
 			{
-				case "emissiveStrength": _emissiveStrength = DeserializePropertyValue<Double?>(ref reader); break;
+				case "emissiveStrength": DeserializePropertyValue<MaterialEmissiveStrength, Double?>(ref reader, this, out _emissiveStrength); break;
 				default: base.DeserializeProperty(jsonPropertyName,ref reader); break;
 			}
 		}

+ 4 - 4
src/SharpGLTF.Core/Schema2/Generated/ext.MaterialsVolume.g.cs

@@ -63,10 +63,10 @@ namespace SharpGLTF.Schema2
 		{
 			switch (jsonPropertyName)
 			{
-				case "attenuationColor": _attenuationColor = DeserializePropertyValue<Vector3?>(ref reader); break;
-				case "attenuationDistance": _attenuationDistance = DeserializePropertyValue<Double?>(ref reader); break;
-				case "thicknessFactor": _thicknessFactor = DeserializePropertyValue<Double?>(ref reader); break;
-				case "thicknessTexture": _thicknessTexture = DeserializePropertyValue<TextureInfo>(ref reader); break;
+				case "attenuationColor": DeserializePropertyValue<MaterialVolume, Vector3?>(ref reader, this, out _attenuationColor); break;
+				case "attenuationDistance": DeserializePropertyValue<MaterialVolume, Double?>(ref reader, this, out _attenuationDistance); break;
+				case "thicknessFactor": DeserializePropertyValue<MaterialVolume, Double?>(ref reader, this, out _thicknessFactor); break;
+				case "thicknessTexture": DeserializePropertyValue<MaterialVolume, TextureInfo>(ref reader, this, out _thicknessTexture); break;
 				default: base.DeserializeProperty(jsonPropertyName,ref reader); break;
 			}
 		}

+ 1 - 1
src/SharpGLTF.Core/Schema2/Generated/ext.MeshGpuInstancing.g.cs

@@ -50,7 +50,7 @@ namespace SharpGLTF.Schema2
 		{
 			switch (jsonPropertyName)
 			{
-				case "attributes": DeserializePropertyDictionary<Int32>(ref reader, _attributes); break;
+				case "attributes": DeserializePropertyDictionary<MeshGpuInstancing, Int32>(ref reader, this, _attributes); break;
 				default: base.DeserializeProperty(jsonPropertyName,ref reader); break;
 			}
 		}

+ 8 - 8
src/SharpGLTF.Core/Schema2/Generated/ext.ModelLightsPunctual.g.cs

@@ -56,8 +56,8 @@ namespace SharpGLTF.Schema2
 		{
 			switch (jsonPropertyName)
 			{
-				case "innerConeAngle": _innerConeAngle = DeserializePropertyValue<Double?>(ref reader); break;
-				case "outerConeAngle": _outerConeAngle = DeserializePropertyValue<Double?>(ref reader); break;
+				case "innerConeAngle": DeserializePropertyValue<PunctualLightSpot, Double?>(ref reader, this, out _innerConeAngle); break;
+				case "outerConeAngle": DeserializePropertyValue<PunctualLightSpot, Double?>(ref reader, this, out _outerConeAngle); break;
 				default: base.DeserializeProperty(jsonPropertyName,ref reader); break;
 			}
 		}
@@ -103,11 +103,11 @@ namespace SharpGLTF.Schema2
 		{
 			switch (jsonPropertyName)
 			{
-				case "color": _color = DeserializePropertyValue<Vector3?>(ref reader); break;
-				case "intensity": _intensity = DeserializePropertyValue<Double?>(ref reader); break;
-				case "range": _range = DeserializePropertyValue<Double?>(ref reader); break;
-				case "spot": _spot = DeserializePropertyValue<PunctualLightSpot>(ref reader); break;
-				case "type": _type = DeserializePropertyValue<String>(ref reader); break;
+				case "color": DeserializePropertyValue<PunctualLight, Vector3?>(ref reader, this, out _color); break;
+				case "intensity": DeserializePropertyValue<PunctualLight, Double?>(ref reader, this, out _intensity); break;
+				case "range": DeserializePropertyValue<PunctualLight, Double?>(ref reader, this, out _range); break;
+				case "spot": DeserializePropertyValue<PunctualLight, PunctualLightSpot>(ref reader, this, out _spot); break;
+				case "type": DeserializePropertyValue<PunctualLight, String>(ref reader, this, out _type); break;
 				default: base.DeserializeProperty(jsonPropertyName,ref reader); break;
 			}
 		}
@@ -135,7 +135,7 @@ namespace SharpGLTF.Schema2
 		{
 			switch (jsonPropertyName)
 			{
-				case "lights": DeserializePropertyList<PunctualLight>(ref reader, _lights); break;
+				case "lights": DeserializePropertyList<_ModelPunctualLights, PunctualLight>(ref reader, this, _lights); break;
 				default: base.DeserializeProperty(jsonPropertyName,ref reader); break;
 			}
 		}

+ 1 - 1
src/SharpGLTF.Core/Schema2/Generated/ext.NodeLightsPunctual.g.cs

@@ -47,7 +47,7 @@ namespace SharpGLTF.Schema2
 		{
 			switch (jsonPropertyName)
 			{
-				case "light": _light = DeserializePropertyValue<Int32>(ref reader); break;
+				case "light": DeserializePropertyValue<_NodePunctualLight, Int32>(ref reader, this, out _light); break;
 				default: base.DeserializeProperty(jsonPropertyName,ref reader); break;
 			}
 		}

+ 4 - 4
src/SharpGLTF.Core/Schema2/Generated/ext.Sheen.g.cs

@@ -63,10 +63,10 @@ namespace SharpGLTF.Schema2
 		{
 			switch (jsonPropertyName)
 			{
-				case "sheenColorFactor": _sheenColorFactor = DeserializePropertyValue<Vector3?>(ref reader); break;
-				case "sheenColorTexture": _sheenColorTexture = DeserializePropertyValue<TextureInfo>(ref reader); break;
-				case "sheenRoughnessFactor": _sheenRoughnessFactor = DeserializePropertyValue<Single?>(ref reader); break;
-				case "sheenRoughnessTexture": _sheenRoughnessTexture = DeserializePropertyValue<TextureInfo>(ref reader); break;
+				case "sheenColorFactor": DeserializePropertyValue<MaterialSheen, Vector3?>(ref reader, this, out _sheenColorFactor); break;
+				case "sheenColorTexture": DeserializePropertyValue<MaterialSheen, TextureInfo>(ref reader, this, out _sheenColorTexture); break;
+				case "sheenRoughnessFactor": DeserializePropertyValue<MaterialSheen, Single?>(ref reader, this, out _sheenRoughnessFactor); break;
+				case "sheenRoughnessTexture": DeserializePropertyValue<MaterialSheen, TextureInfo>(ref reader, this, out _sheenRoughnessTexture); break;
 				default: base.DeserializeProperty(jsonPropertyName,ref reader); break;
 			}
 		}

+ 1 - 1
src/SharpGLTF.Core/Schema2/Generated/ext.TextureKTX2.g.cs

@@ -50,7 +50,7 @@ namespace SharpGLTF.Schema2
 		{
 			switch (jsonPropertyName)
 			{
-				case "source": _source = DeserializePropertyValue<Int32?>(ref reader); break;
+				case "source": DeserializePropertyValue<TextureKTX2, Int32?>(ref reader, this, out _source); break;
 				default: base.DeserializeProperty(jsonPropertyName,ref reader); break;
 			}
 		}

+ 4 - 4
src/SharpGLTF.Core/Schema2/Generated/ext.TextureTransform.g.cs

@@ -63,10 +63,10 @@ namespace SharpGLTF.Schema2
 		{
 			switch (jsonPropertyName)
 			{
-				case "offset": _offset = DeserializePropertyValue<Vector2?>(ref reader); break;
-				case "rotation": _rotation = DeserializePropertyValue<Double?>(ref reader); break;
-				case "scale": _scale = DeserializePropertyValue<Vector2?>(ref reader); break;
-				case "texCoord": _texCoord = DeserializePropertyValue<Int32?>(ref reader); break;
+				case "offset": DeserializePropertyValue<TextureTransform, Vector2?>(ref reader, this, out _offset); break;
+				case "rotation": DeserializePropertyValue<TextureTransform, Double?>(ref reader, this, out _rotation); break;
+				case "scale": DeserializePropertyValue<TextureTransform, Vector2?>(ref reader, this, out _scale); break;
+				case "texCoord": DeserializePropertyValue<TextureTransform, Int32?>(ref reader, this, out _texCoord); break;
 				default: base.DeserializeProperty(jsonPropertyName,ref reader); break;
 			}
 		}

+ 1 - 1
src/SharpGLTF.Core/Schema2/Generated/ext.TextureWEBP.g.cs

@@ -50,7 +50,7 @@ namespace SharpGLTF.Schema2
 		{
 			switch (jsonPropertyName)
 			{
-				case "source": _source = DeserializePropertyValue<Int32?>(ref reader); break;
+				case "source": DeserializePropertyValue<TextureWEBP, Int32?>(ref reader, this, out _source); break;
 				default: base.DeserializeProperty(jsonPropertyName,ref reader); break;
 			}
 		}

+ 2 - 2
src/SharpGLTF.Core/Schema2/Generated/ext.Transmission.g.cs

@@ -56,8 +56,8 @@ namespace SharpGLTF.Schema2
 		{
 			switch (jsonPropertyName)
 			{
-				case "transmissionFactor": _transmissionFactor = DeserializePropertyValue<Double?>(ref reader); break;
-				case "transmissionTexture": _transmissionTexture = DeserializePropertyValue<TextureInfo>(ref reader); break;
+				case "transmissionFactor": DeserializePropertyValue<MaterialTransmission, Double?>(ref reader, this, out _transmissionFactor); break;
+				case "transmissionTexture": DeserializePropertyValue<MaterialTransmission, TextureInfo>(ref reader, this, out _transmissionTexture); break;
 				default: base.DeserializeProperty(jsonPropertyName,ref reader); break;
 			}
 		}

+ 1 - 1
src/SharpGLTF.Core/Schema2/Generated/ext.XmpJsonLinkedData.Prop.g.cs

@@ -50,7 +50,7 @@ namespace SharpGLTF.Schema2
 		{
 			switch (jsonPropertyName)
 			{
-				case "packet": _packet = DeserializePropertyValue<Int32>(ref reader); break;
+				case "packet": DeserializePropertyValue<XmpPacketReference, Int32>(ref reader, this, out _packet); break;
 				default: base.DeserializeProperty(jsonPropertyName,ref reader); break;
 			}
 		}

+ 1 - 1
src/SharpGLTF.Core/Schema2/Generated/ext.XmpJsonLinkedData.Root.g.cs

@@ -51,7 +51,7 @@ namespace SharpGLTF.Schema2
 		{
 			switch (jsonPropertyName)
 			{
-				case "packets": DeserializePropertyList<System.Text.Json.Nodes.JsonNode>(ref reader, _packets); break;
+				case "packets": DeserializePropertyList<XmpPackets, System.Text.Json.Nodes.JsonNode>(ref reader, this, _packets); break;
 				default: base.DeserializeProperty(jsonPropertyName,ref reader); break;
 			}
 		}

+ 4 - 4
src/SharpGLTF.Core/Schema2/Generated/ext.pbrSpecular.g.cs

@@ -63,10 +63,10 @@ namespace SharpGLTF.Schema2
 		{
 			switch (jsonPropertyName)
 			{
-				case "specularColorFactor": _specularColorFactor = DeserializePropertyValue<Vector3?>(ref reader); break;
-				case "specularColorTexture": _specularColorTexture = DeserializePropertyValue<TextureInfo>(ref reader); break;
-				case "specularFactor": _specularFactor = DeserializePropertyValue<Double?>(ref reader); break;
-				case "specularTexture": _specularTexture = DeserializePropertyValue<TextureInfo>(ref reader); break;
+				case "specularColorFactor": DeserializePropertyValue<MaterialSpecular, Vector3?>(ref reader, this, out _specularColorFactor); break;
+				case "specularColorTexture": DeserializePropertyValue<MaterialSpecular, TextureInfo>(ref reader, this, out _specularColorTexture); break;
+				case "specularFactor": DeserializePropertyValue<MaterialSpecular, Double?>(ref reader, this, out _specularFactor); break;
+				case "specularTexture": DeserializePropertyValue<MaterialSpecular, TextureInfo>(ref reader, this, out _specularTexture); break;
 				default: base.DeserializeProperty(jsonPropertyName,ref reader); break;
 			}
 		}

+ 5 - 5
src/SharpGLTF.Core/Schema2/Generated/ext.pbrSpecularGlossiness.g.cs

@@ -67,11 +67,11 @@ namespace SharpGLTF.Schema2
 		{
 			switch (jsonPropertyName)
 			{
-				case "diffuseFactor": _diffuseFactor = DeserializePropertyValue<Vector4?>(ref reader); break;
-				case "diffuseTexture": _diffuseTexture = DeserializePropertyValue<TextureInfo>(ref reader); break;
-				case "glossinessFactor": _glossinessFactor = DeserializePropertyValue<Double?>(ref reader); break;
-				case "specularFactor": _specularFactor = DeserializePropertyValue<Vector3?>(ref reader); break;
-				case "specularGlossinessTexture": _specularGlossinessTexture = DeserializePropertyValue<TextureInfo>(ref reader); break;
+				case "diffuseFactor": DeserializePropertyValue<MaterialPBRSpecularGlossiness, Vector4?>(ref reader, this, out _diffuseFactor); break;
+				case "diffuseTexture": DeserializePropertyValue<MaterialPBRSpecularGlossiness, TextureInfo>(ref reader, this, out _diffuseTexture); break;
+				case "glossinessFactor": DeserializePropertyValue<MaterialPBRSpecularGlossiness, Double?>(ref reader, this, out _glossinessFactor); break;
+				case "specularFactor": DeserializePropertyValue<MaterialPBRSpecularGlossiness, Vector3?>(ref reader, this, out _specularFactor); break;
+				case "specularGlossinessTexture": DeserializePropertyValue<MaterialPBRSpecularGlossiness, TextureInfo>(ref reader, this, out _specularGlossinessTexture); break;
 				default: base.DeserializeProperty(jsonPropertyName,ref reader); break;
 			}
 		}

+ 100 - 100
src/SharpGLTF.Core/Schema2/Generated/gltf.g.cs

@@ -195,7 +195,7 @@ namespace SharpGLTF.Schema2
 		{
 			switch (jsonPropertyName)
 			{
-				case "name": _name = DeserializePropertyValue<String>(ref reader); break;
+				case "name": DeserializePropertyValue<LogicalChildOfRoot, String>(ref reader, this, out _name); break;
 				default: base.DeserializeProperty(jsonPropertyName,ref reader); break;
 			}
 		}
@@ -233,8 +233,8 @@ namespace SharpGLTF.Schema2
 		{
 			switch (jsonPropertyName)
 			{
-				case "bufferView": _bufferView = DeserializePropertyValue<Int32>(ref reader); break;
-				case "byteOffset": _byteOffset = DeserializePropertyValue<Int32?>(ref reader); break;
+				case "bufferView": DeserializePropertyValue<AccessorSparseIndices, Int32>(ref reader, this, out _bufferView); break;
+				case "byteOffset": DeserializePropertyValue<AccessorSparseIndices, Int32?>(ref reader, this, out _byteOffset); break;
 				case "componentType": _componentType = DeserializePropertyValue<IndexEncodingType>(ref reader); break;
 				default: base.DeserializeProperty(jsonPropertyName,ref reader); break;
 			}
@@ -270,8 +270,8 @@ namespace SharpGLTF.Schema2
 		{
 			switch (jsonPropertyName)
 			{
-				case "bufferView": _bufferView = DeserializePropertyValue<Int32>(ref reader); break;
-				case "byteOffset": _byteOffset = DeserializePropertyValue<Int32?>(ref reader); break;
+				case "bufferView": DeserializePropertyValue<AccessorSparseValues, Int32>(ref reader, this, out _bufferView); break;
+				case "byteOffset": DeserializePropertyValue<AccessorSparseValues, Int32?>(ref reader, this, out _byteOffset); break;
 				default: base.DeserializeProperty(jsonPropertyName,ref reader); break;
 			}
 		}
@@ -308,9 +308,9 @@ namespace SharpGLTF.Schema2
 		{
 			switch (jsonPropertyName)
 			{
-				case "count": _count = DeserializePropertyValue<Int32>(ref reader); break;
-				case "indices": _indices = DeserializePropertyValue<AccessorSparseIndices>(ref reader); break;
-				case "values": _values = DeserializePropertyValue<AccessorSparseValues>(ref reader); break;
+				case "count": DeserializePropertyValue<AccessorSparse, Int32>(ref reader, this, out _count); break;
+				case "indices": DeserializePropertyValue<AccessorSparse, AccessorSparseIndices>(ref reader, this, out _indices); break;
+				case "values": DeserializePropertyValue<AccessorSparse, AccessorSparseValues>(ref reader, this, out _values); break;
 				default: base.DeserializeProperty(jsonPropertyName,ref reader); break;
 			}
 		}
@@ -372,15 +372,15 @@ namespace SharpGLTF.Schema2
 		{
 			switch (jsonPropertyName)
 			{
-				case "bufferView": _bufferView = DeserializePropertyValue<Int32?>(ref reader); break;
-				case "byteOffset": _byteOffset = DeserializePropertyValue<Int32?>(ref reader); break;
+				case "bufferView": DeserializePropertyValue<Accessor, Int32?>(ref reader, this, out _bufferView); break;
+				case "byteOffset": DeserializePropertyValue<Accessor, Int32?>(ref reader, this, out _byteOffset); break;
 				case "componentType": _componentType = DeserializePropertyValue<EncodingType>(ref reader); break;
-				case "count": _count = DeserializePropertyValue<Int32>(ref reader); break;
-				case "max": DeserializePropertyList<Double>(ref reader, _max); break;
-				case "min": DeserializePropertyList<Double>(ref reader, _min); break;
-				case "normalized": _normalized = DeserializePropertyValue<Boolean?>(ref reader); break;
-				case "sparse": _sparse = DeserializePropertyValue<AccessorSparse>(ref reader); break;
-				case "type": _type = DeserializePropertyValue<String>(ref reader); break;
+				case "count": DeserializePropertyValue<Accessor, Int32>(ref reader, this, out _count); break;
+				case "max": DeserializePropertyList<Accessor, Double>(ref reader, this, _max); break;
+				case "min": DeserializePropertyList<Accessor, Double>(ref reader, this, _min); break;
+				case "normalized": DeserializePropertyValue<Accessor, Boolean?>(ref reader, this, out _normalized); break;
+				case "sparse": DeserializePropertyValue<Accessor, AccessorSparse>(ref reader, this, out _sparse); break;
+				case "type": DeserializePropertyValue<Accessor, String>(ref reader, this, out _type); break;
 				default: base.DeserializeProperty(jsonPropertyName,ref reader); break;
 			}
 		}
@@ -413,7 +413,7 @@ namespace SharpGLTF.Schema2
 		{
 			switch (jsonPropertyName)
 			{
-				case "node": _node = DeserializePropertyValue<Int32?>(ref reader); break;
+				case "node": DeserializePropertyValue<AnimationChannelTarget, Int32?>(ref reader, this, out _node); break;
 				case "path": _path = DeserializePropertyValue<PropertyPath>(ref reader); break;
 				default: base.DeserializeProperty(jsonPropertyName,ref reader); break;
 			}
@@ -447,8 +447,8 @@ namespace SharpGLTF.Schema2
 		{
 			switch (jsonPropertyName)
 			{
-				case "sampler": _sampler = DeserializePropertyValue<Int32>(ref reader); break;
-				case "target": _target = DeserializePropertyValue<AnimationChannelTarget>(ref reader); break;
+				case "sampler": DeserializePropertyValue<AnimationChannel, Int32>(ref reader, this, out _sampler); break;
+				case "target": DeserializePropertyValue<AnimationChannel, AnimationChannelTarget>(ref reader, this, out _target); break;
 				default: base.DeserializeProperty(jsonPropertyName,ref reader); break;
 			}
 		}
@@ -485,9 +485,9 @@ namespace SharpGLTF.Schema2
 		{
 			switch (jsonPropertyName)
 			{
-				case "input": _input = DeserializePropertyValue<Int32>(ref reader); break;
+				case "input": DeserializePropertyValue<AnimationSampler, Int32>(ref reader, this, out _input); break;
 				case "interpolation": _interpolation = DeserializePropertyValue<AnimationInterpolationMode>(ref reader); break;
-				case "output": _output = DeserializePropertyValue<Int32>(ref reader); break;
+				case "output": DeserializePropertyValue<AnimationSampler, Int32>(ref reader, this, out _output); break;
 				default: base.DeserializeProperty(jsonPropertyName,ref reader); break;
 			}
 		}
@@ -522,8 +522,8 @@ namespace SharpGLTF.Schema2
 		{
 			switch (jsonPropertyName)
 			{
-				case "channels": DeserializePropertyList<AnimationChannel>(ref reader, _channels); break;
-				case "samplers": DeserializePropertyList<AnimationSampler>(ref reader, _samplers); break;
+				case "channels": DeserializePropertyList<Animation, AnimationChannel>(ref reader, this, _channels); break;
+				case "samplers": DeserializePropertyList<Animation, AnimationSampler>(ref reader, this, _samplers); break;
 				default: base.DeserializeProperty(jsonPropertyName,ref reader); break;
 			}
 		}
@@ -562,10 +562,10 @@ namespace SharpGLTF.Schema2
 		{
 			switch (jsonPropertyName)
 			{
-				case "copyright": _copyright = DeserializePropertyValue<String>(ref reader); break;
-				case "generator": _generator = DeserializePropertyValue<String>(ref reader); break;
-				case "minVersion": _minVersion = DeserializePropertyValue<String>(ref reader); break;
-				case "version": _version = DeserializePropertyValue<String>(ref reader); break;
+				case "copyright": DeserializePropertyValue<Asset, String>(ref reader, this, out _copyright); break;
+				case "generator": DeserializePropertyValue<Asset, String>(ref reader, this, out _generator); break;
+				case "minVersion": DeserializePropertyValue<Asset, String>(ref reader, this, out _minVersion); break;
+				case "version": DeserializePropertyValue<Asset, String>(ref reader, this, out _version); break;
 				default: base.DeserializeProperty(jsonPropertyName,ref reader); break;
 			}
 		}
@@ -599,8 +599,8 @@ namespace SharpGLTF.Schema2
 		{
 			switch (jsonPropertyName)
 			{
-				case "byteLength": _byteLength = DeserializePropertyValue<Int32>(ref reader); break;
-				case "uri": _uri = DeserializePropertyValue<String>(ref reader); break;
+				case "byteLength": DeserializePropertyValue<Buffer, Int32>(ref reader, this, out _byteLength); break;
+				case "uri": DeserializePropertyValue<Buffer, String>(ref reader, this, out _uri); break;
 				default: base.DeserializeProperty(jsonPropertyName,ref reader); break;
 			}
 		}
@@ -647,10 +647,10 @@ namespace SharpGLTF.Schema2
 		{
 			switch (jsonPropertyName)
 			{
-				case "buffer": _buffer = DeserializePropertyValue<Int32>(ref reader); break;
-				case "byteLength": _byteLength = DeserializePropertyValue<Int32>(ref reader); break;
-				case "byteOffset": _byteOffset = DeserializePropertyValue<Int32?>(ref reader); break;
-				case "byteStride": _byteStride = DeserializePropertyValue<Int32?>(ref reader); break;
+				case "buffer": DeserializePropertyValue<BufferView, Int32>(ref reader, this, out _buffer); break;
+				case "byteLength": DeserializePropertyValue<BufferView, Int32>(ref reader, this, out _byteLength); break;
+				case "byteOffset": DeserializePropertyValue<BufferView, Int32?>(ref reader, this, out _byteOffset); break;
+				case "byteStride": DeserializePropertyValue<BufferView, Int32?>(ref reader, this, out _byteStride); break;
 				case "target": _target = DeserializePropertyValue<BufferMode>(ref reader); break;
 				default: base.DeserializeProperty(jsonPropertyName,ref reader); break;
 			}
@@ -692,10 +692,10 @@ namespace SharpGLTF.Schema2
 		{
 			switch (jsonPropertyName)
 			{
-				case "xmag": _xmag = DeserializePropertyValue<Double>(ref reader); break;
-				case "ymag": _ymag = DeserializePropertyValue<Double>(ref reader); break;
-				case "zfar": _zfar = DeserializePropertyValue<Double>(ref reader); break;
-				case "znear": _znear = DeserializePropertyValue<Double>(ref reader); break;
+				case "xmag": DeserializePropertyValue<CameraOrthographic, Double>(ref reader, this, out _xmag); break;
+				case "ymag": DeserializePropertyValue<CameraOrthographic, Double>(ref reader, this, out _ymag); break;
+				case "zfar": DeserializePropertyValue<CameraOrthographic, Double>(ref reader, this, out _zfar); break;
+				case "znear": DeserializePropertyValue<CameraOrthographic, Double>(ref reader, this, out _znear); break;
 				default: base.DeserializeProperty(jsonPropertyName,ref reader); break;
 			}
 		}
@@ -738,10 +738,10 @@ namespace SharpGLTF.Schema2
 		{
 			switch (jsonPropertyName)
 			{
-				case "aspectRatio": _aspectRatio = DeserializePropertyValue<Double?>(ref reader); break;
-				case "yfov": _yfov = DeserializePropertyValue<Double>(ref reader); break;
-				case "zfar": _zfar = DeserializePropertyValue<Double?>(ref reader); break;
-				case "znear": _znear = DeserializePropertyValue<Double>(ref reader); break;
+				case "aspectRatio": DeserializePropertyValue<CameraPerspective, Double?>(ref reader, this, out _aspectRatio); break;
+				case "yfov": DeserializePropertyValue<CameraPerspective, Double>(ref reader, this, out _yfov); break;
+				case "zfar": DeserializePropertyValue<CameraPerspective, Double?>(ref reader, this, out _zfar); break;
+				case "znear": DeserializePropertyValue<CameraPerspective, Double>(ref reader, this, out _znear); break;
 				default: base.DeserializeProperty(jsonPropertyName,ref reader); break;
 			}
 		}
@@ -778,8 +778,8 @@ namespace SharpGLTF.Schema2
 		{
 			switch (jsonPropertyName)
 			{
-				case "orthographic": _orthographic = DeserializePropertyValue<CameraOrthographic>(ref reader); break;
-				case "perspective": _perspective = DeserializePropertyValue<CameraPerspective>(ref reader); break;
+				case "orthographic": DeserializePropertyValue<Camera, CameraOrthographic>(ref reader, this, out _orthographic); break;
+				case "perspective": DeserializePropertyValue<Camera, CameraPerspective>(ref reader, this, out _perspective); break;
 				case "type": _type = DeserializePropertyValue<CameraType>(ref reader); break;
 				default: base.DeserializeProperty(jsonPropertyName,ref reader); break;
 			}
@@ -815,8 +815,8 @@ namespace SharpGLTF.Schema2
 		{
 			switch (jsonPropertyName)
 			{
-				case "index": _index = DeserializePropertyValue<Int32>(ref reader); break;
-				case "texCoord": _texCoord = DeserializePropertyValue<Int32?>(ref reader); break;
+				case "index": DeserializePropertyValue<TextureInfo, Int32>(ref reader, this, out _index); break;
+				case "texCoord": DeserializePropertyValue<TextureInfo, Int32?>(ref reader, this, out _texCoord); break;
 				default: base.DeserializeProperty(jsonPropertyName,ref reader); break;
 			}
 		}
@@ -865,11 +865,11 @@ namespace SharpGLTF.Schema2
 		{
 			switch (jsonPropertyName)
 			{
-				case "baseColorFactor": _baseColorFactor = DeserializePropertyValue<Vector4?>(ref reader); break;
-				case "baseColorTexture": _baseColorTexture = DeserializePropertyValue<TextureInfo>(ref reader); break;
-				case "metallicFactor": _metallicFactor = DeserializePropertyValue<Double?>(ref reader); break;
-				case "metallicRoughnessTexture": _metallicRoughnessTexture = DeserializePropertyValue<TextureInfo>(ref reader); break;
-				case "roughnessFactor": _roughnessFactor = DeserializePropertyValue<Double?>(ref reader); break;
+				case "baseColorFactor": DeserializePropertyValue<MaterialPBRMetallicRoughness, Vector4?>(ref reader, this, out _baseColorFactor); break;
+				case "baseColorTexture": DeserializePropertyValue<MaterialPBRMetallicRoughness, TextureInfo>(ref reader, this, out _baseColorTexture); break;
+				case "metallicFactor": DeserializePropertyValue<MaterialPBRMetallicRoughness, Double?>(ref reader, this, out _metallicFactor); break;
+				case "metallicRoughnessTexture": DeserializePropertyValue<MaterialPBRMetallicRoughness, TextureInfo>(ref reader, this, out _metallicRoughnessTexture); break;
+				case "roughnessFactor": DeserializePropertyValue<MaterialPBRMetallicRoughness, Double?>(ref reader, this, out _roughnessFactor); break;
 				default: base.DeserializeProperty(jsonPropertyName,ref reader); break;
 			}
 		}
@@ -897,7 +897,7 @@ namespace SharpGLTF.Schema2
 		{
 			switch (jsonPropertyName)
 			{
-				case "scale": _scale = DeserializePropertyValue<Double?>(ref reader); break;
+				case "scale": DeserializePropertyValue<MaterialNormalTextureInfo, Double?>(ref reader, this, out _scale); break;
 				default: base.DeserializeProperty(jsonPropertyName,ref reader); break;
 			}
 		}
@@ -927,7 +927,7 @@ namespace SharpGLTF.Schema2
 		{
 			switch (jsonPropertyName)
 			{
-				case "strength": _strength = DeserializePropertyValue<Double?>(ref reader); break;
+				case "strength": DeserializePropertyValue<MaterialOcclusionTextureInfo, Double?>(ref reader, this, out _strength); break;
 				default: base.DeserializeProperty(jsonPropertyName,ref reader); break;
 			}
 		}
@@ -983,14 +983,14 @@ namespace SharpGLTF.Schema2
 		{
 			switch (jsonPropertyName)
 			{
-				case "alphaCutoff": _alphaCutoff = DeserializePropertyValue<Double?>(ref reader); break;
+				case "alphaCutoff": DeserializePropertyValue<Material, Double?>(ref reader, this, out _alphaCutoff); break;
 				case "alphaMode": _alphaMode = DeserializePropertyValue<AlphaMode>(ref reader); break;
-				case "doubleSided": _doubleSided = DeserializePropertyValue<Boolean?>(ref reader); break;
-				case "emissiveFactor": _emissiveFactor = DeserializePropertyValue<Vector3?>(ref reader); break;
-				case "emissiveTexture": _emissiveTexture = DeserializePropertyValue<TextureInfo>(ref reader); break;
-				case "normalTexture": _normalTexture = DeserializePropertyValue<MaterialNormalTextureInfo>(ref reader); break;
-				case "occlusionTexture": _occlusionTexture = DeserializePropertyValue<MaterialOcclusionTextureInfo>(ref reader); break;
-				case "pbrMetallicRoughness": _pbrMetallicRoughness = DeserializePropertyValue<MaterialPBRMetallicRoughness>(ref reader); break;
+				case "doubleSided": DeserializePropertyValue<Material, Boolean?>(ref reader, this, out _doubleSided); break;
+				case "emissiveFactor": DeserializePropertyValue<Material, Vector3?>(ref reader, this, out _emissiveFactor); break;
+				case "emissiveTexture": DeserializePropertyValue<Material, TextureInfo>(ref reader, this, out _emissiveTexture); break;
+				case "normalTexture": DeserializePropertyValue<Material, MaterialNormalTextureInfo>(ref reader, this, out _normalTexture); break;
+				case "occlusionTexture": DeserializePropertyValue<Material, MaterialOcclusionTextureInfo>(ref reader, this, out _occlusionTexture); break;
+				case "pbrMetallicRoughness": DeserializePropertyValue<Material, MaterialPBRMetallicRoughness>(ref reader, this, out _pbrMetallicRoughness); break;
 				default: base.DeserializeProperty(jsonPropertyName,ref reader); break;
 			}
 		}
@@ -1034,11 +1034,11 @@ namespace SharpGLTF.Schema2
 		{
 			switch (jsonPropertyName)
 			{
-				case "attributes": DeserializePropertyDictionary<Int32>(ref reader, _attributes); break;
-				case "indices": _indices = DeserializePropertyValue<Int32?>(ref reader); break;
-				case "material": _material = DeserializePropertyValue<Int32?>(ref reader); break;
+				case "attributes": DeserializePropertyDictionary<MeshPrimitive, Int32>(ref reader, this, _attributes); break;
+				case "indices": DeserializePropertyValue<MeshPrimitive, Int32?>(ref reader, this, out _indices); break;
+				case "material": DeserializePropertyValue<MeshPrimitive, Int32?>(ref reader, this, out _material); break;
 				case "mode": _mode = DeserializePropertyValue<PrimitiveType>(ref reader); break;
-				case "targets": DeserializePropertyList<Dictionary<String,Int32>>(ref reader, _targets); break;
+				case "targets": DeserializePropertyList<MeshPrimitive, Dictionary<String,Int32>>(ref reader, this, _targets); break;
 				default: base.DeserializeProperty(jsonPropertyName,ref reader); break;
 			}
 		}
@@ -1074,8 +1074,8 @@ namespace SharpGLTF.Schema2
 		{
 			switch (jsonPropertyName)
 			{
-				case "primitives": DeserializePropertyList<MeshPrimitive>(ref reader, _primitives); break;
-				case "weights": DeserializePropertyList<Double>(ref reader, _weights); break;
+				case "primitives": DeserializePropertyList<Mesh, MeshPrimitive>(ref reader, this, _primitives); break;
+				case "weights": DeserializePropertyList<Mesh, Double>(ref reader, this, _weights); break;
 				default: base.DeserializeProperty(jsonPropertyName,ref reader); break;
 			}
 		}
@@ -1133,15 +1133,15 @@ namespace SharpGLTF.Schema2
 		{
 			switch (jsonPropertyName)
 			{
-				case "camera": _camera = DeserializePropertyValue<Int32?>(ref reader); break;
-				case "children": DeserializePropertyList<Int32>(ref reader, _children); break;
-				case "matrix": _matrix = DeserializePropertyValue<Matrix4x4?>(ref reader); break;
-				case "mesh": _mesh = DeserializePropertyValue<Int32?>(ref reader); break;
-				case "rotation": _rotation = DeserializePropertyValue<Quaternion?>(ref reader); break;
-				case "scale": _scale = DeserializePropertyValue<Vector3?>(ref reader); break;
-				case "skin": _skin = DeserializePropertyValue<Int32?>(ref reader); break;
-				case "translation": _translation = DeserializePropertyValue<Vector3?>(ref reader); break;
-				case "weights": DeserializePropertyList<Double>(ref reader, _weights); break;
+				case "camera": DeserializePropertyValue<Node, Int32?>(ref reader, this, out _camera); break;
+				case "children": DeserializePropertyList<Node, Int32>(ref reader, this, _children); break;
+				case "matrix": DeserializePropertyValue<Node, Matrix4x4?>(ref reader, this, out _matrix); break;
+				case "mesh": DeserializePropertyValue<Node, Int32?>(ref reader, this, out _mesh); break;
+				case "rotation": DeserializePropertyValue<Node, Quaternion?>(ref reader, this, out _rotation); break;
+				case "scale": DeserializePropertyValue<Node, Vector3?>(ref reader, this, out _scale); break;
+				case "skin": DeserializePropertyValue<Node, Int32?>(ref reader, this, out _skin); break;
+				case "translation": DeserializePropertyValue<Node, Vector3?>(ref reader, this, out _translation); break;
+				case "weights": DeserializePropertyList<Node, Double>(ref reader, this, _weights); break;
 				default: base.DeserializeProperty(jsonPropertyName,ref reader); break;
 			}
 		}
@@ -1216,7 +1216,7 @@ namespace SharpGLTF.Schema2
 		{
 			switch (jsonPropertyName)
 			{
-				case "nodes": DeserializePropertyList<Int32>(ref reader, _nodes); break;
+				case "nodes": DeserializePropertyList<Scene, Int32>(ref reader, this, _nodes); break;
 				default: base.DeserializeProperty(jsonPropertyName,ref reader); break;
 			}
 		}
@@ -1253,9 +1253,9 @@ namespace SharpGLTF.Schema2
 		{
 			switch (jsonPropertyName)
 			{
-				case "inverseBindMatrices": _inverseBindMatrices = DeserializePropertyValue<Int32?>(ref reader); break;
-				case "joints": DeserializePropertyList<Int32>(ref reader, _joints); break;
-				case "skeleton": _skeleton = DeserializePropertyValue<Int32?>(ref reader); break;
+				case "inverseBindMatrices": DeserializePropertyValue<Skin, Int32?>(ref reader, this, out _inverseBindMatrices); break;
+				case "joints": DeserializePropertyList<Skin, Int32>(ref reader, this, _joints); break;
+				case "skeleton": DeserializePropertyValue<Skin, Int32?>(ref reader, this, out _skeleton); break;
 				default: base.DeserializeProperty(jsonPropertyName,ref reader); break;
 			}
 		}
@@ -1288,8 +1288,8 @@ namespace SharpGLTF.Schema2
 		{
 			switch (jsonPropertyName)
 			{
-				case "sampler": _sampler = DeserializePropertyValue<Int32?>(ref reader); break;
-				case "source": _source = DeserializePropertyValue<Int32?>(ref reader); break;
+				case "sampler": DeserializePropertyValue<Texture, Int32?>(ref reader, this, out _sampler); break;
+				case "source": DeserializePropertyValue<Texture, Int32?>(ref reader, this, out _source); break;
 				default: base.DeserializeProperty(jsonPropertyName,ref reader); break;
 			}
 		}
@@ -1382,23 +1382,23 @@ namespace SharpGLTF.Schema2
 		{
 			switch (jsonPropertyName)
 			{
-				case "asset": _asset = DeserializePropertyValue<Asset>(ref reader); break;
-				case "extensionsRequired": DeserializePropertyList<String>(ref reader, _extensionsRequired); break;
-				case "extensionsUsed": DeserializePropertyList<String>(ref reader, _extensionsUsed); break;
-				case "accessors": DeserializePropertyList<Accessor>(ref reader, _accessors); break;
-				case "animations": DeserializePropertyList<Animation>(ref reader, _animations); break;
-				case "bufferViews": DeserializePropertyList<BufferView>(ref reader, _bufferViews); break;
-				case "buffers": DeserializePropertyList<Buffer>(ref reader, _buffers); break;
-				case "cameras": DeserializePropertyList<Camera>(ref reader, _cameras); break;
-				case "images": DeserializePropertyList<Image>(ref reader, _images); break;
-				case "materials": DeserializePropertyList<Material>(ref reader, _materials); break;
-				case "meshes": DeserializePropertyList<Mesh>(ref reader, _meshes); break;
-				case "nodes": DeserializePropertyList<Node>(ref reader, _nodes); break;
-				case "samplers": DeserializePropertyList<TextureSampler>(ref reader, _samplers); break;
-				case "scene": _scene = DeserializePropertyValue<Int32?>(ref reader); break;
-				case "scenes": DeserializePropertyList<Scene>(ref reader, _scenes); break;
-				case "skins": DeserializePropertyList<Skin>(ref reader, _skins); break;
-				case "textures": DeserializePropertyList<Texture>(ref reader, _textures); break;
+				case "asset": DeserializePropertyValue<ModelRoot, Asset>(ref reader, this, out _asset); break;
+				case "extensionsRequired": DeserializePropertyList<ModelRoot, String>(ref reader, this, _extensionsRequired); break;
+				case "extensionsUsed": DeserializePropertyList<ModelRoot, String>(ref reader, this, _extensionsUsed); break;
+				case "accessors": DeserializePropertyList<ModelRoot, Accessor>(ref reader, this, _accessors); break;
+				case "animations": DeserializePropertyList<ModelRoot, Animation>(ref reader, this, _animations); break;
+				case "bufferViews": DeserializePropertyList<ModelRoot, BufferView>(ref reader, this, _bufferViews); break;
+				case "buffers": DeserializePropertyList<ModelRoot, Buffer>(ref reader, this, _buffers); break;
+				case "cameras": DeserializePropertyList<ModelRoot, Camera>(ref reader, this, _cameras); break;
+				case "images": DeserializePropertyList<ModelRoot, Image>(ref reader, this, _images); break;
+				case "materials": DeserializePropertyList<ModelRoot, Material>(ref reader, this, _materials); break;
+				case "meshes": DeserializePropertyList<ModelRoot, Mesh>(ref reader, this, _meshes); break;
+				case "nodes": DeserializePropertyList<ModelRoot, Node>(ref reader, this, _nodes); break;
+				case "samplers": DeserializePropertyList<ModelRoot, TextureSampler>(ref reader, this, _samplers); break;
+				case "scene": DeserializePropertyValue<ModelRoot, Int32?>(ref reader, this, out _scene); break;
+				case "scenes": DeserializePropertyList<ModelRoot, Scene>(ref reader, this, _scenes); break;
+				case "skins": DeserializePropertyList<ModelRoot, Skin>(ref reader, this, _skins); break;
+				case "textures": DeserializePropertyList<ModelRoot, Texture>(ref reader, this, _textures); break;
 				default: base.DeserializeProperty(jsonPropertyName,ref reader); break;
 			}
 		}
@@ -1434,9 +1434,9 @@ namespace SharpGLTF.Schema2
 		{
 			switch (jsonPropertyName)
 			{
-				case "bufferView": _bufferView = DeserializePropertyValue<Int32?>(ref reader); break;
-				case "mimeType": _mimeType = DeserializePropertyValue<String>(ref reader); break;
-				case "uri": _uri = DeserializePropertyValue<String>(ref reader); break;
+				case "bufferView": DeserializePropertyValue<Image, Int32?>(ref reader, this, out _bufferView); break;
+				case "mimeType": DeserializePropertyValue<Image, String>(ref reader, this, out _mimeType); break;
+				case "uri": DeserializePropertyValue<Image, String>(ref reader, this, out _uri); break;
 				default: base.DeserializeProperty(jsonPropertyName,ref reader); break;
 			}
 		}

+ 2 - 3
src/SharpGLTF.Core/Schema2/gltf.AnimationChannelTarget.cs

@@ -10,6 +10,7 @@ using SharpGLTF.Validation;
 using System.Xml.Linq;
 using System.IO;
 using System.Reflection;
+using SharpGLTF.IO;
 
 namespace SharpGLTF.Schema2
 {
@@ -45,7 +46,7 @@ namespace SharpGLTF.Schema2
             }
         }
 
-        AnimationChannel IChildOf<AnimationChannel>.LogicalParent => _Parent;
+        AnimationChannel IChildOf<AnimationChannel>.LogicalParent => _Parent;        
 
         void IChildOf<AnimationChannel>.SetLogicalParent(AnimationChannel parent)
         {
@@ -116,8 +117,6 @@ namespace SharpGLTF.Schema2
             }
         }
 
-        
-
         #endregion
     }
 

+ 4 - 3
src/SharpGLTF.Core/Schema2/gltf.Asset.cs

@@ -3,6 +3,7 @@ using System.Collections.Generic;
 using System.Linq;
 
 using SharpGLTF.Collections;
+using SharpGLTF.IO;
 
 namespace SharpGLTF.Schema2
 {
@@ -26,11 +27,11 @@ namespace SharpGLTF.Schema2
                 _version = MINVERSION.ToString(),
                 _minVersion = null
             };
-        }
+        }        
 
         void IChildOf<ModelRoot>.SetLogicalParent(ModelRoot parent) { LogicalParent = parent; }        
 
-        public ModelRoot LogicalParent { get; private set; }        
+        public ModelRoot LogicalParent { get; private set; }
 
         #endregion        
 
@@ -82,7 +83,7 @@ namespace SharpGLTF.Schema2
             validate.IsGreaterOrEqual(nameof(Version), Version, MINVERSION);
 
             // if (MinVersion > MAXVERSION) result.AddSemanticError( $"Maximum supported version is {MAXVERSION} but found:{MinVersion}");
-        }        
+        }                
 
         #endregion
     }

+ 7 - 7
src/SharpGLTF.Ext.3DTiles/Schema2/Generated/Ext.CESIUM_ext_instance_features.g.cs

@@ -65,11 +65,11 @@ namespace SharpGLTF.Schema2.Tiles3D
 		{
 			switch (jsonPropertyName)
 			{
-				case "attribute": _attribute = DeserializePropertyValue<Int32?>(ref reader); break;
-				case "featureCount": _featureCount = DeserializePropertyValue<Int32>(ref reader); break;
-				case "label": _label = DeserializePropertyValue<String>(ref reader); break;
-				case "nullFeatureId": _nullFeatureId = DeserializePropertyValue<Int32?>(ref reader); break;
-				case "propertyTable": _propertyTable = DeserializePropertyValue<Int32?>(ref reader); break;
+				case "attribute": DeserializePropertyValue<MeshExtInstanceFeatureID, Int32?>(ref reader, this, out _attribute); break;
+				case "featureCount": DeserializePropertyValue<MeshExtInstanceFeatureID, Int32>(ref reader, this, out _featureCount); break;
+				case "label": DeserializePropertyValue<MeshExtInstanceFeatureID, String>(ref reader, this, out _label); break;
+				case "nullFeatureId": DeserializePropertyValue<MeshExtInstanceFeatureID, Int32?>(ref reader, this, out _nullFeatureId); break;
+				case "propertyTable": DeserializePropertyValue<MeshExtInstanceFeatureID, Int32?>(ref reader, this, out _propertyTable); break;
 				default: base.DeserializeProperty(jsonPropertyName,ref reader); break;
 			}
 		}
@@ -87,7 +87,7 @@ namespace SharpGLTF.Schema2.Tiles3D
 	{
 	
 		private const int _featureIdsMinItems = 1;
-		private ChildrenList<MeshExtInstanceFeatureID,MeshExtInstanceFeatures> _featureIds;
+		private readonly ChildrenList<MeshExtInstanceFeatureID,MeshExtInstanceFeatures> _featureIds;
 		
 	
 		protected override void SerializeProperties(Utf8JsonWriter writer)
@@ -100,7 +100,7 @@ namespace SharpGLTF.Schema2.Tiles3D
 		{
 			switch (jsonPropertyName)
 			{
-				case "featureIds": DeserializePropertyList<MeshExtInstanceFeatureID>(ref reader, _featureIds); break;
+				case "featureIds": DeserializePropertyList<MeshExtInstanceFeatures, MeshExtInstanceFeatureID>(ref reader, this, _featureIds); break;
 				default: base.DeserializeProperty(jsonPropertyName,ref reader); break;
 			}
 		}

+ 9 - 9
src/SharpGLTF.Ext.3DTiles/Schema2/Generated/Ext.CESIUM_ext_mesh_features.g.cs

@@ -51,7 +51,7 @@ namespace SharpGLTF.Schema2.Tiles3D
 		{
 			switch (jsonPropertyName)
 			{
-				case "channels": DeserializePropertyList<Int32>(ref reader, _channels); break;
+				case "channels": DeserializePropertyList<MeshExtMeshFeatureIDTexture, Int32>(ref reader, this, _channels); break;
 				default: base.DeserializeProperty(jsonPropertyName,ref reader); break;
 			}
 		}
@@ -99,12 +99,12 @@ namespace SharpGLTF.Schema2.Tiles3D
 		{
 			switch (jsonPropertyName)
 			{
-				case "attribute": _attribute = DeserializePropertyValue<Int32?>(ref reader); break;
-				case "featureCount": _featureCount = DeserializePropertyValue<Int32>(ref reader); break;
-				case "label": _label = DeserializePropertyValue<String>(ref reader); break;
-				case "nullFeatureId": _nullFeatureId = DeserializePropertyValue<Int32?>(ref reader); break;
-				case "propertyTable": _propertyTable = DeserializePropertyValue<Int32?>(ref reader); break;
-				case "texture": _texture = DeserializePropertyValue<MeshExtMeshFeatureIDTexture>(ref reader); break;
+				case "attribute": DeserializePropertyValue<MeshExtMeshFeatureID, Int32?>(ref reader, this, out _attribute); break;
+				case "featureCount": DeserializePropertyValue<MeshExtMeshFeatureID, Int32>(ref reader, this, out _featureCount); break;
+				case "label": DeserializePropertyValue<MeshExtMeshFeatureID, String>(ref reader, this, out _label); break;
+				case "nullFeatureId": DeserializePropertyValue<MeshExtMeshFeatureID, Int32?>(ref reader, this, out _nullFeatureId); break;
+				case "propertyTable": DeserializePropertyValue<MeshExtMeshFeatureID, Int32?>(ref reader, this, out _propertyTable); break;
+				case "texture": DeserializePropertyValue<MeshExtMeshFeatureID, MeshExtMeshFeatureIDTexture>(ref reader, this, out _texture); break;
 				default: base.DeserializeProperty(jsonPropertyName,ref reader); break;
 			}
 		}
@@ -122,7 +122,7 @@ namespace SharpGLTF.Schema2.Tiles3D
 	{
 	
 		private const int _featureIdsMinItems = 1;
-		private ChildrenList<MeshExtMeshFeatureID,MeshExtMeshFeatures> _featureIds;
+		private readonly ChildrenList<MeshExtMeshFeatureID,MeshExtMeshFeatures> _featureIds;
 		
 	
 		protected override void SerializeProperties(Utf8JsonWriter writer)
@@ -135,7 +135,7 @@ namespace SharpGLTF.Schema2.Tiles3D
 		{
 			switch (jsonPropertyName)
 			{
-				case "featureIds": DeserializePropertyList<MeshExtMeshFeatureID>(ref reader, _featureIds); break;
+				case "featureIds": DeserializePropertyList<MeshExtMeshFeatures, MeshExtMeshFeatureID>(ref reader, this, _featureIds); break;
 				default: base.DeserializeProperty(jsonPropertyName,ref reader); break;
 			}
 		}

+ 2 - 2
src/SharpGLTF.Ext.3DTiles/Schema2/Generated/Ext.CESIUM_ext_structural_metadata_primitive.g.cs

@@ -55,8 +55,8 @@ namespace SharpGLTF.Schema2.Tiles3D
 		{
 			switch (jsonPropertyName)
 			{
-				case "propertyAttributes": DeserializePropertyList<Int32>(ref reader, _propertyAttributes); break;
-				case "propertyTextures": DeserializePropertyList<Int32>(ref reader, _propertyTextures); break;
+				case "propertyAttributes": DeserializePropertyList<ExtStructuralMetadataMeshPrimitive, Int32>(ref reader, this, _propertyAttributes); break;
+				case "propertyTextures": DeserializePropertyList<ExtStructuralMetadataMeshPrimitive, Int32>(ref reader, this, _propertyTextures); break;
 				default: base.DeserializeProperty(jsonPropertyName,ref reader); break;
 			}
 		}

+ 65 - 65
src/SharpGLTF.Ext.3DTiles/Schema2/Generated/Ext.CESIUM_ext_structural_metadata_root.g.cs

@@ -163,21 +163,21 @@ namespace SharpGLTF.Schema2.Tiles3D
 		{
 			switch (jsonPropertyName)
 			{
-				case "array": _array = DeserializePropertyValue<Boolean?>(ref reader); break;
+				case "array": DeserializePropertyValue<StructuralMetadataClassProperty, Boolean?>(ref reader, this, out _array); break;
 				case "componentType": _componentType = DeserializePropertyValue<DataType>(ref reader); break;
-				case "count": _count = DeserializePropertyValue<Int32?>(ref reader); break;
-				case "default": _default = DeserializePropertyValue<System.Text.Json.Nodes.JsonNode>(ref reader); break;
-				case "description": _description = DeserializePropertyValue<String>(ref reader); break;
-				case "enumType": _enumType = DeserializePropertyValue<String>(ref reader); break;
-				case "max": _max = DeserializePropertyValue<System.Text.Json.Nodes.JsonNode>(ref reader); break;
-				case "min": _min = DeserializePropertyValue<System.Text.Json.Nodes.JsonNode>(ref reader); break;
-				case "name": _name = DeserializePropertyValue<String>(ref reader); break;
-				case "noData": _noData = DeserializePropertyValue<System.Text.Json.Nodes.JsonNode>(ref reader); break;
-				case "normalized": _normalized = DeserializePropertyValue<Boolean?>(ref reader); break;
-				case "offset": _offset = DeserializePropertyValue<System.Text.Json.Nodes.JsonNode>(ref reader); break;
-				case "required": _required = DeserializePropertyValue<Boolean?>(ref reader); break;
-				case "scale": _scale = DeserializePropertyValue<System.Text.Json.Nodes.JsonNode>(ref reader); break;
-				case "semantic": _semantic = DeserializePropertyValue<String>(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;
 			}
@@ -214,9 +214,9 @@ namespace SharpGLTF.Schema2.Tiles3D
 		{
 			switch (jsonPropertyName)
 			{
-				case "description": _description = DeserializePropertyValue<String>(ref reader); break;
-				case "name": _name = DeserializePropertyValue<String>(ref reader); break;
-				case "properties": DeserializePropertyDictionary<StructuralMetadataClassProperty>(ref reader, _properties); break;
+				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;
 			}
 		}
@@ -252,9 +252,9 @@ namespace SharpGLTF.Schema2.Tiles3D
 		{
 			switch (jsonPropertyName)
 			{
-				case "description": _description = DeserializePropertyValue<String>(ref reader); break;
-				case "name": _name = DeserializePropertyValue<String>(ref reader); break;
-				case "value": _value = DeserializePropertyValue<Int32>(ref reader); break;
+				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;
 			}
 		}
@@ -279,7 +279,7 @@ namespace SharpGLTF.Schema2.Tiles3D
 		private IntegerType? _valueType = _valueTypeDefault;
 		
 		private const int _valuesMinItems = 1;
-		private ChildrenList<StructuralMetadataEnumValue,StructuralMetadataEnum> _values;
+		private readonly ChildrenList<StructuralMetadataEnumValue,StructuralMetadataEnum> _values;
 		
 	
 		protected override void SerializeProperties(Utf8JsonWriter writer)
@@ -295,10 +295,10 @@ namespace SharpGLTF.Schema2.Tiles3D
 		{
 			switch (jsonPropertyName)
 			{
-				case "description": _description = DeserializePropertyValue<String>(ref reader); break;
-				case "name": _name = DeserializePropertyValue<String>(ref reader); break;
+				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<StructuralMetadataEnumValue>(ref reader, _values); break;
+				case "values": DeserializePropertyList<StructuralMetadataEnum, StructuralMetadataEnumValue>(ref reader, this, _values); break;
 				default: base.DeserializeProperty(jsonPropertyName,ref reader); break;
 			}
 		}
@@ -343,12 +343,12 @@ namespace SharpGLTF.Schema2.Tiles3D
 		{
 			switch (jsonPropertyName)
 			{
-				case "classes": DeserializePropertyDictionary<StructuralMetadataClass>(ref reader, _classes); break;
-				case "description": _description = DeserializePropertyValue<String>(ref reader); break;
-				case "enums": DeserializePropertyDictionary<StructuralMetadataEnum>(ref reader, _enums); break;
-				case "id": _id = DeserializePropertyValue<String>(ref reader); break;
-				case "name": _name = DeserializePropertyValue<String>(ref reader); break;
-				case "version": _version = DeserializePropertyValue<String>(ref reader); break;
+				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;
 			}
 		}
@@ -405,14 +405,14 @@ namespace SharpGLTF.Schema2.Tiles3D
 			switch (jsonPropertyName)
 			{
 				case "arrayOffsetType": _arrayOffsetType = DeserializePropertyValue<ArrayOffsetType>(ref reader); break;
-				case "arrayOffsets": _arrayOffsets = DeserializePropertyValue<Int32?>(ref reader); break;
-				case "max": _max = DeserializePropertyValue<System.Text.Json.Nodes.JsonNode>(ref reader); break;
-				case "min": _min = DeserializePropertyValue<System.Text.Json.Nodes.JsonNode>(ref reader); break;
-				case "offset": _offset = DeserializePropertyValue<System.Text.Json.Nodes.JsonNode>(ref reader); break;
-				case "scale": _scale = DeserializePropertyValue<System.Text.Json.Nodes.JsonNode>(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": _stringOffsets = DeserializePropertyValue<Int32?>(ref reader); break;
-				case "values": _values = DeserializePropertyValue<Int32>(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;
 			}
 		}
@@ -452,10 +452,10 @@ namespace SharpGLTF.Schema2.Tiles3D
 		{
 			switch (jsonPropertyName)
 			{
-				case "class": _class = DeserializePropertyValue<String>(ref reader); break;
-				case "count": _count = DeserializePropertyValue<Int32>(ref reader); break;
-				case "name": _name = DeserializePropertyValue<String>(ref reader); break;
-				case "properties": DeserializePropertyDictionary<PropertyTableProperty>(ref reader, _properties); break;
+				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;
 			}
 		}
@@ -498,11 +498,11 @@ namespace SharpGLTF.Schema2.Tiles3D
 		{
 			switch (jsonPropertyName)
 			{
-				case "channels": DeserializePropertyList<Int32>(ref reader, _channels); break;
-				case "max": _max = DeserializePropertyValue<System.Text.Json.Nodes.JsonNode>(ref reader); break;
-				case "min": _min = DeserializePropertyValue<System.Text.Json.Nodes.JsonNode>(ref reader); break;
-				case "offset": _offset = DeserializePropertyValue<System.Text.Json.Nodes.JsonNode>(ref reader); break;
-				case "scale": _scale = DeserializePropertyValue<System.Text.Json.Nodes.JsonNode>(ref reader); break;
+				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;
 			}
 		}
@@ -538,9 +538,9 @@ namespace SharpGLTF.Schema2.Tiles3D
 		{
 			switch (jsonPropertyName)
 			{
-				case "class": _class = DeserializePropertyValue<String>(ref reader); break;
-				case "name": _name = DeserializePropertyValue<String>(ref reader); break;
-				case "properties": DeserializePropertyDictionary<PropertyTextureProperty>(ref reader, _properties); break;
+				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;
 			}
 		}
@@ -582,11 +582,11 @@ namespace SharpGLTF.Schema2.Tiles3D
 		{
 			switch (jsonPropertyName)
 			{
-				case "attribute": _attribute = DeserializePropertyValue<String>(ref reader); break;
-				case "max": _max = DeserializePropertyValue<System.Text.Json.Nodes.JsonNode>(ref reader); break;
-				case "min": _min = DeserializePropertyValue<System.Text.Json.Nodes.JsonNode>(ref reader); break;
-				case "offset": _offset = DeserializePropertyValue<System.Text.Json.Nodes.JsonNode>(ref reader); break;
-				case "scale": _scale = DeserializePropertyValue<System.Text.Json.Nodes.JsonNode>(ref reader); break;
+				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;
 			}
 		}
@@ -622,9 +622,9 @@ namespace SharpGLTF.Schema2.Tiles3D
 		{
 			switch (jsonPropertyName)
 			{
-				case "class": _class = DeserializePropertyValue<String>(ref reader); break;
-				case "name": _name = DeserializePropertyValue<String>(ref reader); break;
-				case "properties": DeserializePropertyDictionary<PropertyAttributeProperty>(ref reader, _properties); break;
+				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;
 			}
 		}
@@ -642,13 +642,13 @@ namespace SharpGLTF.Schema2.Tiles3D
 	{
 	
 		private const int _propertyAttributesMinItems = 1;
-		private ChildrenList<PropertyAttribute,EXTStructuralMetadataRoot> _propertyAttributes;
+		private readonly ChildrenList<PropertyAttribute,EXTStructuralMetadataRoot> _propertyAttributes;
 		
 		private const int _propertyTablesMinItems = 1;
-		private ChildrenList<PropertyTable,EXTStructuralMetadataRoot> _propertyTables;
+		private readonly ChildrenList<PropertyTable,EXTStructuralMetadataRoot> _propertyTables;
 		
 		private const int _propertyTexturesMinItems = 1;
-		private ChildrenList<PropertyTexture,EXTStructuralMetadataRoot> _propertyTextures;
+		private readonly ChildrenList<PropertyTexture,EXTStructuralMetadataRoot> _propertyTextures;
 		
 		private StructuralMetadataSchema _schema;
 		
@@ -669,11 +669,11 @@ namespace SharpGLTF.Schema2.Tiles3D
 		{
 			switch (jsonPropertyName)
 			{
-				case "propertyAttributes": DeserializePropertyList<PropertyAttribute>(ref reader, _propertyAttributes); break;
-				case "propertyTables": DeserializePropertyList<PropertyTable>(ref reader, _propertyTables); break;
-				case "propertyTextures": DeserializePropertyList<PropertyTexture>(ref reader, _propertyTextures); break;
-				case "schema": _schema = DeserializePropertyValue<StructuralMetadataSchema>(ref reader); break;
-				case "schemaUri": _schemaUri = DeserializePropertyValue<String>(ref reader); break;
+				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;
 			}
 		}

+ 1 - 1
src/SharpGLTF.Ext.3DTiles/Schema2/Generated/Ext.CESIUM_primitive_outline.g.cs

@@ -50,7 +50,7 @@ namespace SharpGLTF.Schema2.Tiles3D
 		{
 			switch (jsonPropertyName)
 			{
-				case "indices": _indices = DeserializePropertyValue<Int32?>(ref reader); break;
+				case "indices": DeserializePropertyValue<CesiumPrimitiveOutline, Int32?>(ref reader, this, out _indices); break;
 				default: base.DeserializeProperty(jsonPropertyName,ref reader); break;
 			}
 		}

+ 2 - 2
src/SharpGLTF.Ext.Agi/Schema2/generated/ext.AgiNodeArticulations.g.cs

@@ -53,8 +53,8 @@ namespace SharpGLTF.Schema2.AGI
 		{
 			switch (jsonPropertyName)
 			{
-				case "articulationName": _articulationName = DeserializePropertyValue<String>(ref reader); break;
-				case "isAttachPoint": _isAttachPoint = DeserializePropertyValue<Boolean?>(ref reader); break;
+				case "articulationName": DeserializePropertyValue<AgiNodeArticulations, String>(ref reader, this, out _articulationName); break;
+				case "isAttachPoint": DeserializePropertyValue<AgiNodeArticulations, Boolean?>(ref reader, this, out _isAttachPoint); break;
 				default: base.DeserializeProperty(jsonPropertyName,ref reader); break;
 			}
 		}

+ 2 - 2
src/SharpGLTF.Ext.Agi/Schema2/generated/ext.AgiNodeStkMetadata.g.cs

@@ -53,8 +53,8 @@ namespace SharpGLTF.Schema2.AGI
 		{
 			switch (jsonPropertyName)
 			{
-				case "noObscuration": _noObscuration = DeserializePropertyValue<Boolean?>(ref reader); break;
-				case "solarPanelGroupName": _solarPanelGroupName = DeserializePropertyValue<String>(ref reader); break;
+				case "noObscuration": DeserializePropertyValue<AgiNodeStkMetadata, Boolean?>(ref reader, this, out _noObscuration); break;
+				case "solarPanelGroupName": DeserializePropertyValue<AgiNodeStkMetadata, String>(ref reader, this, out _solarPanelGroupName); break;
 				default: base.DeserializeProperty(jsonPropertyName,ref reader); break;
 			}
 		}

+ 10 - 10
src/SharpGLTF.Ext.Agi/Schema2/generated/ext.AgiRootArticulations.g.cs

@@ -80,10 +80,10 @@ namespace SharpGLTF.Schema2.AGI
 		{
 			switch (jsonPropertyName)
 			{
-				case "initialValue": _initialValue = DeserializePropertyValue<Double>(ref reader); break;
-				case "maximumValue": _maximumValue = DeserializePropertyValue<Double>(ref reader); break;
-				case "minimumValue": _minimumValue = DeserializePropertyValue<Double>(ref reader); break;
-				case "name": _name = DeserializePropertyValue<String>(ref reader); break;
+				case "initialValue": DeserializePropertyValue<AgiArticulationStage, Double>(ref reader, this, out _initialValue); break;
+				case "maximumValue": DeserializePropertyValue<AgiArticulationStage, Double>(ref reader, this, out _maximumValue); break;
+				case "minimumValue": DeserializePropertyValue<AgiArticulationStage, Double>(ref reader, this, out _minimumValue); break;
+				case "name": DeserializePropertyValue<AgiArticulationStage, String>(ref reader, this, out _name); break;
 				case "type": _type = DeserializePropertyValue<AgiArticulationTransformType>(ref reader); break;
 				default: base.DeserializeProperty(jsonPropertyName,ref reader); break;
 			}
@@ -106,7 +106,7 @@ namespace SharpGLTF.Schema2.AGI
 		private Vector3? _pointingVector;
 		
 		private const int _stagesMinItems = 1;
-		private ChildrenList<AgiArticulationStage,AgiArticulation> _stages;
+		private readonly ChildrenList<AgiArticulationStage,AgiArticulation> _stages;
 		
 	
 		protected override void SerializeProperties(Utf8JsonWriter writer)
@@ -121,9 +121,9 @@ namespace SharpGLTF.Schema2.AGI
 		{
 			switch (jsonPropertyName)
 			{
-				case "name": _name = DeserializePropertyValue<String>(ref reader); break;
-				case "pointingVector": _pointingVector = DeserializePropertyValue<Vector3?>(ref reader); break;
-				case "stages": DeserializePropertyList<AgiArticulationStage>(ref reader, _stages); break;
+				case "name": DeserializePropertyValue<AgiArticulation, String>(ref reader, this, out _name); break;
+				case "pointingVector": DeserializePropertyValue<AgiArticulation, Vector3?>(ref reader, this, out _pointingVector); break;
+				case "stages": DeserializePropertyList<AgiArticulation, AgiArticulationStage>(ref reader, this, _stages); break;
 				default: base.DeserializeProperty(jsonPropertyName,ref reader); break;
 			}
 		}
@@ -141,7 +141,7 @@ namespace SharpGLTF.Schema2.AGI
 	{
 	
 		private const int _articulationsMinItems = 1;
-		private ChildrenList<AgiArticulation,AgiRootArticulations> _articulations;
+		private readonly ChildrenList<AgiArticulation,AgiRootArticulations> _articulations;
 		
 	
 		protected override void SerializeProperties(Utf8JsonWriter writer)
@@ -154,7 +154,7 @@ namespace SharpGLTF.Schema2.AGI
 		{
 			switch (jsonPropertyName)
 			{
-				case "articulations": DeserializePropertyList<AgiArticulation>(ref reader, _articulations); break;
+				case "articulations": DeserializePropertyList<AgiRootArticulations, AgiArticulation>(ref reader, this, _articulations); break;
 				default: base.DeserializeProperty(jsonPropertyName,ref reader); break;
 			}
 		}

+ 4 - 4
src/SharpGLTF.Ext.Agi/Schema2/generated/ext.AgiRootStkMetadata.g.cs

@@ -55,8 +55,8 @@ namespace SharpGLTF.Schema2.AGI
 		{
 			switch (jsonPropertyName)
 			{
-				case "efficiency": _efficiency = DeserializePropertyValue<Double>(ref reader); break;
-				case "name": _name = DeserializePropertyValue<String>(ref reader); break;
+				case "efficiency": DeserializePropertyValue<AgiStkSolarPanelGroup, Double>(ref reader, this, out _efficiency); break;
+				case "name": DeserializePropertyValue<AgiStkSolarPanelGroup, String>(ref reader, this, out _name); break;
 				default: base.DeserializeProperty(jsonPropertyName,ref reader); break;
 			}
 		}
@@ -74,7 +74,7 @@ namespace SharpGLTF.Schema2.AGI
 	{
 	
 		private const int _solarPanelGroupsMinItems = 1;
-		private ChildrenList<AgiStkSolarPanelGroup,AgiRootStkMetadata> _solarPanelGroups;
+		private readonly ChildrenList<AgiStkSolarPanelGroup,AgiRootStkMetadata> _solarPanelGroups;
 		
 	
 		protected override void SerializeProperties(Utf8JsonWriter writer)
@@ -87,7 +87,7 @@ namespace SharpGLTF.Schema2.AGI
 		{
 			switch (jsonPropertyName)
 			{
-				case "solarPanelGroups": DeserializePropertyList<AgiStkSolarPanelGroup>(ref reader, _solarPanelGroups); break;
+				case "solarPanelGroups": DeserializePropertyList<AgiRootStkMetadata, AgiStkSolarPanelGroup>(ref reader, this, _solarPanelGroups); break;
 				default: base.DeserializeProperty(jsonPropertyName,ref reader); break;
 			}
 		}