Browse Source

Added KHR_materials_diffuse_transmission (Only to Core)

vpenades 9 months ago
parent
commit
6c2e08c4a2

+ 37 - 0
build/SharpGLTF.CodeGen/Ext.KHR_DiffuseTransmission.cs

@@ -0,0 +1,37 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+using SharpGLTF.SchemaReflection;
+
+namespace SharpGLTF
+{
+    class DiffuseTransmissionExtension : SchemaProcessor
+    {
+        private static string SchemaUri => Constants.KhronosExtensionPath("KHR_materials_diffuse_transmission", "glTF.KHR_materials_diffuse_transmission.schema.json");
+
+        private const string ExtensionRootClassName = "KHR_materials_diffuse_transmission glTF extension"; // not correctly named?
+
+        public override IEnumerable<(string, SchemaType.Context)> Process()
+        {
+            var ctx = SchemaProcessing.LoadSchemaContext(SchemaUri);
+            ctx.IgnoredByCodeEmitter("glTF Property");
+            ctx.IgnoredByCodeEmitter("glTF Child of Root Property");
+            ctx.IgnoredByCodeEmitter("Texture Info");
+            ctx.IgnoredByCodeEmitter("Material Normal Texture Info");
+
+            ctx.FindClass(ExtensionRootClassName)
+                .GetField("diffuseTransmissionColorFactor")
+                .SetDataType(typeof(System.Numerics.Vector3), true)
+                .SetDefaultValue("Vector3.One")
+                .SetItemsRange(0);
+
+            yield return("ext.DiffuseTransmission.g", ctx);
+        }
+
+        public override void PrepareTypes(CodeGen.CSharpEmitter newEmitter, SchemaType.Context ctx)
+        {
+            newEmitter.SetRuntimeName(ExtensionRootClassName, "MaterialDiffuseTransmission");
+        }
+    }
+}

+ 3 - 2
build/SharpGLTF.CodeGen/Program.cs

@@ -33,8 +33,9 @@ namespace SharpGLTF
             processors.Add(new SpecularExtension());
             processors.Add(new ClearCoatExtension());
             processors.Add(new AnisotropyExtension());
-            processors.Add(new IridescenceExtension());
-            processors.Add(new TransmissionExtension());            
+            processors.Add(new IridescenceExtension());            
+            processors.Add(new TransmissionExtension());
+            processors.Add(new DiffuseTransmissionExtension());
             processors.Add(new EmissiveStrengthExtension());
             processors.Add(new SpecularGlossinessExtension());
 

+ 76 - 0
src/SharpGLTF.Core/Schema2/Generated/ext.DiffuseTransmission.g.cs

