Ver Fonte

figuring out how to create a half decent Materials API

Vicente Penades há 6 anos atrás
pai
commit
e95329f592

+ 1 - 1
SharpGLTF.sln

@@ -5,8 +5,8 @@ VisualStudioVersion = 15.0.28307.329
 MinimumVisualStudioVersion = 10.0.40219.1
 MinimumVisualStudioVersion = 10.0.40219.1
 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{29566B60-311D-42A0-9E8D-C48DECDD587F}"
 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{29566B60-311D-42A0-9E8D-C48DECDD587F}"
 	ProjectSection(SolutionItems) = preProject
 	ProjectSection(SolutionItems) = preProject
-		glTF2Sharp.ruleset = glTF2Sharp.ruleset
 		README.md = README.md
 		README.md = README.md
+		SharpGLTF.ruleset = SharpGLTF.ruleset
 	EndProjectSection
 	EndProjectSection
 EndProject
 EndProject
 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{072B725F-773F-4751-9616-E9778897C1D2}"
 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{072B725F-773F-4751-9616-E9778897C1D2}"

+ 0 - 0
src/SharpGLTF.DOM/Schema2/gltf.Extensions.cs → src/SharpGLTF.DOM/Schema2/gltf.ExtensionsFactory.cs


+ 2 - 211
src/SharpGLTF.DOM/Schema2/gltf.Materials.cs

@@ -9,45 +9,6 @@ namespace SharpGLTF.Schema2
     [System.Diagnostics.DebuggerDisplay("Material[{LogicalIndex}] {Name}")]
     [System.Diagnostics.DebuggerDisplay("Material[{LogicalIndex}] {Name}")]
     public partial class Material
     public partial class Material
     {
     {
-        #region lifecycle
-
-        internal static Material CreateBestChoice(IReadOnlyList<String> channelKeys)
-        {
-            if (channelKeys.Contains("Diffuse") && channelKeys.Contains("Glossiness")) return CreateMaterialPBRSpecularGlossiness();
-
-                return CreatePBRMetallicRoughness();
-        }
-
-        internal static Material CreatePBRMetallicRoughness()
-        {
-            var m = new Material
-            {
-                _pbrMetallicRoughness = new MaterialPBRMetallicRoughness()
-            };
-
-            return m;
-        }
-
-        internal static Material CreateMaterialPBRSpecularGlossiness()
-        {
-            var m = new Material();
-
-            m.SetExtension(new MaterialPBRSpecularGlossiness_KHR());
-
-            return m;
-        }
-
-        internal static Material CreateMaterialUnlit()
-        {
-            var m = new Material();
-
-            m.SetExtension(new MaterialUnlit_KHR());
-
-            return m;
-        }
-
-        #endregion
-
         #region properties
         #region properties
 
 
         public int LogicalIndex => this.LogicalParent.LogicalMaterials.IndexOfReference(this);
         public int LogicalIndex => this.LogicalParent.LogicalMaterials.IndexOfReference(this);
@@ -73,53 +34,9 @@ namespace SharpGLTF.Schema2
         public Boolean Unlit => this.GetExtension<MaterialUnlit_KHR>() != null;
         public Boolean Unlit => this.GetExtension<MaterialUnlit_KHR>() != null;
 
 
         /// <summary>
         /// <summary>
-        /// returns a collection of channel views available for this material.
+        /// Gets a collection of channel views available for this material.
         /// </summary>
         /// </summary>
-        public IEnumerable<MaterialChannelView> Channels
-        {
-            get
-            {
-                if (_pbrMetallicRoughness != null)
-                {
-                    var channels = _pbrMetallicRoughness.GetChannels(this);
-                    foreach (var c in channels) yield return c;
-                }
-
-                var pbrSpecGloss = this.GetExtension<MaterialPBRSpecularGlossiness_KHR>();
-                if (pbrSpecGloss != null)
-                {
-                    var channels = pbrSpecGloss.GetChannels(this);
-                    foreach (var c in channels) yield return c;
-                }
-
-                yield return new MaterialChannelView
-                    (
-                    this,
-                    "Normal",
-                    _GetNormalTexture,
-                    () => _GetNormalTexture(false) == null ? Vector4.Zero : new Vector4((float)_GetNormalTexture(false).Scale),
-                    value => _GetNormalTexture(true).Scale = (double)value.X
-                    );
-
-                yield return new MaterialChannelView
-                    (
-                    this,
-                    "Occlusion",
-                    _GetOcclusionTexture,
-                    () => _GetOcclusionTexture(false) == null ? Vector4.Zero : new Vector4((float)_GetOcclusionTexture(false).Strength),
-                    value => _GetOcclusionTexture(true).Strength = (double)value.X
-                    );
-
-                yield return new MaterialChannelView
-                    (
-                    this,
-                    "Emissive",
-                    _GetEmissiveTexture,
-                    () => { var rgb = _emissiveFactor.AsValue(_emissiveFactorDefault); return new Vector4(rgb, 1); },
-                    value => _emissiveFactor = new Vector3(value.X, value.Y, value.Z).AsNullable(_emissiveFactorDefault)
-                    );
-            }
-        }
+        public IEnumerable<MaterialChannelView> Channels => _GetChannels();
 
 
         #endregion
         #endregion
 
 
@@ -233,130 +150,4 @@ namespace SharpGLTF.Schema2
 
 
         #endregion
         #endregion
     }
     }
