Ver código fonte

Added KHR_NodeVisibility

vpenades 2 meses atrás
pai
commit
91d33f560f

+ 27 - 0
build/SharpGLTF.codeGen.Extensions.Khronos/KHR_NodeVisibility.cs

@@ -0,0 +1,27 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+using SharpGLTF.SchemaReflection;
+
+namespace SharpGLTF
+{
+    class NodeVisibilityExtension : SchemaProcessor
+    {
+        private static string SchemaUri => KhronosExtensions.KhronosExtensionPath("KHR_node_visibility", "node.KHR_node_visibility.schema.json");
+
+        private const string ExtensionRootClassName = "KHR_node_visibility glTF Node Extension";
+
+        public override IEnumerable<(string, SchemaType.Context)> ReadSchema()
+        {
+            var ctx = SchemaProcessing.LoadExtensionSchemaContext(SchemaUri);
+
+            yield return ("ext.NodeVisibility.g", ctx);
+        }
+
+        public override void PrepareTypes(CodeGen.CSharpEmitter newEmitter, SchemaType.Context ctx)
+        {
+            newEmitter.SetRuntimeName(ExtensionRootClassName, "_NodeVisibility");
+        }
+    }
+}

+ 2 - 0
build/SharpGLTF.codeGen.Extensions.Khronos/KhronosExtensions.cs

@@ -41,6 +41,8 @@ namespace SharpGLTF
             yield return new XmpJsonLdExtension();
 
             yield return new AnimationPointerExtension();
+
+            yield return new NodeVisibilityExtension();
         }
 
         #endregion

+ 94 - 0
src/SharpGLTF.Core/Schema2/Generated/ext.NodeVisibility.g.cs

@@ -0,0 +1,94 @@
+// <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;
+
+using JSONREADER = System.Text.Json.Utf8JsonReader;
+using JSONWRITER = System.Text.Json.Utf8JsonWriter;
+using FIELDINFO = SharpGLTF.Reflection.FieldInfo;
+
+
+namespace SharpGLTF.Schema2
+{
+	using Collections;
+
+	/// <summary>
+	/// glTF extension that defines node's visibility.
+	/// </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 _NodeVisibility : ExtraProperties
+	{
+	
+		#region reflection
+	
+		public new const string SCHEMANAME = "KHR_node_visibility";
+		protected override string GetSchemaName() => SCHEMANAME;
+	
+		protected override IEnumerable<string> ReflectFieldsNames()
+		{
+			yield return "visible";
+			foreach(var f in base.ReflectFieldsNames()) yield return f;
+		}
+		protected override bool TryReflectField(string name, out FIELDINFO value)
+		{
+			switch(name)
+			{
+				case "visible": value = FIELDINFO.From("visible",this, instance => instance._visible ?? true); return true;
+				default: return base.TryReflectField(name, out value);
+			}
+		}
+	
+		#endregion
+	
+		#region data
+	
+		private static readonly Boolean _visibleDefault = true;
+		private Boolean? _visible = _visibleDefault;
+		
+		#endregion
+	
+		#region serialization
+	
+		protected override void SerializeProperties(JSONWRITER writer)
+		{
+			base.SerializeProperties(writer);
+			SerializeProperty(writer, "visible", _visible, _visibleDefault);
+		}
+	
+		protected override void DeserializeProperty(string jsonPropertyName, ref JSONREADER reader)
+		{
+			switch (jsonPropertyName)
+			{
+				case "visible": DeserializePropertyValue<_NodeVisibility, Boolean?>(ref reader, this, out _visible); break;
+				default: base.DeserializeProperty(jsonPropertyName,ref reader); break;
+			}
+		}
+	
+		#endregion
+	
+	}
+
+}

+ 4 - 2
src/SharpGLTF.Core/Schema2/gltf.ExtensionsFactory.cs

@@ -33,9 +33,11 @@ namespace SharpGLTF.Schema2
         static ExtensionsFactory()
         {
             RegisterExtension<ModelRoot, _ModelPunctualLights>("KHR_lights_punctual", p=> new _ModelPunctualLights(p));
-            RegisterExtension<Node, _NodePunctualLight>("KHR_lights_punctual", p=> new _NodePunctualLight(p));
+            RegisterExtension<ModelRoot, XmpPackets>("KHR_xmp_json_ld", p => new XmpPackets(p));
 
+            RegisterExtension<Node, _NodePunctualLight>("KHR_lights_punctual", p=> new _NodePunctualLight(p));
             RegisterExtension<Node, MeshGpuInstancing>("EXT_mesh_gpu_instancing", p=> new MeshGpuInstancing(p));
+            RegisterExtension<Node, _NodeVisibility>(_NodeVisibility.SCHEMANAME, p => new _NodeVisibility(p));
 
             RegisterExtension<Material, MaterialUnlit>("KHR_materials_unlit", p => new MaterialUnlit(p));
             RegisterExtension<Material, MaterialSheen>("KHR_materials_sheen", p => new MaterialSheen(p));
@@ -57,7 +59,7 @@ namespace SharpGLTF.Schema2
             RegisterExtension<Texture, TextureWEBP>("EXT_texture_webp", p => new TextureWEBP(p));
             RegisterExtension<Texture, TextureKTX2>("KHR_texture_basisu", p => new TextureKTX2(p));
 
-            RegisterExtension<ModelRoot, XmpPackets>("KHR_xmp_json_ld", p => new XmpPackets(p));
+            
             RegisterExtension<ExtraProperties, XmpPacketReference>("KHR_xmp_json_ld", p => new XmpPacketReference(p));
 
             RegisterExtension<AnimationChannelTarget, AnimationPointer>("KHR_animation_pointer", p => new AnimationPointer(p));

+ 58 - 0
src/SharpGLTF.Core/Schema2/gltf.Node.Visibility.cs

@@ -0,0 +1,58 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Xml.Linq;
+
+namespace SharpGLTF.Schema2
+{
+    partial class _NodeVisibility
+    {
+        #region lifecycle
+        internal _NodeVisibility(Node node)
+        {
+            _Owner = node;            
+        }
+
+        #endregion
+
+        #region data (not serializable)
+
+        private readonly Node _Owner;
+
+        #endregion
+
+        #region properties
+
+        public bool IsVisible
+        {
+            get => this._visible ?? _visibleDefault;
+            set => this._visible = value == _visibleDefault ? null : value;
+        }
+
+        #endregion
+    }
+
+    partial class Node
+    {
+        public bool TryGetVisibility(out bool isVisible)
+        {
+            var ext = this.GetExtension<_NodeVisibility>();
+            if (ext == null) { isVisible = true; return false; }
+            isVisible = ext.IsVisible;
+            return true;
+        }
+
+        public void SetVisibility(bool? isVisible)
+        {
+            if (isVisible == null)
+            {
+                this.RemoveExtensions<_NodeVisibility>();
+                return;
+            }
+            else
+            {
+                this.UseExtension<_NodeVisibility>().IsVisible = isVisible == true;
+            }                
+        }
+    }
+}