Browse Source

add StructuralMetadataPrimitive

Bert Temme 2 years ago
parent
commit
2afa25e606

+ 1 - 1
src/SharpGLTF.Cesium/Schema2/CesiumExtensions.cs

@@ -20,9 +20,9 @@
             ExtensionsFactory.RegisterExtension<Node, MeshExtInstanceFeatures>("EXT_instance_features");
             ExtensionsFactory.RegisterExtension<MeshPrimitive, MeshExtMeshFeatures>("EXT_mesh_features");
             ExtensionsFactory.RegisterExtension<ModelRoot, EXTStructuralMetadataRoot>("EXT_structural_metadata");
+            ExtensionsFactory.RegisterExtension<MeshPrimitive, ExtStructuralMetadataMeshPrimitive>("EXT_structural_metadata");
 
             // todo: register the rest of the extensions
-            // ExtensionsFactory.RegisterExtension<MeshPrimitive, EXTStructuralMetadataMeshPrimitive>("EXT_structural_metadata");
         }
     }
 }

+ 0 - 0
src/SharpGLTF.Cesium/Schema2/MeshExtInstanceFeatures.cs → src/SharpGLTF.Cesium/Schema2/Ext.InstanceFeatures.cs


+ 4 - 9
src/SharpGLTF.Cesium/Schema2/MeshExtMeshFeatures.cs → src/SharpGLTF.Cesium/Schema2/Ext.MeshFeatures.cs

@@ -153,21 +153,16 @@ namespace SharpGLTF.Schema2
             if (item.PropertyTable.HasValue)
             {
                 Guard.MustBeGreaterThanOrEqualTo((int)item.PropertyTable, 0, nameof(item.PropertyTable));
+                var metadataExtension = primitive.LogicalParent.LogicalParent.GetExtension<EXTStructuralMetadataRoot>();
+                Guard.NotNull(metadataExtension, nameof(metadataExtension), "EXT_Structural_Meatdata extension is not found.");
+                Guard.NotNull(metadataExtension.PropertyTables[item.PropertyTable.Value], nameof(item.PropertyTable), $"Property table index {item.PropertyTable.Value} does not exist");
             }
             if (item.Texture != null)
             {
                 Guard.MustBeGreaterThanOrEqualTo((int)item.Texture.TextureCoordinate, 0, nameof(item.Texture.TextureCoordinate));
                 var expectedTexCoordAttribute = $"TEXCOORD_{item.Texture.TextureCoordinate}";
                 Guard.NotNull(primitive.GetVertexAccessor(expectedTexCoordAttribute), expectedTexCoordAttribute);
-
-                try
-                {
-                    var texture = primitive.LogicalParent.LogicalParent.LogicalTextures[item.Texture.Index];
-                }
-                catch (System.ArgumentOutOfRangeException)
-                {
-                    throw new System.Exception($"Texture index {item.Texture.Index} does not exist");
-                }
+                Guard.NotNull(primitive.LogicalParent.LogicalParent.LogicalTextures[item.Texture.Index], nameof(primitive.LogicalParent.LogicalParent.LogicalTextures), $"Texture {item.Texture.Index} does not exist");
             }
         }
     }

+ 60 - 0
src/SharpGLTF.Cesium/Schema2/Ext.StructuralMetadataPrimitive.cs

@@ -0,0 +1,60 @@
+using System.Collections.Generic;
+
+namespace SharpGLTF.Schema2
+{
+    partial class ExtStructuralMetadataMeshPrimitive
+    {
+        internal ExtStructuralMetadataMeshPrimitive(MeshPrimitive meshPrimitive)
+        {
+            this.meshPrimitive = meshPrimitive;
+        }
+
+        private MeshPrimitive meshPrimitive;
+
+        public List<int> PropertyTextures
+        {
+            get
+            {
+                return _propertyTextures;
+            }
+            set
+            {
+                if (value == null) { _propertyTextures = null; return; }
+                _propertyTextures = value;
+            }
+        }
+
+        public List<int> PropertyAttributes
+        {
+            get
+            {
+                return _propertyAttributes;
+            }
+            set
+            {
+                if (value == null) { _propertyAttributes = null; return; }
+                _propertyAttributes = value;
+            }
+        }
+
+    }
+
+    partial class CesiumExtensions
+    {
+        public static void SetPropertyTextures(this MeshPrimitive primitive, List<int> propertyTextures)
+        {
+            if (propertyTextures == null) { primitive.RemoveExtensions<ExtStructuralMetadataMeshPrimitive>(); return; }
+
+            var ext = primitive.UseExtension<ExtStructuralMetadataMeshPrimitive>();
+            ext.PropertyTextures = propertyTextures;
+        }
+
+        public static void SetPropertyAttributes(this MeshPrimitive primitive, List<int> propertyAttributes)
+        {
+            if (propertyAttributes == null) { primitive.RemoveExtensions<ExtStructuralMetadataMeshPrimitive>(); return; }
+
+            var ext = primitive.UseExtension<ExtStructuralMetadataMeshPrimitive>();
+            ext.PropertyAttributes = propertyAttributes;
+        }
+    }
+}

+ 10 - 8
src/SharpGLTF.Cesium/Schema2/EXTStructuralMetaDataRoot.cs → src/SharpGLTF.Cesium/Schema2/Ext.StructuralMetadataRoot.cs

