Procházet zdrojové kódy

Merge pull request #276 from bertt/fix_list_of_bools_serialization

3D Tiles: Fix list of booleans serialization
Vicente Penades před 6 měsíci
rodič
revize
c1b03f43ac

+ 15 - 2
src/SharpGLTF.Ext.3DTiles/Memory/BinaryTable.cs

@@ -14,8 +14,14 @@ namespace SharpGLTF.Memory
     /// </summary>
     /// </summary>
     public static class BinaryTable
     public static class BinaryTable
     {
     {
-        public static List<byte> GetBytesForArray<T>(List<List<T>> values)
+        public static List<byte> ConvertJaggedListToBytes<T>(List<List<T>> values)
         {
         {
+            var type = typeof(T);
+            if(type == typeof(bool))
+            {
+                var booleanBytes = ConvertJaggedListOfBooleansToBytes(values.Cast<List<bool>>().ToList());
+                return booleanBytes;
+            }
             var bytes = new List<byte>();
             var bytes = new List<byte>();
             foreach (var value in values)
             foreach (var value in values)
             {
             {
@@ -26,7 +32,6 @@ namespace SharpGLTF.Memory
             return bytes;
             return bytes;
         }
         }
 
 
-
         /// <summary>
         /// <summary>
         /// Converts a list of primitive types into a byte array
         /// Converts a list of primitive types into a byte array
         /// </summary>
         /// </summary>
@@ -81,6 +86,14 @@ namespace SharpGLTF.Memory
             }
             }
         }
         }
 
 
+        private static List<byte> ConvertJaggedListOfBooleansToBytes(List<List<bool>> values)
+        {
+            var bits = new BitArray(values.SelectMany(x => x).ToArray());
+            var boolBytes = new byte[(bits.Length - 1) / 8 + 1];
+            bits.CopyTo(boolBytes, 0);
+            return boolBytes.ToList();
+        }
+
         private static byte[] Matrix4x4ToBytes<T>(IReadOnlyList<T> values)
         private static byte[] Matrix4x4ToBytes<T>(IReadOnlyList<T> values)
         {
         {
             var result = new byte[values.Count * 64];
             var result = new byte[values.Count * 64];

+ 1 - 1
src/SharpGLTF.Ext.3DTiles/Schema2/Ext.StructuralMetadataRoot.cs

@@ -874,7 +874,7 @@ namespace SharpGLTF.Schema2
 
 
             private static int GetBufferView<T>(ModelRoot model, List<List<T>> values)
             private static int GetBufferView<T>(ModelRoot model, List<List<T>> values)
             {
             {
-                List<byte> bytes = BinaryTable.GetBytesForArray(values);
+                List<byte> bytes = BinaryTable.ConvertJaggedListToBytes(values);
                 var bufferView = model.UseBufferView(bytes.ToArray());
                 var bufferView = model.UseBufferView(bytes.ToArray());
                 int logicalIndex = bufferView.LogicalIndex;
                 int logicalIndex = bufferView.LogicalIndex;
                 return logicalIndex;
                 return logicalIndex;

+ 20 - 2
tests/SharpGLTF.Ext.3DTiles.Tests/Memory/BinaryTableTests.cs

@@ -8,12 +8,30 @@ namespace SharpGLTF.Memory
     public class BinaryTableTests
     public class BinaryTableTests
     {
     {
         [Test]
         [Test]
-        public void ConvertListofListofIntToBytes()
+        public void ConvertJaggedListOfBoolsToBytes()
+        {
+            var values = new List<List<bool>>();
+            values.Add(new List<bool>() { true, false });
+            values.Add(new List<bool>() { false, true });
+            var bytes = BinaryTable.ConvertJaggedListToBytes(values);
+            // Check size, should be 1 byte for 4 bits
+            Assert.That(bytes.Count, Is.EqualTo(1));
+
+            // read the bits back
+            var bits = new System.Collections.BitArray(bytes.ToArray());
+            Assert.That(bits[0], Is.EqualTo(true));
+            Assert.That(bits[1], Is.EqualTo(false));
+            Assert.That(bits[2], Is.EqualTo(false));
+            Assert.That(bits[3], Is.EqualTo(true));
+        }
+
+        [Test]
+        public void ConvertJaggedListOfIntsToBytes()
         {
         {
             var values = new List<List<int>>();
             var values = new List<List<int>>();
             values.Add(new List<int>() { 0, 1 });
             values.Add(new List<int>() { 0, 1 });
             values.Add(new List<int>() { 2, 3 });
             values.Add(new List<int>() { 2, 3 });
-            var bytes = BinaryTable.GetBytesForArray(values);
+            var bytes = BinaryTable.ConvertJaggedListToBytes(values);
             Assert.That(bytes.Count, Is.EqualTo(BinaryTable.GetSize<int>() * 4));
             Assert.That(bytes.Count, Is.EqualTo(BinaryTable.GetSize<int>() * 4));
         }
         }