2
0
Vicente Penades 6 жил өмнө
parent
commit
8124f45c8d

+ 28 - 62
src/SharpGLTF.DOM/Schema2/gltf.MaterialsFactory.cs

@@ -8,39 +8,47 @@ namespace SharpGLTF.Schema2
 {
     public partial class Material
     {
-        #region lifecycle
+        #region API
 
-        internal static Material CreatePBRMetallicRoughness()
+        public Material InitializeDefault()
         {
-            var m = new Material
-            {
-                _pbrMetallicRoughness = new MaterialPBRMetallicRoughness()
-            };
+            return this.InitializePBRMetallicRoughness();
+        }
 
-            return m;
+        public Material InitializeDefault(Vector4 diffuseColor)
+        {
+            this.InitializePBRMetallicRoughness()
+                .GetChannel("BaseColor")
+                .SetFactor(diffuseColor);
+
+            return this;
         }
 
-        internal static Material CreatePBRSpecularGlossiness()
+        public Material InitializePBRMetallicRoughness()
         {
-            var m = new Material();
+            this._pbrMetallicRoughness = new MaterialPBRMetallicRoughness();
 
-            m.SetExtension(new MaterialPBRSpecularGlossiness_KHR());
+            this.RemoveExtensions<MaterialPBRSpecularGlossiness_KHR>();
+            this.RemoveExtensions<MaterialUnlit_KHR>();
 
-            return m;
+            return this;
         }
 
-        internal static Material CreateMaterialUnlit()
+        public Material InitializePBRSpecularGlossiness()
         {
-            var m = new Material();
-
-            m.SetExtension(new MaterialUnlit_KHR());
+            this.RemoveExtensions<MaterialUnlit_KHR>();
+            this.SetExtension(new MaterialPBRSpecularGlossiness_KHR());
 
-            return m;
+            return this;
         }
 
-        #endregion
+        public Material InitializeUnlit()
+        {
+            this.RemoveExtensions<MaterialPBRSpecularGlossiness_KHR>();
+            this.SetExtension(new MaterialUnlit_KHR());
 
-        #region API
+            return this;
+        }
 
         private IEnumerable<MaterialChannelView> _GetChannels()
         {
@@ -90,49 +98,19 @@ namespace SharpGLTF.Schema2
 
     public partial class ModelRoot
     {
-        public Material AddLogicalMaterial()
+        public Material AddLogicalMaterial(string name = null)
         {
             var mat = new Material();
+            mat.Name = name;
 
             _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();
@@ -178,14 +156,6 @@ namespace SharpGLTF.Schema2
 
     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)
         {
@@ -232,9 +202,5 @@ namespace SharpGLTF.Schema2
 
     internal partial class MaterialUnlit_KHR
     {
-        internal static int GetScore(IEnumerable<string> keys)
-        {
-            return 1;
-        }
     }
 }

+ 22 - 3
src/SharpGLTF.DOM/Schema2/gltf.Property.cs

@@ -18,6 +18,12 @@ namespace SharpGLTF.Schema2
 
         #endregion
 
+        #region properties
+
+        public IReadOnlyCollection<JsonSerializable> Extensions => _extensions;
+
+        #endregion
+
         #region API
 
         public T GetExtension<T>()
@@ -29,12 +35,25 @@ namespace SharpGLTF.Schema2
         public void SetExtension<T>(T value)
             where T : JsonSerializable
         {
+            Guard.NotNull(value, nameof(value));
+
             var idx = _extensions.IndexOf(item => item.GetType() == typeof(T));
 
-            if (idx < 0) { _extensions.Add(value); return; }
+            if (idx >= 0) { _extensions[idx] = value; return; }
+
+            _extensions.Add(value);
+        }
 
-            if (value == null) _extensions.RemoveAt(idx);
-            else _extensions[idx] = value;
+        public void RemoveExtensions<T>(T value)
+            where T : JsonSerializable
+        {
+            _extensions.RemoveAll(item => item == value);
+        }
+
+        public void RemoveExtensions<T>()
+            where T : JsonSerializable
+        {
+            _extensions.RemoveAll(item => item.GetType() == typeof(T));
         }
 
         #endregion

+ 3 - 4
tests/SharpGLTF.Tests/Geometry/CreateMeshTests.cs

@@ -60,10 +60,9 @@ namespace SharpGLTF.Geometry
             var scene = root.UseScene("default");
             var node = scene.AddVisualNode("main scene");
 
-            var material = root.AddLogicalMaterial("Metallic");
-            material.DoubleSided = true;
-            material.GetChannel("BaseColor")
-                .SetFactor(new Vector4(1, 0, 0, 1));
+            var material = root.AddLogicalMaterial("DefaultMaterial")
+                .InitializeDefault(new Vector4(1, 0, 0, 1));
+            material.DoubleSided = true;            
 
             node.Mesh = root.CreateMesh();