Browse Source

Code cleanup

vpenades 2 years ago
parent
commit
000a9154d7

+ 1 - 1
src/Directory.Build.props

@@ -30,7 +30,7 @@
   </ItemGroup>
 
   <PropertyGroup>
-    <NoWarn>1701;1702;1591;CA1062;CA1304;CA1310;CA1000;CA1510;CA1512</NoWarn>
+    <NoWarn>1701;1702;1591;CA1033;CA1062;CA1304;CA1310;CA1000;CA1510;CA1512;CA1861;CA1852;CA1823</NoWarn>
   </PropertyGroup>  
 
   <PropertyGroup>

+ 3 - 1
src/Shared/_Extensions.cs

@@ -328,9 +328,11 @@ namespace SharpGLTF
                 array[i] = value;
             }
         }
-
+        
         internal static IReadOnlyList<T> EnsureList<T>(this IEnumerable<T> collection)
         {
+            // prevents CA1851: Possible multiple enumerations...
+
             return collection is IReadOnlyList<T> list
                 ? list
                 : collection.ToList();

+ 2 - 2
src/SharpGLTF.Toolkit/BaseBuilder.cs

@@ -98,8 +98,8 @@ namespace SharpGLTF
         /// <param name="target">The target object</param>
         internal void TryCopyNameAndExtrasTo(Schema2.LogicalChildOfRoot target)
         {
-            target.Name = this?.Name;
-            target.Extras = this?.Extras?.DeepClone();
+            target.Name = this.Name;
+            target.Extras = this.Extras?.DeepClone();
         }
 
         #endregion

+ 26 - 0
src/SharpGLTF.Toolkit/Collections/Triple.cs

@@ -7,6 +7,8 @@ namespace SharpGLTF.Collections
 {
     public readonly struct Triple<T> : IReadOnlyList<T>, IEquatable<Triple<T>>
     {
+        #region constructors
+
         public static implicit operator Triple<T>(in (T A, T B, T C) triple)
         {
             return new Triple<T>(triple.A, triple.B, triple.C);
@@ -19,6 +21,10 @@ namespace SharpGLTF.Collections
             C = @c;
         }
 
+        #endregion
+
+        #region data
+
         public readonly T A;
         public readonly T B;
         public readonly T C;
@@ -45,6 +51,20 @@ namespace SharpGLTF.Collections
             return true;
         }
 
+        public static bool operator ==(in Triple<T> left, in Triple<T> right)
+        {
+            return left.Equals(right);
+        }
+
+        public static bool operator !=(in Triple<T> left, in Triple<T> right)
+        {
+            return !left.Equals(right);
+        }
+
+        #endregion
+
+        #region properties
+
         public int Count => 3;
 
         public T this[int index]
@@ -61,6 +81,10 @@ namespace SharpGLTF.Collections
             }
         }
 
+        #endregion
+
+        #region API
+
         public IEnumerator<T> GetEnumerator()
         {
             yield return A;
@@ -74,5 +98,7 @@ namespace SharpGLTF.Collections
             yield return B;
             yield return C;
         }
+
+        #endregion
     }
 }

+ 2 - 2
src/SharpGLTF.Toolkit/Collections/ValueListSet.cs

@@ -67,7 +67,7 @@ namespace SharpGLTF.Collections
             get
             {
                 if (index < 0 || index >= _Count) throw new ArgumentOutOfRangeException(nameof(index));
-                if (_Entries[index].HashCode == -1) throw new ArgumentException(nameof(index));
+                if (_Entries[index].HashCode == -1) throw new ArgumentException("Invalid entry", nameof(index));
                 return _Entries[index].Value;
             }
         }