@@ -0,0 +1,76 @@
+// <auto-generated/>
+
+//------------------------------------------------------------------------------------------------
+//      This file has been programatically generated; DON´T EDIT!
+//------------------------------------------------------------------------------------------------
+
+#pragma warning disable SA1001
+#pragma warning disable SA1027
+#pragma warning disable SA1028
+#pragma warning disable SA1121
+#pragma warning disable SA1205
+#pragma warning disable SA1309
+#pragma warning disable SA1402
+#pragma warning disable SA1505
+#pragma warning disable SA1507
+#pragma warning disable SA1508
+#pragma warning disable SA1652
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Numerics;
+using System.Text.Json;
+
+namespace SharpGLTF.Schema2
+{
+	using Collections;
+
+	/// <summary>
+	/// glTF extension that defines the diffuse transmission of the material.
+	/// </summary>
+	#if NET6_0_OR_GREATER
+	[System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicConstructors | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicConstructors)]
+	#endif
+	[global::System.CodeDom.Compiler.GeneratedCodeAttribute("SharpGLTF.CodeGen", "1.0.0.0")]
+	partial class MaterialDiffuseTransmission : ExtraProperties
+	{
+	
+		private static readonly Vector3 _diffuseTransmissionColorFactorDefault = Vector3.One;
+		private Vector3? _diffuseTransmissionColorFactor = _diffuseTransmissionColorFactorDefault;
+		
+		private TextureInfo _diffuseTransmissionColorTexture;
+		
+		private const Double _diffuseTransmissionFactorDefault = 0;
+		private const Double _diffuseTransmissionFactorMinimum = 0;
+		private const Double _diffuseTransmissionFactorMaximum = 1;
+		private Double? _diffuseTransmissionFactor = _diffuseTransmissionFactorDefault;
+		
+		private TextureInfo _diffuseTransmissionTexture;
+		
+	
+		protected override void SerializeProperties(Utf8JsonWriter writer)
+		{
+			base.SerializeProperties(writer);
+			SerializeProperty(writer, "diffuseTransmissionColorFactor", _diffuseTransmissionColorFactor, _diffuseTransmissionColorFactorDefault);
+			SerializePropertyObject(writer, "diffuseTransmissionColorTexture", _diffuseTransmissionColorTexture);
+			SerializeProperty(writer, "diffuseTransmissionFactor", _diffuseTransmissionFactor, _diffuseTransmissionFactorDefault);
+			SerializePropertyObject(writer, "diffuseTransmissionTexture", _diffuseTransmissionTexture);
+		}
+	
+		protected override void DeserializeProperty(string jsonPropertyName, ref Utf8JsonReader reader)
+		{
+			switch (jsonPropertyName)
+			{
+				case "diffuseTransmissionColorFactor": DeserializePropertyValue<MaterialDiffuseTransmission, Vector3?>(ref reader, this, out _diffuseTransmissionColorFactor); break;
+				case "diffuseTransmissionColorTexture": DeserializePropertyValue<MaterialDiffuseTransmission, TextureInfo>(ref reader, this, out _diffuseTransmissionColorTexture); break;
+				case "diffuseTransmissionFactor": DeserializePropertyValue<MaterialDiffuseTransmission, Double?>(ref reader, this, out _diffuseTransmissionFactor); break;
+				case "diffuseTransmissionTexture": DeserializePropertyValue<MaterialDiffuseTransmission, TextureInfo>(ref reader, this, out _diffuseTransmissionTexture); break;
+				default: base.DeserializeProperty(jsonPropertyName,ref reader); break;
+			}
+		}
+	
+	}
+
+}

+ 1 - 0
src/SharpGLTF.Core/Schema2/gltf.ExtensionsFactory.cs

@@ -43,6 +43,7 @@ namespace SharpGLTF.Schema2
             RegisterExtension<Material, MaterialSpecular>("KHR_materials_specular", p => new MaterialSpecular(p));
             RegisterExtension<Material, MaterialClearCoat>("KHR_materials_clearcoat", p => new MaterialClearCoat(p));
             RegisterExtension<Material, MaterialTransmission>("KHR_materials_transmission", p => new MaterialTransmission(p));
+            RegisterExtension<Material, MaterialDiffuseTransmission>("KHR_materials_diffuse_transmission", p => new MaterialDiffuseTransmission(p));
             RegisterExtension<Material, MaterialVolume>("KHR_materials_volume", p => new MaterialVolume(p));
             RegisterExtension<Material, MaterialEmissiveStrength>("KHR_materials_emissive_strength", p => new MaterialEmissiveStrength(p));
             RegisterExtension<Material, MaterialPBRSpecularGlossiness>("KHR_materials_pbrSpecularGlossiness", p => new MaterialPBRSpecularGlossiness(p));

+ 2 - 0
src/SharpGLTF.Core/Schema2/gltf.MaterialParameter.cs

@@ -64,6 +64,8 @@ namespace SharpGLTF.Schema2
         AttenuationDistance,
         AnisotropyStrength,
         AnisotropyRotation,
+        DiffuseTransmissionFactor,
+        DiffuseTransmissionColor,
     }
 
     [System.Diagnostics.DebuggerDisplay("{_Key} = {Value}")]

+ 51 - 1
src/SharpGLTF.Core/Schema2/gltf.MaterialsFactory.cs

@@ -20,6 +20,7 @@ namespace SharpGLTF.Schema2
             this.RemoveExtensions<MaterialClearCoat>();
             this.RemoveExtensions<MaterialSpecular>();
             this.RemoveExtensions<MaterialTransmission>();
+            this.RemoveExtensions<MaterialDiffuseTransmission>();
             this.RemoveExtensions<MaterialVolume>();
             this.RemoveExtensions<MaterialAnisotropy>();
             this.RemoveExtensions<MaterialIridescence>();
@@ -59,6 +60,7 @@ namespace SharpGLTF.Schema2
                 if (extn == "Specular") this.UseExtension<MaterialSpecular>();
                 if (extn == "ClearCoat") this.UseExtension<MaterialClearCoat>();
                 if (extn == "Transmission") this.UseExtension<MaterialTransmission>();
