浏览代码

docs++
removed duplicated classes

Vicente Penades 2 年之前
父节点
当前提交
123e2bb5e1

+ 19 - 1
src/SharpGLTF.Core/Schema2/gltf.MaterialParameter.cs

@@ -5,16 +5,34 @@ using System.Numerics;
 
 namespace SharpGLTF.Schema2
 {
+    /// <summary>
+    /// A parameter accessor interface
+    /// </summary>
+    /// <remarks>
+    /// Implemented by <see cref="_MaterialParameter{}"/>
+    /// </remarks>
     public interface IMaterialParameter
     {
+        /// <summary>
+        /// The name of the parameter.
+        /// </summary>
+        /// <remarks>
+        /// The value must be one of the internal enum <see cref="_MaterialParameterKey"/>
+        /// </remarks>
         string Name { get; }
 
+        /// <summary>
+        /// Gets a value indicating whether the current value is the default value.
+        /// </summary>
         bool IsDefault { get; }
 
+        /// <summary>
+        /// Gets the type of <see cref="Value"/><br/>Which can be <see cref="float"/> <see cref="Vector3"/> and <see cref="Vector4"/>
+        /// </summary>
         Type ValueType { get; }
 
         /// <summary>
-        /// Gets or sets the value of this parameter. <br/>
+        /// Gets or sets the value of this parameter.<br/>
         /// Valid types are <see cref="float"/> <see cref="Vector3"/> and <see cref="Vector4"/>
         /// </summary>
         Object Value { get; set; }

+ 7 - 5
src/SharpGLTF.Toolkit/Geometry/PrimitiveBuilder.cs

@@ -856,11 +856,13 @@ namespace SharpGLTF.Geometry
     /// Helper class used to calculate Normals and Tangents of missing meshes.
     /// </summary>
     /// <typeparam name="TMaterial">default material</typeparam>
-    sealed class MeshPrimitiveNormalsAndTangents<TMaterial> : VertexNormalsFactory.IMeshPrimitive, VertexTangentsFactory.IMeshPrimitive
+    sealed class MeshPrimitiveNormalsAndTangents<TMaterial>
+        : Runtime.VertexNormalsFactory.IMeshPrimitive
+        , Runtime.VertexTangentsFactory.IMeshPrimitive
     {
         #region constructor
 
-        // TODO: we need a solution for morph targets.
+        // TODO: we need a solution for morph targets before proceeding...
 
         public static IReadOnlyDictionary<IPrimitiveReader<TMaterial>, MeshPrimitiveNormalsAndTangents<TMaterial>> GenerateNormalsTangents(IMeshBuilder<TMaterial> mesh)
         {
@@ -870,13 +872,13 @@ namespace SharpGLTF.Geometry
 
             // we can safaly generate both sets because MeshPrimitiveNormalsAndTangents will still return the good normals and tangets if they exist.
 
-            VertexNormalsFactory.CalculateSmoothNormals(pairs.Values.ToList());
-            VertexTangentsFactory.CalculateTangents(pairs.Values.ToList());
+            Runtime.VertexNormalsFactory.CalculateSmoothNormals(pairs.Values.ToList());
+            Runtime.VertexTangentsFactory.CalculateTangents(pairs.Values.ToList());
 
             return pairs;
         }
 
-        public MeshPrimitiveNormalsAndTangents(IPrimitiveReader<TMaterial> source)
+        private MeshPrimitiveNormalsAndTangents(IPrimitiveReader<TMaterial> source)
         {
             _Source = source;
         }

+ 5 - 3
src/SharpGLTF.Toolkit/Geometry/VertexBufferColumns.cs

@@ -438,7 +438,7 @@ namespace SharpGLTF.Geometry
                 .Select(item => new _NormalTangentAgent(item.Vertices, item.Indices))
                 .ToList();
 
-            VertexNormalsFactory.CalculateSmoothNormals(agents);
+            Runtime.VertexNormalsFactory.CalculateSmoothNormals(agents);
         }
 
         public static void CalculateTangents(IReadOnlyList<(VertexBufferColumns Vertices, IEnumerable<(int A, int B, int C)> Indices)> primitives)
@@ -449,14 +449,16 @@ namespace SharpGLTF.Geometry
                 .Select(item => new _NormalTangentAgent(item.Vertices, item.Indices))
                 .ToList();
 
-            VertexTangentsFactory.CalculateTangents(agents);
+            Runtime.VertexTangentsFactory.CalculateTangents(agents);
         }
 
         #endregion
 
         #region nested types
 
-        readonly struct _NormalTangentAgent : VertexNormalsFactory.IMeshPrimitive, VertexTangentsFactory.IMeshPrimitive
+        readonly struct _NormalTangentAgent
+            : Runtime.VertexNormalsFactory.IMeshPrimitive
+            , Runtime.VertexTangentsFactory.IMeshPrimitive
         {
             public _NormalTangentAgent(VertexBufferColumns vertices, IEnumerable<(int A, int B, int C)> indices)
             {

+ 0 - 85
src/SharpGLTF.Toolkit/Geometry/VertexNormalsFactory.cs

@@ -1,85 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Numerics;
-using System.Text;
-
-namespace SharpGLTF.Geometry
-{
-    static class VertexNormalsFactory
-    {
-        #pragma warning disable CA1034 // Nested types should not be visible
-        public interface IMeshPrimitive
-        #pragma warning restore CA1034 // Nested types should not be visible
-        {
-            int VertexCount { get; }
-
-            Vector3 GetVertexPosition(int idx);
-
-            void SetVertexNormal(int idx, Vector3 normal);
-
-            IEnumerable<(int A, int B, int C)> GetTriangleIndices();
-        }
-
-        public static void CalculateSmoothNormals<T>(IReadOnlyList<T> primitives)
-            where T : IMeshPrimitive
-        {
-            Guard.NotNull(primitives, nameof(primitives));
-
-            var normalMap = new Dictionary<Vector3, Vector3>();
-
-            // calculate
-
-            foreach (var primitive in primitives)
-            {
-                foreach (var (ta, tb, tc) in primitive.GetTriangleIndices())
-                {
-                    var p1 = primitive.GetVertexPosition(ta);
-                    var p2 = primitive.GetVertexPosition(tb);
-                    var p3 = primitive.GetVertexPosition(tc);
-
-                    var d = Vector3.Cross(p2 - p1, p3 - p1);
-
-                    _AddDirection(normalMap, p1, d);
-                    _AddDirection(normalMap, p2, d);
-                    _AddDirection(normalMap, p3, d);
-                }
-            }
-
-            // normalize
-
-            foreach (var pos in normalMap.Keys.ToList())
-            {
-                var nrm = Vector3.Normalize(normalMap[pos]);
-
-                normalMap[pos] = nrm._IsFinite() && nrm.LengthSquared() > 0.5f ? nrm : Vector3.UnitZ;
-            }
-
-            // apply
-
-            foreach (var primitive in primitives)
-            {
-                for (int i = 0; i < primitive.VertexCount; ++i)
-                {
-                    var pos = primitive.GetVertexPosition(i);
-
-                    if (normalMap.TryGetValue(pos, out Vector3 nrm))
-                    {
-                        primitive.SetVertexNormal(i, nrm);
-                    }
-                    else
-                    {
-                        primitive.SetVertexNormal(i, Vector3.UnitZ);
-                    }
-                }
-            }
-        }
-
-        private 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;
-            dict[pos] = n + dir;
-        }
-    }
-}

+ 0 - 142
src/SharpGLTF.Toolkit/Geometry/VertexTangentsFactory.cs

@@ -1,142 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Numerics;
-using System.Text;
-
-namespace SharpGLTF.Geometry
-{
-    using VERTEXKEY = System.ValueTuple<Vector3, Vector3, Vector2>;
-
-    static class VertexTangentsFactory
-    {
-        // https://gamedev.stackexchange.com/questions/128023/how-does-mikktspace-work-for-calculating-the-tangent-space-during-normal-mapping
-        // https://stackoverflow.com/questions/25349350/calculating-per-vertex-tangents-for-glsl
-        // https://github.com/buildaworldnet/IrrlichtBAW/wiki/How-to-Normal-Detail-Bump-Derivative-Map,-why-Mikkelsen-is-slightly-wrong-and-why-you-should-give-up-on-calculating-per-vertex-tangents
-        // https://gamedev.stackexchange.com/questions/68612/how-to-compute-tangent-and-bitangent-vectors
-        // https://www.marti.works/calculating-tangents-for-your-mesh/
-        // https://www.html5gamedevs.com/topic/34364-gltf-support-and-mikkt-space/
-
-        /// <summary>
-        /// this interface must be defined by the input primitive to which we want to add tangents
-        /// </summary>
-        public interface IMeshPrimitive
-        {
-            int VertexCount { get; }
-
-            Vector3 GetVertexPosition(int idx);
-            Vector3 GetVertexNormal(int idx);
-            Vector2 GetVertexTexCoord(int idx);
-
-            void SetVertexTangent(int idx, Vector4 tangent);
-
-            IEnumerable<(int A, int B, int C)> GetTriangleIndices();
-        }
-
-        public static void CalculateTangents<T>(IReadOnlyList<T> primitives)
-            where T : IMeshPrimitive
-        {
-            Guard.NotNull(primitives, nameof(primitives));
-
-            var tangentsMap = new Dictionary<VERTEXKEY, (Vector3 u, Vector3 v)>();
-
-            // calculate
-
-            foreach (var primitive in primitives)
-            {
-                foreach (var (i1, i2, i3) in primitive.GetTriangleIndices())
-                {
-                    var p1 = primitive.GetVertexPosition(i1);
-                    var p2 = primitive.GetVertexPosition(i2);
-                    var p3 = primitive.GetVertexPosition(i3);
-
-                    // check for degenerated triangle
-                    if (p1 == p2 || p1 == p3 || p2 == p3) continue;
-
-                    var uv1 = primitive.GetVertexTexCoord(i1);
-                    var uv2 = primitive.GetVertexTexCoord(i2);
-                    var uv3 = primitive.GetVertexTexCoord(i3);
-
-                    // check for degenerated triangle
-                    if (uv1 == uv2 || uv1 == uv3 || uv2 == uv3) continue;
-
-                    var n1 = primitive.GetVertexNormal(i1);
-                    var n2 = primitive.GetVertexNormal(i2);
-                    var n3 = primitive.GetVertexNormal(i3);
-
-                    // calculate tangents
-
-                    var svec = p2 - p1;
-                    var tvec = p3 - p1;
-
-                    var stex = uv2 - uv1;
-                    var ttex = uv3 - uv1;
-
-                    float sx = stex.X;
-                    float tx = ttex.X;
-                    float sy = stex.Y;
-                    float ty = ttex.Y;
-
-                    var r = 1.0F / ((sx * ty) - (tx * sy));
-
-                    if (!r._IsFinite()) continue;
-
-                    var sdir = new Vector3((ty * svec.X) - (sy * tvec.X), (ty * svec.Y) - (sy * tvec.Y), (ty * svec.Z) - (sy * tvec.Z)) * r;
-                    var tdir = new Vector3((sx * tvec.X) - (tx * svec.X), (sx * tvec.Y) - (tx * svec.Y), (sx * tvec.Z) - (tx * svec.Z)) * r;
-
-                    if (!sdir._IsFinite()) continue;
-                    if (!tdir._IsFinite()) continue;
-
-                    // accumulate tangents
-
-                    _AddTangent(tangentsMap, (p1, n1, uv1), (sdir, tdir));
-                    _AddTangent(tangentsMap, (p2, n2, uv2), (sdir, tdir));
-                    _AddTangent(tangentsMap, (p3, n3, uv3), (sdir, tdir));
-                }
-            }
-
-            // normalize
-
-            foreach (var key in tangentsMap.Keys.ToList())
-            {
-                var val = tangentsMap[key];
-
-                // Gram-Schmidt orthogonalize
-                val.u = Vector3.Normalize(val.u - (key.Item2 * Vector3.Dot(key.Item2, val.u)));
-                val.v = Vector3.Normalize(val.v - (key.Item2 * Vector3.Dot(key.Item2, val.v)));
-
-                tangentsMap[key] = val;
-            }
-
-            // apply
-
-            foreach (var primitive in primitives)
-            {
-                for (int i = 0; i < primitive.VertexCount; ++i)
-                {
-                    var p = primitive.GetVertexPosition(i);
-                    var n = primitive.GetVertexNormal(i);
-                    var t = primitive.GetVertexTexCoord(i);
-
-                    if (tangentsMap.TryGetValue((p, n, t), out (Vector3 u, Vector3 v) tangents))
-                    {
-                        var handedness = Vector3.Dot(Vector3.Cross(tangents.u, n), tangents.v) < 0 ? -1.0f : 1.0f;
-
-                        primitive.SetVertexTangent(i, new Vector4(tangents.u, handedness));
-                    }
-                    else
-                    {
-                        primitive.SetVertexTangent(i, new Vector4(1, 0, 0, 1));
-                    }
-                }
-            }
-        }
-
-        private static void _AddTangent(Dictionary<VERTEXKEY, (Vector3, Vector3)> dict, VERTEXKEY key, (Vector3 tu, Vector3 tv) alpha)
-        {
-            dict.TryGetValue(key, out (Vector3 tu, Vector3 tv) beta);
-
-            dict[key] = (alpha.tu + beta.tu, alpha.tv + beta.tv);
-        }
-    }
-}

+ 2 - 0
src/SharpGLTF.Toolkit/SharpGLTF.Toolkit.csproj

@@ -10,6 +10,8 @@
   <ItemGroup>
     <Compile Include="..\Shared\Guard.cs" Link="Diagnostics\Guard.cs" />
     <Compile Include="..\Shared\_Extensions.cs" Link="_Extensions.cs" />
+    <Compile Include="..\SharpGLTF.Core\Runtime\VertexNormalsFactory.cs" Link="Geometry\VertexNormalsFactory.cs" />
+    <Compile Include="..\SharpGLTF.Core\Runtime\VertexTangentsFactory.cs" Link="Geometry\VertexTangentsFactory.cs" />
   </ItemGroup>
 
   <ItemGroup>