Bladeren bron

Renamed ValueTuple's Item1, Item2, etc to proper names.

Vicente Penades 6 jaren geleden
bovenliggende
commit
9e3b0c145a
50 gewijzigde bestanden met toevoegingen van 459 en 430 verwijderingen
  1. 2 2
      build/SharpGLTF.CodeGen/SharpGLTF.CodeGen.csproj
  2. 2 2
      examples/SharpGLTF.Runtime.MonoGame/LoaderContext.cs
  3. 3 3
      examples/SharpGLTF.Runtime.MonoGame/MeshNormalsFallback.cs
  4. 1 1
      examples/SharpGLTF.Runtime.MonoGame/MeshPrimitiveReader.cs
  5. 1 1
      examples/SharpGLTF.Runtime.MonoGame/MonoGameModelInstance.cs
  6. 3 3
      examples/SharpGLTF.Runtime.MonoGame/MonoGameModelTemplate.cs
  7. 0 2
      src/Shared/Guard.cs
  8. 12 12
      src/SharpGLTF.Core/Animations/CubicSamplers.cs
  9. 21 21
      src/SharpGLTF.Core/Animations/LinearSamplers.cs
  10. 28 28
      src/SharpGLTF.Core/Animations/SamplerFactory.cs
  11. 16 10
      src/SharpGLTF.Core/Runtime/SceneInstance.cs
  12. 2 2
      src/SharpGLTF.Core/Runtime/SceneTemplate.cs
  13. 26 23
      src/SharpGLTF.Core/Schema2/gltf.Animations.cs
  14. 6 6
      src/SharpGLTF.Core/Schema2/gltf.ExtensionsFactory.cs
  15. 1 1
      src/SharpGLTF.Core/Schema2/gltf.Mesh.cs
  16. 2 2
      src/SharpGLTF.Core/Schema2/gltf.MeshPrimitive.cs
  17. 8 0
      src/SharpGLTF.Core/Schema2/gltf.Node.cs
  18. 14 11
      src/SharpGLTF.Core/Schema2/gltf.Serialization.Read.cs
  19. 9 9
      src/SharpGLTF.Core/Schema2/gltf.Skin.cs
  20. 4 4
      src/SharpGLTF.Core/Transforms/IndexWeight.cs
  21. 11 11
      src/SharpGLTF.Core/Transforms/MeshTransforms.cs
  22. 8 8
      src/SharpGLTF.Core/Transforms/SparseWeight8.cs
  23. 11 7
      src/SharpGLTF.Core/Validation/ValidationContext.cs
  24. 11 11
      src/SharpGLTF.Toolkit/Animations/CurveBuilder.cs
  25. 18 18
      src/SharpGLTF.Toolkit/Animations/CurveFactory.cs
  26. 6 6
      src/SharpGLTF.Toolkit/Geometry/MeshBuilder.cs
  27. 3 3
      src/SharpGLTF.Toolkit/Geometry/MeshBuilderToolkit.cs
  28. 60 60
      src/SharpGLTF.Toolkit/Geometry/PrimitiveBuilder.cs
  29. 10 10
      src/SharpGLTF.Toolkit/Geometry/VertexBuilder.cs
  30. 5 5
      src/SharpGLTF.Toolkit/Geometry/VertexTypes/FragmentPreprocessors.cs
  31. 8 8
      src/SharpGLTF.Toolkit/Geometry/VertexTypes/VertexGeometry.cs
  32. 10 10
      src/SharpGLTF.Toolkit/Geometry/VertexTypes/VertexMaterial.cs
  33. 2 2
      src/SharpGLTF.Toolkit/Geometry/VertexTypes/VertexSkinning.cs
  34. 5 5
      src/SharpGLTF.Toolkit/IO/WavefrontWriter.cs
  35. 4 0
      src/SharpGLTF.Toolkit/Scenes/NodeBuilder.cs
  36. 1 1
      src/SharpGLTF.Toolkit/Scenes/SceneBuilder.Schema2.cs
  37. 5 5
      src/SharpGLTF.Toolkit/Scenes/Transformers.Schema2.cs
  38. 6 6
      src/SharpGLTF.Toolkit/Schema2/AnimationExtensions.cs
  39. 39 39
      src/SharpGLTF.Toolkit/Schema2/MeshExtensions.cs
  40. 12 12
      src/SharpGLTF.Toolkit/Schema2/SceneExtensions.cs
  41. 14 14
      tests/SharpGLTF.Tests/AnimationSamplingTests.cs
  42. 7 7
      tests/SharpGLTF.Tests/Collections/ChildrenCollectionTests.cs
  43. 6 6
      tests/SharpGLTF.Tests/Geometry/MeshBuilderTests.cs
  44. 3 0
      tests/SharpGLTF.Tests/Geometry/Parametric/SolidMeshUtils.cs
  45. 5 5
      tests/SharpGLTF.Tests/Plotting.cs
  46. 4 4
      tests/SharpGLTF.Tests/Reports.cs
  47. 2 2
      tests/SharpGLTF.Tests/Scenes/SceneBuilderTests.cs
  48. 19 19
      tests/SharpGLTF.Tests/Schema2/LoadAndSave/LoadGeneratedTests.cs
  49. 2 2
      tests/SharpGLTF.Tests/Schema2/LoadAndSave/LoadSampleTests.cs
  50. 1 1
      tests/SharpGLTF.Tests/TestFiles.cs

+ 2 - 2
build/SharpGLTF.CodeGen/SharpGLTF.CodeGen.csproj

@@ -8,8 +8,8 @@
 
 
   <ItemGroup>
   <ItemGroup>
     <PackageReference Include="LibGit2Sharp" Version="0.26.1" />
     <PackageReference Include="LibGit2Sharp" Version="0.26.1" />
-    <PackageReference Include="NJsonSchema.CodeGeneration" Version="10.0.24" />
-    <PackageReference Include="NJsonSchema.CodeGeneration.CSharp" Version="10.0.24" />
+    <PackageReference Include="NJsonSchema.CodeGeneration" Version="10.0.27" />
+    <PackageReference Include="NJsonSchema.CodeGeneration.CSharp" Version="10.0.27" />
   </ItemGroup>
   </ItemGroup>
 
 
 </Project>
 </Project>

+ 2 - 2
examples/SharpGLTF.Runtime.MonoGame/LoaderContext.cs

@@ -115,10 +115,10 @@ namespace SharpGLTF.Runtime
             return vb;
             return vb;
         }
         }
 
 
-        private IndexBuffer CreateIndexBuffer(IEnumerable<(int, int, int)> triangles)
+        private IndexBuffer CreateIndexBuffer(IEnumerable<(int A, int B, int C)> triangles)
         {
         {
             var sequence32 = triangles
             var sequence32 = triangles
-                .SelectMany(item => new[] { (UInt32)item.Item3, (UInt32)item.Item2, (UInt32)item.Item1 })
+                .SelectMany(item => new[] { (UInt32)item.C, (UInt32)item.B, (UInt32)item.A })
                 .ToArray();
                 .ToArray();
 
 
             var max = sequence32.Max();
             var max = sequence32.Max();

+ 3 - 3
examples/SharpGLTF.Runtime.MonoGame/MeshNormalsFallback.cs

@@ -22,9 +22,9 @@ namespace SharpGLTF.Runtime
 
 
                 foreach (var srcTri in srcPrim.GetTriangleIndices())
                 foreach (var srcTri in srcPrim.GetTriangleIndices())
                 {
                 {
-                    var a = positions[srcTri.Item1];
-                    var b = positions[srcTri.Item2];
-                    var c = positions[srcTri.Item3];
+                    var a = positions[srcTri.A];
+                    var b = positions[srcTri.B];
+                    var c = positions[srcTri.C];
                     var d = XYZ.Cross(b - a, c - a);
                     var d = XYZ.Cross(b - a, c - a);
 
 
                     AddWeightedNormal(a, d);
                     AddWeightedNormal(a, d);

+ 1 - 1
examples/SharpGLTF.Runtime.MonoGame/MeshPrimitiveReader.cs

@@ -56,7 +56,7 @@ namespace SharpGLTF.Runtime
             if (doubleSided) // Monogame's effect material does not support double sided materials, so we simulate it by adding reverse faces
             if (doubleSided) // Monogame's effect material does not support double sided materials, so we simulate it by adding reverse faces
             {
             {
                 var front = srcPrim.GetTriangleIndices();
                 var front = srcPrim.GetTriangleIndices();
-                var back = front.Select(item => (item.Item1, item.Item3, item.Item2));
+                var back = front.Select(item => (item.A, item.C, item.B));
                 _Triangles = front.Concat(back).ToArray();
                 _Triangles = front.Concat(back).ToArray();
             }
             }
             else
             else

+ 1 - 1
examples/SharpGLTF.Runtime.MonoGame/MonoGameModelInstance.cs

@@ -52,7 +52,7 @@ namespace SharpGLTF.Runtime
         {
         {
             foreach (var d in _Controller.DrawableReferences)
             foreach (var d in _Controller.DrawableReferences)
             {
             {
-                Draw(_Template._Meshes[d.Item1], projection, view, world, d.Item2);
+                Draw(_Template._Meshes[d.MeshIndex], projection, view, world, d.Transform);
             }
             }
         }
         }
 
 

+ 3 - 3
examples/SharpGLTF.Runtime.MonoGame/MonoGameModelTemplate.cs

@@ -111,11 +111,11 @@ namespace SharpGLTF.Runtime
 
 
             foreach (var d in instance.DrawableReferences)
             foreach (var d in instance.DrawableReferences)
             {
             {
-                var b = _Meshes[d.Item1].BoundingSphere;
+                var b = _Meshes[d.MeshIndex].BoundingSphere;
 
 
-                if (d.Item2 is Transforms.RigidTransform statXform) b = b.Transform(statXform.WorldMatrix.ToXna());
+                if (d.Transform is Transforms.RigidTransform statXform) b = b.Transform(statXform.WorldMatrix.ToXna());
 
 
-                if (d.Item2 is Transforms.SkinnedTransform skinXform)
+                if (d.Transform is Transforms.SkinnedTransform skinXform)
                 {
                 {
                     // this is a bit agressive and probably over-reaching, but with skins you never know the actual bounds
                     // this is a bit agressive and probably over-reaching, but with skins you never know the actual bounds
                     // unless you calculate the bounds frame by frame.
                     // unless you calculate the bounds frame by frame.

+ 0 - 2
src/Shared/Guard.cs

@@ -58,14 +58,12 @@ namespace SharpGLTF
         public static void NotNull(object target, string parameterName, string message = "")
         public static void NotNull(object target, string parameterName, string message = "")
         {
         {
             if (target != null) return;
             if (target != null) return;
-            if (string.IsNullOrWhiteSpace(message)) throw new ArgumentNullException(parameterName);
             throw new ArgumentNullException(parameterName, message);
             throw new ArgumentNullException(parameterName, message);
         }
         }
 
 
         public static void MustBeNull(object target, string parameterName, string message = "")
         public static void MustBeNull(object target, string parameterName, string message = "")
         {
         {
             if (target == null) return;
             if (target == null) return;
-            if (string.IsNullOrWhiteSpace(message)) throw new ArgumentException("Argument must be null.", parameterName);
             throw new ArgumentException(parameterName, message);
             throw new ArgumentException(parameterName, message);
         }
         }
 
 

+ 12 - 12
src/SharpGLTF.Core/Animations/CubicSamplers.cs

@@ -36,9 +36,9 @@ namespace SharpGLTF.Animations
 
 
             return SamplerFactory.InterpolateCubic
             return SamplerFactory.InterpolateCubic
                 (
                 (
-                segment.Item1.Item2, segment.Item1.Item3,   // start, startTangentOut
-                segment.Item2.Item2, segment.Item2.Item1,   // end, endTangentIn
-                segment.Item3                               // amount
+                segment.A.Item2, segment.A.Item3,   // start, startTangentOut
+                segment.B.Item2, segment.B.Item1,   // end, endTangentIn
+                segment.Amount                               // amount
                 );
                 );
         }
         }
 
 
@@ -100,9 +100,9 @@ namespace SharpGLTF.Animations
 
 
             return SamplerFactory.InterpolateCubic
             return SamplerFactory.InterpolateCubic
                 (
                 (
-                segment.Item1.Item2, segment.Item1.Item3,   // start, startTangentOut
-                segment.Item2.Item2, segment.Item2.Item1,   // end, endTangentIn
-                segment.Item3                               // amount
+                segment.A.Item2, segment.A.Item3,   // start, startTangentOut
+                segment.B.Item2, segment.B.Item1,   // end, endTangentIn
+                segment.Amount                               // amount
                 );
                 );
         }
         }
 
 
@@ -164,9 +164,9 @@ namespace SharpGLTF.Animations
 
 
             return Transforms.SparseWeight8.InterpolateCubic
             return Transforms.SparseWeight8.InterpolateCubic
                 (
                 (
-                segment.Item1.Item2, segment.Item1.Item3,   // start, startTangentOut
-                segment.Item2.Item2, segment.Item2.Item1,   // end, endTangentIn
-                segment.Item3                               // amount
+                segment.A.Item2, segment.A.Item3,   // start, startTangentOut
+                segment.B.Item2, segment.B.Item1,   // end, endTangentIn
+                segment.Amount                               // amount
                 );
                 );
         }
         }
 
 
@@ -228,9 +228,9 @@ namespace SharpGLTF.Animations
 
 
             return SamplerFactory.InterpolateCubic
             return SamplerFactory.InterpolateCubic
                 (
                 (
-                segment.Item1.Item2, segment.Item1.Item3,   // start, startTangentOut
-                segment.Item2.Item2, segment.Item2.Item1,   // end, endTangentIn
-                segment.Item3                               // amount
+                segment.A.Item2, segment.A.Item3,   // start, startTangentOut
+                segment.B.Item2, segment.B.Item1,   // end, endTangentIn
+                segment.Amount                               // amount
                 );
                 );
         }
         }
 
 

+ 21 - 21
src/SharpGLTF.Core/Animations/LinearSamplers.cs

