Przeglądaj źródła

Expanded VertexMaterialDelta to support 4 texture coordinates to align it with all vertexMaterial permutations

vpenades 2 lat temu
rodzic
commit
32e9e2014e

+ 43 - 6
src/SharpGLTF.Toolkit/Geometry/VertexTypes/VertexMaterial.Permutations.cs

@@ -313,6 +313,7 @@ namespace SharpGLTF.Geometry.VertexTypes
          {
          {
              this.TexCoord0 += delta.TexCoord0Delta;
              this.TexCoord0 += delta.TexCoord0Delta;
              this.TexCoord1 += delta.TexCoord1Delta;
              this.TexCoord1 += delta.TexCoord1Delta;
+             this.TexCoord2 += delta.TexCoord2Delta;
          }
          }
          void IVertexMaterial.SetColor(int index, Vector4 color)
          void IVertexMaterial.SetColor(int index, Vector4 color)
          {
          {
@@ -433,6 +434,8 @@ namespace SharpGLTF.Geometry.VertexTypes
          {
          {
              this.TexCoord0 += delta.TexCoord0Delta;
              this.TexCoord0 += delta.TexCoord0Delta;
              this.TexCoord1 += delta.TexCoord1Delta;
              this.TexCoord1 += delta.TexCoord1Delta;
+             this.TexCoord2 += delta.TexCoord2Delta;
+             this.TexCoord3 += delta.TexCoord3Delta;
          }
          }
          void IVertexMaterial.SetColor(int index, Vector4 color)
          void IVertexMaterial.SetColor(int index, Vector4 color)
          {
          {
@@ -881,6 +884,7 @@ namespace SharpGLTF.Geometry.VertexTypes
              this.Color += delta.Color0Delta;
              this.Color += delta.Color0Delta;
              this.TexCoord0 += delta.TexCoord0Delta;
              this.TexCoord0 += delta.TexCoord0Delta;
              this.TexCoord1 += delta.TexCoord1Delta;
              this.TexCoord1 += delta.TexCoord1Delta;
+             this.TexCoord2 += delta.TexCoord2Delta;
          }
          }
          void IVertexMaterial.SetColor(int index, Vector4 color)
          void IVertexMaterial.SetColor(int index, Vector4 color)
          {
          {
@@ -1009,6 +1013,8 @@ namespace SharpGLTF.Geometry.VertexTypes
              this.Color += delta.Color0Delta;
              this.Color += delta.Color0Delta;
              this.TexCoord0 += delta.TexCoord0Delta;
              this.TexCoord0 += delta.TexCoord0Delta;
              this.TexCoord1 += delta.TexCoord1Delta;
              this.TexCoord1 += delta.TexCoord1Delta;
+             this.TexCoord2 += delta.TexCoord2Delta;
+             this.TexCoord3 += delta.TexCoord3Delta;
          }
          }
          void IVertexMaterial.SetColor(int index, Vector4 color)
          void IVertexMaterial.SetColor(int index, Vector4 color)
          {
          {
@@ -1489,6 +1495,7 @@ namespace SharpGLTF.Geometry.VertexTypes
              this.Color1 += delta.Color1Delta;
              this.Color1 += delta.Color1Delta;
              this.TexCoord0 += delta.TexCoord0Delta;
              this.TexCoord0 += delta.TexCoord0Delta;
              this.TexCoord1 += delta.TexCoord1Delta;
              this.TexCoord1 += delta.TexCoord1Delta;
+             this.TexCoord2 += delta.TexCoord2Delta;
          }
          }
          void IVertexMaterial.SetColor(int index, Vector4 color)
          void IVertexMaterial.SetColor(int index, Vector4 color)
          {
          {
@@ -1625,6 +1632,8 @@ namespace SharpGLTF.Geometry.VertexTypes
              this.Color1 += delta.Color1Delta;
              this.Color1 += delta.Color1Delta;
              this.TexCoord0 += delta.TexCoord0Delta;
              this.TexCoord0 += delta.TexCoord0Delta;
              this.TexCoord1 += delta.TexCoord1Delta;
              this.TexCoord1 += delta.TexCoord1Delta;
+             this.TexCoord2 += delta.TexCoord2Delta;
+             this.TexCoord3 += delta.TexCoord3Delta;
          }
          }
          void IVertexMaterial.SetColor(int index, Vector4 color)
          void IVertexMaterial.SetColor(int index, Vector4 color)
          {
          {
@@ -1677,6 +1686,8 @@ namespace SharpGLTF.Geometry.VertexTypes
              Color1Delta = Vector4.Zero;
              Color1Delta = Vector4.Zero;
              TexCoord0Delta = morphVal.TexCoord - rootVal.TexCoord;
              TexCoord0Delta = morphVal.TexCoord - rootVal.TexCoord;
              TexCoord1Delta = Vector2.Zero;
              TexCoord1Delta = Vector2.Zero;
+             TexCoord2Delta = Vector2.Zero;
+             TexCoord3Delta = Vector2.Zero;
          }
          }
          internal VertexMaterialDelta(in VertexTexture2 rootVal, in VertexTexture2 morphVal)
          internal VertexMaterialDelta(in VertexTexture2 rootVal, in VertexTexture2 morphVal)
          {
          {
@@ -1686,24 +1697,30 @@ namespace SharpGLTF.Geometry.VertexTypes
              Color1Delta = Vector4.Zero;
              Color1Delta = Vector4.Zero;
              TexCoord0Delta = morphVal.TexCoord0 - rootVal.TexCoord0;
              TexCoord0Delta = morphVal.TexCoord0 - rootVal.TexCoord0;
              TexCoord1Delta = morphVal.TexCoord1 - rootVal.TexCoord1;
              TexCoord1Delta = morphVal.TexCoord1 - rootVal.TexCoord1;
+             TexCoord2Delta = Vector2.Zero;
+             TexCoord3Delta = Vector2.Zero;
          }
          }
          internal VertexMaterialDelta(in VertexTexture3 rootVal, in VertexTexture3 morphVal)
          internal VertexMaterialDelta(in VertexTexture3 rootVal, in VertexTexture3 morphVal)
          {
          {
              MaxColors = 0;
              MaxColors = 0;
-             MaxTextCoords = 2;
+             MaxTextCoords = 3;
              Color0Delta = Vector4.Zero;
              Color0Delta = Vector4.Zero;
              Color1Delta = Vector4.Zero;
              Color1Delta = Vector4.Zero;
              TexCoord0Delta = morphVal.TexCoord0 - rootVal.TexCoord0;
              TexCoord0Delta = morphVal.TexCoord0 - rootVal.TexCoord0;
              TexCoord1Delta = morphVal.TexCoord1 - rootVal.TexCoord1;
              TexCoord1Delta = morphVal.TexCoord1 - rootVal.TexCoord1;
+             TexCoord2Delta = morphVal.TexCoord2 - rootVal.TexCoord2;
+             TexCoord3Delta = Vector2.Zero;
          }
          }
          internal VertexMaterialDelta(in VertexTexture4 rootVal, in VertexTexture4 morphVal)
          internal VertexMaterialDelta(in VertexTexture4 rootVal, in VertexTexture4 morphVal)
          {
          {
              MaxColors = 0;
              MaxColors = 0;
-             MaxTextCoords = 2;
+             MaxTextCoords = 4;
              Color0Delta = Vector4.Zero;
              Color0Delta = Vector4.Zero;
              Color1Delta = Vector4.Zero;
              Color1Delta = Vector4.Zero;
              TexCoord0Delta = morphVal.TexCoord0 - rootVal.TexCoord0;
              TexCoord0Delta = morphVal.TexCoord0 - rootVal.TexCoord0;
              TexCoord1Delta = morphVal.TexCoord1 - rootVal.TexCoord1;
              TexCoord1Delta = morphVal.TexCoord1 - rootVal.TexCoord1;
+             TexCoord2Delta = morphVal.TexCoord2 - rootVal.TexCoord2;
+             TexCoord3Delta = morphVal.TexCoord3 - rootVal.TexCoord3;
          }
          }
          
          
          internal VertexMaterialDelta(in VertexColor1 rootVal, in VertexColor1 morphVal)
          internal VertexMaterialDelta(in VertexColor1 rootVal, in VertexColor1 morphVal)
@@ -1714,6 +1731,8 @@ namespace SharpGLTF.Geometry.VertexTypes
              Color1Delta = Vector4.Zero;
              Color1Delta = Vector4.Zero;
              TexCoord0Delta = Vector2.Zero;
              TexCoord0Delta = Vector2.Zero;
              TexCoord1Delta = Vector2.Zero;
              TexCoord1Delta = Vector2.Zero;
+             TexCoord2Delta = Vector2.Zero;
+             TexCoord3Delta = Vector2.Zero;
          }
          }
          internal VertexMaterialDelta(in VertexColor1Texture1 rootVal, in VertexColor1Texture1 morphVal)
          internal VertexMaterialDelta(in VertexColor1Texture1 rootVal, in VertexColor1Texture1 morphVal)
          {
          {
@@ -1723,6 +1742,8 @@ namespace SharpGLTF.Geometry.VertexTypes
              Color1Delta = Vector4.Zero;
              Color1Delta = Vector4.Zero;
              TexCoord0Delta = morphVal.TexCoord - rootVal.TexCoord;
              TexCoord0Delta = morphVal.TexCoord - rootVal.TexCoord;
              TexCoord1Delta = Vector2.Zero;
              TexCoord1Delta = Vector2.Zero;
+             TexCoord2Delta = Vector2.Zero;
+             TexCoord3Delta = Vector2.Zero;
          }
          }
          internal VertexMaterialDelta(in VertexColor1Texture2 rootVal, in VertexColor1Texture2 morphVal)
          internal VertexMaterialDelta(in VertexColor1Texture2 rootVal, in VertexColor1Texture2 morphVal)
          {
          {
@@ -1732,24 +1753,30 @@ namespace SharpGLTF.Geometry.VertexTypes
              Color1Delta = Vector4.Zero;
              Color1Delta = Vector4.Zero;
              TexCoord0Delta = morphVal.TexCoord0 - rootVal.TexCoord0;
              TexCoord0Delta = morphVal.TexCoord0 - rootVal.TexCoord0;
              TexCoord1Delta = morphVal.TexCoord1 - rootVal.TexCoord1;
              TexCoord1Delta = morphVal.TexCoord1 - rootVal.TexCoord1;
+             TexCoord2Delta = Vector2.Zero;
+             TexCoord3Delta = Vector2.Zero;
          }
          }
          internal VertexMaterialDelta(in VertexColor1Texture3 rootVal, in VertexColor1Texture3 morphVal)
          internal VertexMaterialDelta(in VertexColor1Texture3 rootVal, in VertexColor1Texture3 morphVal)
          {
          {
              MaxColors = 1;
              MaxColors = 1;
-             MaxTextCoords = 2;
+             MaxTextCoords = 3;
              Color0Delta = morphVal.Color - rootVal.Color;
              Color0Delta = morphVal.Color - rootVal.Color;
              Color1Delta = Vector4.Zero;
              Color1Delta = Vector4.Zero;
              TexCoord0Delta = morphVal.TexCoord0 - rootVal.TexCoord0;
              TexCoord0Delta = morphVal.TexCoord0 - rootVal.TexCoord0;
              TexCoord1Delta = morphVal.TexCoord1 - rootVal.TexCoord1;
              TexCoord1Delta = morphVal.TexCoord1 - rootVal.TexCoord1;
+             TexCoord2Delta = morphVal.TexCoord2 - rootVal.TexCoord2;
+             TexCoord3Delta = Vector2.Zero;
          }
          }
          internal VertexMaterialDelta(in VertexColor1Texture4 rootVal, in VertexColor1Texture4 morphVal)
          internal VertexMaterialDelta(in VertexColor1Texture4 rootVal, in VertexColor1Texture4 morphVal)
          {
          {
              MaxColors = 1;
              MaxColors = 1;
-             MaxTextCoords = 2;
+             MaxTextCoords = 4;
              Color0Delta = morphVal.Color - rootVal.Color;
              Color0Delta = morphVal.Color - rootVal.Color;
              Color1Delta = Vector4.Zero;
              Color1Delta = Vector4.Zero;
              TexCoord0Delta = morphVal.TexCoord0 - rootVal.TexCoord0;
              TexCoord0Delta = morphVal.TexCoord0 - rootVal.TexCoord0;
              TexCoord1Delta = morphVal.TexCoord1 - rootVal.TexCoord1;
              TexCoord1Delta = morphVal.TexCoord1 - rootVal.TexCoord1;
+             TexCoord2Delta = morphVal.TexCoord2 - rootVal.TexCoord2;
+             TexCoord3Delta = morphVal.TexCoord3 - rootVal.TexCoord3;
          }
          }
          
          
          internal VertexMaterialDelta(in VertexColor2 rootVal, in VertexColor2 morphVal)
          internal VertexMaterialDelta(in VertexColor2 rootVal, in VertexColor2 morphVal)