-
-    internal partial class MaterialPBRMetallicRoughness
-    {
-        private TextureInfo _GetBaseTexture(bool create)
-        {
-            if (create && _baseColorTexture == null) _baseColorTexture = new TextureInfo();
-            return _baseColorTexture;
-        }
-
-        private TextureInfo _GetMetallicTexture(bool create)
-        {
-            if (create && _metallicRoughnessTexture == null) _metallicRoughnessTexture = new TextureInfo();
-            return _metallicRoughnessTexture;
-        }
-
-        public IEnumerable<MaterialChannelView> GetChannels(Material material)
-        {
-            yield return new MaterialChannelView
-                (
-                material,
-                "BaseColor",
-                _GetBaseTexture,
-                () => _baseColorFactor.AsValue(_baseColorFactorDefault),
-                value => _baseColorFactor = value.AsNullable(_baseColorFactorDefault)
-                );
-
-            yield return new MaterialChannelView
-                (
-                material,
-                "Metallic",
-                _GetMetallicTexture,
-                () => new Vector4((float)(_metallicFactor ?? _metallicFactorDefault)),
-                value => _metallicFactor = ((double)value.X).AsNullable(_metallicFactorDefault, _metallicFactorMaximum, _metallicFactorMaximum)
-                );
-
-            yield return new MaterialChannelView
-                (
-                material,
-                "Roughness",
-                null,
-                () => new Vector4((float)(_roughnessFactor ?? _roughnessFactorDefault)),
-                value => _roughnessFactor = ((double)value.X).AsNullable(_roughnessFactorDefault, _roughnessFactorMinimum, _roughnessFactorMaximum)
-                );
-        }
-    }
-
-    internal partial class MaterialPBRSpecularGlossiness_KHR
-    {
-        private TextureInfo _GetDiffuseTexture(bool create)
-        {
-            if (create && _diffuseTexture == null) _diffuseTexture = new TextureInfo();
-            return _diffuseTexture;
-        }
-
-        private TextureInfo _GetGlossinessTexture(bool create)
-        {
-            if (create && _specularGlossinessTexture == null) _specularGlossinessTexture = new TextureInfo();
-            return _specularGlossinessTexture;
-        }
-
-        public IEnumerable<MaterialChannelView> GetChannels(Material material)
-        {
-            yield return new MaterialChannelView
-                (
-                material,
-                "Diffuse",
-                _GetDiffuseTexture,
-                () => _diffuseFactor.AsValue(_diffuseFactorDefault),
-                value => _diffuseFactor = value.AsNullable(_diffuseFactorDefault)
-                );
-
-            yield return new MaterialChannelView
-                (
-                material,
-                "Glossiness",
-                _GetGlossinessTexture,
-                () => new Vector4((float)(_glossinessFactor ?? _glossinessFactorDefault)),
-                value => _glossinessFactor = ((double)value.X).AsNullable(_glossinessFactorDefault, _glossinessFactorMinimum, _glossinessFactorMaximum)
-                );
-
-            yield return new MaterialChannelView
-                (
-                material,
-                "Specular",
-                null,
-                () => { var rgb = _specularFactor.AsValue(_specularFactorDefault); return new Vector4(rgb, 1); },
-                value => _specularFactor = new Vector3(value.X, value.Y, value.Z).AsNullable(_specularFactorDefault)
-                );
-        }
-    }
-
-    public partial class ModelRoot
-    {
-        public Material AddLogicalMaterial()
-        {
-            var mat = new Material();
-
-            _materials.Add(mat);
-
-            return mat;
-        }
-
-        public Material AddLogicalMaterial(IReadOnlyList<string> channelKeys)
-        {
-            var mat = Material.CreateBestChoice(channelKeys);
-
-            _materials.Add(mat);
-
-            return mat;
-        }
-
-        public Material AddLogicalMaterial(Type mtype)
-        {
-            Material mat = null;
-
-            if (mtype == typeof(MaterialPBRMetallicRoughness)) mat = Material.CreatePBRMetallicRoughness();
-            if (mtype == typeof(MaterialPBRSpecularGlossiness_KHR)) mat = Material.CreateMaterialPBRSpecularGlossiness();
-            if (mtype == typeof(MaterialUnlit_KHR)) mat = Material.CreateMaterialUnlit();
-
-            if (mat == null) throw new ArgumentException(nameof(mtype));
-
-            _materials.Add(mat);
-
-            return mat;
-        }
-    }
 }
 }

