Browse Source

improve getting outline accessor method, add error handling

Bert Temme 2 years ago
parent
commit
4e68701649

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

@@ -1,22 +0,0 @@
-namespace SharpGLTF.Schema2
-{
-    partial class CESIUM_primitive_outlineglTFprimitiveextension
-    {
-        internal CESIUM_primitive_outlineglTFprimitiveextension(MeshPrimitive meshPrimitive) { }
-
-        public int? Indices
-        {
-            get => _indices;
-            set => _indices = value;
-        }
-    }
-    partial class MeshPrimitive
-    {
-        public void SetCesiumOutline(int? indices)
-        {
-            if (indices == null) { RemoveExtensions<CESIUM_primitive_outlineglTFprimitiveextension>(); return; }
-            var ext = UseExtension<CESIUM_primitive_outlineglTFprimitiveextension>();
-            ext.Indices = indices;
-        }
-    }
-}

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

@@ -0,0 +1,50 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+
+namespace SharpGLTF.Schema2
+{
+    partial class CESIUM_primitive_outlineglTFprimitiveextension
+    {
+        internal CESIUM_primitive_outlineglTFprimitiveextension(MeshPrimitive meshPrimitive) { }
+
+        public int? Indices
+        {
+            get => _indices;
+            set => _indices = value;
+        }
+    }
+    partial class MeshPrimitive
+    {
+        public void SetCesiumOutline(Accessor accessor)
+        {
+            if (accessor == null) { RemoveExtensions<CESIUM_primitive_outlineglTFprimitiveextension>(); return; }
+
+            Guard.NotNull(accessor, nameof(accessor));
+            Guard.MustShareLogicalParent(LogicalParent.LogicalParent, "this", accessor, nameof(accessor));
+            Guard.IsTrue(accessor.Encoding == EncodingType.UNSIGNED_INT, nameof(accessor));
+            Guard.IsTrue(accessor.Dimensions== DimensionType.SCALAR, nameof(accessor));
+
+            var ext = UseExtension<CESIUM_primitive_outlineglTFprimitiveextension>();
+            ext.Indices = accessor.LogicalIndex;
+        }
+    }
+
+    public static class CesiumOutline
+    {
+        public static Accessor CreateCesiumOutlineAccessor(ModelRoot model, IReadOnlyList<uint> outlines)
+        {
+            var outlineBytes = new List<byte>();
+
+            foreach (var outline in outlines)
+            {
+                var bytes = BitConverter.GetBytes(outline).ToList();
+                outlineBytes.AddRange(bytes);
+            }
+            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);
+            return accessor;
+        }
+    }
+}

+ 5 - 15
tests/SharpGLTF.Toolkit.Tests/Scenes/SceneBuilderTests.cs

@@ -11,6 +11,7 @@ using SharpGLTF.Geometry.VertexTypes;
 using SharpGLTF.Geometry.Parametric;
 using SharpGLTF.Materials;
 using System.Diagnostics;
+using System.Collections.ObjectModel;
 
 namespace SharpGLTF.Scenes
 {
@@ -18,7 +19,7 @@ namespace SharpGLTF.Scenes
 
     using SKINNEDVERTEX4 = VertexBuilder<VertexPosition, VertexEmpty, VertexJoints4>;
     using SKINNEDVERTEX8 = VertexBuilder<VertexPosition, VertexEmpty, VertexJoints8>;
-
+    using Buffer = Schema2.Buffer;
 
     [Category("Toolkit.Scenes")]
     public partial class SceneBuilderTests
@@ -39,21 +40,10 @@ namespace SharpGLTF.Scenes
 
             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 outlines = new ReadOnlyCollection<uint>(new List<uint> { 0, 1, 1, 2, 2, 0 });
             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 accessor = CesiumOutline.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);