@@ -1760,6 +1787,8 @@ namespace SharpGLTF.Geometry.VertexTypes
              Color1Delta = morphVal.Color1 - rootVal.Color1;
              Color1Delta = morphVal.Color1 - rootVal.Color1;
              TexCoord0Delta = Vector2.Zero;
              TexCoord0Delta = Vector2.Zero;
              TexCoord1Delta = Vector2.Zero;
              TexCoord1Delta = Vector2.Zero;
+             TexCoord2Delta = Vector2.Zero;
+             TexCoord3Delta = Vector2.Zero;
          }
          }
          internal VertexMaterialDelta(in VertexColor2Texture1 rootVal, in VertexColor2Texture1 morphVal)
          internal VertexMaterialDelta(in VertexColor2Texture1 rootVal, in VertexColor2Texture1 morphVal)
          {
          {
@@ -1769,6 +1798,8 @@ namespace SharpGLTF.Geometry.VertexTypes
              Color1Delta = morphVal.Color1 - rootVal.Color1;
              Color1Delta = morphVal.Color1 - rootVal.Color1;
              TexCoord0Delta = morphVal.TexCoord - rootVal.TexCoord;
              TexCoord0Delta = morphVal.TexCoord - rootVal.TexCoord;
              TexCoord1Delta = Vector2.Zero;
              TexCoord1Delta = Vector2.Zero;
+             TexCoord2Delta = Vector2.Zero;
+             TexCoord3Delta = Vector2.Zero;
          }
          }
          internal VertexMaterialDelta(in VertexColor2Texture2 rootVal, in VertexColor2Texture2 morphVal)
          internal VertexMaterialDelta(in VertexColor2Texture2 rootVal, in VertexColor2Texture2 morphVal)
          {
          {
@@ -1778,24 +1809,30 @@ namespace SharpGLTF.Geometry.VertexTypes
              Color1Delta = morphVal.Color1 - rootVal.Color1;
              Color1Delta = morphVal.Color1 - rootVal.Color1;
              TexCoord0Delta = morphVal.TexCoord0 - rootVal.TexCoord0;
              TexCoord0Delta = morphVal.TexCoord0 - rootVal.TexCoord0;
              TexCoord1Delta = morphVal.TexCoord1 - rootVal.TexCoord1;
              TexCoord1Delta = morphVal.TexCoord1 - rootVal.TexCoord1;
+             TexCoord2Delta = Vector2.Zero;
+             TexCoord3Delta = Vector2.Zero;
          }
          }
          internal VertexMaterialDelta(in VertexColor2Texture3 rootVal, in VertexColor2Texture3 morphVal)
          internal VertexMaterialDelta(in VertexColor2Texture3 rootVal, in VertexColor2Texture3 morphVal)
          {
          {
              MaxColors = 2;
              MaxColors = 2;
-             MaxTextCoords = 2;
+             MaxTextCoords = 3;
              Color0Delta = morphVal.Color0 - rootVal.Color0;
              Color0Delta = morphVal.Color0 - rootVal.Color0;
              Color1Delta = morphVal.Color1 - rootVal.Color1;
              Color1Delta = morphVal.Color1 - rootVal.Color1;
              TexCoord0Delta = morphVal.TexCoord0 - rootVal.TexCoord0;
              TexCoord0Delta = morphVal.TexCoord0 - rootVal.TexCoord0;
              TexCoord1Delta = morphVal.TexCoord1 - rootVal.TexCoord1;
              TexCoord1Delta = morphVal.TexCoord1 - rootVal.TexCoord1;
+             TexCoord2Delta = morphVal.TexCoord2 - rootVal.TexCoord2;
+             TexCoord3Delta = Vector2.Zero;
          }
          }
          internal VertexMaterialDelta(in VertexColor2Texture4 rootVal, in VertexColor2Texture4 morphVal)
          internal VertexMaterialDelta(in VertexColor2Texture4 rootVal, in VertexColor2Texture4 morphVal)
          {
          {
              MaxColors = 2;
              MaxColors = 2;
-             MaxTextCoords = 2;
+             MaxTextCoords = 4;
              Color0Delta = morphVal.Color0 - rootVal.Color0;
              Color0Delta = morphVal.Color0 - rootVal.Color0;
              Color1Delta = morphVal.Color1 - rootVal.Color1;
              Color1Delta = morphVal.Color1 - rootVal.Color1;
              TexCoord0Delta = morphVal.TexCoord0 - rootVal.TexCoord0;
              TexCoord0Delta = morphVal.TexCoord0 - rootVal.TexCoord0;
              TexCoord1Delta = morphVal.TexCoord1 - rootVal.TexCoord1;
              TexCoord1Delta = morphVal.TexCoord1 - rootVal.TexCoord1;
+             TexCoord2Delta = morphVal.TexCoord2 - rootVal.TexCoord2;
+             TexCoord3Delta = morphVal.TexCoord3 - rootVal.TexCoord3;
          }
          }
          
          
 
 