@@ -13,7 +13,7 @@ namespace SharpGLTF.Animations
     {
     {
         #region lifecycle
         #region lifecycle
 
 
-        public Vector3LinearSampler(IEnumerable<(float, Vector3)> sequence, bool isLinear)
+        public Vector3LinearSampler(IEnumerable<(float Key, Vector3 Value)> sequence, bool isLinear)
         {
         {
             _Sequence = sequence;
             _Sequence = sequence;
             _Linear = isLinear;
             _Linear = isLinear;
@@ -23,7 +23,7 @@ namespace SharpGLTF.Animations
 
 
         #region data
         #region data
 
 
-        private readonly IEnumerable<(float, Vector3)> _Sequence;
+        private readonly IEnumerable<(float Key, Vector3 Value)> _Sequence;
         private readonly Boolean _Linear;
         private readonly Boolean _Linear;
 
 
         #endregion
         #endregion
@@ -36,21 +36,21 @@ namespace SharpGLTF.Animations
         {
         {
             var segment = SamplerFactory.FindPairContainingOffset(_Sequence, offset);
             var segment = SamplerFactory.FindPairContainingOffset(_Sequence, offset);
 
 
-            if (!_Linear) return segment.Item1;
+            if (!_Linear) return segment.A;
 
 
-            return Vector3.Lerp(segment.Item1, segment.Item2, segment.Item3);
+            return Vector3.Lerp(segment.A, segment.B, segment.Amount);
         }
         }
 
 
         public IReadOnlyDictionary<float, Vector3> ToStepCurve()
         public IReadOnlyDictionary<float, Vector3> ToStepCurve()
         {
         {
             Guard.IsFalse(_Linear, nameof(_Linear));
             Guard.IsFalse(_Linear, nameof(_Linear));
-            return _Sequence.ToDictionary(pair => pair.Item1, pair => pair.Item2);
+            return _Sequence.ToDictionary(pair => pair.Key, pair => pair.Value);
         }
         }
 
 
         public IReadOnlyDictionary<float, Vector3> ToLinearCurve()
         public IReadOnlyDictionary<float, Vector3> ToLinearCurve()
         {
         {
             Guard.IsTrue(_Linear, nameof(_Linear));
             Guard.IsTrue(_Linear, nameof(_Linear));
-            return _Sequence.ToDictionary(pair => pair.Item1, pair => pair.Item2);
+            return _Sequence.ToDictionary(pair => pair.Key, pair => pair.Value);
         }
         }
 
 
         public IReadOnlyDictionary<float, (Vector3, Vector3, Vector3)> ToSplineCurve()
         public IReadOnlyDictionary<float, (Vector3, Vector3, Vector3)> ToSplineCurve()
@@ -89,7 +89,7 @@ namespace SharpGLTF.Animations
 
 
         #region data
         #region data
 
 
-        private readonly IEnumerable<(float, Quaternion)> _Sequence;
+        private readonly IEnumerable<(float Key, Quaternion Value)> _Sequence;
         private readonly Boolean _Linear;
         private readonly Boolean _Linear;
 
 
         #endregion
         #endregion
@@ -102,21 +102,21 @@ namespace SharpGLTF.Animations
         {
         {
             var segment = SamplerFactory.FindPairContainingOffset(_Sequence, offset);
             var segment = SamplerFactory.FindPairContainingOffset(_Sequence, offset);
 
 
-            if (!_Linear) return segment.Item1;
+            if (!_Linear) return segment.A;
 
 
-            return Quaternion.Slerp(segment.Item1, segment.Item2, segment.Item3);
+            return Quaternion.Slerp(segment.A, segment.B, segment.Amount);
         }
         }
 
 
         public IReadOnlyDictionary<float, Quaternion> ToStepCurve()
         public IReadOnlyDictionary<float, Quaternion> ToStepCurve()
         {
         {
             Guard.IsFalse(_Linear, nameof(_Linear));
             Guard.IsFalse(_Linear, nameof(_Linear));
-            return _Sequence.ToDictionary(pair => pair.Item1, pair => pair.Item2);
+            return _Sequence.ToDictionary(pair => pair.Key, pair => pair.Value);
         }
         }
 
 
         public IReadOnlyDictionary<float, Quaternion> ToLinearCurve()
         public IReadOnlyDictionary<float, Quaternion> ToLinearCurve()
         {
         {
             Guard.IsTrue(_Linear, nameof(_Linear));
             Guard.IsTrue(_Linear, nameof(_Linear));
-            return _Sequence.ToDictionary(pair => pair.Item1, pair => pair.Item2);
+            return _Sequence.ToDictionary(pair => pair.Key, pair => pair.Value);
         }
         }
 
 
         public IReadOnlyDictionary<float, (Quaternion, Quaternion, Quaternion)> ToSplineCurve()
         public IReadOnlyDictionary<float, (Quaternion, Quaternion, Quaternion)> ToSplineCurve()
@@ -145,7 +145,7 @@ namespace SharpGLTF.Animations
     {
     {
         #region lifecycle
         #region lifecycle
 
 
-        public SparseLinearSampler(IEnumerable<(float, Transforms.SparseWeight8)> sequence, bool isLinear)
+        public SparseLinearSampler(IEnumerable<(float Key, Transforms.SparseWeight8 Value)> sequence, bool isLinear)
         {
         {
             _Sequence = sequence;
             _Sequence = sequence;
             _Linear = isLinear;
             _Linear = isLinear;
@@ -155,7 +155,7 @@ namespace SharpGLTF.Animations
 
 
         #region data
         #region data
 
 
-        private readonly IEnumerable<(float, Transforms.SparseWeight8)> _Sequence;
+        private readonly IEnumerable<(float Key, Transforms.SparseWeight8 Value)> _Sequence;
         private readonly Boolean _Linear;
         private readonly Boolean _Linear;
 
 
         #endregion
         #endregion
@@ -168,9 +168,9 @@ namespace SharpGLTF.Animations
         {
         {
             var segment = SamplerFactory.FindPairContainingOffset(_Sequence, offset);
             var segment = SamplerFactory.FindPairContainingOffset(_Sequence, offset);
 
 
-            if (!_Linear) return segment.Item1;
+            if (!_Linear) return segment.A;
 
 
-            var weights = Transforms.SparseWeight8.InterpolateLinear(segment.Item1, segment.Item2, segment.Item3);
+            var weights = Transforms.SparseWeight8.InterpolateLinear(segment.A, segment.B, segment.Amount);
 
 
             return weights;
             return weights;
         }
         }
@@ -183,7 +183,7 @@ namespace SharpGLTF.Animations
         public IReadOnlyDictionary<float, Transforms.SparseWeight8> ToLinearCurve()
         public IReadOnlyDictionary<float, Transforms.SparseWeight8> ToLinearCurve()
         {
         {
             Guard.IsTrue(_Linear, nameof(_Linear));
             Guard.IsTrue(_Linear, nameof(_Linear));
-            return _Sequence.ToDictionary(pair => pair.Item1, pair => pair.Item2);
+            return _Sequence.ToDictionary(pair => pair.Key, pair => pair.Value);
         }
         }
 
 
         public IReadOnlyDictionary<float, (Transforms.SparseWeight8, Transforms.SparseWeight8, Transforms.SparseWeight8)> ToSplineCurve()
         public IReadOnlyDictionary<float, (Transforms.SparseWeight8, Transforms.SparseWeight8, Transforms.SparseWeight8)> ToSplineCurve()
@@ -222,7 +222,7 @@ namespace SharpGLTF.Animations
 
 
         #region data
         #region data
 
 
-        private readonly IEnumerable<(float, float[])> _Sequence;
+        private readonly IEnumerable<(float Key, float[] Value)> _Sequence;
         private readonly Boolean _Linear;
         private readonly Boolean _Linear;
 
 
         #endregion
         #endregion
@@ -235,21 +235,21 @@ namespace SharpGLTF.Animations
         {
         {
             var segment = SamplerFactory.FindPairContainingOffset(_Sequence, offset);
             var segment = SamplerFactory.FindPairContainingOffset(_Sequence, offset);
 
 
-            if (!_Linear) return segment.Item1;
+            if (!_Linear) return segment.A;
 
 
-            return SamplerFactory.InterpolateLinear(segment.Item1, segment.Item2, segment.Item3);
+            return SamplerFactory.InterpolateLinear(segment.A, segment.B, segment.Amount);
         }
         }
 
 
         public IReadOnlyDictionary<float, float[]> ToStepCurve()
         public IReadOnlyDictionary<float, float[]> ToStepCurve()
         {
         {
             Guard.IsFalse(_Linear, nameof(_Linear));
             Guard.IsFalse(_Linear, nameof(_Linear));
-            return _Sequence.ToDictionary(pair => pair.Item1, pair => pair.Item2);
+            return _Sequence.ToDictionary(pair => pair.Key, pair => pair.Value);
         }
         }
 
 
         public IReadOnlyDictionary<float, float[]> ToLinearCurve()
         public IReadOnlyDictionary<float, float[]> ToLinearCurve()
         {
         {
             Guard.IsTrue(_Linear, nameof(_Linear));
             Guard.IsTrue(_Linear, nameof(_Linear));
-            return _Sequence.ToDictionary(pair => pair.Item1, pair => pair.Item2);
+            return _Sequence.ToDictionary(pair => pair.Key, pair => pair.Value);
         }
         }
 
 
         public IReadOnlyDictionary<float, (float[], float[], float[])> ToSplineCurve()
         public IReadOnlyDictionary<float, (float[], float[], float[])> ToSplineCurve()

+ 28 - 28
src/SharpGLTF.Core/Animations/SamplerFactory.cs

@@ -52,12 +52,12 @@ namespace SharpGLTF.Animations
         /// <param name="amount">The input amount (must be between 0 and 1)</param>
         /// <param name="amount">The input amount (must be between 0 and 1)</param>
         /// <returns>
         /// <returns>
         /// The output weights.
         /// The output weights.
-        /// - Item1: Weight for Start point
-        /// - Item2: Weight for End point
-        /// - Item3: Weight for Start Outgoing Tangent
-        /// - Item4: Weight for End Incoming Tangent
+        /// - StartPosition: Weight for Start point
+        /// - EndPosition: Weight for End point
+        /// - StartTangent: Weight for Start Outgoing Tangent
+        /// - EndTangent: Weight for End Incoming Tangent
         /// </returns>
         /// </returns>
-        public static (float, float, float, float) CreateHermitePointWeights(float amount)
+        public static (float StartPosition, float EndPosition, float StartTangent, float EndTangent) CreateHermitePointWeights(float amount)
         {
         {
             System.Diagnostics.Debug.Assert(amount >= 0 && amount <= 1, nameof(amount));
             System.Diagnostics.Debug.Assert(amount >= 0 && amount <= 1, nameof(amount));
 
 
@@ -89,12 +89,12 @@ namespace SharpGLTF.Animations
         /// <param name="amount">The input amount (must be between 0 and 1)</param>
         /// <param name="amount">The input amount (must be between 0 and 1)</param>
         /// <returns>
         /// <returns>
         /// The output weights.
         /// The output weights.
-        /// - Item1: Weight for Start point
-        /// - Item2: Weight for End point
-        /// - Item3: Weight for Start Outgoing Tangent
-        /// - Item4: Weight for End Incoming Tangent
+        /// - StartPosition: Weight for Start point
+        /// - EndPosition: Weight for End point
+        /// - StartTangent: Weight for Start Outgoing Tangent
+        /// - EndTangent: Weight for End Incoming Tangent
         /// </returns>
         /// </returns>
-        public static (float, float, float, float) CreateHermiteTangentWeights(float amount)
+        public static (float StartPosition, float EndPosition, float StartTangent, float EndTangent) CreateHermiteTangentWeights(float amount)
         {
         {
             System.Diagnostics.Debug.Assert(amount >= 0 && amount <= 1, nameof(amount));
             System.Diagnostics.Debug.Assert(amount >= 0 && amount <= 1, nameof(amount));
 
 
@@ -125,29 +125,29 @@ namespace SharpGLTF.Animations
         /// <param name="sequence">A sequence of float+<typeparamref name="T"/> pairs sorted in ascending order.</param>
         /// <param name="sequence">A sequence of float+<typeparamref name="T"/> pairs sorted in ascending order.</param>
         /// <param name="offset">the offset to look for in the sequence.</param>
         /// <param name="offset">the offset to look for in the sequence.</param>
         /// <returns>Two consecutive <typeparamref name="T"/> values and a float amount to LERP amount.</returns>
         /// <returns>Two consecutive <typeparamref name="T"/> values and a float amount to LERP amount.</returns>
-        public static (T, T, float) FindPairContainingOffset<T>(this IEnumerable<(float, T)> sequence, float offset)
+        public static (T A, T B, Single Amount) FindPairContainingOffset<T>(this IEnumerable<(float Key, T Value)> sequence, float offset)
         {
         {
             Guard.NotNull(sequence, nameof(sequence));
             Guard.NotNull(sequence, nameof(sequence));
 
 
             if (!sequence.Any()) return (default(T), default(T), 0);
             if (!sequence.Any()) return (default(T), default(T), 0);
 
 
-            (float, T)? left = null;
-            (float, T)? right = null;
-            (float, T)? prev = null;
+            (float Key, T Value)? left = null;
+            (float Key, T Value)? right = null;
+            (float Key, T Value)? prev = null;
 
 
             var first = sequence.First();
             var first = sequence.First();
-            if (offset < first.Item1) offset = first.Item1;
+            if (offset < first.Key) offset = first.Key;
 
 
             foreach (var item in sequence)
             foreach (var item in sequence)
             {
             {
-                System.Diagnostics.Debug.Assert(!prev.HasValue || prev.Value.Item1 < item.Item1, "Values in the sequence must be sorted ascending.");
+                System.Diagnostics.Debug.Assert(condition: !prev.HasValue || prev.Value.Key < item.Key, "Values in the sequence must be sorted ascending.");
 
 
-                if (item.Item1 == offset)
+                if (item.Key == offset)
                 {
                 {
                     left = item; continue;
                     left = item; continue;
                 }
                 }
 
 
-                if (item.Item1 > offset)
+                if (item.Key > offset)
                 {
                 {
                     if (left == null) left = prev;
                     if (left == null) left = prev;
                     right = item;
                     right = item;
@@ -158,18 +158,18 @@ namespace SharpGLTF.Animations
             }
             }
 
 
             if (left == null && right == null) return (default(T), default(T), 0);
             if (left == null && right == null) return (default(T), default(T), 0);
-            if (left == null) return (right.Value.Item2, right.Value.Item2, 0);
-            if (right == null) return (left.Value.Item2, left.Value.Item2, 0);
+            if (left == null) return (right.Value.Value, right.Value.Value, 0);
+            if (right == null) return (left.Value.Value, left.Value.Value, 0);
 
 
-            var delta = right.Value.Item1 - left.Value.Item1;
+            var delta = right.Value.Key - left.Value.Key;
 
 
             System.Diagnostics.Debug.Assert(delta > 0);
             System.Diagnostics.Debug.Assert(delta > 0);
 
 
-            var amount = (offset - left.Value.Item1) / delta;
+            var amount = (offset - left.Value.Key) / delta;
 
 
             System.Diagnostics.Debug.Assert(amount >= 0 && amount <= 1);
             System.Diagnostics.Debug.Assert(amount >= 0 && amount <= 1);
 
 
-            return (left.Value.Item2, right.Value.Item2, amount);
+            return (left.Value.Value, right.Value.Value, amount);
         }
         }
 
 
         /// <summary>
         /// <summary>
@@ -179,7 +179,7 @@ namespace SharpGLTF.Animations
         /// <param name="sequence">A sequence of offsets sorted in ascending order.</param>
         /// <param name="sequence">A sequence of offsets sorted in ascending order.</param>
         /// <param name="offset">the offset to look for in the sequence.</param>
         /// <param name="offset">the offset to look for in the sequence.</param>
         /// <returns>Two consecutive offsets and a LERP amount.</returns>
         /// <returns>Two consecutive offsets and a LERP amount.</returns>
-        public static (float, float, float) FindPairContainingOffset(IEnumerable<float> sequence, float offset)
+        public static (Single A, Single B, Single Amount) FindPairContainingOffset(IEnumerable<float> sequence, float offset)
         {
         {
             Guard.NotNull(sequence, nameof(sequence));
             Guard.NotNull(sequence, nameof(sequence));
 
 
@@ -288,16 +288,16 @@ namespace SharpGLTF.Animations
 
 
         public static Vector3 InterpolateCubic(Vector3 start, Vector3 outgoingTangent, Vector3 end, Vector3 incomingTangent, Single amount)
         public static Vector3 InterpolateCubic(Vector3 start, Vector3 outgoingTangent, Vector3 end, Vector3 incomingTangent, Single amount)
         {
         {
-            var hermite = SamplerFactory.CreateHermitePointWeights(amount);
+            var hermite = CreateHermitePointWeights(amount);
 
 
-            return (start * hermite.Item1) + (end * hermite.Item2) + (outgoingTangent * hermite.Item3) + (incomingTangent * hermite.Item4);
+            return (start * hermite.StartPosition) + (end * hermite.EndPosition) + (outgoingTangent * hermite.StartTangent) + (incomingTangent * hermite.EndTangent);
         }
         }
 
 
         public static Quaternion InterpolateCubic(Quaternion start, Quaternion outgoingTangent, Quaternion end, Quaternion incomingTangent, Single amount)
         public static Quaternion InterpolateCubic(Quaternion start, Quaternion outgoingTangent, Quaternion end, Quaternion incomingTangent, Single amount)
         {
         {
             var hermite = CreateHermitePointWeights(amount);
             var hermite = CreateHermitePointWeights(amount);
 
 
-            return Quaternion.Normalize((start * hermite.Item1) + (end * hermite.Item2) + (outgoingTangent * hermite.Item3) + (incomingTangent * hermite.Item4));
+            return Quaternion.Normalize((start * hermite.StartPosition) + (end * hermite.EndPosition) + (outgoingTangent * hermite.StartTangent) + (incomingTangent * hermite.EndTangent));
         }
         }
 
 
         public static Single[] InterpolateCubic(Single[] start, Single[] outgoingTangent, Single[] end, Single[] incomingTangent, Single amount)
         public static Single[] InterpolateCubic(Single[] start, Single[] outgoingTangent, Single[] end, Single[] incomingTangent, Single amount)
@@ -313,7 +313,7 @@ namespace SharpGLTF.Animations
 
 
             for (int i = 0; i < result.Length; ++i)
             for (int i = 0; i < result.Length; ++i)
             {
             {
-                result[i] = (start[i] * hermite.Item1) + (end[i] * hermite.Item2) + (outgoingTangent[i] * hermite.Item3) + (incomingTangent[i] * hermite.Item4);
+                result[i] = (start[i] * hermite.StartPosition) + (end[i] * hermite.EndPosition) + (outgoingTangent[i] * hermite.StartTangent) + (incomingTangent[i] * hermite.EndTangent);
             }
             }
 
 
             return result;
             return result;

+ 16 - 10
src/SharpGLTF.Core/Runtime/SceneInstance.cs

@@ -190,12 +190,19 @@ namespace SharpGLTF.Runtime
         public int DrawableReferencesCount => _DrawableTransforms.Length;
         public int DrawableReferencesCount => _DrawableTransforms.Length;
 
 
         /// <summary>
         /// <summary>
-        /// Gets a collection of drawable references, where Item1 is the logical Index
-        /// of a <see cref="Schema2.Mesh"/> in <see cref="Schema2.ModelRoot.LogicalMeshes"/>
-        /// and Item2 is an <see cref="IGeometryTransform"/> that can be used to transform
-        /// the <see cref="Schema2.Mesh"/> into world space.
+        /// Gets a collection of drawable references, where:
+        /// <list type="bullet">
+        /// <item>
+        /// <term>MeshIndex</term>
+        /// <description>The logical Index of a <see cref="Schema2.Mesh"/> in <see cref="Schema2.ModelRoot.LogicalMeshes"/>.</description>
+        /// </item>
+        /// <item>
+        /// <term>Transform</term>
+        /// <description>An <see cref="IGeometryTransform"/> that can be used to transform the <see cref="Schema2.Mesh"/> into world space.</description>
+        /// </item>
+        /// </list>
         /// </summary>
         /// </summary>
-        public IEnumerable<(int, IGeometryTransform)> DrawableReferences
+        public IEnumerable<(int MeshIndex, IGeometryTransform Transform)> DrawableReferences
         {
         {
             get
             get
             {
             {
@@ -286,14 +293,13 @@ namespace SharpGLTF.Runtime
         }
         }
 
 
         /// <summary>
         /// <summary>
-        /// Gets a drawable reference pair, where Item1 is the logical Index
-        /// of a <see cref="Schema2.Mesh"/> in <see cref="Schema2.ModelRoot.LogicalMeshes"/>
-        /// and Item2 is an <see cref="IGeometryTransform"/> that can be used to transform
-        /// the <see cref="Schema2.Mesh"/> into world space.
+        /// Gets a drawable reference pair, where:
+        /// - MeshIndex is the logical Index of a <see cref="Schema2.Mesh"/> in <see cref="Schema2.ModelRoot.LogicalMeshes"/>.
+        /// - Transform is an <see cref="IGeometryTransform"/> that can be used to transform the <see cref="Schema2.Mesh"/> into world space.
         /// </summary>
         /// </summary>
         /// <param name="index">The index of the drawable reference, from 0 to <see cref="DrawableReferencesCount"/></param>
         /// <param name="index">The index of the drawable reference, from 0 to <see cref="DrawableReferencesCount"/></param>
         /// <returns>A drawable reference</returns>
         /// <returns>A drawable reference</returns>
-        public (int, IGeometryTransform) GetDrawableReference(int index)
+        public (int MeshIndex, IGeometryTransform Transform) GetDrawableReference(int index)
         {
         {
             var dref = _DrawableReferences[index];
             var dref = _DrawableReferences[index];
 
 

+ 2 - 2
src/SharpGLTF.Core/Runtime/SceneTemplate.cs

@@ -266,8 +266,8 @@ namespace SharpGLTF.Runtime
             {
             {
                 var jm = skin.GetJoint(i);
                 var jm = skin.GetJoint(i);
 
 
-                _JointsNodeIndices[i] = indexFunc(jm.Item1);
-                _BindMatrices[i] = jm.Item2;
+                _JointsNodeIndices[i] = indexFunc(jm.Joint);
+                _BindMatrices[i] = jm.InverseBindMatrix;
             }
             }
         }
         }
 
 

+ 26 - 23
src/SharpGLTF.Core/Schema2/gltf.Animations.cs

@@ -167,7 +167,7 @@ namespace SharpGLTF.Schema2
 
 
         public IAnimationSampler<SparseWeight8> FindSparseMorphSampler(Node node) { return FindChannel(node, PropertyPath.weights)?.Sampler; }
         public IAnimationSampler<SparseWeight8> FindSparseMorphSampler(Node node) { return FindChannel(node, PropertyPath.weights)?.Sampler; }
 
 
-        public AffineTransform GetLocalTransform(Node node, float time)
+        public AffineTransform GetLocalTransform(Node node, Single time)
         {
         {
             Guard.NotNull(node, nameof(node));
             Guard.NotNull(node, nameof(node));
             Guard.MustShareLogicalParent(this, node, nameof(node));
             Guard.MustShareLogicalParent(this, node, nameof(node));
@@ -185,7 +185,7 @@ namespace SharpGLTF.Schema2
             return xform;
             return xform;
         }
         }
 
 
-        public IReadOnlyList<float> GetMorphWeights(Node node, float time)
+        public IReadOnlyList<float> GetMorphWeights(Node node, Single time)
         {
         {
             Guard.NotNull(node, nameof(node));
             Guard.NotNull(node, nameof(node));
 
 
@@ -200,7 +200,7 @@ namespace SharpGLTF.Schema2
             return mfunc.GetPoint(time);
             return mfunc.GetPoint(time);
         }
         }
 
 
-        public SparseWeight8 GetSparseMorphWeights(Node node, float time)
+        public SparseWeight8 GetSparseMorphWeights(Node node, Single time)
         {
         {
             Guard.NotNull(node, nameof(node));
             Guard.NotNull(node, nameof(node));
 
 
@@ -463,7 +463,7 @@ namespace SharpGLTF.Schema2
             return accessor;
             return accessor;
         }
         }
 
 
-        private static (Single[], TValue[]) _Split<TValue>(IReadOnlyDictionary<Single, TValue> keyframes)
+        private static (Single[] Keys, TValue[] Values) _Split<TValue>(IReadOnlyDictionary<Single, TValue> keyframes)
         {
         {
             var sorted = keyframes
             var sorted = keyframes
                 .OrderBy(item => item.Key)
                 .OrderBy(item => item.Key)
@@ -481,7 +481,7 @@ namespace SharpGLTF.Schema2
             return (keys, vals);
             return (keys, vals);
         }
         }
 
 
-        private static (Single[], TValue[]) _Split<TValue>(IReadOnlyDictionary<Single, (TValue, TValue, TValue)> keyframes)
+        private static (Single[] Keys, TValue[] Values) _Split<TValue>(IReadOnlyDictionary<Single, (TValue, TValue, TValue)> keyframes)
         {
         {
             var sorted = keyframes
             var sorted = keyframes
                 .OrderBy(item => item.Key)
                 .OrderBy(item => item.Key)
@@ -504,55 +504,58 @@ namespace SharpGLTF.Schema2
         internal void SetKeys(IReadOnlyDictionary<Single, Vector3> keyframes)
         internal void SetKeys(IReadOnlyDictionary<Single, Vector3> keyframes)
         {
         {
             var kv = _Split(keyframes);
             var kv = _Split(keyframes);
-            _input = this._CreateInputAccessor(kv.Item1).LogicalIndex;
-            _output = this._CreateOutputAccessor(kv.Item2).LogicalIndex;
+            _input = this._CreateInputAccessor(kv.Keys).LogicalIndex;
+            _output = this._CreateOutputAccessor(kv.Values).LogicalIndex;
         }
         }
 
 
         internal void SetKeys(IReadOnlyDictionary<Single, Quaternion> keyframes)
         internal void SetKeys(IReadOnlyDictionary<Single, Quaternion> keyframes)
         {
         {
             var kv = _Split(keyframes);
             var kv = _Split(keyframes);
-            _input = this._CreateInputAccessor(kv.Item1).LogicalIndex;
-            _output = this._CreateOutputAccessor(kv.Item2).LogicalIndex;
+            _input = this._CreateInputAccessor(kv.Keys).LogicalIndex;
+            _output = this._CreateOutputAccessor(kv.Values).LogicalIndex;
         }
         }
 
 
         internal void SetKeys(IReadOnlyDictionary<Single, SparseWeight8> keyframes, int expandedCount)
         internal void SetKeys(IReadOnlyDictionary<Single, SparseWeight8> keyframes, int expandedCount)
         {
         {
             var kv = _Split(keyframes);
             var kv = _Split(keyframes);
-            _input = this._CreateInputAccessor(kv.Item1).LogicalIndex;
-            _output = this._CreateOutputAccessor(kv.Item2, expandedCount).LogicalIndex;
+            _input = this._CreateInputAccessor(kv.Keys).LogicalIndex;
+            _output = this._CreateOutputAccessor(kv.Values, expandedCount).LogicalIndex;
         }
         }
 
 
         internal void SetKeys(IReadOnlyDictionary<Single, (Vector3, Vector3, Vector3)> keyframes)
         internal void SetKeys(IReadOnlyDictionary<Single, (Vector3, Vector3, Vector3)> keyframes)
         {
         {
             var kv = _Split(keyframes);
             var kv = _Split(keyframes);
 
 
-            kv.Item2[0] = Vector3.Zero;
-            kv.Item2[kv.Item2.Length - 1] = Vector3.Zero;
+            // this might not be true for a looped animation, where first and last might be the same
+            kv.Values[0] = Vector3.Zero;
+            kv.Values[kv.Values.Length - 1] = Vector3.Zero;
 
 
-            _input = this._CreateInputAccessor(kv.Item1).LogicalIndex;
-            _output = this._CreateOutputAccessor(kv.Item2).LogicalIndex;
+            _input = this._CreateInputAccessor(kv.Keys).LogicalIndex;
+            _output = this._CreateOutputAccessor(kv.Values).LogicalIndex;
         }
         }
 
 
         internal void SetKeys(IReadOnlyDictionary<Single, (Quaternion, Quaternion, Quaternion)> keyframes)
         internal void SetKeys(IReadOnlyDictionary<Single, (Quaternion, Quaternion, Quaternion)> keyframes)
         {
         {
             var kv = _Split(keyframes);
             var kv = _Split(keyframes);
 
 
-            kv.Item2[0] = default(Quaternion);
-            kv.Item2[kv.Item2.Length - 1] = default(Quaternion);
+            // this might not be true for a looped animation, where first and last might be the same
+            kv.Values[0] = default;
+            kv.Values[kv.Values.Length - 1] = default;
 
 
-            _input = this._CreateInputAccessor(kv.Item1).LogicalIndex;
-            _output = this._CreateOutputAccessor(kv.Item2).LogicalIndex;
+            _input = this._CreateInputAccessor(kv.Keys).LogicalIndex;
+            _output = this._CreateOutputAccessor(kv.Values).LogicalIndex;
         }
         }
 
 
         internal void SetKeys(IReadOnlyDictionary<Single, (SparseWeight8, SparseWeight8, SparseWeight8)> keyframes, int expandedCount)
         internal void SetKeys(IReadOnlyDictionary<Single, (SparseWeight8, SparseWeight8, SparseWeight8)> keyframes, int expandedCount)
         {
         {
             var kv = _Split(keyframes);
             var kv = _Split(keyframes);
 
 
-            kv.Item2[0] = default(SparseWeight8);
-            kv.Item2[kv.Item2.Length - 1] = default(SparseWeight8);
+            // this might not be true for a looped animation, where first and last might be the same
+            kv.Values[0] = default;
+            kv.Values[kv.Values.Length - 1] = default;
 
 
-            _input = this._CreateInputAccessor(kv.Item1).LogicalIndex;
-            _output = this._CreateOutputAccessor(kv.Item2, expandedCount).LogicalIndex;
+            _input = this._CreateInputAccessor(kv.Keys).LogicalIndex;
+            _output = this._CreateOutputAccessor(kv.Values, expandedCount).LogicalIndex;
         }
         }
 
 
         IEnumerable<(Single, Vector3)> IAnimationSampler<Vector3>.GetLinearKeys()
         IEnumerable<(Single, Vector3)> IAnimationSampler<Vector3>.GetLinearKeys()

+ 6 - 6
src/SharpGLTF.Core/Schema2/gltf.ExtensionsFactory.cs

@@ -33,13 +33,13 @@ namespace SharpGLTF.Schema2
 
 
         #region data
         #region data
 
 
-        private static readonly List<(string, Type, Type)> _Extensions = new List<(string, Type, Type)>();
+        private static readonly List<(string Name, Type ParentType, Type ExtType)> _Extensions = new List<(string, Type, Type)>();
 
 
         #endregion
         #endregion
 
 
         #region API
         #region API
 
 
-        public static IEnumerable<string> SupportedExtensions => _Extensions.Select(item => item.Item1);
+        public static IEnumerable<string> SupportedExtensions => _Extensions.Select(item => item.Name);
 
 
         public static void RegisterExtension<TParent, TExtension>(string persistentName)
         public static void RegisterExtension<TParent, TExtension>(string persistentName)
             where TParent : JsonSerializable
             where TParent : JsonSerializable
@@ -52,13 +52,13 @@ namespace SharpGLTF.Schema2
         {
         {
             var ptype = parent.GetType();
             var ptype = parent.GetType();
 
 
-            var entry = _Extensions.FirstOrDefault(item => item.Item1 == key && item.Item2 == ptype);
+            var entry = _Extensions.FirstOrDefault(item => item.Name == key && item.ParentType == ptype);
 
 
-            if (entry.Item1 == null) return null;
+            if (entry.Name == null) return null;
 
 
             var instance = Activator.CreateInstance
             var instance = Activator.CreateInstance
                 (
                 (
-                entry.Item3,
+                entry.ExtType,
                 System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance,
                 System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance,
                 null,
                 null,
                 new Object[] { parent },
                 new Object[] { parent },
@@ -72,7 +72,7 @@ namespace SharpGLTF.Schema2
         {
         {
             foreach (var entry in _Extensions)
             foreach (var entry in _Extensions)
             {
             {
-                if (entry.Item2 == parentType && entry.Item3 == extensionType) return entry.Item1;
+                if (entry.ParentType == parentType && entry.ExtType == extensionType) return entry.Name;
             }
             }
 
 
             return null;
             return null;

+ 1 - 1
src/SharpGLTF.Core/Schema2/gltf.Mesh.cs

@@ -65,7 +65,7 @@ namespace SharpGLTF.Schema2
             {
             {
                 foreach (var kw in weights.GetIndexedWeights())
                 foreach (var kw in weights.GetIndexedWeights())
                 {
                 {
-                    _weights[kw.Item1] = kw.Item2;
+                    _weights[kw.Index] = kw.Weight;
                 }
                 }
             }
             }
         }
         }

+ 2 - 2
src/SharpGLTF.Core/Schema2/gltf.MeshPrimitive.cs

@@ -197,7 +197,7 @@ namespace SharpGLTF.Schema2
         /// Decodes the raw indices and returns a list of indexed lines.
         /// Decodes the raw indices and returns a list of indexed lines.
         /// </summary>
         /// </summary>
         /// <returns>A sequence of indexed lines.</returns>
         /// <returns>A sequence of indexed lines.</returns>
-        public IEnumerable<(int, int)> GetLineIndices()
+        public IEnumerable<(int A, int B)> GetLineIndices()
         {
         {
             if (this.DrawPrimitiveType.GetPrimitiveVertexSize() != 2) return Enumerable.Empty<(int, int)>();
             if (this.DrawPrimitiveType.GetPrimitiveVertexSize() != 2) return Enumerable.Empty<(int, int)>();
 
 
@@ -210,7 +210,7 @@ namespace SharpGLTF.Schema2
         /// Decodes the raw indices and returns a list of indexed triangles.
         /// Decodes the raw indices and returns a list of indexed triangles.
         /// </summary>
         /// </summary>
         /// <returns>A sequence of indexed triangles.</returns>
         /// <returns>A sequence of indexed triangles.</returns>
-        public IEnumerable<(int, int, int)> GetTriangleIndices()
+        public IEnumerable<(int A, int B, int C)> GetTriangleIndices()
         {
         {
             if (this.DrawPrimitiveType.GetPrimitiveVertexSize() != 3) return Enumerable.Empty<(int, int, int)>();
             if (this.DrawPrimitiveType.GetPrimitiveVertexSize() != 3) return Enumerable.Empty<(int, int, int)>();
 
 

+ 8 - 0
src/SharpGLTF.Core/Schema2/gltf.Node.cs

@@ -193,6 +193,8 @@ namespace SharpGLTF.Schema2
 
 
         #region properties - transform
         #region properties - transform
 
 
+        #pragma warning disable CA1721 // Property names should not match get methods
+
         /// <summary>
         /// <summary>
         /// Gets or sets the local Scale, Rotation and Translation of this <see cref="Node"/>.
         /// Gets or sets the local Scale, Rotation and Translation of this <see cref="Node"/>.
         /// </summary>
         /// </summary>
@@ -212,6 +214,8 @@ namespace SharpGLTF.Schema2
             }
             }
         }
         }
 
 
+        #pragma warning restore CA1721 // Property names should not match get methods
+
         /// <summary>
         /// <summary>
         /// Gets or sets the local transform <see cref="Matrix4x4"/> of this <see cref="Node"/>.
         /// Gets or sets the local transform <see cref="Matrix4x4"/> of this <see cref="Node"/>.
         /// </summary>
         /// </summary>
@@ -236,6 +240,8 @@ namespace SharpGLTF.Schema2
             }
             }
         }
         }
 
 
+        #pragma warning disable CA1721 // Property names should not match get methods
+
         /// <summary>
         /// <summary>
         /// Gets or sets the world transform <see cref="Matrix4x4"/> of this <see cref="Node"/>.
         /// Gets or sets the world transform <see cref="Matrix4x4"/> of this <see cref="Node"/>.
         /// </summary>
         /// </summary>
@@ -253,6 +259,8 @@ namespace SharpGLTF.Schema2
             }
             }
         }
         }
 
 
+        #pragma warning restore CA1721 // Property names should not match get methods
+
         #endregion
         #endregion
 
 
         #region API - Transforms
         #region API - Transforms

+ 14 - 11
src/SharpGLTF.Core/Schema2/gltf.Serialization.Read.cs

@@ -63,7 +63,7 @@ namespace SharpGLTF.Schema2
             {
             {
                 bool binaryFile = glb._Identify(stream);
                 bool binaryFile = glb._Identify(stream);
 
 
-                if (binaryFile) return _ReadGLB(stream, settings).Item2;
+                if (binaryFile) return _ReadGLB(stream, settings).Validation;
 
 
                 string content = null;
                 string content = null;
 
 
@@ -72,7 +72,7 @@ namespace SharpGLTF.Schema2
                     content = streamReader.ReadToEnd();
                     content = streamReader.ReadToEnd();
                 }
                 }
 
 
-                return _ParseGLTF(content, settings).Item2;
+                return _ParseGLTF(content, settings).Validation;
             }
             }
         }
         }
 
 
@@ -157,11 +157,14 @@ namespace SharpGLTF.Schema2
         /// <returns>A <see cref="MODEL"/> instance.</returns>
         /// <returns>A <see cref="MODEL"/> instance.</returns>
         public static MODEL ReadGLB(Stream stream, ReadSettings settings)
         public static MODEL ReadGLB(Stream stream, ReadSettings settings)
         {
         {
+            Guard.NotNull(stream, nameof(stream));
+            Guard.NotNull(settings, nameof(settings));
+
             var mv = _ReadGLB(stream, settings);
             var mv = _ReadGLB(stream, settings);
 
 
-            if (mv.Item2.HasErrors) throw mv.Item2.Errors.FirstOrDefault();
+            if (mv.Validation.HasErrors) throw mv.Validation.Errors.FirstOrDefault();
 
 
-            return mv.Item1;
+            return mv.Model;
         }
         }
 
 
         /// <summary>
         /// <summary>
@@ -174,9 +177,9 @@ namespace SharpGLTF.Schema2
         {
         {
             var mv = _ParseGLTF(jsonContent, settings);
             var mv = _ParseGLTF(jsonContent, settings);
 
 
-            if (mv.Item2.HasErrors) throw mv.Item2.Errors.FirstOrDefault();
+            if (mv.Validation.HasErrors) throw mv.Validation.Errors.FirstOrDefault();
 
 
-            return mv.Item1;
+            return mv.Model;
         }
         }
 
 
         public static MODEL ReadFromDictionary(Dictionary<string, BYTES> files, string fileName)
         public static MODEL ReadFromDictionary(Dictionary<string, BYTES> files, string fileName)
@@ -193,9 +196,9 @@ namespace SharpGLTF.Schema2
                 {
                 {
                     var mv = _Read(tr, settings);
                     var mv = _Read(tr, settings);
 
 
-                    if (mv.Item2.HasErrors) throw mv.Item2.Errors.FirstOrDefault();
+                    if (mv.Validation.HasErrors) throw mv.Validation.Errors.FirstOrDefault();
 
 
-                    return mv.Item1;
+                    return mv.Model;
                 }
                 }
             }
             }
         }
         }
@@ -204,7 +207,7 @@ namespace SharpGLTF.Schema2
 
 
         #region reading core
         #region reading core
 
 
-        private static (MODEL, Validation.ValidationResult) _ReadGLB(Stream stream, ReadSettings settings)
+        private static (MODEL Model, Validation.ValidationResult Validation) _ReadGLB(Stream stream, ReadSettings settings)
         {
         {
             Guard.NotNull(stream, nameof(stream));
             Guard.NotNull(stream, nameof(stream));
             Guard.NotNull(settings, nameof(settings));
             Guard.NotNull(settings, nameof(settings));
@@ -229,7 +232,7 @@ namespace SharpGLTF.Schema2
             return _ParseGLTF(dom, settings);
             return _ParseGLTF(dom, settings);
         }
         }
 
 
-        private static (MODEL, Validation.ValidationResult) _ParseGLTF(String jsonContent, ReadSettings settings)
+        private static (MODEL Model, Validation.ValidationResult Validation) _ParseGLTF(String jsonContent, ReadSettings settings)
         {
         {
             Guard.NotNullOrEmpty(jsonContent, nameof(jsonContent));
             Guard.NotNullOrEmpty(jsonContent, nameof(jsonContent));
             Guard.NotNull(settings, nameof(settings));
             Guard.NotNull(settings, nameof(settings));
@@ -240,7 +243,7 @@ namespace SharpGLTF.Schema2
             }
             }
         }
         }
 
 
-        private static (MODEL, Validation.ValidationResult) _Read(TextReader textReader, ReadSettings settings)
+        private static (MODEL Model, Validation.ValidationResult Validation) _Read(TextReader textReader, ReadSettings settings)
         {
         {
             Guard.NotNull(textReader, nameof(textReader));
             Guard.NotNull(textReader, nameof(textReader));
             Guard.NotNull(settings, nameof(settings));
             Guard.NotNull(settings, nameof(settings));

+ 9 - 9
src/SharpGLTF.Core/Schema2/gltf.Skin.cs

@@ -66,7 +66,7 @@ namespace SharpGLTF.Schema2
             return this.LogicalParent.LogicalAccessors[this._inverseBindMatrices.Value];
             return this.LogicalParent.LogicalAccessors[this._inverseBindMatrices.Value];
         }
         }
 
 
-        public (Node, Matrix4x4) GetJoint(int idx)
+        public (Node Joint, Matrix4x4 InverseBindMatrix) GetJoint(int idx)
         {
         {
             var nodeIdx = _joints[idx];
             var nodeIdx = _joints[idx];
 
 
@@ -119,19 +119,19 @@ namespace SharpGLTF.Schema2
         /// A collection of <see cref="Node"/> joints,
         /// A collection of <see cref="Node"/> joints,
         /// where each joint has an Inverse Bind Matrix.
         /// where each joint has an Inverse Bind Matrix.
         /// </param>
         /// </param>
-        public void BindJoints((Node, Matrix4x4)[] joints)
+        public void BindJoints((Node Joint, Matrix4x4 InverseBindMatrix)[] joints)
         {
         {
             Guard.NotNull(joints, nameof(joints));
             Guard.NotNull(joints, nameof(joints));
 
 
-            _FindCommonAncestor(joints.Select(item => item.Item1));
+            _FindCommonAncestor(joints.Select(item => item.Joint));
 
 
-            foreach (var j in joints) { Guard.IsTrue(j.Item2._IsFinite(), nameof(joints)); }
+            foreach (var j in joints) { Guard.IsTrue(j.InverseBindMatrix._IsFinite(), nameof(joints)); }
 
 
             // inverse bind matrices accessor
             // inverse bind matrices accessor
 
 
             var data = new Byte[joints.Length * 16 * 4];
             var data = new Byte[joints.Length * 16 * 4];
             var matrices = new Memory.Matrix4x4Array(data.Slice(0), 0, EncodingType.FLOAT, false);
             var matrices = new Memory.Matrix4x4Array(data.Slice(0), 0, EncodingType.FLOAT, false);
-            matrices.Fill(joints.Select(item => item.Item2));
+            matrices.Fill(joints.Select(item => item.InverseBindMatrix));
 
 
             var accessor = LogicalParent.CreateAccessor("Bind Matrices");
             var accessor = LogicalParent.CreateAccessor("Bind Matrices");
             accessor.SetData( LogicalParent.UseBufferView(data), 0, joints.Length, DimensionType.MAT4, EncodingType.FLOAT, false);
             accessor.SetData( LogicalParent.UseBufferView(data), 0, joints.Length, DimensionType.MAT4, EncodingType.FLOAT, false);
@@ -141,7 +141,7 @@ namespace SharpGLTF.Schema2
             // joints
             // joints
 
 
             _joints.Clear();
             _joints.Clear();
-            _joints.AddRange(joints.Select(item => item.Item1.LogicalIndex));
+            _joints.AddRange(joints.Select(item => item.Joint.LogicalIndex));
         }
         }
 
 
         #endregion
         #endregion
@@ -165,8 +165,8 @@ namespace SharpGLTF.Schema2
                 var src = joints[i];
                 var src = joints[i];
                 var dst = GetJoint(i);
                 var dst = GetJoint(i);
 
 
-                if (!ReferenceEquals(src.Key, dst.Item1)) return false;
-                if (src.Value != dst.Item2) return false;
+                if (!ReferenceEquals(src.Key, dst.Joint)) return false;
+                if (src.Value != dst.InverseBindMatrix) return false;
             }
             }
 
 
             return true;
             return true;
@@ -279,7 +279,7 @@ namespace SharpGLTF.Schema2
 
 
                 for (int i = 0; i < this.JointsCount; ++i)
                 for (int i = 0; i < this.JointsCount; ++i)
                 {
                 {
-                    var jointNode = GetJoint(i).Item1;
+                    var jointNode = GetJoint(i).Joint;
 
 
                     if (skeletonNode == jointNode) continue;
                     if (skeletonNode == jointNode) continue;
                     if (skeletonNode._ContainsVisualNode(jointNode, true)) continue;
                     if (skeletonNode._ContainsVisualNode(jointNode, true)) continue;

+ 4 - 4
src/SharpGLTF.Core/Transforms/IndexWeight.cs

@@ -10,13 +10,13 @@ namespace SharpGLTF.Transforms
     {
     {
         #region constructor
         #region constructor
 
 
-        public IndexWeight((int, float) pair)
+        public IndexWeight((int Index, float Weight) pair)
         {
         {
-            Index = pair.Item1;
-            Weight = pair.Item2;
+            Index = pair.Index;
+            Weight = pair.Weight;
         }
         }
 
 
-        public static implicit operator IndexWeight((int, float) pair) { return new IndexWeight(pair.Item1, pair.Item2); }
+        public static implicit operator IndexWeight((int Index, float Weight) pair) { return new IndexWeight(pair.Index, pair.Weight); }
 
 
         public IndexWeight(int i, float w)
         public IndexWeight(int i, float w)
         {
         {

+ 11 - 11
src/SharpGLTF.Core/Transforms/MeshTransforms.cs

@@ -115,16 +115,16 @@ namespace SharpGLTF.Transforms
             {
             {
                 foreach (var pair in _Weights.GetNonZeroWeights())
                 foreach (var pair in _Weights.GetNonZeroWeights())
                 {
                 {
-                    var val = pair.Item1 == COMPLEMENT_INDEX ? value : morphTargets[pair.Item1];
-                    p += val * pair.Item2;
+                    var val = pair.Index == COMPLEMENT_INDEX ? value : morphTargets[pair.Index];
+                    p += val * pair.Weight;
                 }
                 }
             }
             }
             else
             else
             {
             {
                 foreach (var pair in _Weights.GetNonZeroWeights())
                 foreach (var pair in _Weights.GetNonZeroWeights())
                 {
                 {
-                    var val = pair.Item1 == COMPLEMENT_INDEX ? value : value + morphTargets[pair.Item1];
-                    p += val * pair.Item2;
+                    var val = pair.Index == COMPLEMENT_INDEX ? value : value + morphTargets[pair.Index];
+                    p += val * pair.Weight;
                 }
                 }
             }
             }
 
 
@@ -143,16 +143,16 @@ namespace SharpGLTF.Transforms
             {
             {
                 foreach (var pair in _Weights.GetNonZeroWeights())
                 foreach (var pair in _Weights.GetNonZeroWeights())
                 {
                 {
-                    var val = pair.Item1 == COMPLEMENT_INDEX ? value : morphTargets[pair.Item1];
-                    p += val * pair.Item2;
+                    var val = pair.Index == COMPLEMENT_INDEX ? value : morphTargets[pair.Index];
+                    p += val * pair.Weight;
                 }
                 }
             }
             }
             else
             else
             {
             {
                 foreach (var pair in _Weights.GetNonZeroWeights())
                 foreach (var pair in _Weights.GetNonZeroWeights())
                 {
                 {
-                    var val = pair.Item1 == COMPLEMENT_INDEX ? value : value + morphTargets[pair.Item1];
-                    p += val * pair.Item2;
+                    var val = pair.Index == COMPLEMENT_INDEX ? value : value + morphTargets[pair.Index];
+                    p += val * pair.Weight;
                 }
                 }
             }
             }
 
 
@@ -334,7 +334,7 @@ namespace SharpGLTF.Transforms
 
 
             foreach (var jw in skinWeights.GetIndexedWeights())
             foreach (var jw in skinWeights.GetIndexedWeights())
             {
             {
-                worldPosition += V3.Transform(localPosition, _SkinTransforms[jw.Item1]) * jw.Item2 * wnrm;
+                worldPosition += V3.Transform(localPosition, _SkinTransforms[jw.Index]) * jw.Weight * wnrm;
             }
             }
 
 
             return worldPosition;
             return worldPosition;
@@ -350,7 +350,7 @@ namespace SharpGLTF.Transforms
 
 
             foreach (var jw in skinWeights.GetIndexedWeights())
             foreach (var jw in skinWeights.GetIndexedWeights())
             {
             {
-                worldNormal += V3.TransformNormal(localNormal, _SkinTransforms[jw.Item1]) * jw.Item2;
+                worldNormal += V3.TransformNormal(localNormal, _SkinTransforms[jw.Index]) * jw.Weight;
             }
             }
 
 
             return V3.Normalize(localNormal);
             return V3.Normalize(localNormal);
@@ -366,7 +366,7 @@ namespace SharpGLTF.Transforms
 
 
             foreach (var jw in skinWeights.GetIndexedWeights())
             foreach (var jw in skinWeights.GetIndexedWeights())
             {
             {
-                worldTangent += V3.TransformNormal(localTangentV, _SkinTransforms[jw.Item1]) * jw.Item2;
+                worldTangent += V3.TransformNormal(localTangentV, _SkinTransforms[jw.Index]) * jw.Weight;
             }
             }
 
 
             worldTangent = V3.Normalize(worldTangent);
             worldTangent = V3.Normalize(worldTangent);

+ 8 - 8
src/SharpGLTF.Core/Transforms/SparseWeight8.cs

@@ -23,8 +23,8 @@ namespace SharpGLTF.Transforms
         private string _GetDebuggerDisplay()
         private string _GetDebuggerDisplay()
         {
         {
             var iw = this.GetIndexedWeights()
             var iw = this.GetIndexedWeights()
-                .Where(item => item.Item2 != 0)
-                .Select(item => $"[{item.Item1}]={item.Item2}");
+                .Where(item => item.Weight != 0)
+                .Select(item => $"[{item.Index}]={item.Weight}");
 
 
             var txt = string.Join(" ", iw);
             var txt = string.Join(" ", iw);
 
 
@@ -72,7 +72,7 @@ namespace SharpGLTF.Transforms
         /// </summary>
         /// </summary>
         /// <param name="indexedWeights">A sequence of indexed weight values.</param>
         /// <param name="indexedWeights">A sequence of indexed weight values.</param>
         /// <returns>A <see cref="SparseWeight8"/> instance.</returns>
         /// <returns>A <see cref="SparseWeight8"/> instance.</returns>
-        public static SparseWeight8 Create(params (int, float)[] indexedWeights)
+        public static SparseWeight8 Create(params (int Index, float Weight)[] indexedWeights)
         {
         {
             if (indexedWeights == null) return default;
             if (indexedWeights == null) return default;
 
 
@@ -83,9 +83,9 @@ namespace SharpGLTF.Transforms
             for (int i = 0; i < indexedWeights.Length; ++i)
             for (int i = 0; i < indexedWeights.Length; ++i)
             {
             {
                 var p = indexedWeights[i];
                 var p = indexedWeights[i];
-                if (p.Item2 == 0) continue;
+                if (p.Weight == 0) continue;
 
 
-                Guard.MustBeGreaterThanOrEqualTo(p.Item1, 0, nameof(indexedWeights));
+                Guard.MustBeGreaterThanOrEqualTo(p.Index, 0, nameof(indexedWeights));
 
 
                 sparse[o++] = p;
                 sparse[o++] = p;
             }
             }
@@ -418,7 +418,7 @@ namespace SharpGLTF.Transforms
         {
         {
             var basis = Animations.SamplerFactory.CreateHermitePointWeights(amount);
             var basis = Animations.SamplerFactory.CreateHermitePointWeights(amount);
 
 
-            return _OperateCubic(x, xt, y, yt, (xx, xxt, yy, yyt) => (xx * basis.Item1) + (yy * basis.Item2) + (xxt * basis.Item3) + (yyt * basis.Item4));
+            return _OperateCubic(x, xt, y, yt, (xx, xxt, yy, yyt) => (xx * basis.StartPosition) + (yy * basis.EndPosition) + (xxt * basis.StartTangent) + (yyt * basis.EndTangent));
         }
         }
 
 
         public IEnumerable<float> Expand(int count)
         public IEnumerable<float> Expand(int count)
@@ -429,7 +429,7 @@ namespace SharpGLTF.Transforms
             }
             }
         }
         }
 
 
-        public IEnumerable<(int, float)> GetIndexedWeights()
+        public IEnumerable<(int Index, float Weight)> GetIndexedWeights()
         {
         {
             yield return (Index0, Weight0);
             yield return (Index0, Weight0);
             yield return (Index1, Weight1);
             yield return (Index1, Weight1);
@@ -579,7 +579,7 @@ namespace SharpGLTF.Transforms
             return new SparseWeight8(rrr);
             return new SparseWeight8(rrr);
         }
         }
 
 
-        internal IEnumerable<(int, float)> GetNonZeroWeights()
+        internal IEnumerable<(int Index, float Weight)> GetNonZeroWeights()
         {
         {
             if (Weight0 != 0) yield return (Index0, Weight0);
             if (Weight0 != 0) yield return (Index0, Weight0);
             if (Weight1 != 0) yield return (Index1, Weight1);
             if (Weight1 != 0) yield return (Index1, Weight1);

+ 11 - 7
src/SharpGLTF.Core/Validation/ValidationContext.cs

@@ -147,21 +147,25 @@ namespace SharpGLTF.Validation
             AddSchemaError(location, "Invalid JSON data.");
             AddSchemaError(location, "Invalid JSON data.");
         }
         }
 
 
-        public void CheckSchemaIsValidURI(ValueLocation location, string uri)
+        #pragma warning disable CA1054 // Uri parameters should not be strings
+
+        public void CheckSchemaIsValidURI(ValueLocation location, string gltfURI)
         {
         {
-            if (string.IsNullOrEmpty(uri)) return;
+            if (string.IsNullOrEmpty(gltfURI)) return;
 
 
-            if (uri.StartsWith("data:"))
+            if (gltfURI.StartsWith("data:", StringComparison.Ordinal))
             {
             {
                 // check decoding
                 // check decoding
                 return;
                 return;
             }
             }
 
 
-            if (Uri.TryCreate(uri, UriKind.Relative, out Uri xuri)) return;
+            if (Uri.TryCreate(gltfURI, UriKind.Relative, out Uri xuri)) return;
 
 
-            AddSchemaError(location, $"Invalid URI '{uri}'.");
+            AddSchemaError(location, $"Invalid URI '{gltfURI}'.");
         }
         }
 
 
+        #pragma warning restore CA1054 // Uri parameters should not be strings
+
         #endregion
         #endregion
 
 
         #region semantic errors
         #region semantic errors
@@ -365,9 +369,9 @@ namespace SharpGLTF.Validation
 
 
         public static implicit operator ValueLocation(string name) { return new ValueLocation(name); }
         public static implicit operator ValueLocation(string name) { return new ValueLocation(name); }
 
 
-        public static implicit operator ValueLocation((string, int) tuple) { return new ValueLocation(tuple.Item1, tuple.Item2); }
+        public static implicit operator ValueLocation((string name, int index) tuple) { return new ValueLocation(tuple.name, tuple.index); }
 
 
-        public static implicit operator ValueLocation((string, int?) tuple) { return new ValueLocation(tuple.Item1, tuple.Item2 ?? 0); }
+        public static implicit operator ValueLocation((string name, int? index) tuple) { return new ValueLocation(tuple.name, tuple.index ?? 0); }
 
 
         public static implicit operator String(ValueLocation location) { return location.ToString(); }
         public static implicit operator String(ValueLocation location) { return location.ToString(); }
 
 

+ 11 - 11
src/SharpGLTF.Toolkit/Animations/CurveBuilder.cs

@@ -104,16 +104,16 @@ namespace SharpGLTF.Animations
 
 
             var offsets = SamplerFactory.FindPairContainingOffset(_Keys.Keys, offset);
             var offsets = SamplerFactory.FindPairContainingOffset(_Keys.Keys, offset);
 
 
-            var a = _Keys[offsets.Item1];
-            var b = _Keys[offsets.Item2];
+            var a = _Keys[offsets.A];
+            var b = _Keys[offsets.B];
 
 
             if (a.Degree == 1) a.OutgoingTangent = GetTangent(a.Point, b.Point);
             if (a.Degree == 1) a.OutgoingTangent = GetTangent(a.Point, b.Point);
 
 
             a.Degree = 3;
             a.Degree = 3;
             b.IncomingTangent = tangent;
             b.IncomingTangent = tangent;
 
 
-            _Keys[offsets.Item1] = a;
-            _Keys[offsets.Item2] = b;
+            _Keys[offsets.A] = a;
+            _Keys[offsets.B] = b;
         }
         }
 
 
         /// <summary>
         /// <summary>
@@ -127,28 +127,28 @@ namespace SharpGLTF.Animations
 
 
             var offsets = SamplerFactory.FindPairContainingOffset(_Keys.Keys, offset);
             var offsets = SamplerFactory.FindPairContainingOffset(_Keys.Keys, offset);
 
 
-            var a = _Keys[offsets.Item1];
-            var b = _Keys[offsets.Item2];
+            var a = _Keys[offsets.A];
+            var b = _Keys[offsets.B];
 
 
-            if (offsets.Item1 != offsets.Item2)
+            if (offsets.A != offsets.B)
             {
             {
                 if (a.Degree == 1) b.IncomingTangent = GetTangent(a.Point, b.Point);
                 if (a.Degree == 1) b.IncomingTangent = GetTangent(a.Point, b.Point);
-                _Keys[offsets.Item2] = b;
+                _Keys[offsets.B] = b;
             }
             }
 
 
             a.Degree = 3;
             a.Degree = 3;
             a.OutgoingTangent = tangent;
             a.OutgoingTangent = tangent;
 
 
-            _Keys[offsets.Item1] = a;
+            _Keys[offsets.A] = a;
         }
         }
 
 
-        private protected (_CurveNode<T>, _CurveNode<T>, float) FindSample(float offset)
+        private protected (_CurveNode<T> A, _CurveNode<T> B, float Amount) FindSample(float offset)
         {
         {
             if (_Keys.Count == 0) return (default(_CurveNode<T>), default(_CurveNode<T>), 0);
             if (_Keys.Count == 0) return (default(_CurveNode<T>), default(_CurveNode<T>), 0);
 
 
             var offsets = SamplerFactory.FindPairContainingOffset(_Keys.Keys, offset);
             var offsets = SamplerFactory.FindPairContainingOffset(_Keys.Keys, offset);
 
 
-            return (_Keys[offsets.Item1], _Keys[offsets.Item2], offsets.Item3);
+            return (_Keys[offsets.A], _Keys[offsets.B], offsets.Amount);
         }
         }
 
 
         public void SetCurve(ICurveSampler<T> curve)
         public void SetCurve(ICurveSampler<T> curve)

+ 18 - 18
src/SharpGLTF.Toolkit/Animations/CurveFactory.cs

@@ -61,20 +61,20 @@ namespace SharpGLTF.Animations
         {
         {
             var sample = FindSample(offset);
             var sample = FindSample(offset);
 
 
-            switch (sample.Item1.Degree)
+            switch (sample.A.Degree)
             {
             {
                 case 0:
                 case 0:
-                    return sample.Item1.Point;
+                    return sample.A.Point;
 
 
                 case 1:
                 case 1:
-                    return Vector3.Lerp(sample.Item1.Point, sample.Item2.Point, sample.Item3);
+                    return Vector3.Lerp(sample.A.Point, sample.B.Point, sample.Amount);
 
 
                 case 3:
                 case 3:
                     return SamplerFactory.InterpolateCubic
                     return SamplerFactory.InterpolateCubic
                             (
                             (
-                            sample.Item1.Point, sample.Item1.OutgoingTangent,
-                            sample.Item2.Point, sample.Item2.IncomingTangent,
-                            sample.Item3
+                            sample.A.Point, sample.A.OutgoingTangent,
+                            sample.B.Point, sample.B.IncomingTangent,
+                            sample.Amount
                             );
                             );
 
 
                 default:
                 default:
@@ -117,20 +117,20 @@ namespace SharpGLTF.Animations
         {
         {
             var sample = FindSample(offset);
             var sample = FindSample(offset);
 
 
-            switch (sample.Item1.Degree)
+            switch (sample.A.Degree)
             {
             {
                 case 0:
                 case 0:
-                    return sample.Item1.Point;
+                    return sample.A.Point;
 
 
                 case 1:
                 case 1:
-                    return Quaternion.Slerp(sample.Item1.Point, sample.Item2.Point, sample.Item3);
+                    return Quaternion.Slerp(sample.A.Point, sample.B.Point, sample.Amount);
 
 
                 case 3:
                 case 3:
                     return SamplerFactory.InterpolateCubic
                     return SamplerFactory.InterpolateCubic
                             (
                             (
-                            sample.Item1.Point, sample.Item1.OutgoingTangent,
-                            sample.Item2.Point, sample.Item2.IncomingTangent,
-                            sample.Item3
+                            sample.A.Point, sample.A.OutgoingTangent,
+                            sample.B.Point, sample.B.IncomingTangent,
+                            sample.Amount
                             );
                             );
 
 
                 default:
                 default:
@@ -173,20 +173,20 @@ namespace SharpGLTF.Animations
         {
         {
             var sample = FindSample(offset);
             var sample = FindSample(offset);
 
 
-            switch (sample.Item1.Degree)
+            switch (sample.A.Degree)
             {
             {
                 case 0:
                 case 0:
-                    return sample.Item1.Point;
+                    return sample.A.Point;
 
 
                 case 1:
                 case 1:
-                    return SPARSE.InterpolateLinear(sample.Item1.Point, sample.Item2.Point, sample.Item3);
+                    return SPARSE.InterpolateLinear(sample.A.Point, sample.B.Point, sample.Amount);
 
 
                 case 3:
                 case 3:
                     return SPARSE.InterpolateCubic
                     return SPARSE.InterpolateCubic
                             (
                             (
-                            sample.Item1.Point, sample.Item1.OutgoingTangent,
-                            sample.Item2.Point, sample.Item2.IncomingTangent,
-                            sample.Item3
+                            sample.A.Point, sample.A.OutgoingTangent,
+                            sample.B.Point, sample.B.IncomingTangent,
+                            sample.Amount
                             );
                             );
 
 
                 default:
                 default:

+ 6 - 6
src/SharpGLTF.Toolkit/Geometry/MeshBuilder.cs

@@ -57,7 +57,7 @@ namespace SharpGLTF.Geometry
 
 
         #region data
         #region data
 
 
-        private readonly Dictionary<(TMaterial, int), PrimitiveBuilder<TMaterial, TvG, TvM, TvS>> _Primitives = new Dictionary<(TMaterial, int), PrimitiveBuilder<TMaterial, TvG, TvM, TvS>>();
+        private readonly Dictionary<(TMaterial Material, int PrimType), PrimitiveBuilder<TMaterial, TvG, TvM, TvS>> _Primitives = new Dictionary<(TMaterial, int), PrimitiveBuilder<TMaterial, TvG, TvM, TvS>>();
 
 
         private VertexPreprocessor<TvG, TvM, TvS> _VertexPreprocessor;
         private VertexPreprocessor<TvG, TvM, TvS> _VertexPreprocessor;
 
 
@@ -73,7 +73,7 @@ namespace SharpGLTF.Geometry
             set => _VertexPreprocessor = value;
             set => _VertexPreprocessor = value;
         }
         }
 
 
-        public IEnumerable<TMaterial> Materials => _Primitives.Keys.Select(item => item.Item1).Distinct();
+        public IEnumerable<TMaterial> Materials => _Primitives.Keys.Select(item => item.Material).Distinct();
 
 
         public IReadOnlyCollection<PrimitiveBuilder<TMaterial, TvG, TvM, TvS>> Primitives => _Primitives.Values;
         public IReadOnlyCollection<PrimitiveBuilder<TMaterial, TvG, TvM, TvS>> Primitives => _Primitives.Values;
 
 
@@ -88,13 +88,13 @@ namespace SharpGLTF.Geometry
             return new MorphTargetBuilder<TMaterial, TvG, TvS, TvM>(this, index);
             return new MorphTargetBuilder<TMaterial, TvG, TvS, TvM>(this, index);
         }
         }
 
 
-        private PrimitiveBuilder<TMaterial, TvG, TvM, TvS> _UsePrimitive((TMaterial, int) key)
+        private PrimitiveBuilder<TMaterial, TvG, TvM, TvS> _UsePrimitive((TMaterial Material, int PrimType) key)
         {
         {
             if (!_Primitives.TryGetValue(key, out PrimitiveBuilder<TMaterial, TvG, TvM, TvS> primitive))
             if (!_Primitives.TryGetValue(key, out PrimitiveBuilder<TMaterial, TvG, TvM, TvS> primitive))
             {
             {
-                if (key.Item2 == 1) primitive = new PointsPrimitiveBuilder<TMaterial, TvG, TvM, TvS>(this, key.Item1);
-                if (key.Item2 == 2) primitive = new LinesPrimitiveBuilder<TMaterial, TvG, TvM, TvS>(this, key.Item1);
-                if (key.Item2 == 3) primitive = new TrianglesPrimitiveBuilder<TMaterial, TvG, TvM, TvS>(this, key.Item1);
+                if (key.PrimType == 1) primitive = new PointsPrimitiveBuilder<TMaterial, TvG, TvM, TvS>(this, key.Material);
+                if (key.PrimType == 2) primitive = new LinesPrimitiveBuilder<TMaterial, TvG, TvM, TvS>(this, key.Material);
+                if (key.PrimType == 3) primitive = new TrianglesPrimitiveBuilder<TMaterial, TvG, TvM, TvS>(this, key.Material);
 
 
                 Guard.NotNull(primitive, nameof(key));
                 Guard.NotNull(primitive, nameof(key));
 
 

+ 3 - 3
src/SharpGLTF.Toolkit/Geometry/MeshBuilderToolkit.cs

@@ -97,9 +97,9 @@ namespace SharpGLTF.Geometry
             {
             {
                 foreach (var tri in prim.Triangles)
                 foreach (var tri in prim.Triangles)
                 {
                 {
-                    var a = prim.Vertices[tri.Item1].GetGeometry().GetPosition();
-                    var b = prim.Vertices[tri.Item1].GetGeometry().GetPosition();
-                    var c = prim.Vertices[tri.Item1].GetGeometry().GetPosition();
+                    var a = prim.Vertices[tri.A].GetGeometry().GetPosition();
+                    var b = prim.Vertices[tri.B].GetGeometry().GetPosition();
+                    var c = prim.Vertices[tri.C].GetGeometry().GetPosition();
                     var d = Vector3.Cross(b - a, c - a);
                     var d = Vector3.Cross(b - a, c - a);
                     addDirection(posnrm, a, d);
                     addDirection(posnrm, a, d);
                     addDirection(posnrm, b, d);
                     addDirection(posnrm, b, d);

+ 60 - 60
src/SharpGLTF.Toolkit/Geometry/PrimitiveBuilder.cs

@@ -45,17 +45,17 @@ namespace SharpGLTF.Geometry
         /// <summary>
         /// <summary>
         /// Gets the indices of all lines, given that <see cref="VerticesPerPrimitive"/> is 2.
         /// Gets the indices of all lines, given that <see cref="VerticesPerPrimitive"/> is 2.
         /// </summary>
         /// </summary>
-        IReadOnlyList<(int, int)> Lines { get; }
+        IReadOnlyList<(int A, int B)> Lines { get; }
 
 
         /// <summary>
         /// <summary>
         /// Gets the indices of all the surfaces as triangles, given that <see cref="VerticesPerPrimitive"/> is 3.
         /// Gets the indices of all the surfaces as triangles, given that <see cref="VerticesPerPrimitive"/> is 3.
         /// </summary>
         /// </summary>
-        IReadOnlyList<(int, int, int)> Triangles { get; }
+        IReadOnlyList<(int A, int B, int C)> Triangles { get; }
 
 
         /// <summary>
         /// <summary>
         /// Gets the indices of all the surfaces, given that <see cref="VerticesPerPrimitive"/> is 3.
         /// Gets the indices of all the surfaces, given that <see cref="VerticesPerPrimitive"/> is 3.
         /// </summary>
         /// </summary>
-        IReadOnlyList<(int, int, int, int?)> Surfaces { get; }
+        IReadOnlyList<(int A, int B, int C, int? D)> Surfaces { get; }
 
 
         /// <summary>
         /// <summary>
         /// Calculates the raw list of indices to use for this primitive.
         /// Calculates the raw list of indices to use for this primitive.
@@ -75,11 +75,11 @@ namespace SharpGLTF.Geometry
 
 
         int AddPoint(IVertexBuilder a);
         int AddPoint(IVertexBuilder a);
 
 
-        (int, int) AddLine(IVertexBuilder a, IVertexBuilder b);
+        (int A, int B) AddLine(IVertexBuilder a, IVertexBuilder b);
 
 
-        (int, int, int) AddTriangle(IVertexBuilder a, IVertexBuilder b, IVertexBuilder c);
+        (int A, int B, int C) AddTriangle(IVertexBuilder a, IVertexBuilder b, IVertexBuilder c);
 
 
-        (int, int, int, int) AddQuadrangle(IVertexBuilder a, IVertexBuilder b, IVertexBuilder c, IVertexBuilder d);
+        (int A, int B, int C, int D) AddQuadrangle(IVertexBuilder a, IVertexBuilder b, IVertexBuilder c, IVertexBuilder d);
     }
     }
 
 
     /// <summary>
     /// <summary>
@@ -161,11 +161,11 @@ namespace SharpGLTF.Geometry
 
 
         public virtual IReadOnlyList<int> Points => Array.Empty<int>();
         public virtual IReadOnlyList<int> Points => Array.Empty<int>();
 
 
-        public virtual IReadOnlyList<(int, int)> Lines => Array.Empty<(int, int)>();
+        public virtual IReadOnlyList<(int A, int B)> Lines => Array.Empty<(int, int)>();
 
 
-        public virtual IReadOnlyList<(int, int, int)> Triangles => Array.Empty<(int, int, int)>();
+        public virtual IReadOnlyList<(int A, int B, int C)> Triangles => Array.Empty<(int, int, int)>();
 
 
-        public virtual IReadOnlyList<(int, int, int, int?)> Surfaces => Array.Empty<(int, int, int, int?)>();
+        public virtual IReadOnlyList<(int A, int B, int C, int? D)> Surfaces => Array.Empty<(int, int, int, int?)>();
 
 
         #endregion
         #endregion
 
 
@@ -235,7 +235,7 @@ namespace SharpGLTF.Geometry
         /// <param name="a">First corner of the line.</param>
         /// <param name="a">First corner of the line.</param>
         /// <param name="b">Second corner of the line.</param>
         /// <param name="b">Second corner of the line.</param>
         /// <returns>The indices of the vertices, or, in case the line is degenerated, (-1,-1).</returns>
         /// <returns>The indices of the vertices, or, in case the line is degenerated, (-1,-1).</returns>
-        public (int, int) AddLine(IVertexBuilder a, IVertexBuilder b)
+        public (int A, int B) AddLine(IVertexBuilder a, IVertexBuilder b)
         {
         {
             Guard.NotNull(a, nameof(a));
             Guard.NotNull(a, nameof(a));
             Guard.NotNull(b, nameof(b));
             Guard.NotNull(b, nameof(b));
@@ -250,7 +250,7 @@ namespace SharpGLTF.Geometry
         /// <param name="b">Second corner of the triangle.</param>
         /// <param name="b">Second corner of the triangle.</param>
         /// <param name="c">Third corner of the triangle.</param>
         /// <param name="c">Third corner of the triangle.</param>
         /// <returns>The indices of the vertices, or, in case the triangle is degenerated, (-1,-1,-1).</returns>
         /// <returns>The indices of the vertices, or, in case the triangle is degenerated, (-1,-1,-1).</returns>
-        public (int, int, int) AddTriangle(IVertexBuilder a, IVertexBuilder b, IVertexBuilder c)
+        public (int A, int B, int C) AddTriangle(IVertexBuilder a, IVertexBuilder b, IVertexBuilder c)
         {
         {
             Guard.NotNull(a, nameof(a));
             Guard.NotNull(a, nameof(a));
             Guard.NotNull(b, nameof(b));
             Guard.NotNull(b, nameof(b));
@@ -271,7 +271,7 @@ namespace SharpGLTF.Geometry
         /// If only one of the vertices is degenerated, leading to a single triangle, the resulting indices would
         /// If only one of the vertices is degenerated, leading to a single triangle, the resulting indices would
         /// have just one negative index, like this: (16,-1,17,18)
         /// have just one negative index, like this: (16,-1,17,18)
         /// </remarks>
         /// </remarks>
-        public (int, int, int, int) AddQuadrangle(IVertexBuilder a, IVertexBuilder b, IVertexBuilder c, IVertexBuilder d)
+        public (int A, int B, int C, int D) AddQuadrangle(IVertexBuilder a, IVertexBuilder b, IVertexBuilder c, IVertexBuilder d)
         {
         {
             Guard.NotNull(a, nameof(a));
             Guard.NotNull(a, nameof(a));
             Guard.NotNull(b, nameof(b));
             Guard.NotNull(b, nameof(b));
@@ -321,13 +321,13 @@ namespace SharpGLTF.Geometry
             {
             {
                 foreach (var l in primitive.Lines)
                 foreach (var l in primitive.Lines)
                 {
                 {
-                    var a = vertexTransformFunc(primitive.Vertices[l.Item1]);
-                    var b = vertexTransformFunc(primitive.Vertices[l.Item2]);
+                    var a = vertexTransformFunc(primitive.Vertices[l.A]);
+                    var b = vertexTransformFunc(primitive.Vertices[l.B]);
 
 
                     var indices = AddLine(a, b);
                     var indices = AddLine(a, b);
 
 
-                    vmap[l.Item1] = indices.Item1;
-                    vmap[l.Item2] = indices.Item2;
+                    vmap[l.A] = indices.A;
+                    vmap[l.B] = indices.B;
                 }
                 }
             }
             }
 
 
@@ -335,27 +335,27 @@ namespace SharpGLTF.Geometry
             {
             {
                 foreach (var s in primitive.Surfaces)
                 foreach (var s in primitive.Surfaces)
                 {
                 {
-                    var a = vertexTransformFunc(primitive.Vertices[s.Item1]);
-                    var b = vertexTransformFunc(primitive.Vertices[s.Item2]);
-                    var c = vertexTransformFunc(primitive.Vertices[s.Item3]);
+                    var a = vertexTransformFunc(primitive.Vertices[s.A]);
+                    var b = vertexTransformFunc(primitive.Vertices[s.B]);
+                    var c = vertexTransformFunc(primitive.Vertices[s.C]);
 
 
-                    if (s.Item4.HasValue)
+                    if (s.D.HasValue)
                     {
                     {
-                        var d = vertexTransformFunc(primitive.Vertices[s.Item4.Value]);
+                        var d = vertexTransformFunc(primitive.Vertices[s.D.Value]);
                         var indices = AddQuadrangle(a, b, c, d);
                         var indices = AddQuadrangle(a, b, c, d);
 
 
-                        vmap[s.Item1] = indices.Item1;
-                        vmap[s.Item2] = indices.Item2;
-                        vmap[s.Item3] = indices.Item3;
-                        vmap[s.Item4.Value] = indices.Item4;
+                        vmap[s.A] = indices.A;
+                        vmap[s.B] = indices.B;
+                        vmap[s.C] = indices.C;
+                        vmap[s.D.Value] = indices.D;
                     }
                     }
                     else
                     else
                     {
                     {
                         var indices = AddTriangle(a, b, c);
                         var indices = AddTriangle(a, b, c);
 
 
-                        vmap[s.Item1] = indices.Item1;
-                        vmap[s.Item2] = indices.Item2;
-                        vmap[s.Item3] = indices.Item3;
+                        vmap[s.A] = indices.A;
+                        vmap[s.B] = indices.B;
+                        vmap[s.C] = indices.C;
                     }
                     }
                 }
                 }
             }
             }
@@ -390,7 +390,7 @@ namespace SharpGLTF.Geometry
         /// <param name="a">First corner of the line.</param>
         /// <param name="a">First corner of the line.</param>
         /// <param name="b">Second corner of the line.</param>
         /// <param name="b">Second corner of the line.</param>
         /// <returns>The indices of the vertices, or, in case the line is degenerated, (-1,-1).</returns>
         /// <returns>The indices of the vertices, or, in case the line is degenerated, (-1,-1).</returns>
-        public virtual (int, int) AddLine(VertexBuilder<TvG, TvM, TvS> a, VertexBuilder<TvG, TvM, TvS> b)
+        public virtual (int A, int B) AddLine(VertexBuilder<TvG, TvM, TvS> a, VertexBuilder<TvG, TvM, TvS> b)
         {
         {
             throw new NotSupportedException("Lines are not supported for this primitive");
             throw new NotSupportedException("Lines are not supported for this primitive");
         }
         }
@@ -402,7 +402,7 @@ namespace SharpGLTF.Geometry
         /// <param name="b">Second corner of the triangle.</param>
         /// <param name="b">Second corner of the triangle.</param>
         /// <param name="c">Third corner of the triangle.</param>
         /// <param name="c">Third corner of the triangle.</param>
         /// <returns>The indices of the vertices, or, in case the triangle is degenerated, (-1,-1,-1).</returns>
         /// <returns>The indices of the vertices, or, in case the triangle is degenerated, (-1,-1,-1).</returns>
-        public virtual (int, int, int) AddTriangle(VertexBuilder<TvG, TvM, TvS> a, VertexBuilder<TvG, TvM, TvS> b, VertexBuilder<TvG, TvM, TvS> c)
+        public virtual (int A, int B, int C) AddTriangle(VertexBuilder<TvG, TvM, TvS> a, VertexBuilder<TvG, TvM, TvS> b, VertexBuilder<TvG, TvM, TvS> c)
         {
         {
             throw new NotSupportedException("Triangles are not supported for this primitive");
             throw new NotSupportedException("Triangles are not supported for this primitive");
         }
         }
@@ -415,7 +415,7 @@ namespace SharpGLTF.Geometry
         /// <param name="c">Third corner of the quadrangle.</param>
         /// <param name="c">Third corner of the quadrangle.</param>
         /// <param name="d">Fourth corner of the quadrangle.</param>
         /// <param name="d">Fourth corner of the quadrangle.</param>
         /// <returns>The indices of the vertices, or, in case the quadrangle is degenerated, (-1,-1,-1,-1).</returns>
         /// <returns>The indices of the vertices, or, in case the quadrangle is degenerated, (-1,-1,-1,-1).</returns>
-        public virtual (int, int, int, int) AddQuadrangle(VertexBuilder<TvG, TvM, TvS> a, VertexBuilder<TvG, TvM, TvS> b, VertexBuilder<TvG, TvM, TvS> c, VertexBuilder<TvG, TvM, TvS> d)
+        public virtual (int A, int B, int C, int D) AddQuadrangle(VertexBuilder<TvG, TvM, TvS> a, VertexBuilder<TvG, TvM, TvS> b, VertexBuilder<TvG, TvM, TvS> c, VertexBuilder<TvG, TvM, TvS> d)
         {
         {
             throw new NotSupportedException("Quadrangles are not supported for this primitive");
             throw new NotSupportedException("Quadrangles are not supported for this primitive");
         }
         }
@@ -518,7 +518,7 @@ namespace SharpGLTF.Geometry
 
 
         #region data
         #region data
 
 
-        private readonly List<(int, int)> _Indices = new List<(int, int)>();
+        private readonly List<(int A, int B)> _Indices = new List<(int A, int B)>();
 
 
         #endregion
         #endregion
 
 
@@ -526,13 +526,13 @@ namespace SharpGLTF.Geometry
 
 
         public override int VerticesPerPrimitive => 2;
         public override int VerticesPerPrimitive => 2;
 
 
-        public override IReadOnlyList<(int, int)> Lines => _Indices;
+        public override IReadOnlyList<(int A, int B)> Lines => _Indices;
 
 
         #endregion
         #endregion
 
 
         #region API
         #region API
 
 
-        public override (int, int) AddLine(VertexBuilder<TvG, TvM, TvS> a, VertexBuilder<TvG, TvM, TvS> b)
+        public override (int A, int B) AddLine(VertexBuilder<TvG, TvM, TvS> a, VertexBuilder<TvG, TvM, TvS> b)
         {
         {
             if (Mesh.VertexPreprocessor != null)
             if (Mesh.VertexPreprocessor != null)
             {
             {
@@ -556,7 +556,7 @@ namespace SharpGLTF.Geometry
         public override IReadOnlyList<int> GetIndices()
         public override IReadOnlyList<int> GetIndices()
         {
         {
             return _Indices
             return _Indices
-                .SelectMany(item => new[] { item.Item1, item.Item2 })
+                .SelectMany(item => new[] { item.A, item.B })
                 .ToList();
                 .ToList();
         }
         }
 
 
@@ -580,8 +580,8 @@ namespace SharpGLTF.Geometry
 
 
         #region data
         #region data
 
 
-        private readonly List<(int, int, int)> _TriIndices = new List<(int, int, int)>();
-        private readonly List<(int, int, int, int)> _QuadIndices = new List<(int, int, int, int)>();
+        private readonly List<(int A, int B, int C)> _TriIndices = new List<(int A, int B, int C)>();
+        private readonly List<(int A, int B, int C, int D)> _QuadIndices = new List<(int A, int B, int C, int D)>();
 
 
         #endregion
         #endregion
 
 
@@ -589,15 +589,15 @@ namespace SharpGLTF.Geometry
 
 
         public override int VerticesPerPrimitive => 3;
         public override int VerticesPerPrimitive => 3;
 
 
-        public override IReadOnlyList<(int, int, int)> Triangles => new TriangleList(_TriIndices, _QuadIndices);
+        public override IReadOnlyList<(int A, int B, int C)> Triangles => new TriangleList(_TriIndices, _QuadIndices);
 
 
-        public override IReadOnlyList<(int, int, int, int?)> Surfaces => new SurfaceList(_TriIndices, _QuadIndices);
+        public override IReadOnlyList<(int A, int B, int C, int? D)> Surfaces => new SurfaceList(_TriIndices, _QuadIndices);
 
 
         #endregion
         #endregion
 
 
         #region API
         #region API
 
 
-        public override (int, int, int) AddTriangle(VertexBuilder<TvG, TvM, TvS> a, VertexBuilder<TvG, TvM, TvS> b, VertexBuilder<TvG, TvM, TvS> c)
+        public override (int A, int B, int C) AddTriangle(VertexBuilder<TvG, TvM, TvS> a, VertexBuilder<TvG, TvM, TvS> b, VertexBuilder<TvG, TvM, TvS> c)
         {
         {
             if (Mesh.VertexPreprocessor != null)
             if (Mesh.VertexPreprocessor != null)
             {
             {
@@ -609,7 +609,7 @@ namespace SharpGLTF.Geometry
             return _AddTriangle(a, b, c);
             return _AddTriangle(a, b, c);
         }
         }
 
 
-        public override (int, int, int, int) AddQuadrangle(VertexBuilder<TvG, TvM, TvS> a, VertexBuilder<TvG, TvM, TvS> b, VertexBuilder<TvG, TvM, TvS> c, VertexBuilder<TvG, TvM, TvS> d)
+        public override (int A, int B, int C, int D) AddQuadrangle(VertexBuilder<TvG, TvM, TvS> a, VertexBuilder<TvG, TvM, TvS> b, VertexBuilder<TvG, TvM, TvS> c, VertexBuilder<TvG, TvM, TvS> d)
         {
         {
             if (Mesh.VertexPreprocessor != null)
             if (Mesh.VertexPreprocessor != null)
             {
             {
@@ -626,28 +626,28 @@ namespace SharpGLTF.Geometry
             if (a.Position == b.Position)
             if (a.Position == b.Position)
             {
             {
                 var tri = _AddTriangle(b, c, d);
                 var tri = _AddTriangle(b, c, d);
-                return (-1, tri.Item1, tri.Item2, tri.Item3);
+                return (-1, tri.A, tri.B, tri.C);
             }
             }
 
 
             // B-C degenerated
             // B-C degenerated
             if (b.Position == c.Position)
             if (b.Position == c.Position)
             {
             {
                 var tri = _AddTriangle(a, c, d);
                 var tri = _AddTriangle(a, c, d);
-                return (tri.Item1, -1, tri.Item2, tri.Item3);
+                return (tri.A, -1, tri.B, tri.C);
             }
             }
 
 
             // C-D degenerated
             // C-D degenerated
             if (c.Position == d.Position)
             if (c.Position == d.Position)
             {
             {
                 var tri = _AddTriangle(a, b, d);
                 var tri = _AddTriangle(a, b, d);
-                return (tri.Item1, tri.Item2, -1, tri.Item3);
+                return (tri.A, tri.B, -1, tri.C);
             }
             }
 
 
             // D-A degenerated
             // D-A degenerated
             if (d.Position == a.Position)
             if (d.Position == a.Position)
             {
             {
                 var tri = _AddTriangle(a, b, c);
                 var tri = _AddTriangle(a, b, c);
-                return (tri.Item1, tri.Item2, tri.Item3, -1);
+                return (tri.A, tri.B, tri.C, -1);
             }
             }
 
 
             // at some points it could be interesting to comply with https://github.com/KhronosGroup/glTF/pull/1620
             // at some points it could be interesting to comply with https://github.com/KhronosGroup/glTF/pull/1620
@@ -673,7 +673,7 @@ namespace SharpGLTF.Geometry
             }
             }
         }
         }
 
 
-        private (int, int, int) _AddTriangle(VertexBuilder<TvG, TvM, TvS> a, VertexBuilder<TvG, TvM, TvS> b, VertexBuilder<TvG, TvM, TvS> c)
+        private (int A, int B, int C) _AddTriangle(VertexBuilder<TvG, TvM, TvS> a, VertexBuilder<TvG, TvM, TvS> b, VertexBuilder<TvG, TvM, TvS> c)
         {
         {
             // check for degenerated triangle
             // check for degenerated triangle
             if (a.Position == b.Position || a.Position == c.Position || b.Position == c.Position) return (-1, -1, -1);
             if (a.Position == b.Position || a.Position == c.Position || b.Position == c.Position) return (-1, -1, -1);
@@ -694,7 +694,7 @@ namespace SharpGLTF.Geometry
         public override IReadOnlyList<int> GetIndices()
         public override IReadOnlyList<int> GetIndices()
         {
         {
             return Triangles
             return Triangles
-                .SelectMany(item => new[] { item.Item1, item.Item2, item.Item3 })
+                .SelectMany(item => new[] { item.A, item.B, item.C })
                 .ToList();
                 .ToList();
         }
         }
 
 
@@ -702,7 +702,7 @@ namespace SharpGLTF.Geometry
 
 
         #region Types
         #region Types
 
 
-        private struct TriangleList : IReadOnlyList<(int, int, int)>
+        private struct TriangleList : IReadOnlyList<(int A, int B, int C)>
         {
         {
             public TriangleList(IReadOnlyList<(int, int, int)> tris, IReadOnlyList<(int, int, int, int)> quads)
             public TriangleList(IReadOnlyList<(int, int, int)> tris, IReadOnlyList<(int, int, int, int)> quads)
             {
             {
@@ -710,12 +710,12 @@ namespace SharpGLTF.Geometry
                 _Quads = quads;
                 _Quads = quads;
             }
             }
 
 
-            private readonly IReadOnlyList<(int, int, int)> _Tris;
-            private readonly IReadOnlyList<(int, int, int, int)> _Quads;
+            private readonly IReadOnlyList<(int A, int B, int C)> _Tris;
+            private readonly IReadOnlyList<(int A, int B, int C, int D)> _Quads;
 
 
             public int Count => _Tris.Count + (_Quads.Count * 2);
             public int Count => _Tris.Count + (_Quads.Count * 2);
 
 
-            public (int, int, int) this[int index]
+            public (int A, int B, int C) this[int index]
             {
             {
                 get
                 get
                 {
                 {
@@ -729,11 +729,11 @@ namespace SharpGLTF.Geometry
 
 
                     var quad = _Quads[index / 2];
                     var quad = _Quads[index / 2];
 
 
-                    return (index & 1) == 0 ? (quad.Item1, quad.Item2, quad.Item3) : (quad.Item1, quad.Item3, quad.Item4);
+                    return (index & 1) == 0 ? (quad.A, quad.B, quad.C) : (quad.A, quad.C, quad.D);
                 }
                 }
             }
             }
 
 
-            public IEnumerator<(int, int, int)> GetEnumerator()
+            public IEnumerator<(int A, int B, int C)> GetEnumerator()
             {
             {
                 var c = this.Count;
                 var c = this.Count;
                 for (int i = 0; i < c; ++i) yield return this[i];
                 for (int i = 0; i < c; ++i) yield return this[i];
@@ -746,7 +746,7 @@ namespace SharpGLTF.Geometry
             }
             }
         }
         }
 
 
-        private struct SurfaceList : IReadOnlyList<(int, int, int, int?)>
+        private struct SurfaceList : IReadOnlyList<(int A, int B, int C, int? D)>
         {
         {
             public SurfaceList(IReadOnlyList<(int, int, int)> tris, IReadOnlyList<(int, int, int, int)> quads)
             public SurfaceList(IReadOnlyList<(int, int, int)> tris, IReadOnlyList<(int, int, int, int)> quads)
             {
             {
@@ -754,29 +754,29 @@ namespace SharpGLTF.Geometry
                 _Quads = quads;
                 _Quads = quads;
             }
             }
 
 
-            private readonly IReadOnlyList<(int, int, int)> _Tris;
-            private readonly IReadOnlyList<(int, int, int, int)> _Quads;
+            private readonly IReadOnlyList<(int A, int B, int C)> _Tris;
+            private readonly IReadOnlyList<(int A, int B, int C, int D)> _Quads;
 
 
             public int Count => _Tris.Count + _Quads.Count;
             public int Count => _Tris.Count + _Quads.Count;
 
 
-            public (int, int, int, int?) this[int index]
+            public (int A, int B, int C, int? D) this[int index]
             {
             {
                 get
                 get
                 {
                 {
                     if (index < _Tris.Count)
                     if (index < _Tris.Count)
                     {
                     {
                         var tri = _Tris[index];
                         var tri = _Tris[index];
-                        return (tri.Item1, tri.Item2, tri.Item3, null);
+                        return (tri.A, tri.B, tri.C, null);
                     }
                     }
 
 
                     index -= _Tris.Count;
                     index -= _Tris.Count;
 
 
                     var quad = _Quads[index];
                     var quad = _Quads[index];
-                    return (quad.Item1, quad.Item2, quad.Item3, quad.Item4);
+                    return (quad.A, quad.B, quad.C, quad.D);
                 }
                 }
             }
             }
 
 
-            public IEnumerator<(int, int, int, int?)> GetEnumerator()
+            public IEnumerator<(int A, int B, int C, int? D)> GetEnumerator()
             {
             {
                 var c = this.Count;
                 var c = this.Count;
                 for (int i = 0; i < c; ++i) yield return this[i];
                 for (int i = 0; i < c; ++i) yield return this[i];

+ 10 - 10
src/SharpGLTF.Toolkit/Geometry/VertexBuilder.cs

@@ -126,7 +126,7 @@ namespace SharpGLTF.Geometry
             for (int i = 0; i < Skinning.MaxBindings; ++i)
             for (int i = 0; i < Skinning.MaxBindings; ++i)
             {
             {
                 var jw = Skinning.GetJointBinding(i);
                 var jw = Skinning.GetJointBinding(i);
-                if (!jw.Item2._IsFinite() || jw.Item2 < 0 || jw.Item1 < 0) sb.Append($" ❌𝐉𝐖{i} {jw.Item1}:{jw.Item2}");
+                if (!jw.Weight._IsFinite() || jw.Weight < 0 || jw.Index < 0) sb.Append($" ❌𝐉𝐖{i} {jw.Index}:{jw.Weight}");
             }
             }
 
 
             return sb.ToString();
             return sb.ToString();
@@ -183,7 +183,7 @@ namespace SharpGLTF.Geometry
             Skinning = default;
             Skinning = default;
         }
         }
 
 
-        public VertexBuilder(TvG g, params (int, float)[] bindings)
+        public VertexBuilder(TvG g, params (int Index, float Weight)[] bindings)
         {
         {
             Geometry = g;
             Geometry = g;
             Material = default;
             Material = default;
@@ -202,19 +202,19 @@ namespace SharpGLTF.Geometry
             Skinning.SetWeights(bindings);
             Skinning.SetWeights(bindings);
         }
         }
 
 
-        public static implicit operator VertexBuilder<TvG, TvM, TvS>((TvG, TvM, TvS) tuple)
+        public static implicit operator VertexBuilder<TvG, TvM, TvS>((TvG Geo, TvM Mat, TvS Skin) tuple)
         {
         {
-            return new VertexBuilder<TvG, TvM, TvS>(tuple.Item1, tuple.Item2, tuple.Item3);
+            return new VertexBuilder<TvG, TvM, TvS>(tuple.Geo, tuple.Mat, tuple.Skin);
         }
         }
 
 
-        public static implicit operator VertexBuilder<TvG, TvM, TvS>((TvG, TvM) tuple)
+        public static implicit operator VertexBuilder<TvG, TvM, TvS>((TvG Geo, TvM Mat) tuple)
         {
         {
-            return new VertexBuilder<TvG, TvM, TvS>(tuple.Item1, tuple.Item2);
+            return new VertexBuilder<TvG, TvM, TvS>(tuple.Geo, tuple.Mat);
         }
         }
 
 
-        public static implicit operator VertexBuilder<TvG, TvM, TvS>((TvG, TvS) tuple)
+        public static implicit operator VertexBuilder<TvG, TvM, TvS>((TvG Geo, TvS Mat) tuple)
         {
         {
-            return new VertexBuilder<TvG, TvM, TvS>(tuple.Item1, tuple.Item2);
+            return new VertexBuilder<TvG, TvM, TvS>(tuple.Geo, tuple.Mat);
         }
         }
 
 
         public static implicit operator VertexBuilder<TvG, TvM, TvS>(TvG g)
         public static implicit operator VertexBuilder<TvG, TvM, TvS>(TvG g)
@@ -321,7 +321,7 @@ namespace SharpGLTF.Geometry
             return v;
             return v;
         }
         }
 
 
-        public VertexBuilder<TvG, TvM, TvS> WithSkinning(params (int, float)[] bindings)
+        public VertexBuilder<TvG, TvM, TvS> WithSkinning(params (int Index, float Weight)[] bindings)
         {
         {
             var v = this;
             var v = this;
 
 
@@ -329,7 +329,7 @@ namespace SharpGLTF.Geometry
 
 
             while (i < bindings.Length)
             while (i < bindings.Length)
             {
             {
-                v.Skinning.SetJointBinding(i, bindings[i].Item1, bindings[i].Item2);
+                v.Skinning.SetJointBinding(i, bindings[i].Index, bindings[i].Weight);
                 ++i;
                 ++i;
             }
             }
 
 

+ 5 - 5
src/SharpGLTF.Toolkit/Geometry/VertexTypes/FragmentPreprocessors.cs

@@ -110,13 +110,13 @@ namespace SharpGLTF.Geometry.VertexTypes
 
 
             for (int i = 0; i < vertex.MaxBindings; ++i)
             for (int i = 0; i < vertex.MaxBindings; ++i)
             {
             {
-                var pair = vertex.GetJointBinding(i);
+                var (index, weight) = vertex.GetJointBinding(i);
 
 
-                Guard.MustBeGreaterThanOrEqualTo(pair.Item1, 0, $"Joint{i}");
-                Guard.IsTrue(pair.Item2._IsFinite(), $"Weight{i}", "Values are not finite.");
-                if (pair.Item2 == 0) Guard.IsTrue(pair.Item1 == 0, "joints with weight zero must be set to zero");
+                Guard.MustBeGreaterThanOrEqualTo(index, 0, $"Joint{i}");
+                Guard.IsTrue(weight._IsFinite(), $"Weight{i}", "Values are not finite.");
+                if (weight == 0) Guard.IsTrue(index == 0, "joints with weight zero must be set to zero");
 
 
-                weightsSum += pair.Item2;
+                weightsSum += weight;
             }
             }
 
 
             // TODO: check that joints are unique
             // TODO: check that joints are unique

+ 8 - 8
src/SharpGLTF.Toolkit/Geometry/VertexTypes/VertexGeometry.cs

@@ -136,9 +136,9 @@ namespace SharpGLTF.Geometry.VertexTypes
             src.TryGetNormal(out this.Normal);
             src.TryGetNormal(out this.Normal);
         }
         }
 
 
-        public static implicit operator VertexPositionNormal((Vector3, Vector3) tuple)
+        public static implicit operator VertexPositionNormal((Vector3 Pos, Vector3 Nrm) tuple)
         {
         {
-            return new VertexPositionNormal(tuple.Item1, tuple.Item2);
+            return new VertexPositionNormal(tuple.Pos, tuple.Nrm);
         }
         }
 
 
         #endregion
         #endregion
@@ -219,9 +219,9 @@ namespace SharpGLTF.Geometry.VertexTypes
             src.TryGetTangent(out this.Tangent);
             src.TryGetTangent(out this.Tangent);
         }
         }
 
 
-        public static implicit operator VertexPositionNormalTangent((Vector3, Vector3, Vector4) tuple)
+        public static implicit operator VertexPositionNormalTangent((Vector3 Pos, Vector3 Nrm, Vector4 Tgt) tuple)
         {
         {
-            return new VertexPositionNormalTangent(tuple.Item1, tuple.Item2, tuple.Item3);
+            return new VertexPositionNormalTangent(tuple.Pos, tuple.Nrm, tuple.Tgt);
         }
         }
 
 
         #endregion
         #endregion
@@ -299,14 +299,14 @@ namespace SharpGLTF.Geometry.VertexTypes
             return new VertexGeometryDelta(position, Vector3.Zero, Vector3.Zero);
             return new VertexGeometryDelta(position, Vector3.Zero, Vector3.Zero);
         }
         }
 
 
-        public static implicit operator VertexGeometryDelta((Vector3, Vector3) tuple)
+        public static implicit operator VertexGeometryDelta((Vector3 Pos, Vector3 Nrm) tuple)
         {
         {
-            return new VertexGeometryDelta(tuple.Item1, tuple.Item2, Vector3.Zero);
+            return new VertexGeometryDelta(tuple.Pos, tuple.Nrm, Vector3.Zero);
         }
         }
 
 
-        public static implicit operator VertexGeometryDelta((Vector3, Vector3, Vector3) tuple)
+        public static implicit operator VertexGeometryDelta((Vector3 Pos, Vector3 Nrm, Vector3 tgt) tuple)
         {
         {
-            return new VertexGeometryDelta(tuple.Item1, tuple.Item2, tuple.Item3);
+            return new VertexGeometryDelta(tuple.Pos, tuple.Nrm, tuple.tgt);
         }
         }
 
 
         public VertexGeometryDelta(IVertexGeometry src)
         public VertexGeometryDelta(IVertexGeometry src)

+ 10 - 10
src/SharpGLTF.Toolkit/Geometry/VertexTypes/VertexMaterial.cs

@@ -118,9 +118,9 @@ namespace SharpGLTF.Geometry.VertexTypes
             this.Color1 = src.MaxColors > 1 ? src.GetColor(1) : Vector4.One;
             this.Color1 = src.MaxColors > 1 ? src.GetColor(1) : Vector4.One;
         }
         }
 
 
-        public static implicit operator VertexColor2((Vector4, Vector4) tuple)
+        public static implicit operator VertexColor2((Vector4 Color0, Vector4 Color1) tuple)
         {
         {
-            return new VertexColor2(tuple.Item1, tuple.Item2);
+            return new VertexColor2(tuple.Color0, tuple.Color1);
         }
         }
 
 
         #endregion
         #endregion
@@ -261,9 +261,9 @@ namespace SharpGLTF.Geometry.VertexTypes
             this.TexCoord1 = src.MaxTextCoords > 1 ? src.GetTexCoord(1) : Vector2.Zero;
             this.TexCoord1 = src.MaxTextCoords > 1 ? src.GetTexCoord(1) : Vector2.Zero;
         }
         }
 
 
-        public static implicit operator VertexTexture2((Vector2, Vector2) tuple)
+        public static implicit operator VertexTexture2((Vector2 Tex0, Vector2 Tex1) tuple)
         {
         {
-            return new VertexTexture2(tuple.Item1, tuple.Item2);
+            return new VertexTexture2(tuple.Tex0, tuple.Tex1);
         }
         }
 
 
         #endregion
         #endregion
@@ -339,9 +339,9 @@ namespace SharpGLTF.Geometry.VertexTypes
             this.TexCoord = src.MaxTextCoords > 0 ? src.GetTexCoord(0) : Vector2.Zero;
             this.TexCoord = src.MaxTextCoords > 0 ? src.GetTexCoord(0) : Vector2.Zero;
         }
         }
 
 
-        public static implicit operator VertexColor1Texture1((Vector4, Vector2) tuple)
+        public static implicit operator VertexColor1Texture1((Vector4 Color, Vector2 Tex) tuple)
         {
         {
-            return new VertexColor1Texture1(tuple.Item1, tuple.Item2);
+            return new VertexColor1Texture1(tuple.Color, tuple.Tex);
         }
         }
 
 
         #endregion
         #endregion
@@ -415,9 +415,9 @@ namespace SharpGLTF.Geometry.VertexTypes
             this.TexCoord1 = src.MaxTextCoords > 1 ? src.GetTexCoord(1) : Vector2.Zero;
             this.TexCoord1 = src.MaxTextCoords > 1 ? src.GetTexCoord(1) : Vector2.Zero;
         }
         }
 
 
-        public static implicit operator VertexColor1Texture2((Vector4, Vector2, Vector2) tuple)
+        public static implicit operator VertexColor1Texture2((Vector4 Color, Vector2 Tex0, Vector2 Tex1) tuple)
         {
         {
-            return new VertexColor1Texture2(tuple.Item1, tuple.Item2, tuple.Item3);
+            return new VertexColor1Texture2(tuple.Color, tuple.Tex0, tuple.Tex1);
         }
         }
 
 
         #endregion
         #endregion
@@ -504,9 +504,9 @@ namespace SharpGLTF.Geometry.VertexTypes
             this.TexCoord1 = src.MaxTextCoords > 1 ? src.GetTexCoord(1) : Vector2.Zero;
             this.TexCoord1 = src.MaxTextCoords > 1 ? src.GetTexCoord(1) : Vector2.Zero;
         }
         }
 
 
-        public static implicit operator VertexColor2Texture2((Vector4, Vector4, Vector2, Vector2) tuple)
+        public static implicit operator VertexColor2Texture2((Vector4 Color0, Vector4 Color1, Vector2 Tex0, Vector2 Tex1) tuple)
         {
         {
-            return new VertexColor2Texture2(tuple.Item1, tuple.Item2, tuple.Item3, tuple.Item4);
+            return new VertexColor2Texture2(tuple.Color0, tuple.Color1, tuple.Tex0, tuple.Tex1);
         }
         }
 
 
         #endregion
         #endregion

+ 2 - 2
src/SharpGLTF.Toolkit/Geometry/VertexTypes/VertexSkinning.cs

@@ -12,7 +12,7 @@ namespace SharpGLTF.Geometry.VertexTypes
 
 
         void Validate();
         void Validate();
 
 
-        (int, float) GetJointBinding(int index);
+        (int Index, float Weight) GetJointBinding(int index);
         void SetJointBinding(int index, int joint, float weight);
         void SetJointBinding(int index, int joint, float weight);
 
 
         void SetWeights(in SparseWeight8 weights);
         void SetWeights(in SparseWeight8 weights);
@@ -195,7 +195,7 @@ namespace SharpGLTF.Geometry.VertexTypes
 
 
         public void SetWeights(in SparseWeight8 weights) { this = new VertexJoints8(weights); }
         public void SetWeights(in SparseWeight8 weights) { this = new VertexJoints8(weights); }
 
 
-        public (int, float) GetJointBinding(int index)
+        public (int Index, float Weight) GetJointBinding(int index)
         {
         {
             switch (index)
             switch (index)
             {
             {

+ 5 - 5
src/SharpGLTF.Toolkit/IO/WavefrontWriter.cs

@@ -201,9 +201,9 @@ namespace SharpGLTF.IO
 
 
                 foreach (var t in p.Triangles)
                 foreach (var t in p.Triangles)
                 {
                 {
-                    var a = t.Item1 + baseVertexIndex;
-                    var b = t.Item2 + baseVertexIndex;
-                    var c = t.Item3 + baseVertexIndex;
+                    var a = t.A + baseVertexIndex;
+                    var b = t.B + baseVertexIndex;
+                    var c = t.C + baseVertexIndex;
 
 
                     sb.AppendLine(Invariant($"f {a}/{a}/{a} {b}/{b}/{b} {c}/{c}/{c}"));
                     sb.AppendLine(Invariant($"f {a}/{a}/{a} {b}/{b}/{b} {c}/{c}/{c}"));
                 }
                 }
@@ -252,7 +252,7 @@ namespace SharpGLTF.IO
                     dstMaterial.DiffuseTexture = srcMaterial.GetDiffuseTexture()?.PrimaryImage?.GetImageContent() ?? default;
                     dstMaterial.DiffuseTexture = srcMaterial.GetDiffuseTexture()?.PrimaryImage?.GetImageContent() ?? default;
                 }
                 }
 
 
-                this.AddTriangle(dstMaterial, triangle.Item1, triangle.Item2, triangle.Item3);
+                this.AddTriangle(dstMaterial, triangle.A, triangle.B, triangle.C);
             }
             }
         }
         }
 
 
@@ -275,7 +275,7 @@ namespace SharpGLTF.IO
                     dstMaterial.DiffuseTexture = srcMaterial.GetDiffuseTexture()?.PrimaryImage?.GetImageContent() ?? default;
                     dstMaterial.DiffuseTexture = srcMaterial.GetDiffuseTexture()?.PrimaryImage?.GetImageContent() ?? default;
                 }
                 }
 
 
-                this.AddTriangle(dstMaterial, triangle.Item1, triangle.Item2, triangle.Item3);
+                this.AddTriangle(dstMaterial, triangle.A, triangle.B, triangle.C);
             }
             }
         }
         }
 
 

+ 4 - 0
src/SharpGLTF.Toolkit/Scenes/NodeBuilder.cs

@@ -79,6 +79,8 @@ namespace SharpGLTF.Scenes
             }
             }
         }
         }
 
 
+        #pragma warning disable CA1721 // Property names should not match get methods
+
         /// <summary>
         /// <summary>
         /// Gets or sets the local Scale, Rotation and Translation of this <see cref="NodeBuilder"/>.
         /// Gets or sets the local Scale, Rotation and Translation of this <see cref="NodeBuilder"/>.
         /// </summary>
         /// </summary>
@@ -118,6 +120,8 @@ namespace SharpGLTF.Scenes
             }
             }
         }
         }
 
 
+        #pragma warning restore CA1721 // Property names should not match get methods
+
         #endregion
         #endregion
 
 
         #region API - hierarchy
         #region API - hierarchy

+ 1 - 1
src/SharpGLTF.Toolkit/Scenes/SceneBuilder.Schema2.cs

@@ -275,7 +275,7 @@ namespace SharpGLTF.Scenes
                     for (int i = 0; i < joints.Length; ++i)
                     for (int i = 0; i < joints.Length; ++i)
                     {
                     {
                         var j = srcInstance.Skin.GetJoint(i);
                         var j = srcInstance.Skin.GetJoint(i);
-                        joints[i] = (dstNodes[j.Item1], j.Item2);
+                        joints[i] = (dstNodes[j.Joint], j.InverseBindMatrix);
                     }
                     }
 
 
                     var dstInst = dstScene.AddSkinnedMesh(dstMesh, joints);
                     var dstInst = dstScene.AddSkinnedMesh(dstMesh, joints);

+ 5 - 5
src/SharpGLTF.Toolkit/Scenes/Transformers.Schema2.cs

@@ -56,16 +56,16 @@ namespace SharpGLTF.Scenes
                 {
                 {
                     var srcNode = _Joints[i];
                     var srcNode = _Joints[i];
 
 
-                    System.Diagnostics.Debug.Assert(!srcNode.Item2.HasValue);
+                    System.Diagnostics.Debug.Assert(!srcNode.InverseBindMatrix.HasValue);
 
 
-                    dstNodes[i] = context.GetNode(srcNode.Item1);
+                    dstNodes[i] = context.GetNode(srcNode.Joints);
                 }
                 }
 
 
                 #if DEBUG
                 #if DEBUG
                 for (int i = 0; i < dstNodes.Length; ++i)
                 for (int i = 0; i < dstNodes.Length; ++i)
                 {
                 {
                     var srcNode = _Joints[i];
                     var srcNode = _Joints[i];
-                    System.Diagnostics.Debug.Assert(dstNodes[i].WorldMatrix == srcNode.Item1.WorldMatrix);
+                    System.Diagnostics.Debug.Assert(dstNodes[i].WorldMatrix == srcNode.Joints.WorldMatrix);
                 }
                 }
                 #endif
                 #endif
 
 
@@ -74,14 +74,14 @@ namespace SharpGLTF.Scenes
             else
             else
             {
             {
                 var skinnedJoints = _Joints
                 var skinnedJoints = _Joints
-                .Select(j => (context.GetNode(j.Item1), j.Item2.Value))
+                .Select(j => (context.GetNode(j.Joints), j.InverseBindMatrix.Value))
                 .ToArray();
                 .ToArray();
 
 
                 skinnedMeshNode.WithSkinBinding(skinnedJoints);
                 skinnedMeshNode.WithSkinBinding(skinnedJoints);
             }
             }
 
 
             // set skeleton
             // set skeleton
-            // var root = _Joints[0].Item1.Root;
+            // var root = _Joints[0].Joint.Root;
             // skinnedMeshNode.Skin.Skeleton = context.GetNode(root);
             // skinnedMeshNode.Skin.Skeleton = context.GetNode(root);
 
 
             schema2Target.Setup(skinnedMeshNode, context);
             schema2Target.Setup(skinnedMeshNode, context);

+ 6 - 6
src/SharpGLTF.Toolkit/Schema2/AnimationExtensions.cs

@@ -87,23 +87,23 @@ namespace SharpGLTF.Schema2
             return node;
             return node;
         }
         }
 
 
-        public static Node WithScaleAnimation(this Node node, string animationName, params (Single, Vector3)[] keyframes)
+        public static Node WithScaleAnimation(this Node node, string animationName, params (Single Key, Vector3 Value)[] keyframes)
         {
         {
-            var keys = keyframes.ToDictionary(kvp => kvp.Item1, kvp => kvp.Item2);
+            var keys = keyframes.ToDictionary(kvp => kvp.Key, kvp => kvp.Value);
 
 
             return node.WithScaleAnimation(animationName, keys);
             return node.WithScaleAnimation(animationName, keys);
         }
         }
 
 
-        public static Node WithRotationAnimation(this Node node, string animationName, params (Single, Quaternion)[] keyframes)
+        public static Node WithRotationAnimation(this Node node, string animationName, params (Single Key, Quaternion Value)[] keyframes)
         {
         {
-            var keys = keyframes.ToDictionary(kvp => kvp.Item1, kvp => kvp.Item2);
+            var keys = keyframes.ToDictionary(kvp => kvp.Key, kvp => kvp.Value);
 
 
             return node.WithRotationAnimation(animationName, keys);
             return node.WithRotationAnimation(animationName, keys);
         }
         }
 
 
-        public static Node WithTranslationAnimation(this Node node, string animationName, params (Single, Vector3)[] keyframes)
+        public static Node WithTranslationAnimation(this Node node, string animationName, params (Single Key, Vector3 Value)[] keyframes)
         {
         {
-            var keys = keyframes.ToDictionary(kvp => kvp.Item1, kvp => kvp.Item2);
+            var keys = keyframes.ToDictionary(kvp => kvp.Key, kvp => kvp.Value);
 
 
             return node.WithTranslationAnimation(animationName, keys);
             return node.WithTranslationAnimation(animationName, keys);
         }
         }

+ 39 - 39
src/SharpGLTF.Toolkit/Schema2/MeshExtensions.cs

@@ -237,24 +237,24 @@ namespace SharpGLTF.Schema2
             return primitive.WithVertexAccessors(xvertices);
             return primitive.WithVertexAccessors(xvertices);
         }
         }
 
 
-        public static MeshPrimitive WithVertexAccessors<TvP, TvM>(this MeshPrimitive primitive, IReadOnlyList<(TvP, TvM)> vertices)
+        public static MeshPrimitive WithVertexAccessors<TvP, TvM>(this MeshPrimitive primitive, IReadOnlyList<(TvP Geo, TvM Mat)> vertices)
             where TvP : struct, IVertexGeometry
             where TvP : struct, IVertexGeometry
             where TvM : struct, IVertexMaterial
             where TvM : struct, IVertexMaterial
         {
         {
             var xvertices = vertices
             var xvertices = vertices
-                .Select(item => new VertexBuilder<TvP, TvM, VertexEmpty>(item.Item1, item.Item2))
+                .Select(item => new VertexBuilder<TvP, TvM, VertexEmpty>(item.Geo, item.Mat))
                 .ToList();
                 .ToList();
 
 
             return primitive.WithVertexAccessors(xvertices);
             return primitive.WithVertexAccessors(xvertices);
         }
         }
 
 
-        public static MeshPrimitive WithVertexAccessors<TvP, TvM, TvS>(this MeshPrimitive primitive, IReadOnlyList<(TvP, TvM, TvS)> vertices)
+        public static MeshPrimitive WithVertexAccessors<TvP, TvM, TvS>(this MeshPrimitive primitive, IReadOnlyList<(TvP Geo, TvM Mat, TvS Skin)> vertices)
             where TvP : struct, IVertexGeometry
             where TvP : struct, IVertexGeometry
             where TvM : struct, IVertexMaterial
             where TvM : struct, IVertexMaterial
             where TvS : struct, IVertexSkinning
             where TvS : struct, IVertexSkinning
         {
         {
             var xvertices = vertices
             var xvertices = vertices
-                .Select(item => new VertexBuilder<TvP, TvM, TvS>(item.Item1, item.Item2, item.Item3))
+                .Select(item => new VertexBuilder<TvP, TvM, TvS>(item.Geo, item.Mat, item.Skin))
                 .ToList();
                 .ToList();
 
 
             return primitive.WithVertexAccessors(xvertices);
             return primitive.WithVertexAccessors(xvertices);
@@ -274,7 +274,7 @@ namespace SharpGLTF.Schema2
             return primitive.WithVertexAccessors(memAccessors);
             return primitive.WithVertexAccessors(memAccessors);
         }
         }
 
 
-        public static MeshPrimitive WithVertexAccessors(this MeshPrimitive primitive, IEnumerable<Memory.MemoryAccessor> memAccessors)
+        public static MeshPrimitive WithVertexAccessors(this MeshPrimitive primitive, IEnumerable<MemoryAccessor> memAccessors)
         {
         {
             Guard.NotNull(memAccessors, nameof(memAccessors));
             Guard.NotNull(memAccessors, nameof(memAccessors));
             Guard.IsTrue(memAccessors.All(item => item != null), nameof(memAccessors));
             Guard.IsTrue(memAccessors.All(item => item != null), nameof(memAccessors));
@@ -284,7 +284,7 @@ namespace SharpGLTF.Schema2
             return primitive;
             return primitive;
         }
         }
 
 
-        public static MeshPrimitive WithVertexAccessor(this MeshPrimitive primitive, Memory.MemoryAccessor memAccessor)
+        public static MeshPrimitive WithVertexAccessor(this MeshPrimitive primitive, MemoryAccessor memAccessor)
         {
         {
             Guard.NotNull(primitive, nameof(primitive));
             Guard.NotNull(primitive, nameof(primitive));
             Guard.NotNull(memAccessor, nameof(memAccessor));
             Guard.NotNull(memAccessor, nameof(memAccessor));
@@ -296,7 +296,7 @@ namespace SharpGLTF.Schema2
             return primitive;
             return primitive;
         }
         }
 
 
-        public static MeshPrimitive WithIndicesAccessor(this MeshPrimitive primitive, PrimitiveType primitiveType, Memory.MemoryAccessor memAccessor)
+        public static MeshPrimitive WithIndicesAccessor(this MeshPrimitive primitive, PrimitiveType primitiveType, MemoryAccessor memAccessor)
         {
         {
             Guard.NotNull(primitive, nameof(primitive));
             Guard.NotNull(primitive, nameof(primitive));
 
 
@@ -312,7 +312,7 @@ namespace SharpGLTF.Schema2
             return primitive;
             return primitive;
         }
         }
 
 
-        public static MeshPrimitive WithMorphTargetAccessors(this MeshPrimitive primitive, int targetIndex, IEnumerable<Memory.MemoryAccessor> memAccessors)
+        public static MeshPrimitive WithMorphTargetAccessors(this MeshPrimitive primitive, int targetIndex, IEnumerable<MemoryAccessor> memAccessors)
         {
         {
             Guard.NotNull(primitive, nameof(primitive));
             Guard.NotNull(primitive, nameof(primitive));
             Guard.MustBeGreaterThanOrEqualTo(targetIndex, 0, nameof(targetIndex));
             Guard.MustBeGreaterThanOrEqualTo(targetIndex, 0, nameof(targetIndex));
@@ -343,14 +343,14 @@ namespace SharpGLTF.Schema2
 
 
         #region evaluation
         #region evaluation
 
 
-        public static IEnumerable<(IVertexBuilder, Material)> EvaluatePoints(this Mesh mesh, MESHXFORM xform = null)
+        public static IEnumerable<(IVertexBuilder A, Material Material)> EvaluatePoints(this Mesh mesh, MESHXFORM xform = null)
         {
         {
             if (mesh == null) return Enumerable.Empty<(IVertexBuilder, Material)>();
             if (mesh == null) return Enumerable.Empty<(IVertexBuilder, Material)>();
 
 
             return mesh.Primitives.SelectMany(item => item.EvaluatePoints(xform));
             return mesh.Primitives.SelectMany(item => item.EvaluatePoints(xform));
         }
         }
 
 
-        public static IEnumerable<(IVertexBuilder, Material)> EvaluatePoints(this MeshPrimitive prim, MESHXFORM xform = null)
+        public static IEnumerable<(IVertexBuilder A, Material Material)> EvaluatePoints(this MeshPrimitive prim, MESHXFORM xform = null)
         {
         {
             if (prim == null) yield break;
             if (prim == null) yield break;
             if (xform != null && !xform.Visible) yield break;
             if (xform != null && !xform.Visible) yield break;
@@ -369,14 +369,14 @@ namespace SharpGLTF.Schema2
             }
             }
         }
         }
 
 
-        public static IEnumerable<(IVertexBuilder, IVertexBuilder, Material)> EvaluateLines(this Mesh mesh, MESHXFORM xform = null)
+        public static IEnumerable<(IVertexBuilder A, IVertexBuilder B, Material Material)> EvaluateLines(this Mesh mesh, MESHXFORM xform = null)
         {
         {
             if (mesh == null) return Enumerable.Empty<(IVertexBuilder, IVertexBuilder, Material)>();
             if (mesh == null) return Enumerable.Empty<(IVertexBuilder, IVertexBuilder, Material)>();
 
 
             return mesh.Primitives.SelectMany(item => item.EvaluateLines(xform));
             return mesh.Primitives.SelectMany(item => item.EvaluateLines(xform));
         }
         }
 
 
-        public static IEnumerable<(IVertexBuilder, IVertexBuilder, Material)> EvaluateLines(this MeshPrimitive prim, MESHXFORM xform = null)
+        public static IEnumerable<(IVertexBuilder A, IVertexBuilder B, Material Material)> EvaluateLines(this MeshPrimitive prim, MESHXFORM xform = null)
         {
         {
             if (prim == null) yield break;
             if (prim == null) yield break;
             if (xform != null && !xform.Visible) yield break;
             if (xform != null && !xform.Visible) yield break;
@@ -389,21 +389,21 @@ namespace SharpGLTF.Schema2
 
 
             foreach (var t in lines)
             foreach (var t in lines)
             {
             {
-                var a = vertices.GetVertex(vtype, t.Item1);
-                var b = vertices.GetVertex(vtype, t.Item2);
+                var a = vertices.GetVertex(vtype, t.A);
+                var b = vertices.GetVertex(vtype, t.B);
 
 
                 yield return (a, b, prim.Material);
                 yield return (a, b, prim.Material);
             }
             }
         }
         }
 
 
-        public static IEnumerable<(IVertexBuilder, IVertexBuilder, IVertexBuilder, Material)> EvaluateTriangles(this Mesh mesh, MESHXFORM xform = null)
+        public static IEnumerable<(IVertexBuilder A, IVertexBuilder B, IVertexBuilder C, Material Material)> EvaluateTriangles(this Mesh mesh, MESHXFORM xform = null)
         {
         {
             if (mesh == null) return Enumerable.Empty<(IVertexBuilder, IVertexBuilder, IVertexBuilder, Material)>();
             if (mesh == null) return Enumerable.Empty<(IVertexBuilder, IVertexBuilder, IVertexBuilder, Material)>();
 
 
             return mesh.Primitives.SelectMany(item => item.EvaluateTriangles(xform));
             return mesh.Primitives.SelectMany(item => item.EvaluateTriangles(xform));
         }
         }
 
 
-        public static IEnumerable<(IVertexBuilder, IVertexBuilder, IVertexBuilder, Material)> EvaluateTriangles(this MeshPrimitive prim, MESHXFORM xform = null)
+        public static IEnumerable<(IVertexBuilder A, IVertexBuilder B, IVertexBuilder C, Material Material)> EvaluateTriangles(this MeshPrimitive prim, MESHXFORM xform = null)
         {
         {
             if (prim == null) yield break;
             if (prim == null) yield break;
             if (xform != null && !xform.Visible) yield break;
             if (xform != null && !xform.Visible) yield break;
@@ -416,15 +416,15 @@ namespace SharpGLTF.Schema2
 
 
             foreach (var t in triangles)
             foreach (var t in triangles)
             {
             {
-                var a = vertices.GetVertex(vtype, t.Item1);
-                var b = vertices.GetVertex(vtype, t.Item2);
-                var c = vertices.GetVertex(vtype, t.Item3);
+                var a = vertices.GetVertex(vtype, t.A);
+                var b = vertices.GetVertex(vtype, t.B);
+                var c = vertices.GetVertex(vtype, t.C);
 
 
                 yield return (a, b, c, prim.Material);
                 yield return (a, b, c, prim.Material);
             }
             }
         }
         }
 
 
-        public static IEnumerable<(VertexBuilder<TvG, TvM, TvS>, VertexBuilder<TvG, TvM, TvS>, VertexBuilder<TvG, TvM, TvS>, Material)> EvaluateTriangles<TvG, TvM, TvS>(this Mesh mesh, MESHXFORM xform = null)
+        public static IEnumerable<(VertexBuilder<TvG, TvM, TvS> A, VertexBuilder<TvG, TvM, TvS> B, VertexBuilder<TvG, TvM, TvS> C, Material Material)> EvaluateTriangles<TvG, TvM, TvS>(this Mesh mesh, MESHXFORM xform = null)
             where TvG : struct, IVertexGeometry
             where TvG : struct, IVertexGeometry
             where TvM : struct, IVertexMaterial
             where TvM : struct, IVertexMaterial
             where TvS : struct, IVertexSkinning
             where TvS : struct, IVertexSkinning
@@ -434,7 +434,7 @@ namespace SharpGLTF.Schema2
             return mesh.Primitives.SelectMany(item => item.EvaluateTriangles<TvG, TvM, TvS>(xform));
             return mesh.Primitives.SelectMany(item => item.EvaluateTriangles<TvG, TvM, TvS>(xform));
         }
         }
 
 
