소스 검색

Added Iridescence validator and MaterialBuilder helper methods

Vicente Penades 3 년 전
부모
커밋
3d10b09515

+ 14 - 9
src/SharpGLTF.Core/Schema2/gltf.MaterialsFactory.cs

@@ -667,20 +667,25 @@ namespace SharpGLTF.Schema2
 
         protected override void OnValidateContent(ValidationContext validate)
         {
-            base.OnValidateContent(validate);
+            base.OnValidateContent(validate);            
 
-            /*
-            if (_attenuationColor.HasValue)
+            if (_iridescenceFactor.HasValue)
             {
-                Guard.MustBeBetweenOrEqualTo(_attenuationColor.Value.X, 0, float.MaxValue, nameof(_attenuationColor));
-                Guard.MustBeBetweenOrEqualTo(_attenuationColor.Value.Y, 0, float.MaxValue, nameof(_attenuationColor));
-                Guard.MustBeBetweenOrEqualTo(_attenuationColor.Value.Z, 0, float.MaxValue, nameof(_attenuationColor));
+                Guard.MustBeBetweenOrEqualTo(_iridescenceFactor.Value, _iridescenceFactorMinimum, _iridescenceFactorMaximum, nameof(_iridescenceFactor));
             }
 
-            if (_thicknessFactor.HasValue)
+            if (_iridescenceIor.HasValue)
             {
-                Guard.MustBeBetweenOrEqualTo(_thicknessFactor.Value, _thicknessFactorMinimum, float.MaxValue, nameof(_thicknessFactor));
-            }*/
+                Guard.MustBeBetweenOrEqualTo(_iridescenceIor.Value, _iridescenceIorMinimum, double.MaxValue, nameof(_iridescenceIor));
+            }
+
+            var thickMin = _iridescenceThicknessMinimum ?? _iridescenceThicknessMinimumDefault;
+            var thickMax = _iridescenceThicknessMaximum ?? _iridescenceThicknessMaximumDefault;
+
+            Guard.MustBeBetweenOrEqualTo(thickMin, _iridescenceThicknessMinimumMinimum, thickMax, nameof(_iridescenceThicknessMinimum));
+            Guard.MustBeBetweenOrEqualTo(thickMax, thickMin, double.MaxValue, nameof(_iridescenceThicknessMaximum));
+
+            
         }
 
         private TextureInfo _GetIridescenceTexture(bool create)

+ 16 - 0
src/SharpGLTF.Toolkit/Materials/MaterialBuilder.cs

@@ -530,6 +530,22 @@ namespace SharpGLTF.Materials
             return this;
         }
 
+        public MaterialBuilder WithIridiscence(IMAGEFILE imageFile, float factor = 0f, float ior = 1.3f)
+        {
+            WithChannelImage(KnownChannel.Iridescence, imageFile);            
+            WithChannelParam(KnownChannel.Iridescence, KnownProperty.IridescenceFactor, factor);
+            WithChannelParam(KnownChannel.Iridescence, KnownProperty.IndexOfRefraction, ior);
+            return this;
+        }
+
+        public MaterialBuilder WithIridiscenceThickness(IMAGEFILE imageFile, float min = 100f, float max = 400f)
+        {
+            WithChannelImage(KnownChannel.IridescenceThickness, imageFile);
+            WithChannelParam(KnownChannel.IridescenceThickness, KnownProperty.Minimum, min);
+            WithChannelParam(KnownChannel.IridescenceThickness, KnownProperty.Maximum, max);
+            return this;
+        }
+
         #endregion
 
         #region API - OBSOLETE

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

@@ -25,7 +25,10 @@ namespace SharpGLTF.Materials
         BaseColor,
         MetallicRoughness,
 
+        [Obsolete("This channel is used by KHR_materials_pbrSpecularGlossiness extension, which has been deprecated by Khronos; use BaseColor instead.")]
         Diffuse,
+
+        [Obsolete("This channel is used by KHR_materials_pbrSpecularGlossiness extension, which has been deprecated by Khronos; use SpecularColor instead.")]
         SpecularGlossiness,
 
         ClearCoat,
@@ -42,6 +45,9 @@ namespace SharpGLTF.Materials
 
         VolumeThickness,
         VolumeAttenuation,
+
+        Iridescence,
+        IridescenceThickness,
     }
 
     /// <summary>

+ 19 - 0
tests/SharpGLTF.Toolkit.Tests/Materials/MaterialBuilderTests.cs

@@ -158,6 +158,25 @@ namespace SharpGLTF.Materials
             return material;
         }
 
+        private static MaterialBuilder _CreateIridescenceMaterial()
+        {
+            var assetsPath = System.IO.Path.Combine(TestContext.CurrentContext.TestDirectory, "Assets");
+            var tex1 = System.IO.Path.Combine(assetsPath, "shannon.png");
+
+            var material = new MaterialBuilder("Volume Material")
+                .WithAlpha(AlphaMode.OPAQUE);
+
+            material.WithMetallicRoughnessShader()
+                .WithBaseColor(tex1, new Vector4(0.7f, 0, 0f, 0.8f))
+                .WithMetallicRoughness(tex1, 0.2f, 0.4f);
+
+            material
+                .WithIridiscence(default, 0, 1.3f)
+                .WithIridiscenceThickness(default, 100, 400);
+
+            return material;
+        }
+
         private static MaterialBuilder _CreateClearCoatMaterial()
         {
             var assetsPath = System.IO.Path.Combine(TestContext.CurrentContext.TestDirectory, "Assets");