+ 3 - 7
src/SharpGLTF.Toolkit/Geometry/VertexTypes/VertexMaterial.Permutations.tt

@@ -168,10 +168,6 @@ void WriteVertexMaterialPermutation(int colorCount, int textureCount)
         var src = $"{attr.Param}Delta";
         var src = $"{attr.Param}Delta";
         if (src == "ColorDelta") src= "Color0Delta";
         if (src == "ColorDelta") src= "Color0Delta";
         if (src == "TexCoordDelta") src= "TexCoord0Delta";
         if (src == "TexCoordDelta") src= "TexCoord0Delta";
-
-        if (src.EndsWith("2Delta")) continue;
-        if (src.EndsWith("3Delta")) continue;
-
         WriteLine($"this.{attr.Param} += delta.{src};");
         WriteLine($"this.{attr.Param} += delta.{src};");
     }    
     }    
     PopIndent(); WriteLine("}");
     PopIndent(); WriteLine("}");
@@ -224,9 +220,9 @@ void WriteVertexSubtractPermutation(int colorCount, int textureCount)
     WriteLine($"internal VertexMaterialDelta(in {vertexTypeName} rootVal, in {vertexTypeName} morphVal)");
     WriteLine($"internal VertexMaterialDelta(in {vertexTypeName} rootVal, in {vertexTypeName} morphVal)");
     WriteLine("{"); PushIndent("    ");
     WriteLine("{"); PushIndent("    ");
 
 