-        public static IEnumerable<(VertexBuilder<TvG, TvM, TvS>, VertexBuilder<TvG, TvM, TvS>, VertexBuilder<TvG, TvM, TvS>, Material)> EvaluateTriangles<TvG, TvM, TvS>(this MeshPrimitive prim, MESHXFORM xform = null)
+        public static IEnumerable<(VertexBuilder<TvG, TvM, TvS> A, VertexBuilder<TvG, TvM, TvS> B, VertexBuilder<TvG, TvM, TvS> C, Material Material)> EvaluateTriangles<TvG, TvM, TvS>(this MeshPrimitive prim, MESHXFORM xform = null)
             where TvG : struct, IVertexGeometry
             where TvG : struct, IVertexGeometry
             where TvM : struct, IVertexMaterial
             where TvM : struct, IVertexMaterial
             where TvS : struct, IVertexSkinning
             where TvS : struct, IVertexSkinning
@@ -451,9 +451,9 @@ namespace SharpGLTF.Schema2
 
 
             foreach (var t in triangles)
             foreach (var t in triangles)
             {
             {
-                var a = vertices.GetVertex<TvG, TvM, TvS>(t.Item1);
-                var b = vertices.GetVertex<TvG, TvM, TvS>(t.Item2);
-                var c = vertices.GetVertex<TvG, TvM, TvS>(t.Item3);
+                var a = vertices.GetVertex<TvG, TvM, TvS>(t.A);
+                var b = vertices.GetVertex<TvG, TvM, TvS>(t.B);
+                var c = vertices.GetVertex<TvG, TvM, TvS>(t.C);
 
 
                 if (!hasNormals)
                 if (!hasNormals)
                 {
                 {
@@ -534,9 +534,9 @@ namespace SharpGLTF.Schema2
 
 
                 foreach (var t in p.GetTriangleIndices())
                 foreach (var t in p.GetTriangleIndices())
                 {
                 {
-                    var p1 = positions[t.Item1];
-                    var p2 = positions[t.Item2];
-                    var p3 = positions[t.Item3];
+                    var p1 = positions[t.A];
+                    var p2 = positions[t.B];
+                    var p3 = positions[t.C];
                     var d = Vector3.Cross(p2 - p1, p3 - p1);
                     var d = Vector3.Cross(p2 - p1, p3 - p1);
                     addDirection(posnrm, p1, d);
                     addDirection(posnrm, p1, d);
                     addDirection(posnrm, p2, d);
                     addDirection(posnrm, p2, d);
@@ -571,7 +571,7 @@ namespace SharpGLTF.Schema2
 
 
                 foreach (var tri in srcPrim.EvaluateTriangles<TvG, TvM, TvS>(null))
                 foreach (var tri in srcPrim.EvaluateTriangles<TvG, TvM, TvS>(null))
                 {
                 {
-                    dstPrim.AddTriangle(tri.Item1, tri.Item2, tri.Item3);
+                    dstPrim.AddTriangle(tri.A, tri.B, tri.C);
                 }
                 }
             }
             }
         }
         }
@@ -604,7 +604,7 @@ namespace SharpGLTF.Schema2
             {
             {
                 var material = materialFunc(tri.Item4);
                 var material = materialFunc(tri.Item4);
 
 
-                mesh.UsePrimitive(material).AddTriangle(tri.Item1, tri.Item2, tri.Item3);
+                mesh.UsePrimitive(material).AddTriangle(tri.A, tri.B, tri.C);
             }
             }
 
 
             return mesh;
             return mesh;
@@ -706,26 +706,26 @@ namespace SharpGLTF.Schema2
 
 
             foreach (var srcLine in srcPrim.GetLineIndices())
             foreach (var srcLine in srcPrim.GetLineIndices())
             {
             {
-                var v1 = vertices.GetVertex(dstPrim.VertexType, srcLine.Item1);
-                var v2 = vertices.GetVertex(dstPrim.VertexType, srcLine.Item2);
+                var v1 = vertices.GetVertex(dstPrim.VertexType, srcLine.A);
+                var v2 = vertices.GetVertex(dstPrim.VertexType, srcLine.B);
 
 
                 var indices = dstPrim.AddLine(v1, v2);
                 var indices = dstPrim.AddLine(v1, v2);
 
 
-                vmap[srcLine.Item1] = indices.Item1;
-                vmap[srcLine.Item2] = indices.Item2;
+                vmap[srcLine.A] = indices.A;
+                vmap[srcLine.B] = indices.B;
             }
             }
 
 
             foreach (var srcTri in srcPrim.GetTriangleIndices())
             foreach (var srcTri in srcPrim.GetTriangleIndices())
             {
             {
-                var v1 = vertices.GetVertex(dstPrim.VertexType, srcTri.Item1);
-                var v2 = vertices.GetVertex(dstPrim.VertexType, srcTri.Item2);
-                var v3 = vertices.GetVertex(dstPrim.VertexType, srcTri.Item3);
+                var v1 = vertices.GetVertex(dstPrim.VertexType, srcTri.A);
+                var v2 = vertices.GetVertex(dstPrim.VertexType, srcTri.B);
+                var v3 = vertices.GetVertex(dstPrim.VertexType, srcTri.C);
 
 
                 var indices = dstPrim.AddTriangle(v1, v2, v3);
                 var indices = dstPrim.AddTriangle(v1, v2, v3);
 
 
-                vmap[srcTri.Item1] = indices.Item1;
-                vmap[srcTri.Item2] = indices.Item2;
-                vmap[srcTri.Item3] = indices.Item3;
+                vmap[srcTri.A] = indices.A;
+                vmap[srcTri.B] = indices.B;
+                vmap[srcTri.C] = indices.C;
             }
             }
 
 
             for (int tidx = 0; tidx < vertices.MorphTargets.Count; ++tidx)
             for (int tidx = 0; tidx < vertices.MorphTargets.Count; ++tidx)

+ 12 - 12
src/SharpGLTF.Toolkit/Schema2/SceneExtensions.cs

@@ -83,14 +83,14 @@ namespace SharpGLTF.Schema2
             return node;
             return node;
         }
         }
 
 