@@ -82,7 +82,7 @@ namespace SharpGLTF.Collections
         {
             if (_Count <= 0) return;
 
-            _Entries.AsSpan().Fill(default);
+            _Entries.AsSpan().Clear();
             _Buckets.AsSpan().Fill(-1);
 
             _Count = 0;

+ 10 - 6
src/SharpGLTF.Toolkit/Geometry/MeshBuilderToolkit.cs

@@ -90,31 +90,35 @@ namespace SharpGLTF.Geometry
 
         public static Schema2.EncodingType GetOptimalIndexEncoding<TMaterial>(this IEnumerable<IMeshBuilder<TMaterial>> meshes)
         {
+            Guard.NotNull(meshes, nameof(meshes));
+
             var indices = meshes
                 .SelectMany(item => item.Primitives)
                 .Where(item => item.VerticesPerPrimitive >= 2) // points will never use index buffers
                 .SelectMany(prim => prim.GetIndices());
 
-            var maxIndex = indices.Any() ? indices.Max() : 0;
+            var maxIndex = indices.Aggregate(0, (a,b) => Math.Max(a,b));
 
             return maxIndex < 65535 ? Schema2.EncodingType.UNSIGNED_SHORT : Schema2.EncodingType.UNSIGNED_INT;
         }
 
         public static Schema2.EncodingType GetOptimalJointEncoding<TMaterial>(this IEnumerable<IMeshBuilder<TMaterial>> meshes)
         {
+            Guard.NotNull(meshes, nameof(meshes));
+
             var indices = meshes
                 .SelectMany(item => item.Primitives)
                 .SelectMany(item => item.Vertices)
                 .Select(item => item.GetSkinning().GetBindings().MaxIndex);
 
-            var maxIndex = indices.Any() ? indices.Max() : 0;
+            var maxIndex = indices.Aggregate(0, (a, b) => Math.Max(a, b));
 
             return maxIndex < 256 ? Schema2.EncodingType.UNSIGNED_BYTE : Schema2.EncodingType.UNSIGNED_SHORT;
         }
         
         public static IMeshBuilder<TMaterial> CreateMeshBuilderFromVertexAttributes
             <
-            #if !NETSTANDARD
+            #if NET6_0_OR_GREATER
             [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)]
             #endif
             TMaterial>(params string[] vertexAttributes)
@@ -126,12 +130,12 @@ namespace SharpGLTF.Geometry
             return mesh as IMeshBuilder<TMaterial>;
         }
         
-        #if !NETSTANDARD
+        #if NET6_0_OR_GREATER
         [return: DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)]
         #endif
         public static Type GetMeshBuilderType
             (
-            #if !NETSTANDARD
+            #if NET6_0_OR_GREATER
             [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)]
             #endif
             Type materialType, string[] vertexAttributes)
@@ -149,7 +153,7 @@ namespace SharpGLTF.Geometry
         {
             var posnrm = new Dictionary<Vector3, Vector3>();
 
-            void addDirection(Dictionary<Vector3, Vector3> dict, Vector3 pos, Vector3 dir)
+            static void addDirection(Dictionary<Vector3, Vector3> dict, Vector3 pos, Vector3 dir)
             {
                 if (!dir._IsFinite()) return;
                 if (!dict.TryGetValue(pos, out Vector3 n)) n = Vector3.Zero;

+ 1 - 1
src/SharpGLTF.Toolkit/Geometry/Packed/PackedEncoding.cs

@@ -19,7 +19,7 @@ namespace SharpGLTF.Geometry
             if (JointsEncoding.HasValue) return;
 
             var indices = vertices.Select(item => item.GetSkinning().GetBindings().MaxIndex);
-            var maxIndex = indices.Any() ? indices.Max() : 0;
+            var maxIndex = indices.Aggregate(0, (a, b) => Math.Max(a, b));
             JointsEncoding = maxIndex < 256 ? ENCODING.UNSIGNED_BYTE : ENCODING.UNSIGNED_SHORT;
         }
     }

+ 4 - 0
src/SharpGLTF.Toolkit/Geometry/Packed/PackedMeshBuilder.cs