-    // we don't support all the channels yet
+    
     colorCount = Math.Min(2,colorCount);
     colorCount = Math.Min(2,colorCount);
-    textureCount = Math.Min(2,textureCount);
+    textureCount = Math.Min(4,textureCount);
 
 
     WriteLine($"MaxColors = {colorCount};");
     WriteLine($"MaxColors = {colorCount};");
     WriteLine($"MaxTextCoords = {textureCount};");
     WriteLine($"MaxTextCoords = {textureCount};");
@@ -239,7 +235,7 @@ void WriteVertexSubtractPermutation(int colorCount, int textureCount)
         else WriteLine($"Color{i}Delta = Vector4.Zero;");    
         else WriteLine($"Color{i}Delta = Vector4.Zero;");    
     }
     }
 
 
-    for(int i=0; i< 2; ++i)
+    for(int i=0; i < 4; ++i)
     {
     {
         var name = textureCount == 1 ? "TexCoord" : $"TexCoord{i}";
         var name = textureCount == 1 ? "TexCoord" : $"TexCoord{i}";
 
 

+ 61 - 43
src/SharpGLTF.Toolkit/Geometry/VertexTypes/VertexMaterial.cs

@@ -158,10 +158,7 @@ namespace SharpGLTF.Geometry.VertexTypes
 
 
     /// <summary>
     /// <summary>
     /// Defines a Vertex attribute with two material Colors and two Texture Coordinates.
     /// Defines a Vertex attribute with two material Colors and two Texture Coordinates.
-    /// </summary>
-    #if NET6_0_OR_GREATER
-    [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors | DynamicallyAccessedMemberTypes.PublicFields)]
-    #endif
+    /// </summary>    
     [System.Diagnostics.DebuggerDisplay("{_GetDebuggerDisplay(),nq}")]
     [System.Diagnostics.DebuggerDisplay("{_GetDebuggerDisplay(),nq}")]
     [System.Runtime.InteropServices.StructLayout(System.Runtime.InteropServices.LayoutKind.Sequential)]
     [System.Runtime.InteropServices.StructLayout(System.Runtime.InteropServices.LayoutKind.Sequential)]
     public partial struct VertexMaterialDelta : IVertexMaterial, IEquatable<VertexMaterialDelta>
     public partial struct VertexMaterialDelta : IVertexMaterial, IEquatable<VertexMaterialDelta>
@@ -176,7 +173,12 @@ namespace SharpGLTF.Geometry.VertexTypes
 
 
         public static implicit operator VertexMaterialDelta(in (Vector4 Color0Delta, Vector4 Color1Delta, Vector2 TextCoord0Delta, Vector2 TextCoord1Delta) tuple)
         public static implicit operator VertexMaterialDelta(in (Vector4 Color0Delta, Vector4 Color1Delta, Vector2 TextCoord0Delta, Vector2 TextCoord1Delta) tuple)
         {
         {
-            return new VertexMaterialDelta(tuple.Color0Delta, tuple.Color1Delta, tuple.TextCoord0Delta, tuple.TextCoord1Delta);
+            return new VertexMaterialDelta(tuple.Color0Delta, tuple.Color1Delta, tuple.TextCoord0Delta, tuple.TextCoord1Delta, Vector2.Zero, Vector2.Zero);
+        }
+
+        public static implicit operator VertexMaterialDelta(in (Vector4 Color0Delta, Vector4 Color1Delta, Vector2 TextCoord0Delta, Vector2 TextCoord1Delta, Vector2 TextCoord2Delta, Vector2 TextCoord3Delta) tuple)
+        {
+            return new VertexMaterialDelta(tuple.Color0Delta, tuple.Color1Delta, tuple.TextCoord0Delta, tuple.TextCoord1Delta, tuple.TextCoord2Delta, tuple.TextCoord3Delta);
         }
         }
 
 
         public VertexMaterialDelta(IVertexMaterial src)
         public VertexMaterialDelta(IVertexMaterial src)
@@ -184,50 +186,41 @@ namespace SharpGLTF.Geometry.VertexTypes
             Guard.NotNull(src, nameof(src));
             Guard.NotNull(src, nameof(src));
 
 
             MaxColors = Math.Min(2, src.MaxColors);
             MaxColors = Math.Min(2, src.MaxColors);
-            MaxTextCoords = Math.Min(2,src.MaxTextCoords);
+            MaxTextCoords = Math.Min(4,src.MaxTextCoords);
 
 
-            if (src.MaxColors == 0)
-            {
-                Color0Delta = Vector4.Zero;
-                Color1Delta = Vector4.Zero;
-            }
-            else if (src.MaxColors == 1)
-            {
-                Color0Delta = src.GetColor(0);
-                Color1Delta = Vector4.Zero;
-            }
-            else
-            {
-                Color0Delta = src.GetColor(0);
-                Color1Delta = src.GetColor(1);
-            }
+            Color0Delta = src.MaxColors < 1 ? Vector4.Zero : src.GetColor(0);
+            Color1Delta = src.MaxColors < 2 ? Vector4.Zero : src.GetColor(1);
 
 
-            if (src.MaxTextCoords == 0)
-            {
-                TexCoord0Delta = Vector2.Zero;
-                TexCoord1Delta = Vector2.Zero;
-            }
-            else if (src.MaxTextCoords == 1)
-            {
-                TexCoord0Delta = src.GetTexCoord(0);
-                TexCoord1Delta = Vector2.Zero;
-            }
-            else
-            {
-                TexCoord0Delta = src.GetTexCoord(0);
-                TexCoord1Delta = src.GetTexCoord(1);
-            }
+            TexCoord0Delta = src.MaxTextCoords < 1 ? Vector2.Zero : src.GetTexCoord(0);
+            TexCoord1Delta = src.MaxTextCoords < 2 ? Vector2.Zero : src.GetTexCoord(1);
+            TexCoord2Delta = src.MaxTextCoords < 3 ? Vector2.Zero : src.GetTexCoord(2);
+            TexCoord3Delta = src.MaxTextCoords < 4 ? Vector2.Zero : src.GetTexCoord(3);
         }
         }
