瀏覽代碼

add cesium outline extension validator function

Bert Temme 2 年之前
父節點
當前提交
92db26b719

+ 37 - 0
src/SharpGLTF.Core/Schema2/gltf.MeshPrimitive.CESIUM_primitive_outline.cs

@@ -32,6 +32,12 @@ namespace SharpGLTF.Schema2
 
     public static class CesiumToolkit
     {
+        /// <summary>
+        /// Creates an accessor to store Cesium outline vertex indices
+        /// </summary>
+        /// <param name="model"></param>
+        /// <param name="outlines"></param>
+        /// <returns></returns>
         public static Accessor CreateCesiumOutlineAccessor(ModelRoot model, IReadOnlyList<uint> outlines)
         {
             var outlineBytes = new List<byte>();
@@ -46,5 +52,36 @@ namespace SharpGLTF.Schema2
             accessor.SetData(buffer, 0, outlineBytes.Count / 4, DimensionType.SCALAR, EncodingType.UNSIGNED_INT, false);
             return accessor;
         }
+
+        /// <summary>
+        /// Checks if all the indices in the Cesium Outline Extension are existing in the primitive indices 
+        /// </summary>
+        /// <param name="model"></param>
+        /// <returns>boolean, true is valid false is not valid</returns>
+        public static bool ValidateCesiumOutlineExtension(ModelRoot model)
+        {
+            foreach (var mesh in model.LogicalMeshes)
+            {
+                foreach (var meshPrimitive in mesh.Primitives)
+                {
+                    var cesiumOutlineExtension = meshPrimitive.GetExtension<CESIUM_primitive_outlineglTFprimitiveextension>();
+                    if (cesiumOutlineExtension != null)
+                    {
+                        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 true;
+        }
     }
 }

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

@@ -40,13 +40,15 @@ namespace SharpGLTF.Scenes
 
             scene.AddRigidMesh(mesh, Matrix4x4.Identity);
 
-            var outlines = new ReadOnlyCollection<uint>(new List<uint> { 0, 1, 1, 2, 2, 0 });
             var model = scene.ToGltf2();
+
+            var outlines = new ReadOnlyCollection<uint>(new List<uint> { 0, 1, 1, 2, 2, 0});
             var accessor = CesiumToolkit.CreateCesiumOutlineAccessor(model, outlines);
             model.LogicalMeshes[0].Primitives[0].SetCesiumOutline(accessor);
 
             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");