@@ -27,6 +27,10 @@ namespace SharpGLTF.Geometry
         /// <returns>A collectio of <see cref="PackedMeshBuilder{TMaterial}"/> meshes.</returns>
         internal static IEnumerable<PackedMeshBuilder<TMaterial>> CreatePackedMeshes(IEnumerable<IMeshBuilder<TMaterial>> meshBuilders, Scenes.SceneBuilderSchema2Settings settings)
         {
+            Guard.NotNull(meshBuilders, nameof(meshBuilders));
+
+            meshBuilders = meshBuilders.EnsureList();
+
             try
             {
                 foreach (var m in meshBuilders) m.Validate();

+ 1 - 1
src/SharpGLTF.Toolkit/Geometry/Packed/PackedPrimitiveBuilder.cs

@@ -129,7 +129,7 @@ namespace SharpGLTF.Geometry
                 var name = accessor.Attribute.Name;
                 if (!name.EndsWith("DELTA", StringComparison.Ordinal)) throw new InvalidOperationException();
 
-                name = name.Replace("DELTA", string.Empty);
+                name = name.Replace("DELTA", string.Empty, StringComparison.Ordinal);
 
                 var attr = accessor.Attribute;
                 attr.Name = name;

+ 3 - 0
src/SharpGLTF.Toolkit/Geometry/PrimitiveBuilder.cs

@@ -106,6 +106,9 @@ namespace SharpGLTF.Geometry
         /// <summary>
         /// Gets the type of the vertex used by this primitive.
         /// </summary>
+        #if NET6_0_OR_GREATER
+        [System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicConstructors)]
+        #endif
         public Type VertexType => typeof(VertexBuilder<TvG, TvM, TvS>);
 
         /// <summary>

+ 6 - 0
src/SharpGLTF.Toolkit/Geometry/PrimitiveInterfaces.cs

@@ -10,6 +10,9 @@ namespace SharpGLTF.Geometry
         /// <summary>
         /// Gets a generic type of <see cref="VertexBuilder{TvG, TvM, TvS}"/>.
         /// </summary>
+        #if NET6_0_OR_GREATER
+        [System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicConstructors)]
+        #endif
         Type VertexType { get; }
 
         /// <summary>
@@ -72,6 +75,9 @@ namespace SharpGLTF.Geometry
         /// <summary>
         /// Gets a generic type of <see cref="VertexBuilder{TvG, TvM, TvS}"/>.
         /// </summary>
+        #if NET6_0_OR_GREATER
+        [System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicConstructors)]
+        #endif
         Type VertexType { get; }
 
         void SetVertexDelta(int morphTargetIndex, int vertexIndex, VertexGeometryDelta geometryDelta, VertexMaterialDelta materialDelta);

+ 14 - 7
src/SharpGLTF.Toolkit/Geometry/VertexBufferColumns.cs

@@ -88,7 +88,7 @@ namespace SharpGLTF.Geometry
 
         #region API
 
-        private static IList<T> _IsolateColumn<T>(IList<T> column)
+        private static T[] _IsolateColumn<T>(IList<T> column)
         {
             if (column == null) return null;
 
@@ -310,7 +310,7 @@ namespace SharpGLTF.Geometry
 
         public VertexBufferColumns AddMorphTarget()
         {
-            if (_MorphTargets == null) _MorphTargets = new List<VertexBufferColumns>();
+            _MorphTargets ??= new List<VertexBufferColumns>();
             var mt = new VertexBufferColumns();
             _MorphTargets.Add(mt);
 
@@ -321,6 +321,9 @@ namespace SharpGLTF.Geometry
 
         #region API - Vertex indexing
 
+        #if NET6_0_OR_GREATER
+        [return: System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicConstructors)]
+        #endif
         public Type GetCompatibleVertexType()
         {
             var hasNormals = Normals != null;
@@ -395,7 +398,13 @@ namespace SharpGLTF.Geometry
             return s;
         }
 
-        public IVertexBuilder GetVertex(Type vertexType, int index)
+        public IVertexBuilder GetVertex
+            (
+            #if NET6_0_OR_GREATER
+            [System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicConstructors)]
+            #endif
+            Type vertexType,
+            int index)
         {
             var g = GetVertexGeometry<VertexPositionNormalTangent>(index);
             var m = GetVertexMaterial<VertexColor2Texture2>(index);
@@ -435,8 +444,7 @@ namespace SharpGLTF.Geometry
             Guard.NotNull(primitives, nameof(primitives));
 
             var agents = primitives
-                .Select(item => new _NormalTangentAgent(item.Vertices, item.Indices))
-                .ToList();
+                .Select(item => new _NormalTangentAgent(item.Vertices, item.Indices));
 
             Runtime.VertexNormalsFactory.CalculateSmoothNormals(agents);
         }