-
+        
         public VertexMaterialDelta(in Vector4 color0Delta, in Vector4 color1Delta, in Vector2 texCoord0Delta, in Vector2 texCoord1Delta)
         public VertexMaterialDelta(in Vector4 color0Delta, in Vector4 color1Delta, in Vector2 texCoord0Delta, in Vector2 texCoord1Delta)
         {
         {
             MaxColors = 2;
             MaxColors = 2;
-            MaxTextCoords = 2;
+            MaxTextCoords = 4;
+
+            Color0Delta = color0Delta;
+            Color1Delta = color1Delta;
+            TexCoord0Delta = texCoord0Delta;
+            TexCoord1Delta = texCoord1Delta;
+            TexCoord2Delta = Vector2.Zero;
+            TexCoord3Delta = Vector2.Zero;
+        }
+
+        public VertexMaterialDelta(in Vector4 color0Delta, in Vector4 color1Delta, in Vector2 texCoord0Delta, in Vector2 texCoord1Delta, in Vector2 texCoord2Delta, in Vector2 texCoord3Delta)
+        {
+            MaxColors = 2;
+            MaxTextCoords = 4;
 
 
             Color0Delta = color0Delta;
             Color0Delta = color0Delta;
             Color1Delta = color1Delta;
             Color1Delta = color1Delta;
             TexCoord0Delta = texCoord0Delta;
             TexCoord0Delta = texCoord0Delta;
             TexCoord1Delta = texCoord1Delta;
             TexCoord1Delta = texCoord1Delta;
+            TexCoord2Delta = texCoord2Delta;
+            TexCoord3Delta = texCoord3Delta;
         }
         }
         
         
         internal VertexMaterialDelta(in VertexMaterialDelta rootVal, in VertexMaterialDelta morphVal)
         internal VertexMaterialDelta(in VertexMaterialDelta rootVal, in VertexMaterialDelta morphVal)