@@ -73,14 +73,8 @@ OneOf<StructuralMetadataSchema, Uri> schema)
                     var index = propertyTextureProperty.Value._LogicalTextureIndex;
                     Guard.MustBeGreaterThanOrEqualTo(texCoord, 0, nameof(texCoord));
                     Guard.IsTrue(channels.Count > 0, nameof(channels), "Channels must be defined");
-                    try
-                    {
-                        var texture = modelRoot.LogicalTextures[index];
-                    }
-                    catch (ArgumentOutOfRangeException)
-                    {
-                        throw new ArgumentOutOfRangeException($"Texture index {index} does not exist");
-                    }
+                    Guard.IsTrue(index >= 0, nameof(index), "Index must be defined");
+                    Guard.NotNull(modelRoot.LogicalTextures[index], nameof(index), $"Texture {index} must be defined");
                 }
             }
             var ext = modelRoot.UseExtension<EXTStructuralMetadataRoot>();
@@ -278,6 +272,14 @@ OneOf<StructuralMetadataSchema, Uri> schema)
             Guard.IsFalse(Schema != null && SchemaUri != null, "Schema/SchemaUri", "Schema and SchemaUri cannot both be defined");
             Guard.IsFalse(Schema == null && SchemaUri == null, "Schema/SchemaUri", "One of Schema and SchemaUri must be defined");
 
+            
+            // check if the propertyTable id is set, then the propertyTable must be defined
+
+            // loop through all the primitive and check if propertyTable is defined, then the propertyTable must be defined
+            
+
+
+
             base.OnValidateContent(result);
         }
     }

+ 6 - 2
tests/SharpGLTF.Cesium.Tests/ExtStructuralMetadataTests.cs

@@ -110,6 +110,7 @@ namespace SharpGLTF.Cesium
             var imageBytes0 = Convert.FromBase64String(img0);
             var imageBuilder0 = ImageBuilder.From(imageBytes0);
 
+            // var img1 = "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABLUlEQVR42mVSSxbDIAh0GzUxKZrmCF3n/oerIx9pupgHIswAGtblE7bIKN0vqSOyXSOjPLAtktv9sCFxmcXj7EgsFj8zN00yYxrBZZJBRYk2LdC4WCDUfAdab7bpDm1lCyBW+7lpDnyNS34gcTQRltTPbAeEdFjcSQ0X9EOhGPYjhgLA7xh3kjxEEpMj1qQj7iAzAYoPELzYtuwK02M06WywAFDfX1MdJEoOtSZ7Allz1mYmWZDNL0pNF6ezu9jsQJUcNK7qzbWvMdSYQ8Jo7KKK8/uo4dxreHe0/HgF2/IqBen/za+Di69Sf8cZz5jmk+hcuhdd2tWLz8IE5MbFnRWT+yyU5vZJRtAOqlvq6MDeOrstu0UidsoO0Ak9xGwE+67+34salNEBSCxX7Bexg0rbq6TFvwAAAABJRU5ErkJggg==";
             var img1 = "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABLUlEQVR42mVSSxbDIAh0GzUxKZrmCF3n/oerIx9pupgHIswAGtblE7bIKN0vqSOyXSOjPLAtktv9sCFxmcXj7EgsFj8zN00yYxrBZZJBRYk2LdC4WCDUfAdab7bpDm1lCyBW+7lpDnyNS34gcTQRltTPbAeEdFjcSQ0X9EOhGPYjhgLA7xh3kjxEEpMj1qQj7iAzAYoPELzYtuwK02M06WywAFDfX1MdJEoOtSZ7Allz1mYmWZDNL0pNF6ezu9jsQJUcNK7qzbWvMdSYQ8Jo7KKK8/uo4dxreHe0/HgF2/IqBen/za+Di69Sf8cZz5jmk+hcuhdd2tWLz8IE5MbFnRWT+yyU5vZJRtAOqlvq6MDeOrstu0UidsoO0Ak9xGwE+67+34salNEBSCxX7Bexg0rbq6TFvwAAAABJRU5ErkJggg==";
             var imageBytes1 = Convert.FromBase64String(img1);
             var imageBuilder1 = ImageBuilder.From(imageBytes1);
@@ -138,7 +139,6 @@ namespace SharpGLTF.Cesium
             var scene = new SceneBuilder();
             scene.AddRigidMesh(mesh, Matrix4x4.Identity);
             var model = scene.ToGltf2();
-            model.UseImage(imageBuilder1.Content);
 
             var schema = new StructuralMetadataSchema();
 
@@ -161,7 +161,7 @@ namespace SharpGLTF.Cesium
             insulationProperty.Name = "Insulation Thickness";
             insulationProperty.Type = ElementType.SCALAR;
             insulationProperty.ComponentType = DataType.UINT8;
-            insideTemperatureProperty.Normalized = true;
+            insulationProperty.Normalized = true;
 
             exampleMetadataClass.Properties.Add("insideTemperature", insideTemperatureProperty);
             exampleMetadataClass.Properties.Add("outsideTemperature", outsideTemperatureProperty);
@@ -195,6 +195,10 @@ namespace SharpGLTF.Cesium
 
             model.SetPropertyTexture(buildingPropertyTexture, schema);
 
+            var primitive = model.LogicalMeshes[0].Primitives[0];
+            var propertyTextures = new List<int> { 0 };
+            primitive.SetPropertyTextures(propertyTextures);
+
             var ctx = new ValidationResult(model, ValidationMode.Strict, true);
             model.AttachToCurrentTest("cesium_ext_structural_metadata_simple_property_texture.glb");
             model.AttachToCurrentTest("cesium_ext_structural_metadata_simple_property_texture.gltf");