+ 240 - 0
src/SharpGLTF.DOM/Schema2/gltf.MaterialsFactory.cs

@@ -0,0 +1,240 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Numerics;
+using System.Text;
+
+namespace SharpGLTF.Schema2
+{
+    public partial class Material
+    {
+        #region lifecycle
+
+        internal static Material CreatePBRMetallicRoughness()
+        {
+            var m = new Material
+            {
+                _pbrMetallicRoughness = new MaterialPBRMetallicRoughness()
+            };
+
+            return m;
+        }
+
+        internal static Material CreatePBRSpecularGlossiness()
+        {
+            var m = new Material();
+
+            m.SetExtension(new MaterialPBRSpecularGlossiness_KHR());
+
+            return m;
+        }
+
+        internal static Material CreateMaterialUnlit()
+        {
+            var m = new Material();
+
+            m.SetExtension(new MaterialUnlit_KHR());
+
+            return m;
+        }
+
+        #endregion
+
+        #region API
+
+        private IEnumerable<MaterialChannelView> _GetChannels()
+        {
+            if (_pbrMetallicRoughness != null)
+            {
+                var channels = _pbrMetallicRoughness.GetChannels(this);
+                foreach (var c in channels) yield return c;
+            }
+
+            var pbrSpecGloss = this.GetExtension<MaterialPBRSpecularGlossiness_KHR>();
+            if (pbrSpecGloss != null)
+            {
+                var channels = pbrSpecGloss.GetChannels(this);
+                foreach (var c in channels) yield return c;
+            }
+
+            yield return new MaterialChannelView
+                (
+                this,
+                "Normal",
+                _GetNormalTexture,
+                () => _GetNormalTexture(false) == null ? Vector4.One : new Vector4(1, 1, 1, (float)_GetNormalTexture(false).Scale),
+                value => _GetNormalTexture(true).Scale = (double)value.W
+                );
+
+            yield return new MaterialChannelView
+                (
+                this,
+                "Occlusion",
+                _GetOcclusionTexture,
+                () => _GetOcclusionTexture(false) == null ? Vector4.One : new Vector4(1, 1, 1, (float)_GetOcclusionTexture(false).Strength),
+                value => _GetOcclusionTexture(true).Strength = (double)value.W
+                );
+
+            yield return new MaterialChannelView
+                (
+                this,
+                "Emissive",
+                _GetEmissiveTexture,
+                () => { var rgb = _emissiveFactor.AsValue(_emissiveFactorDefault); return new Vector4(rgb, 1); },
+                value => _emissiveFactor = new Vector3(value.X, value.Y, value.Z).AsNullable(_emissiveFactorDefault)
+                );
+        }
+
+        #endregion
+    }
+
+    public partial class ModelRoot
+    {
+        public Material AddLogicalMaterial()
+        {
+            var mat = new Material();
+
+            _materials.Add(mat);
+
+            return mat;
+        }
+
+        public Material AddLogicalMaterial(params string[] channelKeys)
+        {
+            var dict = new Dictionary<string, int>
+            {
+                ["Unlit"] = MaterialUnlit_KHR.GetScore(channelKeys),
+                ["PBRMetallicRoughness"] = MaterialPBRMetallicRoughness.GetScore(channelKeys),
+                ["PBRSpecularGlossiness"] = MaterialPBRSpecularGlossiness_KHR.GetScore(channelKeys)
+            };
+
+            var materialType = dict.OrderBy(item => item.Value).Last().Key;
+
+            Material m = null;
+
+            if (materialType == "Unlit") m = Material.CreateMaterialUnlit();
+            if (materialType == "PBRMetallicRoughness") m = Material.CreatePBRMetallicRoughness();
+            if (materialType == "PBRSpecularGlossiness") m = Material.CreatePBRSpecularGlossiness();
+
+            _materials.Add(m);
+
+            return m;
+        }
+    }
+
+    internal partial class MaterialPBRMetallicRoughness
+    {
+        internal static int GetScore(IEnumerable<string> keys)
+        {
+            int score = 0;
+            if (keys.Contains("BaseColor")) ++score;
+            if (keys.Contains("Metallic")) ++score;
+            if (keys.Contains("Roughness")) ++score;
+            return score;
+        }
+
+        private TextureInfo _GetBaseTexture(bool create)
+        {
+            if (create && _baseColorTexture == null) _baseColorTexture = new TextureInfo();
+            return _baseColorTexture;
+        }
+
+        private TextureInfo _GetMetallicTexture(bool create)
+        {
+            if (create && _metallicRoughnessTexture == null) _metallicRoughnessTexture = new TextureInfo();
+            return _metallicRoughnessTexture;
+        }
+
+        public IEnumerable<MaterialChannelView> GetChannels(Material material)
+        {
+            yield return new MaterialChannelView
+                (
+                material,
+                "BaseColor",
+                _GetBaseTexture,
+                () => _baseColorFactor.AsValue(_baseColorFactorDefault),
+                value => _baseColorFactor = value.AsNullable(_baseColorFactorDefault)
+                );
+
+            yield return new MaterialChannelView
+                (
+                material,
+                "Metallic",
+                _GetMetallicTexture,
+                () => new Vector4(1, 1, 1, (float)(_metallicFactor ?? _metallicFactorDefault)),
+                value => _metallicFactor = ((double)value.W).AsNullable(_metallicFactorDefault, _metallicFactorMaximum, _metallicFactorMaximum)
+                );
+
+            yield return new MaterialChannelView
+                (
+                material,
+                "Roughness",
+                null,
+                () => new Vector4(1, 1, 1, (float)(_roughnessFactor ?? _roughnessFactorDefault)),
+                value => _roughnessFactor = ((double)value.W).AsNullable(_roughnessFactorDefault, _roughnessFactorMinimum, _roughnessFactorMaximum)
+                );
+        }
+    }
+
+    internal partial class MaterialPBRSpecularGlossiness_KHR
+    {
+        internal static int GetScore(IEnumerable<string> keys)
+        {
+            int score = 0;
+            if (keys.Contains("Diffuse")) ++score;
+            if (keys.Contains("Glossiness")) ++score;
+            if (keys.Contains("Specular")) ++score;
+            return score;
+        }
+
+        private TextureInfo _GetDiffuseTexture(bool create)
+        {
+            if (create && _diffuseTexture == null) _diffuseTexture = new TextureInfo();
+            return _diffuseTexture;
+        }
+
+        private TextureInfo _GetGlossinessTexture(bool create)
+        {
+            if (create && _specularGlossinessTexture == null) _specularGlossinessTexture = new TextureInfo();
+            return _specularGlossinessTexture;
+        }
+
+        public IEnumerable<MaterialChannelView> GetChannels(Material material)
+        {
+            yield return new MaterialChannelView
+                (
+                material,
+                "Diffuse",
+                _GetDiffuseTexture,
+                () => _diffuseFactor.AsValue(_diffuseFactorDefault),
+                value => _diffuseFactor = value.AsNullable(_diffuseFactorDefault)
+                );
+
+            yield return new MaterialChannelView
+                (
+                material,
+                "Glossiness",
+                _GetGlossinessTexture,
+                () => new Vector4(1, 1, 1, (float)_glossinessFactor.AsValue(_glossinessFactorDefault)),
+                value => _glossinessFactor = ((double)value.W).AsNullable(_glossinessFactorDefault, _glossinessFactorMinimum, _glossinessFactorMaximum)
+                );
+
+            yield return new MaterialChannelView
+                (
+                material,
+                "Specular",
+                null,
+                () => { var rgb = _specularFactor.AsValue(_specularFactorDefault); return new Vector4(rgb, 1); },
+                value => _specularFactor = new Vector3(value.X, value.Y, value.Z).AsNullable(_specularFactorDefault)
+                );
+        }
+    }
+
+    internal partial class MaterialUnlit_KHR
+    {
+        internal static int GetScore(IEnumerable<string> keys)
+        {
+            return 1;
+        }
+    }
+}