@@ -242,18 +235,22 @@ namespace SharpGLTF.Geometry.VertexTypes
             Color1Delta = morphVal.Color1Delta - rootVal.Color1Delta;
             Color1Delta = morphVal.Color1Delta - rootVal.Color1Delta;
             TexCoord0Delta = morphVal.TexCoord0Delta - rootVal.TexCoord0Delta;
             TexCoord0Delta = morphVal.TexCoord0Delta - rootVal.TexCoord0Delta;
             TexCoord1Delta = morphVal.TexCoord1Delta - rootVal.TexCoord1Delta;
             TexCoord1Delta = morphVal.TexCoord1Delta - rootVal.TexCoord1Delta;
+            TexCoord2Delta = morphVal.TexCoord2Delta - rootVal.TexCoord2Delta;
+            TexCoord3Delta = morphVal.TexCoord3Delta - rootVal.TexCoord3Delta;
         }
         }
 
 
         #endregion
         #endregion
 
 
         #region data
         #region data
 
 
-        public static VertexMaterialDelta Zero => new VertexMaterialDelta(Vector4.Zero, Vector4.Zero, Vector2.Zero, Vector2.Zero);
+        public static VertexMaterialDelta Zero => new VertexMaterialDelta(Vector4.Zero, Vector4.Zero, Vector2.Zero, Vector2.Zero, Vector2.Zero, Vector2.Zero);
                 
                 
         public Vector4 Color0Delta;        
         public Vector4 Color0Delta;        
         public Vector4 Color1Delta;        
         public Vector4 Color1Delta;        
