瀏覽代碼

Added KHR_materials_anisotropy (Only to Core)

vpenades 8 月之前
父節點
當前提交
304358f6bf

+ 31 - 0
build/SharpGLTF.CodeGen/Ext.KHR_Anisotropy.cs

@@ -0,0 +1,31 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+using SharpGLTF.SchemaReflection;
+
+namespace SharpGLTF
+{
+    class AnisotropyExtension : SchemaProcessor
+    {
+        private static string SchemaUri => Constants.KhronosExtensionPath("KHR_materials_anisotropy", "material.KHR_materials_anisotropy.schema.json");
+
+        private const string ExtensionRootClassName = "KHR_materials_anisotropy glTF Material Extension";
+
+        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");
+
+            yield return("ext.Anisotropy.g", ctx);
+        }
+
+        public override void PrepareTypes(CodeGen.CSharpEmitter newEmitter, SchemaType.Context ctx)
+        {
+            newEmitter.SetRuntimeName(ExtensionRootClassName, "MaterialAnisotropy");
+        }
+    }
+}

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

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

+ 72 - 0
src/SharpGLTF.Core/Schema2/Generated/ext.Anisotropy.g.cs

@@ -0,0 +1,72 @@
+// <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 anisotropy.
+	/// </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 MaterialAnisotropy : ExtraProperties
+	{
+	
+		private const Double _anisotropyRotationDefault = 0;
+		private Double? _anisotropyRotation = _anisotropyRotationDefault;
+		
+		private const Double _anisotropyStrengthDefault = 0;
+		private const Double _anisotropyStrengthMinimum = 0;
+		private const Double _anisotropyStrengthMaximum = 1;
+		private Double? _anisotropyStrength = _anisotropyStrengthDefault;
+		
+		private TextureInfo _anisotropyTexture;
+		
+	
+		protected override void SerializeProperties(Utf8JsonWriter writer)
+		{
+			base.SerializeProperties(writer);
+			SerializeProperty(writer, "anisotropyRotation", _anisotropyRotation, _anisotropyRotationDefault);
+			SerializeProperty(writer, "anisotropyStrength", _anisotropyStrength, _anisotropyStrengthDefault);
+			SerializePropertyObject(writer, "anisotropyTexture", _anisotropyTexture);
+		}
+	
+		protected override void DeserializeProperty(string jsonPropertyName, ref Utf8JsonReader reader)
+		{
+			switch (jsonPropertyName)
+			{
+				case "anisotropyRotation": DeserializePropertyValue<MaterialAnisotropy, Double?>(ref reader, this, out _anisotropyRotation); break;
+				case "anisotropyStrength": DeserializePropertyValue<MaterialAnisotropy, Double?>(ref reader, this, out _anisotropyStrength); break;
+				case "anisotropyTexture": DeserializePropertyValue<MaterialAnisotropy, TextureInfo>(ref reader, this, out _anisotropyTexture); break;
+				default: base.DeserializeProperty(jsonPropertyName,ref reader); break;
+			}
+		}
+	
+	}
+
+}

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

@@ -47,6 +47,7 @@ namespace SharpGLTF.Schema2
             RegisterExtension<Material, MaterialEmissiveStrength>("KHR_materials_emissive_strength", p => new MaterialEmissiveStrength(p));
             RegisterExtension<Material, MaterialPBRSpecularGlossiness>("KHR_materials_pbrSpecularGlossiness", p => new MaterialPBRSpecularGlossiness(p));
             RegisterExtension<Material, MaterialIridescence>("KHR_materials_iridescence", p => new MaterialIridescence(p));
+            RegisterExtension<Material, MaterialAnisotropy>("KHR_materials_anisotropy", p => new MaterialAnisotropy(p));
 
             RegisterExtension<TextureInfo, TextureTransform>("KHR_texture_transform", p => new TextureTransform(p));
 

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

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

+ 49 - 2
src/SharpGLTF.Core/Schema2/gltf.MaterialsFactory.cs