@@ -446,8 +454,7 @@ namespace SharpGLTF.Geometry
             Guard.NotNull(primitives, nameof(primitives));
 
             var agents = primitives
-                .Select(item => new _NormalTangentAgent(item.Vertices, item.Indices))
-                .ToList();
+                .Select(item => new _NormalTangentAgent(item.Vertices, item.Indices));
 
             Runtime.VertexTangentsFactory.CalculateTangents(agents);
         }

+ 27 - 21
src/SharpGLTF.Toolkit/Geometry/VertexBuilder.cs

@@ -80,7 +80,7 @@ namespace SharpGLTF.Geometry
     {
         #region debug
 
-        internal string _GetDebuggerDisplay()
+        internal readonly string _GetDebuggerDisplay()
         {
             var txt = "Vertex";
 
@@ -281,7 +281,7 @@ namespace SharpGLTF.Geometry
         public TvS Skinning;
 
         /// <inheritdoc/>
-        public override int GetHashCode() { return Geometry.GetHashCode(); }
+        public readonly override int GetHashCode() { return Geometry.GetHashCode(); }
 
         /// <inheritdoc/>
         public override bool Equals(object obj) { return obj is VertexBuilder<TvG, TvM, TvS> other && AreEqual(this, other); }
@@ -304,7 +304,7 @@ namespace SharpGLTF.Geometry
         [System.Diagnostics.DebuggerBrowsable(System.Diagnostics.DebuggerBrowsableState.Never)]
         public Vector3 Position
         {
-            get => Geometry.GetPosition();
+            readonly get => Geometry.GetPosition();
             set => Geometry.SetPosition(value);
         }
 
@@ -312,7 +312,7 @@ namespace SharpGLTF.Geometry
 
         #region API
 
-        public void Validate()
+        public readonly void Validate()
         {
             VertexPreprocessorLambdas.ValidateVertexGeometry(Geometry);
             VertexPreprocessorLambdas.ValidateVertexMaterial(Material);
@@ -333,11 +333,11 @@ namespace SharpGLTF.Geometry
 
         #pragma warning restore CA1000 // Do not declare static members on generic types
 
-        IVertexGeometry IVertexBuilder.GetGeometry() { return this.Geometry; }
+        readonly IVertexGeometry IVertexBuilder.GetGeometry() { return this.Geometry; }
 
-        IVertexMaterial IVertexBuilder.GetMaterial() { return this.Material; }
+        readonly IVertexMaterial IVertexBuilder.GetMaterial() { return this.Material; }
 
-        IVertexSkinning IVertexBuilder.GetSkinning() { return this.Skinning; }
+        readonly IVertexSkinning IVertexBuilder.GetSkinning() { return this.Skinning; }
 
         void IVertexBuilder.SetGeometry(IVertexGeometry geometry)
         {
@@ -361,21 +361,21 @@ namespace SharpGLTF.Geometry
 
         #region With* fluent API
 
-        public VertexBuilder<TvG, TvM, TvS> TransformedBy(in Matrix4x4 transform)
+        public readonly VertexBuilder<TvG, TvM, TvS> TransformedBy(in Matrix4x4 transform)
         {
             var clone = this;
             clone.Geometry.ApplyTransform(transform);
             return clone;
         }
 
-        public VertexBuilder<TvG, TvM, TvS> WithGeometry(in Vector3 position)
+        public readonly VertexBuilder<TvG, TvM, TvS> WithGeometry(in Vector3 position)
         {
             var v = this;
             v.Geometry.SetPosition(position);
             return v;
         }
 
-        public VertexBuilder<TvG, TvM, TvS> WithGeometry(in Vector3 position, in Vector3 normal)
+        public readonly VertexBuilder<TvG, TvM, TvS> WithGeometry(in Vector3 position, in Vector3 normal)
         {
             var v = this;
             v.Geometry.SetPosition(position);
@@ -383,7 +383,7 @@ namespace SharpGLTF.Geometry
             return v;
         }
 
-        public VertexBuilder<TvG, TvM, TvS> WithGeometry(in Vector3 position, in Vector3 normal, in Vector4 tangent)
+        public readonly VertexBuilder<TvG, TvM, TvS> WithGeometry(in Vector3 position, in Vector3 normal, in Vector4 tangent)
         {
             var v = this;
             v.Geometry.SetPosition(position);
@@ -392,7 +392,7 @@ namespace SharpGLTF.Geometry
             return v;
         }
 
-        public VertexBuilder<TvG, TvM, TvS> WithMaterial(params Vector2[] uvs)
+        public readonly VertexBuilder<TvG, TvM, TvS> WithMaterial(params Vector2[] uvs)
         {
             Guard.NotNull(uvs, nameof(uvs));
 
@@ -401,7 +401,7 @@ namespace SharpGLTF.Geometry
             return v;
         }
 
-        public VertexBuilder<TvG, TvM, TvS> WithMaterial(in Vector4 color0, params Vector2[] uvs)
+        public readonly VertexBuilder<TvG, TvM, TvS> WithMaterial(in Vector4 color0, params Vector2[] uvs)
         {
             Guard.NotNull(uvs, nameof(uvs));
 
@@ -411,7 +411,7 @@ namespace SharpGLTF.Geometry
             return v;
         }
 
-        public VertexBuilder<TvG, TvM, TvS> WithMaterial(in Vector4 color0, Vector4 color1, params Vector2[] uvs)
+        public readonly VertexBuilder<TvG, TvM, TvS> WithMaterial(in Vector4 color0, Vector4 color1, params Vector2[] uvs)
         {
             Guard.NotNull(uvs, nameof(uvs));
 
@@ -422,14 +422,14 @@ namespace SharpGLTF.Geometry
             return v;
         }
 
-        public VertexBuilder<TvG, TvM, TvS> WithSkinning(in Transforms.SparseWeight8 sparse)
+        public readonly VertexBuilder<TvG, TvM, TvS> WithSkinning(in Transforms.SparseWeight8 sparse)
         {
             var v = this;
             v.Skinning.SetBindings(sparse);
             return v;
         }
 
-        public VertexBuilder<TvG, TvM, TvS> WithSkinning(params (int Index, float Weight)[] bindings)
+        public readonly VertexBuilder<TvG, TvM, TvS> WithSkinning(params (int Index, float Weight)[] bindings)
         {
             var v = this;
 
@@ -440,7 +440,7 @@ namespace SharpGLTF.Geometry
             return v;
         }
 
-        public VertexBuilder<TvG, TvM, TvS> WithSkinning(IEnumerable<(int Index, float Weight)> bindings)
+        public readonly VertexBuilder<TvG, TvM, TvS> WithSkinning(IEnumerable<(int Index, float Weight)> bindings)
         {
             var v = this;
 
@@ -486,11 +486,11 @@ namespace SharpGLTF.Geometry
 
         #region API
 
-        public IVertexGeometry GetGeometry() { return Geometry; }
+        public readonly IVertexGeometry GetGeometry() { return Geometry; }
 
-        public IVertexMaterial GetMaterial() { return Material; }
+        public readonly IVertexMaterial GetMaterial() { return Material; }
 
-        public IVertexSkinning GetSkinning() { return Skinning; }
+        public readonly IVertexSkinning GetSkinning() { return Skinning; }
 
         public void SetGeometry(IVertexGeometry geometry) { this.Geometry = geometry; }
 
@@ -498,7 +498,13 @@ namespace SharpGLTF.Geometry
 
         public void SetSkinning(IVertexSkinning skinning) { this.Skinning = skinning; }
 
-        public IVertexBuilder ConvertToType(Type vertexType)
+        public readonly IVertexBuilder ConvertToType
+            (
+            #if NET6_0_OR_GREATER
+            [System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicConstructors)]
+            #endif
+            Type vertexType
+            )
         {
             var v = (IVertexBuilder)Activator.CreateInstance(vertexType);
 

+ 6 - 6
src/SharpGLTF.Toolkit/Geometry/VertexTypes/VertexUtils.Builder.cs

@@ -7,7 +7,7 @@ namespace SharpGLTF.Geometry.VertexTypes
 {
     static partial class VertexUtils
     {
-        #if !NETSTANDARD
+        #if NET6_0_OR_GREATER
         [return: DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)]
         #endif
         public static Type GetVertexGeometryType(params string[] vertexAttributes)
@@ -18,7 +18,7 @@ namespace SharpGLTF.Geometry.VertexTypes
             return t;
         }
 
-        #if !NETSTANDARD
+        #if NET6_0_OR_GREATER
         [return: DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)]
         #endif
         public static Type GetVertexMaterialType(params string[] vertexAttributes)
@@ -36,7 +36,7 @@ namespace SharpGLTF.Geometry.VertexTypes
             return GetVertexMaterialType(colors, uvcoords);
         }
 
-        #if !NETSTANDARD
+        #if NET6_0_OR_GREATER
         [return: DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)]
         #endif
         public static Type GetVertexMaterialType(int colors, int uvcoords)
@@ -65,7 +65,7 @@ namespace SharpGLTF.Geometry.VertexTypes
             return typeof(VertexEmpty);
         }
 
-        #if !NETSTANDARD
+        #if NET6_0_OR_GREATER
         [return: DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)]
         #endif
         public static Type GetVertexSkinningType(params string[] vertexAttributes)