-        public static Node WithSkinBinding(this Node node, params (Node, Matrix4x4)[] joints)
+        public static Node WithSkinBinding(this Node node, params (Node Joint, Matrix4x4 InverseBindMatrix)[] joints)
         {
         {
             Guard.NotNull(node, nameof(node));
             Guard.NotNull(node, nameof(node));
 
 
             foreach (var j in joints)
             foreach (var j in joints)
             {
             {
-                Guard.MustShareLogicalParent(node, j.Item1, nameof(joints));
-                Guard.IsTrue(Matrix4x4.Invert(j.Item2, out Matrix4x4 r), nameof(joints), "Invalid Matrix");
+                Guard.MustShareLogicalParent(node, j.Joint, nameof(joints));
+                Guard.IsTrue(Matrix4x4.Invert(j.InverseBindMatrix, out Matrix4x4 r), nameof(joints), "Invalid Matrix");
             }
             }
 
 
             var skin = node.LogicalParent.CreateSkin();
             var skin = node.LogicalParent.CreateSkin();
@@ -116,7 +116,7 @@ namespace SharpGLTF.Schema2
                 .WithSkinBinding(meshPoseTransform, joints);
                 .WithSkinBinding(meshPoseTransform, joints);
         }
         }
 
 
-        public static Node WithSkinnedMesh(this Node node, Mesh mesh, params (Node, Matrix4x4)[] joints)
+        public static Node WithSkinnedMesh(this Node node, Mesh mesh, params (Node Joint, Matrix4x4 InverseBindMatrix)[] joints)
         {
         {
             Guard.NotNull(node, nameof(node));
             Guard.NotNull(node, nameof(node));
             Guard.NotNull(mesh, nameof(mesh));
             Guard.NotNull(mesh, nameof(mesh));
@@ -125,8 +125,8 @@ namespace SharpGLTF.Schema2
 
 
             foreach (var j in joints)
             foreach (var j in joints)
             {
             {
-                Guard.MustShareLogicalParent(node, j.Item1, nameof(joints));
-                Guard.IsTrue(Matrix4x4.Invert(j.Item2, out Matrix4x4 r), nameof(joints), "Invalid Matrix");
+                Guard.MustShareLogicalParent(node, j.Joint, nameof(joints));
+                Guard.IsTrue(Matrix4x4.Invert(j.InverseBindMatrix, out Matrix4x4 r), nameof(joints), "Invalid Matrix");
             }
             }
 
 
             // TODO: the joints must be visible in the visual tree that contains node.
             // TODO: the joints must be visible in the visual tree that contains node.
@@ -209,7 +209,7 @@ namespace SharpGLTF.Schema2
         /// <param name="animation">An <see cref="Animation"/> instance, or null.</param>
         /// <param name="animation">An <see cref="Animation"/> instance, or null.</param>
         /// <param name="time">The animation time.</param>
         /// <param name="time">The animation time.</param>
         /// <returns>A collection of triangles in world space.</returns>
         /// <returns>A collection of triangles in world space.</returns>
-        public static IEnumerable<(IVertexBuilder, IVertexBuilder, IVertexBuilder, Material)> EvaluateTriangles(this Scene scene, Animation animation = null, float time = 0)
+        public static IEnumerable<(IVertexBuilder A, IVertexBuilder B, IVertexBuilder C, Material Material)> EvaluateTriangles(this Scene scene, Animation animation = null, float time = 0)
         {
         {
             if (scene == null) return Enumerable.Empty<(IVertexBuilder, IVertexBuilder, IVertexBuilder, Material)>();
             if (scene == null) return Enumerable.Empty<(IVertexBuilder, IVertexBuilder, IVertexBuilder, Material)>();
 
 
@@ -230,8 +230,8 @@ namespace SharpGLTF.Schema2
 
 
             return instance
             return instance
                 .DrawableReferences
                 .DrawableReferences
-                .Where(item => item.Item2.Visible)
-                .SelectMany(item => meshes[item.Item1].EvaluateTriangles(item.Item2));
+                .Where(item => item.Transform.Visible)
+                .SelectMany(item => meshes[item.MeshIndex].EvaluateTriangles(item.Transform));
         }
         }
 
 
         /// <summary>
         /// <summary>
@@ -243,7 +243,7 @@ namespace SharpGLTF.Schema2
         /// <param name="animation">An <see cref="Animation"/> instance, or null.</param>
         /// <param name="animation">An <see cref="Animation"/> instance, or null.</param>
         /// <param name="time">The animation time.</param>
         /// <param name="time">The animation time.</param>
         /// <returns>A collection of triangles in world space.</returns>
         /// <returns>A collection of triangles in world space.</returns>
-        public static IEnumerable<(VertexBuilder<TvG, TvM, VertexEmpty>, VertexBuilder<TvG, TvM, VertexEmpty>, VertexBuilder<TvG, TvM, VertexEmpty>, Material)> EvaluateTriangles<TvG, TvM>(this Scene scene, Animation animation = null, float time = 0)
+        public static IEnumerable<(VertexBuilder<TvG, TvM, VertexEmpty> A, VertexBuilder<TvG, TvM, VertexEmpty> B, VertexBuilder<TvG, TvM, VertexEmpty> C, Material Material)> EvaluateTriangles<TvG, TvM>(this Scene scene, Animation animation = null, float time = 0)
             where TvG : struct, IVertexGeometry
             where TvG : struct, IVertexGeometry
             where TvM : struct, IVertexMaterial
             where TvM : struct, IVertexMaterial
         {
         {
@@ -266,8 +266,8 @@ namespace SharpGLTF.Schema2
 
 
             return instance
             return instance
                 .DrawableReferences
                 .DrawableReferences
-                .Where(item => item.Item2.Visible)
-                .SelectMany(item => meshes[item.Item1].EvaluateTriangles<TvG, TvM, VertexEmpty>(item.Item2));
+                .Where(item => item.Transform.Visible)
+                .SelectMany(item => meshes[item.MeshIndex].EvaluateTriangles<TvG, TvM, VertexEmpty>(item.Transform));
         }
         }
 
 
         public static Scenes.SceneBuilder ToSceneBuilder(this Scene srcScene)
         public static Scenes.SceneBuilder ToSceneBuilder(this Scene srcScene)

+ 14 - 14
tests/SharpGLTF.Tests/AnimationSamplingTests.cs

@@ -122,10 +122,10 @@ namespace SharpGLTF
 
 
                 var p = Vector2.Zero;
                 var p = Vector2.Zero;
 
 
-                p += p1 * hermite.Item1;
-                p += p4 * hermite.Item2;
-                p += (p2 - p1) * 4 * hermite.Item3;
-                p += (p4 - p3) * 4 * hermite.Item4;
+                p += p1 * hermite.StartPosition;
+                p += p4 * hermite.EndPosition;
+                p += (p2 - p1) * 4 * hermite.StartTangent;
+                p += (p4 - p3) * 4 * hermite.EndTangent;
 
 
                 ppp.Add(p);
                 ppp.Add(p);
             }
             }
