浏览代码

finish code add unit test

Bert Temme 2 年之前
父节点
当前提交
6cd531d892

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

@@ -50,7 +50,7 @@ namespace SharpGLTF.Schema2
             RegisterExtension<Node, AgiNodeArticulations>("AGI_articulations");
             RegisterExtension<Node, AgiNodeStkMetadata>("AGI_stk_metadata");
 
-            RegisterExtension<Mesh, CESIUM_primitive_outlineglTFprimitiveextension>("CESIUM_primitive_outline");
+            RegisterExtension<MeshPrimitive, CESIUM_primitive_outlineglTFprimitiveextension>("CESIUM_primitive_outline");
         }
 
         #endregion

+ 3 - 9
src/SharpGLTF.Core/Schema2/gltf.MeshPrimitive.CESIUM_primitive_outline..cs

@@ -12,17 +12,11 @@
     }
     partial class MeshPrimitive
     {
-        // call using sample: model.LogicalMeshes[0].Primitives[0].AddCesiumOutline(4);
-
-        public void AddCesiumOutline(int? indices)
+        public void SetCesiumOutline(int? indices)
         {
-            if (indices != null) { this.RemoveExtensions<CESIUM_primitive_outlineglTFprimitiveextension>(); return; }
-            var ext = new CESIUM_primitive_outlineglTFprimitiveextension(this);
+            if (indices == null) { RemoveExtensions<CESIUM_primitive_outlineglTFprimitiveextension>(); return; }
+            var ext = UseExtension<CESIUM_primitive_outlineglTFprimitiveextension>();
             ext.Indices = indices;
-
-            // what to do next?
-            SetExtension(ext);
-            UseExtension<CESIUM_primitive_outlineglTFprimitiveextension>();
         }
     }
 }

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

@@ -10,6 +10,7 @@ using SharpGLTF.Geometry;
 using SharpGLTF.Geometry.VertexTypes;
 using SharpGLTF.Geometry.Parametric;
 using SharpGLTF.Materials;
+using System.Diagnostics;
 
 namespace SharpGLTF.Scenes
 {
@@ -22,6 +23,46 @@ namespace SharpGLTF.Scenes
     [Category("Toolkit.Scenes")]
     public partial class SceneBuilderTests
     {
+        [Test(Description = "Creates a simple triangle with Cesium outlining")]
+        public void CreateCesiumOutlineTriangleScene()
+        {
+            TestContext.CurrentContext.AttachGltfValidatorLinks();
+
+            var material = MaterialBuilder.CreateDefault();
+
+            var mesh = new MeshBuilder<VertexPosition>("mesh");
+
+            var prim = mesh.UsePrimitive(material);
+            prim.AddTriangle(new VertexPosition(-10, 0, 0), new VertexPosition(10, 0, 0), new VertexPosition(0, 10, 0));
+
+            var scene = new SceneBuilder();
+
+            scene.AddRigidMesh(mesh, Matrix4x4.Identity);
+
+            var outlineBytes = new List<byte>();
+            var outlines = new List<uint>() { 0, 1, 1, 2, 2, 0 };
+
+            foreach (var outline in outlines)
+            {
+                var bytes = BitConverter.GetBytes(outline).ToList();
+                outlineBytes.AddRange(bytes);
+            }
+
+            var model = scene.ToGltf2();
+            var buffer = model.UseBufferView(outlineBytes.ToArray());
+            var accessor = model.CreateAccessor("Cesium outlines");
+            accessor.SetData(buffer, 0, outlineBytes.Count / 4, DimensionType.SCALAR, EncodingType.UNSIGNED_INT, false);
+
+            model.LogicalMeshes[0].Primitives[0].SetCesiumOutline(accessor.LogicalIndex);
+
+            var cesiumOutlineExtension = (CESIUM_primitive_outlineglTFprimitiveextension)model.LogicalMeshes[0].Primitives[0].Extensions.FirstOrDefault();
+            Assert.True(cesiumOutlineExtension.Indices == accessor.LogicalIndex);
+
+            scene.AttachToCurrentTest("cesium_outline_triangle.glb");
+            scene.AttachToCurrentTest("cesium_outline_triangle.gltf");
+            scene.AttachToCurrentTest("cesium_outline_triangle.plotly");
+        }
+
         [Test(Description ="Creates a simple cube.")]
         public void CreateCubeScene()
         {