@@ -21,8 +21,10 @@ namespace SharpGLTF.Schema2
             this.RemoveExtensions<MaterialSpecular>();
             this.RemoveExtensions<MaterialTransmission>();
             this.RemoveExtensions<MaterialVolume>();
+            this.RemoveExtensions<MaterialAnisotropy>();
             this.RemoveExtensions<MaterialIridescence>();
-            this.RemoveExtensions<MaterialPBRSpecularGlossiness>();
+
+            this.RemoveExtensions<MaterialPBRSpecularGlossiness>();            
         }
 
         /// <summary>
@@ -58,6 +60,7 @@ namespace SharpGLTF.Schema2
                 if (extn == "ClearCoat") this.UseExtension<MaterialClearCoat>();
                 if (extn == "Transmission") this.UseExtension<MaterialTransmission>();
                 if (extn == "Volume") this.UseExtension<MaterialVolume>();
+                if (extn == "Anisotropy") this.UseExtension<MaterialAnisotropy>();
                 if (extn == "Iridiscence") this.UseExtension<MaterialIridescence>();
             }
         }
@@ -113,6 +116,9 @@ namespace SharpGLTF.Schema2
             channels = this.GetExtension<MaterialIridescence>()?.GetChannels(this);
             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; }
+
             var normalParam = new _MaterialParameter<float>(
                 _MaterialParameterKey.NormalScale,
                 MaterialNormalTextureInfo.ScaleDefault,
@@ -641,7 +647,6 @@ namespace SharpGLTF.Schema2
         }
     }
 
-
     internal sealed partial class MaterialIridescence
     {
         #pragma warning disable CA1801 // Review unused parameters
@@ -711,4 +716,46 @@ namespace SharpGLTF.Schema2
             yield return new MaterialChannel(material, "IridescenceThickness", thicknessTexture, thkMin, thkMax);
         }
     }
+
+    internal sealed partial class MaterialAnisotropy
+    {
+        #pragma warning disable CA1801 // Review unused parameters
+        internal MaterialAnisotropy(Material material) { }
+        #pragma warning restore CA1801 // Review unused parameters
+
+        protected override IEnumerable<ExtraProperties> GetLogicalChildren()
+        {
+            return base.GetLogicalChildren().ConcatElements(_anisotropyTexture);
+        }
+
+        protected override void OnValidateContent(ValidationContext validate)
+        {
+            base.OnValidateContent(validate);
+
+            if (_anisotropyStrength.HasValue)
+            {
+                Guard.MustBeBetweenOrEqualTo(_anisotropyStrength.Value, _anisotropyStrengthMinimum, _anisotropyStrengthMaximum, nameof(_anisotropyStrength));
+            }
+        }
+
+        public float AnisotropyStrength
+        {
+            get => (float)this._anisotropyStrength.AsValue(_anisotropyStrengthDefault);
+            set => this._anisotropyStrength = ((double)value).AsNullable((float)_anisotropyStrengthDefault, _anisotropyStrengthMinimum, _anisotropyStrengthMaximum);
+        }
+
+        public float AnisotropyRotation
+        {
+            get => (float)this._anisotropyRotation.AsValue(_anisotropyRotationDefault);
+            set => this._anisotropyRotation = value.AsNullable((float)_anisotropyRotationDefault);
+        }
+
+        public IEnumerable<MaterialChannel> GetChannels(Material material)
+        {
+            var anisoTexture = new _MaterialTexture(() => _anisotropyTexture, () => SetProperty(this, ref _anisotropyTexture, new TextureInfo()));
+            var strength = new _MaterialParameter<float>(_MaterialParameterKey.AnisotropyStrength, (float)_anisotropyStrengthDefault, () => AnisotropyStrength, v => AnisotropyStrength = v);
+            var rotation = new _MaterialParameter<float>(_MaterialParameterKey.AnisotropyRotation, (float)_anisotropyRotationDefault, () => AnisotropyRotation, v => AnisotropyRotation = v);
+            yield return new MaterialChannel(material, "Anisotropy", anisoTexture, strength, rotation);            
+        }
+    }
 }