@@ -137,8 +137,8 @@ namespace SharpGLTF
             var hb = Animations.SamplerFactory.CreateHermitePointWeights(k);
             var hb = Animations.SamplerFactory.CreateHermitePointWeights(k);
             var ht = Animations.SamplerFactory.CreateHermiteTangentWeights(k);
             var ht = Animations.SamplerFactory.CreateHermiteTangentWeights(k);
 
 
-            var pp = p1 * hb.Item1 + p4 * hb.Item2 + (p2 - p1) * 4 * hb.Item3 + (p4 - p3) * 4 * hb.Item4;
-            var pt = p1 * ht.Item1 + p4 * ht.Item2 + (p2 - p1) * 4 * ht.Item3 + (p4 - p3) * 4 * ht.Item4;
+            var pp = p1 * hb.StartPosition + p4 * hb.EndPosition + (p2 - p1) * 4 * hb.StartTangent + (p4 - p3) * 4 * hb.EndTangent;
+            var pt = p1 * ht.StartPosition + p4 * ht.EndPosition + (p2 - p1) * 4 * ht.StartTangent + (p4 - p3) * 4 * ht.EndTangent;
 
 
             // plotting
             // plotting
 
 
@@ -164,10 +164,10 @@ namespace SharpGLTF
 
 
                 var p = Vector2.Zero;
                 var p = Vector2.Zero;
 
 