@@ -79,7 +79,7 @@ namespace SharpGLTF.Geometry.VertexTypes
             return typeof(VertexEmpty);
         }
 
-        #if !NETSTANDARD
+        #if NET6_0_OR_GREATER
         [return: DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)]
         #endif
         public static Type GetVertexBuilderType(params string[] vertexAttributes)
@@ -93,7 +93,7 @@ namespace SharpGLTF.Geometry.VertexTypes
             return vtype.MakeGenericType(tvg, tvm, tvs);
         }
 
-        #if !NETSTANDARD
+        #if NET6_0_OR_GREATER
         [return: DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)]
         #endif
         public static Type GetVertexBuilderType(bool hasNormals, bool hasTangents, int numCols, int numUV, int numJoints)

+ 4 - 2
src/SharpGLTF.Toolkit/IO/WavefrontWriter.cs

@@ -95,7 +95,7 @@ namespace SharpGLTF.IO
             return files;
         }
 
-        private IReadOnlyDictionary<String, Action<Stream>> _GetFileGenerators(string baseName) 
+        private Dictionary<String, Action<Stream>> _GetFileGenerators(string baseName) 
         {
             Guard.IsFalse(baseName.Any(c => char.IsWhiteSpace(c)), nameof(baseName), "Whitespace characters not allowed in filename");
 
@@ -108,8 +108,10 @@ namespace SharpGLTF.IO
             return fileGenerators;
         }
 