-        public Vector2 TexCoord0Delta;        
-        public Vector2 TexCoord1Delta;        
+        public Vector2 TexCoord0Delta;
+        public Vector2 TexCoord1Delta;
+        public Vector2 TexCoord2Delta;
+        public Vector2 TexCoord3Delta;
 
 
         IEnumerable<KeyValuePair<string, AttributeFormat>> IVertexReflection.GetEncodingAttributes()
         IEnumerable<KeyValuePair<string, AttributeFormat>> IVertexReflection.GetEncodingAttributes()
         {
         {
@@ -262,6 +259,8 @@ namespace SharpGLTF.Geometry.VertexTypes
 
 
             yield return new KeyValuePair<string, AttributeFormat>("TEXCOORD_0DELTA", new AttributeFormat(Schema2.DimensionType.VEC2));
             yield return new KeyValuePair<string, AttributeFormat>("TEXCOORD_0DELTA", new AttributeFormat(Schema2.DimensionType.VEC2));
             yield return new KeyValuePair<string, AttributeFormat>("TEXCOORD_1DELTA", new AttributeFormat(Schema2.DimensionType.VEC2));
             yield return new KeyValuePair<string, AttributeFormat>("TEXCOORD_1DELTA", new AttributeFormat(Schema2.DimensionType.VEC2));
+            yield return new KeyValuePair<string, AttributeFormat>("TEXCOORD_2DELTA", new AttributeFormat(Schema2.DimensionType.VEC2));
+            yield return new KeyValuePair<string, AttributeFormat>("TEXCOORD_3DELTA", new AttributeFormat(Schema2.DimensionType.VEC2));
         }
         }
 
 
         /// <inheritdoc/>
         /// <inheritdoc/>