-                p += p1 * hermite.Item1;
-                p += p2 * hermite.Item2;
-                p += t * hermite.Item3;
-                p += t * hermite.Item4;
+                p += p1 * hermite.StartPosition;
+                p += p2 * hermite.EndPosition;
+                p += t * hermite.StartTangent;
+                p += t * hermite.EndTangent;
 
 
                 ppp.Add(p);
                 ppp.Add(p);
             }
             }
@@ -207,10 +207,10 @@ namespace SharpGLTF
                 // hermite interpolation with a unit tangent
                 // hermite interpolation with a unit tangent
                 var hermite = Animations.SamplerFactory.CreateHermitePointWeights(amount);
                 var hermite = Animations.SamplerFactory.CreateHermitePointWeights(amount);
                 var hq = default(Quaternion);
                 var hq = default(Quaternion);
-                hq += q1 * hermite.Item1;
-                hq += q2 * hermite.Item2;
-                hq += qt * hermite.Item3;
-                hq += qt * hermite.Item4;
+                hq += q1 * hermite.StartPosition;
+                hq += q2 * hermite.EndPosition;
+                hq += qt * hermite.StartTangent;
+                hq += qt * hermite.EndTangent;
                 hq = Quaternion.Normalize(hq);
                 hq = Quaternion.Normalize(hq);
                 
                 
                 // check
                 // check