-        private static IReadOnlyDictionary<Material, string> _GetMaterialFileGenerator(IDictionary<String, Action<Stream>> fileGenerators, string baseName, IEnumerable<Material> materials)
+        private static Dictionary<Material, string> _GetMaterialFileGenerator(IDictionary<String, Action<Stream>> fileGenerators, string baseName, IEnumerable<Material> materials)
         {
+            if (!(materials is List<Material>)) materials = materials.ToList();
+
             // write all image files
             var images = materials
                 .Select(item => item.DiffuseTexture)

+ 2 - 0
src/SharpGLTF.Toolkit/Materials/MaterialEnums.cs

@@ -160,11 +160,13 @@ namespace SharpGLTF.Materials
                 case KnownChannel.Normal: yield return new _Property(KnownProperty.NormalScale, 1f); break;
                 case KnownChannel.Occlusion: yield return new _Property(KnownProperty.OcclusionStrength, 1f); break;
 
+                #pragma warning disable CS0618 // Type or member is obsolete - We want to warn users that this is obsolete, but not to ourselves!
                 case KnownChannel.Diffuse: yield return new _Property(KnownProperty.RGBA, Vector4.One); break;
                 case KnownChannel.SpecularGlossiness:
                     yield return new _Property(KnownProperty.SpecularFactor, Vector3.One);
                     yield return new _Property(KnownProperty.GlossinessFactor, 1f);
                     break;
+                #pragma warning restore CS0618 // Type or member is obsolete
 
                 case KnownChannel.BaseColor: yield return new _Property(KnownProperty.RGBA, Vector4.One); break;
                 case KnownChannel.MetallicRoughness:

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

@@ -263,6 +263,9 @@ namespace SharpGLTF.Scenes
         public static bool IsValidArmature(IEnumerable<NodeBuilder> joints)
         {
             if (joints == null) return false;
+
+            joints = joints.EnsureList();
+
             if (!joints.Any()) return false;
             if (joints.Any(item => item == null)) return false;
 

+ 3 - 2
src/SharpGLTF.Toolkit/Scenes/SceneBuilder.Schema2.cs

@@ -220,12 +220,13 @@ namespace SharpGLTF.Scenes
             return dstScene;
         }
 
-        private static IReadOnlyDictionary<Node, MESHBUILDER> _GatherMeshInstances(IEnumerable<Node> srcNodes)
+        private static Dictionary<Node, MESHBUILDER> _GatherMeshInstances(IEnumerable<Node> srcNodes)
         {
             // filter all the nodes with meshes
 
             var srcInstances = srcNodes
-                .Where(item => item.Mesh != null);
+                .Where(item => item.Mesh != null)
+                .ToList();
 
             // create a dictionary of shared Mesh => MeshBuilder pairs.
 

+ 9 - 4
src/SharpGLTF.Toolkit/Scenes/Transformers.Schema2.cs

@@ -1,8 +1,6 @@
 using System;
 using System.Collections.Generic;
 using System.Linq;
-using System.Security.Cryptography;
-using System.Xml.Linq;
 
 using SharpGLTF.Schema2;
 
@@ -36,7 +34,9 @@ namespace SharpGLTF.Scenes
         {
             // gather all FixedTransformers with renderables
 
-            var renderables = instances.Where(item => item.HasRenderableContent);
+            var renderables = instances
+                .Where(item => item.HasRenderableContent)
+                .ToList();
 
             // gather all renderables attached to the scene root.
 
@@ -68,9 +68,14 @@ namespace SharpGLTF.Scenes
 
         private _MeshInstancing(NodeBuilder parentNode, IEnumerable<FixedTransformer> children, int gpuMinCount)
         {
-            System.Diagnostics.Debug.Assert(children.All(item => item.ParentNode == parentNode), "all items must have the same parentNode");
+            Guard.NotNull(children,nameof(children));
 
             #if DEBUG
+
+            children = children.EnsureList();
+
+            System.Diagnostics.Debug.Assert(children.All(item => item.ParentNode == parentNode), "all items must have the same parentNode");
+
             var hasMoreThanOne = children
                 .Select(item => item.Content)
                 .Cast<IRenderableContent>()

+ 3 - 3
src/SharpGLTF.Toolkit/Schema2/EvaluatedTriangle.cs

@@ -45,7 +45,7 @@ namespace SharpGLTF.Schema2
                 );
         }
 
-        private static IReadOnlyList<(Material Material, VertexBufferColumns Vertices, IEnumerable<(int, int, int)> Triangles)> _GatherMeshGeometry(Mesh mesh)
+        private static List<(Material Material, VertexBufferColumns Vertices, IEnumerable<(int, int, int)> Triangles)> _GatherMeshGeometry(Mesh mesh)
         {
             var primitives = mesh.Primitives
                             .Where(prim => prim.GetTriangleIndices().Any())
@@ -62,7 +62,7 @@ namespace SharpGLTF.Schema2
                     .Select(p => (p.Item2, p.Item3))
                     .ToList();
 
-                if (prims.Any()) VertexBufferColumns.CalculateSmoothNormals(prims);
+                if (prims.Count > 0) VertexBufferColumns.CalculateSmoothNormals(prims);
             }
 
             if (needsTangents)
@@ -72,7 +72,7 @@ namespace SharpGLTF.Schema2
                     .Select(p => (p.Item2, p.Item3))
                     .ToList();
 
-                if (prims.Any()) VertexBufferColumns.CalculateTangents(prims);
+                if (prims.Count > 0) VertexBufferColumns.CalculateTangents(prims);
             }
 
             return primitives;

+ 3 - 0
src/SharpGLTF.Toolkit/Schema2/MaterialExtensions.cs

@@ -263,6 +263,8 @@ namespace SharpGLTF.Schema2
 
             if (srcMaterial.FindChannel("Diffuse") != null || srcMaterial.FindChannel("SpecularGlossiness") != null)
             {
+                #pragma warning disable CS0618 // Type or member is obsolete
+
                 dstMaterial.WithSpecularGlossinessShader();
                 srcMaterial.CopyChannelsTo(dstMaterial, "Diffuse", "SpecularGlossiness");
                 // srcMaterial.CopyChannelsTo(dstMaterial, "ClearCoat", "ClearCoatRoughness", "ClearCoatNormal");
@@ -278,6 +280,7 @@ namespace SharpGLTF.Schema2
                 }
 
                 return;
+                #pragma warning restore CS0618 // Type or member is obsolete
             }
 
             if (srcMaterial.FindChannel("BaseColor") != null || srcMaterial.FindChannel("MetallicRoughness") != null)

