Procházet zdrojové kódy

Add OnValidateContent method

Bert Temme před 2 roky
rodič
revize
618f8e679f

+ 28 - 20
src/SharpGLTF.Core/Schema2/gltf.MeshPrimitive.CESIUM_primitive_outline.cs

@@ -6,14 +6,28 @@ namespace SharpGLTF.Schema2
 {
     partial class CESIUM_primitive_outlineglTFprimitiveextension
     {
-        internal CESIUM_primitive_outlineglTFprimitiveextension(MeshPrimitive meshPrimitive) { }
+        private MeshPrimitive meshPrimitive;
+        internal CESIUM_primitive_outlineglTFprimitiveextension(MeshPrimitive meshPrimitive)
+        {
+            this.meshPrimitive = meshPrimitive;
+        }
 
         public int? Indices
         {
             get => _indices;
             set => _indices = value;
         }
+
+        protected override void OnValidateContent(Validation.ValidationContext validate)
+        {
+            var outlineAccessor = meshPrimitive.LogicalParent.LogicalParent.LogicalAccessors[(int)_indices];
+            var isValid = CesiumToolkit.ValidateCesiumOutlineIndices(outlineAccessor, meshPrimitive);
+            validate.IsTrue(nameof(_indices), isValid, "Mismatch between accesor indices and MeshPrimitive indices");
+
+            base.OnValidateContent(validate);
+        }
     }
+
     partial class MeshPrimitive
     {
         public void SetCesiumOutline(Accessor accessor)
@@ -54,30 +68,24 @@ namespace SharpGLTF.Schema2
         }
 
         /// <summary>
-        /// Checks if all the indices in the Cesium Outline Extension are existing in the primitive indices 
+        /// Checks if all the indices of the Cesium outline accessor are available in the MeshPrimitive indices
         /// </summary>
-        /// <param name="model"></param>
-        /// <returns>boolean, true is valid false is not valid</returns>
-        public static bool ValidateCesiumOutlineExtension(ModelRoot model)
+        /// <param name="accessor"></param>
+        /// <param name="meshPrimitive"></param>
+        /// <returns>true all indices are available, false indices are missing </returns>
+        public static bool ValidateCesiumOutlineIndices(Accessor accessor, MeshPrimitive meshPrimitive)
         {
-            foreach (var mesh in model.LogicalMeshes)
+            var cesiumOutlineExtension = meshPrimitive.GetExtension<CESIUM_primitive_outlineglTFprimitiveextension>();
+            if (cesiumOutlineExtension != null)
             {
-                foreach (var meshPrimitive in mesh.Primitives)
+                var accessorIndices = accessor.AsIndicesArray();
+                var meshPrimitiveIndices = meshPrimitive.GetIndices();
+                foreach (var accessorIndice in accessorIndices)
                 {
-                    var cesiumOutlineExtension = meshPrimitive.GetExtension<CESIUM_primitive_outlineglTFprimitiveextension>();
-                    if (cesiumOutlineExtension != null)
+                    var contains = meshPrimitiveIndices.Contains(accessorIndice);
+                    if (!contains)
                     {
-                        var accessor = model.LogicalAccessors[(int)cesiumOutlineExtension.Indices];
-                        var accessorIndices = accessor.AsIndicesArray();
-                        var meshPrimitiveIndices = meshPrimitive.GetIndices();
-                        foreach (var accessorIndice in accessorIndices)
-                        {
-                            var contains = meshPrimitiveIndices.Contains(accessorIndice);
-                            if (!contains)
-                            {
-                                return false;
-                            }
-                        }
+                        return false;
                     }
                 }
             }

+ 0 - 1
tests/SharpGLTF.Toolkit.Tests/Scenes/SceneBuilderTests.cs

@@ -48,7 +48,6 @@ namespace SharpGLTF.Scenes
 
             var cesiumOutlineExtension = (CESIUM_primitive_outlineglTFprimitiveextension)model.LogicalMeshes[0].Primitives[0].Extensions.FirstOrDefault();
             Assert.True(cesiumOutlineExtension.Indices == accessor.LogicalIndex);
-            Assert.IsTrue(CesiumToolkit.ValidateCesiumOutlineExtension(model));
 
             scene.AttachToCurrentTest("cesium_outline_triangle.glb");
             scene.AttachToCurrentTest("cesium_outline_triangle.gltf");