+ 7 - 7
tests/SharpGLTF.Tests/Collections/ChildrenCollectionTests.cs

@@ -27,16 +27,16 @@ namespace SharpGLTF.Collections
 
 
             Assert.Throws<ArgumentNullException>(() => list.Add(null));
             Assert.Throws<ArgumentNullException>(() => list.Add(null));
 
 
-            var item1 = new TestChild();
-            Assert.IsNull(item1.LogicalParent);
+            var item = new TestChild();
+            Assert.IsNull(item.LogicalParent);
 
 
-            list.Add(item1);
-            Assert.AreSame(item1.LogicalParent, this);
+            list.Add(item);
+            Assert.AreSame(item.LogicalParent, this);
 
 
-            Assert.Throws<ArgumentException>(() => list.Add(item1));
+            Assert.Throws<ArgumentException>(() => list.Add(item));
 
 
-            list.Remove(item1);
-            Assert.IsNull(item1.LogicalParent);
+            list.Remove(item);
+            Assert.IsNull(item.LogicalParent);
         }
         }
 
 
     }
     }

+ 6 - 6
tests/SharpGLTF.Tests/Geometry/MeshBuilderTests.cs

@@ -156,9 +156,9 @@ namespace SharpGLTF.Geometry
                     new VertexPosition(validTriangle.Item2),
                     new VertexPosition(validTriangle.Item2),
                     new VertexPosition(validTriangle.Item3)
                     new VertexPosition(validTriangle.Item3)
                     );
                     );