+ 17 - 7
src/SharpGLTF.Toolkit/Schema2/MeshExtensions.cs

@@ -272,6 +272,9 @@ namespace SharpGLTF.Schema2
         public static MeshPrimitive WithVertexAccessors(this MeshPrimitive primitive, IEnumerable<MemoryAccessor> memAccessors)
         {
             Guard.NotNull(memAccessors, nameof(memAccessors));
+
+            memAccessors = memAccessors.EnsureList();
+
             Guard.IsTrue(memAccessors.All(item => item != null), nameof(memAccessors));
 
             foreach (var va in memAccessors) primitive.WithVertexAccessor(va);
@@ -362,7 +365,10 @@ namespace SharpGLTF.Schema2
             Guard.NotNull(instancing, nameof(instancing));
             Guard.NotNull(transforms, nameof(transforms));
 
-            var xfrms = transforms.Select(item => item.GetDecomposed());
+            var xfrms = transforms
+                .Select(item => item.GetDecomposed())
+                .ToList();
+
             var hasS = xfrms.Any(item => item.Scale != Vector3.One);
             var hasR = xfrms.Any(item => item.Rotation != Quaternion.Identity);
             var hasT = xfrms.Any(item => item.Translation != Vector3.Zero);
@@ -384,7 +390,7 @@ namespace SharpGLTF.Schema2
                 .SelectMany(item => item)
                 .Select(item => item.Key)
                 .Distinct()
-                .Where(item => item.StartsWith("_", StringComparison.Ordinal));
+                .Where(item => item.StartsWith('_'));
 
             // for each attribute key found, fill the IDs
             foreach (var key in keys)
@@ -419,7 +425,7 @@ namespace SharpGLTF.Schema2
         /// <summary>
         /// Takes a list of <see cref="JSONEXTRAS"/> and selects a specific property of a specific data type.
         /// </summary>        
-        private static IReadOnlyList<T> _SelectAttribute<T>(IReadOnlyList<JSONEXTRAS> values, string propertyName)
+        private static List<T> _SelectAttribute<T>(IReadOnlyList<JSONEXTRAS> values, string propertyName)
         {
             var result = new List<T>();
 
@@ -475,14 +481,18 @@ namespace SharpGLTF.Schema2
             if (xform != null && !xform.Visible) yield break;
 
             var points = prim.GetPointIndices();
-            if (!points.Any()) yield break;
 
-            var vertices = prim.GetVertexColumns();
-            var vtype = vertices.GetCompatibleVertexType();
+            VertexBufferColumns vertices = null;
+            Type vtype = null;
 
             foreach (var xinst in Transforms.InstancingTransform.Evaluate(xform))
             {
-                var xvertices = xinst != null ? vertices.WithTransform(xinst) : vertices;
+                vertices ??= prim.GetVertexColumns();
+                vtype ??= vertices.GetCompatibleVertexType();
+
+                var xvertices = xinst != null
+                    ? vertices.WithTransform(xinst)
+                    : vertices;
 
                 foreach (var t in points)
                 {