+ 1 - 1
src/SharpGLTF.DOM/SharpGLTF.DOM.csproj

@@ -39,7 +39,7 @@
   </ItemGroup>
   </ItemGroup>
 
 
   <PropertyGroup>
   <PropertyGroup>
-    <CodeAnalysisRuleSet>..\..\glTF2Sharp.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSet>..\..\SharpGLTF.ruleset</CodeAnalysisRuleSet>
   </PropertyGroup>
   </PropertyGroup>
 
 
   <ItemGroup>
   <ItemGroup>

+ 1 - 1
tests/SharpGLTF.Tests/Geometry/CreateMeshTests.cs

@@ -60,7 +60,7 @@ namespace SharpGLTF.Geometry
             var scene = root.UseScene("default");
             var scene = root.UseScene("default");
             var node = scene.AddVisualNode("main scene");
             var node = scene.AddVisualNode("main scene");
 
 
-            var material = root.AddLogicalMaterial(typeof(Schema2.MaterialPBRMetallicRoughness));
+            var material = root.AddLogicalMaterial("Metallic");
             material.DoubleSided = true;
             material.DoubleSided = true;
             material.GetChannel("BaseColor")
             material.GetChannel("BaseColor")
                 .SetFactor(new Vector4(1, 0, 0, 1));
                 .SetFactor(new Vector4(1, 0, 0, 1));