-            Assert.GreaterOrEqual(validIndices.Item1, 0);
-            Assert.GreaterOrEqual(validIndices.Item2, 0);
-            Assert.GreaterOrEqual(validIndices.Item3, 0);
+            Assert.GreaterOrEqual(validIndices.A, 0);
+            Assert.GreaterOrEqual(validIndices.B, 0);
+            Assert.GreaterOrEqual(validIndices.C, 0);
 
 
             var degenIndices = mesh.UsePrimitive(material2)
             var degenIndices = mesh.UsePrimitive(material2)
                 .AddTriangle
                 .AddTriangle
@@ -167,9 +167,9 @@ namespace SharpGLTF.Geometry
                     new VertexPosition(degeneratedTriangle.Item2),
                     new VertexPosition(degeneratedTriangle.Item2),
                     new VertexPosition(degeneratedTriangle.Item3)
                     new VertexPosition(degeneratedTriangle.Item3)
                     );
                     );
-            Assert.Less(degenIndices.Item1, 0);
-            Assert.Less(degenIndices.Item2, 0);
-            Assert.Less(degenIndices.Item3, 0);
+            Assert.Less(degenIndices.A, 0);
+            Assert.Less(degenIndices.B, 0);
+            Assert.Less(degenIndices.C, 0);
 
 
             // create meshes:
             // create meshes:
 
 

+ 3 - 0
tests/SharpGLTF.Tests/Geometry/Parametric/SolidMeshUtils.cs

@@ -26,6 +26,9 @@ namespace SharpGLTF.Geometry.Parametric
 
 
     class Cube<TMaterial> : ParametricShape<TMaterial>
     class Cube<TMaterial> : ParametricShape<TMaterial>
     {
     {
+        // TODO:
+        // Faces and UV alignment should follow: https://github.com/KhronosGroup/glTF/blob/master/extensions/2.0/Vendor/EXT_lights_image_based/figures/Cube_map.svg
+
         #region lifecycle
         #region lifecycle
 
 
         public Cube(TMaterial material)
         public Cube(TMaterial material)

+ 5 - 5
tests/SharpGLTF.Tests/Plotting.cs

@@ -61,8 +61,8 @@ namespace SharpGLTF
             {
             {
                 var points = series
                 var points = series
                     .Select((y, x) => (x, y))
                     .Select((y, x) => (x, y))
-                    .Where(item => item.Item2.IsFinite())
-                    .Select(item => new Vector2(item.Item1, item.Item2));
+                    .Where(item => item.y.IsFinite())
+                    .Select(item => new Vector2(item.x, item.y));
 
 
                 return Create(points, lt);
                 return Create(points, lt);
             }
             }
@@ -72,7 +72,7 @@ namespace SharpGLTF
                 var points = series
                 var points = series
                     .Select((y, x) => (x, (float)y))
                     .Select((y, x) => (x, (float)y))
                     .Where(item => item.Item2.IsFinite())
                     .Where(item => item.Item2.IsFinite())
-                    .Select(item => new Vector2(item.Item1, item.Item2));
+                    .Select(item => new Vector2(item.x, item.Item2));
 
 
                 return Create(points, lt);
                 return Create(points, lt);
             }
             }
@@ -199,7 +199,7 @@ namespace SharpGLTF
                 DrawToFile(filePath, this);
                 DrawToFile(filePath, this);
             }
             }
 
 
-            public static (Vector3, Vector3) GetBounds(params Point3Series[] series)
+            public static (Vector3 Min,  Vector3 Max) GetBounds(params Point3Series[] series)
             {
             {
                 var xmin = series.SelectMany(item => item._Points).Min(item => item.X);
                 var xmin = series.SelectMany(item => item._Points).Min(item => item.X);
                 var xmax = series.SelectMany(item => item._Points).Max(item => item.X);
                 var xmax = series.SelectMany(item => item._Points).Max(item => item.X);
@@ -247,7 +247,7 @@ namespace SharpGLTF
 
 
                     pl.init();
                     pl.init();
 
 
-                    pl.env(bounds.Item1.X, bounds.Item2.X, bounds.Item1.Y, bounds.Item2.Y, PLplot.AxesScale.Independent, PLplot.AxisBox.BoxTicksLabelsAxes);
+                    pl.env(bounds.Min.X, bounds.Max.X, bounds.Min.Y, bounds.Max.Y, PLplot.AxesScale.Independent, PLplot.AxisBox.BoxTicksLabelsAxes);
 
 
                     for (int i = 0; i < series.Length; ++i)
                     for (int i = 0; i < series.Length; ++i)
                     {
                     {

+ 4 - 4
tests/SharpGLTF.Tests/Reports.cs

@@ -18,7 +18,7 @@ namespace SharpGLTF.Reporting
         public int NumLines { get; internal set; }
         public int NumLines { get; internal set; }
         public int NumPoints { get; internal set; }
         public int NumPoints { get; internal set; }
 
 
-        public (XYZ, XYZ) Bounds { get; internal set; }
+        public (XYZ Min, XYZ Max) Bounds { get; internal set; }
 
 
         public IEnumerable<string> VertexAttributes { get; internal set; }
         public IEnumerable<string> VertexAttributes { get; internal set; }
 
 
@@ -49,7 +49,7 @@ namespace SharpGLTF.Reporting
             this.NumTriangles = tris.Count;
             this.NumTriangles = tris.Count;
 
 
             Bounds = tris
             Bounds = tris
-                .SelectMany(item => new[] { item.Item1, item.Item2, item.Item3 })
+                .SelectMany(item => new[] { item.A, item.B, item.C })
                 .Select(item => item.GetGeometry().GetPosition())
                 .Select(item => item.GetGeometry().GetPosition())
                 .GetBounds();
                 .GetBounds();
 
 
@@ -63,8 +63,8 @@ namespace SharpGLTF.Reporting
             NumLines = many.Sum(item => item.NumLines);
             NumLines = many.Sum(item => item.NumLines);
             NumPoints = many.Sum(item => item.NumPoints);
             NumPoints = many.Sum(item => item.NumPoints);
 
 
-            var min = many.Select(item => item.Bounds.Item1).GetMin();
-            var max = many.Select(item => item.Bounds.Item2).GetMax();
+            var min = many.Select(item => item.Bounds.Min).GetMin();
+            var max = many.Select(item => item.Bounds.Max).GetMax();
             Bounds = (min, max);
             Bounds = (min, max);
 
 
             VertexAttributes = many
             VertexAttributes = many

+ 2 - 2
tests/SharpGLTF.Tests/Scenes/SceneBuilderTests.cs

@@ -557,8 +557,8 @@ namespace SharpGLTF.Scenes
             var colRep = Reporting.ModelReport.CreateReportFrom(colModel);
             var colRep = Reporting.ModelReport.CreateReportFrom(colModel);
 
 
             Assert.AreEqual(srcRep.NumTriangles, rowRep.NumTriangles);
             Assert.AreEqual(srcRep.NumTriangles, rowRep.NumTriangles);
-            NumericsAssert.AreEqual(srcRep.Bounds.Item1, rowRep.Bounds.Item1, 0.0001f);
-            NumericsAssert.AreEqual(srcRep.Bounds.Item2, rowRep.Bounds.Item2, 0.0001f);
+            NumericsAssert.AreEqual(srcRep.Bounds.Min, rowRep.Bounds.Min, 0.0001f);
+            NumericsAssert.AreEqual(srcRep.Bounds.Max, rowRep.Bounds.Max, 0.0001f);
 
 
             // save file
             // save file
 
 

+ 19 - 19
tests/SharpGLTF.Tests/Schema2/LoadAndSave/LoadGeneratedTests.cs

@@ -39,35 +39,35 @@ namespace SharpGLTF.Schema2.LoadAndSave
                 {
                 {
                     var model = ModelRoot.Load(f.Item1);
                     var model = ModelRoot.Load(f.Item1);
 
 
-                    if (!f.Item2)
+                    if (!f.ShouldLoad)
                     {
                     {
-                        TestContext.Error.WriteLine($"{f.Item1.ToShortDisplayPath()} 👎😦 Should not load!");
+                        TestContext.Error.WriteLine($"{f.Path.ToShortDisplayPath()} 👎😦 Should not load!");
                         passed = false;
                         passed = false;
                     }
                     }
                     else
                     else
                     {
                     {
-                        TestContext.WriteLine($"{f.Item1.ToShortDisplayPath()} 🙂👍");                        
+                        TestContext.WriteLine($"{f.Path.ToShortDisplayPath()} 🙂👍");                        
                     }                    
                     }                    
                 }
                 }
                 catch (Exception ex)
                 catch (Exception ex)
                 {
                 {
-                    if (f.Item2)
+                    if (f.ShouldLoad)
                     {
                     {
-                        TestContext.Error.WriteLine($"{f.Item1.ToShortDisplayPath()} 👎😦 Should load!");
+                        TestContext.Error.WriteLine($"{f.Path.ToShortDisplayPath()} 👎😦 Should load!");
                         TestContext.Error.WriteLine($"   ERROR: {ex.Message}");
                         TestContext.Error.WriteLine($"   ERROR: {ex.Message}");
                         passed = false;
                         passed = false;
                     }
                     }
                     else
                     else
                     {
                     {
-                        TestContext.WriteLine($"{f.Item1.ToShortDisplayPath()} 🙂👍");
+                        TestContext.WriteLine($"{f.Path.ToShortDisplayPath()} 🙂👍");
                         TestContext.WriteLine($"   Exception: {ex.Message}");
                         TestContext.WriteLine($"   Exception: {ex.Message}");
                     }                    
                     }                    
                 }
                 }
 
 
-                if (f.Item2 && !f.Item1.ToLower().Contains("compatibility"))
+                if (f.ShouldLoad && !f.Path.ToLower().Contains("compatibility"))
                 {
                 {
-                    var model = ModelRoot.Load(f.Item1);
-                    model.AttachToCurrentTest(System.IO.Path.ChangeExtension(System.IO.Path.GetFileName(f.Item1), ".obj"));
+                    var model = ModelRoot.Load(f.Path);
+                    model.AttachToCurrentTest(System.IO.Path.ChangeExtension(System.IO.Path.GetFileName(f.Path), ".obj"));
                 }
                 }
             }
             }
 
 
@@ -87,37 +87,37 @@ namespace SharpGLTF.Schema2.LoadAndSave
             {
             {
                 try
                 try
                 {
                 {
-                    var model = ModelRoot.Load(f.Item1);
+                    var model = ModelRoot.Load(f.Path);
 
 
-                    if (!f.Item2)
+                    if (!f.ShouldLoad)
                     {
                     {
-                        TestContext.Error.WriteLine($"{f.Item1.ToShortDisplayPath()} 👎😦 Should not load!");
+                        TestContext.Error.WriteLine($"{f.Path.ToShortDisplayPath()} 👎😦 Should not load!");
                         passed = false;
                         passed = false;
                     }
                     }
                     else
                     else
                     {
                     {
-                        TestContext.WriteLine($"{f.Item1.ToShortDisplayPath()} 🙂👍");
+                        TestContext.WriteLine($"{f.Path.ToShortDisplayPath()} 🙂👍");
                     }
                     }
                 }
                 }
                 catch (Exception ex)
                 catch (Exception ex)
                 {
                 {
-                    if (f.Item2)
+                    if (f.ShouldLoad)
                     {
                     {
-                        TestContext.Error.WriteLine($"{f.Item1.ToShortDisplayPath()} 👎😦 Should load!");
+                        TestContext.Error.WriteLine($"{f.Path.ToShortDisplayPath()} 👎😦 Should load!");
                         TestContext.Error.WriteLine($"   ERROR: {ex.Message}");
                         TestContext.Error.WriteLine($"   ERROR: {ex.Message}");
                         passed = false;
                         passed = false;
                     }
                     }
                     else
                     else
                     {
                     {
-                        TestContext.WriteLine($"{f.Item1.ToShortDisplayPath()} 🙂👍");
+                        TestContext.WriteLine($"{f.Path.ToShortDisplayPath()} 🙂👍");
                         TestContext.WriteLine($"   Exception: {ex.Message}");
                         TestContext.WriteLine($"   Exception: {ex.Message}");
                     }
                     }
                 }
                 }
 
 
-                if (f.Item2 && !f.Item1.ToLower().Contains("compatibility"))
+                if (f.ShouldLoad && !f.Path.ToLower().Contains("compatibility"))
                 {
                 {
-                    var model = ModelRoot.Load(f.Item1);
-                    model.AttachToCurrentTest(System.IO.Path.ChangeExtension(System.IO.Path.GetFileName(f.Item1), ".obj"));
+                    var model = ModelRoot.Load(f.Path);
+                    model.AttachToCurrentTest(System.IO.Path.ChangeExtension(System.IO.Path.GetFileName(f.Path), ".obj"));
                 }
                 }
             }
             }
 
 

+ 2 - 2
tests/SharpGLTF.Tests/Schema2/LoadAndSave/LoadSampleTests.cs

@@ -315,7 +315,7 @@ namespace SharpGLTF.Schema2.LoadAndSave
             {
             {
                 instance.SetAnimationFrame(anim.LogicalIndex, t);
                 instance.SetAnimationFrame(anim.LogicalIndex, t);
 
 
-                var nodexform = instance.GetDrawableReference(0).Item2;
+                var nodexform = instance.GetDrawableReference(0).Transform;
 
 
                 TestContext.WriteLine($"Animation at {t}");
                 TestContext.WriteLine($"Animation at {t}");
 
 
@@ -333,7 +333,7 @@ namespace SharpGLTF.Schema2.LoadAndSave
                     .ToList();
                     .ToList();
 
 
                 var vertices = triangles
                 var vertices = triangles
-                    .SelectMany(item => new[] { item.Item1.Position, item.Item2.Position, item.Item3.Position })
+                    .SelectMany(item => new[] { item.A.Position, item.B.Position, item.C.Position })
                     .Distinct()
                     .Distinct()
                     .ToList();
                     .ToList();
 
 

+ 1 - 1
tests/SharpGLTF.Tests/TestFiles.cs

@@ -87,7 +87,7 @@ namespace SharpGLTF
             return GetModelPathsInDirectory(_SchemaDir, "extensions", "2.0");         
             return GetModelPathsInDirectory(_SchemaDir, "extensions", "2.0");         
         }
         }
 
 
-        public static IEnumerable<(string, bool)> GetReferenceModelPaths(bool useNegative = false)
+        public static IEnumerable<(string Path, bool ShouldLoad)> GetReferenceModelPaths(bool useNegative = false)
         {
         {
             _Check();
             _Check();