@@ -271,7 +270,15 @@ namespace SharpGLTF.Geometry.VertexTypes
         public int MaxTextCoords { get; }
         public int MaxTextCoords { get; }
 
 
         /// <inheritdoc/>
         /// <inheritdoc/>
-        public readonly override int GetHashCode() { return Color0Delta.GetHashCode() ^ Color1Delta.GetHashCode() ^ TexCoord0Delta.GetHashCode() ^ TexCoord1Delta.GetHashCode(); }
+        public readonly override int GetHashCode()
+        {
+            return Color0Delta.GetHashCode()
+                ^ Color1Delta.GetHashCode()
+                ^ TexCoord0Delta.GetHashCode()
+                ^ TexCoord1Delta.GetHashCode()
+                ^ TexCoord2Delta.GetHashCode()
+                ^ TexCoord3Delta.GetHashCode();
+        }
 
 
         /// <inheritdoc/>
         /// <inheritdoc/>
         public readonly override bool Equals(object obj) { return obj is VertexMaterialDelta other && AreEqual(this, other); }
         public readonly override bool Equals(object obj) { return obj is VertexMaterialDelta other && AreEqual(this, other); }
@@ -282,7 +289,12 @@ namespace SharpGLTF.Geometry.VertexTypes
         public static bool operator !=(in VertexMaterialDelta a, in VertexMaterialDelta b) { return !AreEqual(a, b); }
         public static bool operator !=(in VertexMaterialDelta a, in VertexMaterialDelta b) { return !AreEqual(a, b); }
         public static bool AreEqual(in VertexMaterialDelta a, in VertexMaterialDelta b)
         public static bool AreEqual(in VertexMaterialDelta a, in VertexMaterialDelta b)
         {
         {
-            return a.Color0Delta == b.Color0Delta && a.Color1Delta == b.Color1Delta && a.TexCoord0Delta == b.TexCoord0Delta && a.TexCoord1Delta == b.TexCoord1Delta;
+            return a.Color0Delta == b.Color0Delta
+                && a.Color1Delta == b.Color1Delta
+                && a.TexCoord0Delta == b.TexCoord0Delta
+                && a.TexCoord1Delta == b.TexCoord1Delta
+                && a.TexCoord2Delta == b.TexCoord2Delta
+                && a.TexCoord3Delta == b.TexCoord3Delta;
         }        
         }        
 
 
         #endregion
         #endregion
@@ -302,6 +314,8 @@ namespace SharpGLTF.Geometry.VertexTypes
             this.Color1Delta += delta.Color1Delta;
             this.Color1Delta += delta.Color1Delta;
             this.TexCoord0Delta += delta.TexCoord0Delta;
             this.TexCoord0Delta += delta.TexCoord0Delta;
             this.TexCoord1Delta += delta.TexCoord1Delta;
             this.TexCoord1Delta += delta.TexCoord1Delta;
+            this.TexCoord2Delta += delta.TexCoord2Delta;
+            this.TexCoord3Delta += delta.TexCoord3Delta;
         }
         }
 
 
         void IVertexMaterial.SetColor(int setIndex, Vector4 color)
         void IVertexMaterial.SetColor(int setIndex, Vector4 color)
@@ -324,6 +338,8 @@ namespace SharpGLTF.Geometry.VertexTypes
         {
         {
             if (setIndex == 0) this.TexCoord0Delta = coord;
             if (setIndex == 0) this.TexCoord0Delta = coord;
             if (setIndex == 1) this.TexCoord1Delta = coord;
             if (setIndex == 1) this.TexCoord1Delta = coord;
+            if (setIndex == 2) this.TexCoord2Delta = coord;
+            if (setIndex == 3) this.TexCoord3Delta = coord;
         }
         }
 
 
         /// <inheritdoc/>
         /// <inheritdoc/>
@@ -344,6 +360,8 @@ namespace SharpGLTF.Geometry.VertexTypes
             {
             {
                 case 0: return this.TexCoord0Delta;
                 case 0: return this.TexCoord0Delta;
                 case 1: return this.TexCoord1Delta;
                 case 1: return this.TexCoord1Delta;
+                case 2: return this.TexCoord2Delta;
+                case 3: return this.TexCoord3Delta;
                 default: throw new ArgumentOutOfRangeException(nameof(index));
                 default: throw new ArgumentOutOfRangeException(nameof(index));
             }
             }
         }
         }