+                if (extn == "DiffuseTransmission") this.UseExtension<MaterialDiffuseTransmission>();
                 if (extn == "Volume") this.UseExtension<MaterialVolume>();
                 if (extn == "Anisotropy") this.UseExtension<MaterialAnisotropy>();
                 if (extn == "Iridiscence") this.UseExtension<MaterialIridescence>();
@@ -104,6 +106,9 @@ namespace SharpGLTF.Schema2
             channels = this.GetExtension<MaterialTransmission>()?.GetChannels(this);
             if (channels != null) { foreach (var c in channels) yield return c; }
 
+            channels = this.GetExtension<MaterialDiffuseTransmission>()?.GetChannels(this);
+            if (channels != null) { foreach (var c in channels) yield return c; }
+
             channels = this.GetExtension<MaterialSheen>()?.GetChannels(this);
             if (channels != null) { foreach (var c in channels) yield return c; }
 
@@ -117,7 +122,7 @@ namespace SharpGLTF.Schema2
             if (channels != null) { foreach (var c in channels) yield return c; }
 
             channels = this.GetExtension<MaterialAnisotropy>()?.GetChannels(this);
-            if (channels != null) { foreach (var c in channels) yield return c; }
+            if (channels != null) { foreach (var c in channels) yield return c; }            
 
             var normalParam = new _MaterialParameter<float>(
                 _MaterialParameterKey.NormalScale,
@@ -758,4 +763,49 @@ namespace SharpGLTF.Schema2
             yield return new MaterialChannel(material, "Anisotropy", anisoTexture, strength, rotation);            
         }
     }
+
+    internal sealed partial class MaterialDiffuseTransmission
+    {
+        #pragma warning disable CA1801 // Review unused parameters
+        internal MaterialDiffuseTransmission(Material material) { }
+        #pragma warning restore CA1801 // Review unused parameters
+
+        protected override IEnumerable<ExtraProperties> GetLogicalChildren()
+        {
+            return base.GetLogicalChildren().ConcatElements(_diffuseTransmissionTexture, _diffuseTransmissionColorTexture);
+        }
+
+        protected override void OnValidateContent(ValidationContext validate)
+        {
+            base.OnValidateContent(validate);
+
+            if (_diffuseTransmissionFactor.HasValue)
+            {
+                Guard.MustBeBetweenOrEqualTo(_diffuseTransmissionFactor.Value, _diffuseTransmissionFactorMinimum, _diffuseTransmissionFactorMaximum, nameof(_diffuseTransmissionFactor));
+            }
+        }
+
+        public float DiffuseTransmissionFactor
+        {
+            get => (float)this._diffuseTransmissionFactor.AsValue(_diffuseTransmissionFactorDefault);
+            set => this._diffuseTransmissionFactor = ((double)value).AsNullable(_diffuseTransmissionFactorDefault, _diffuseTransmissionFactorMinimum, _diffuseTransmissionFactorMaximum);
+        }
+
+        public Vector3 DiffuseTransmissionColorFactor
+        {
+            get => this._diffuseTransmissionColorFactor.AsValue(_diffuseTransmissionColorFactorDefault);
+            set => this._diffuseTransmissionColorFactor = value.AsNullable(_diffuseTransmissionColorFactorDefault);
+        }        
+
+        public IEnumerable<MaterialChannel> GetChannels(Material material)
+        {
+            var factorTexture = new _MaterialTexture(() => _diffuseTransmissionTexture, () => SetProperty(this, ref _diffuseTransmissionTexture, new TextureInfo()));
+            var factorParameter = new _MaterialParameter<float>(_MaterialParameterKey.DiffuseTransmissionFactor, (float)_diffuseTransmissionFactorDefault, () => DiffuseTransmissionFactor, v => DiffuseTransmissionFactor = v);            
+            yield return new MaterialChannel(material, "DiffuseTransmissionFactor", factorTexture, factorParameter);
+
+            var colorTexture = new _MaterialTexture(() => _diffuseTransmissionColorTexture, () => SetProperty(this, ref _diffuseTransmissionColorTexture, new TextureInfo()));
+            var colorParameter = new _MaterialParameter<Vector3>(_MaterialParameterKey.DiffuseTransmissionColor, _diffuseTransmissionColorFactorDefault, () => DiffuseTransmissionColorFactor, v => DiffuseTransmissionColorFactor = v);            
+            yield return new MaterialChannel(material, "DiffuseTransmissionColor", colorTexture, colorParameter);
+        }
+    }
 }