Skip to content

Commit c1b03f4

Browse files
authored
Merge pull request vpenades#276 from bertt/fix_list_of_bools_serialization
3D Tiles: Fix list of booleans serialization
2 parents a98b476 + 6e5d899 commit c1b03f4

File tree

3 files changed

+36
-5
lines changed

3 files changed

+36
-5
lines changed

src/SharpGLTF.Ext.3DTiles/Memory/BinaryTable.cs

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,14 @@ namespace SharpGLTF.Memory
1414
/// </summary>
1515
public static class BinaryTable
1616
{
17-
public static List<byte> GetBytesForArray<T>(List<List<T>> values)
17+
public static List<byte> ConvertJaggedListToBytes<T>(List<List<T>> values)
1818
{
19+
var type = typeof(T);
20+
if(type == typeof(bool))
21+
{
22+
var booleanBytes = ConvertJaggedListOfBooleansToBytes(values.Cast<List<bool>>().ToList());
23+
return booleanBytes;
24+
}
1925
var bytes = new List<byte>();
2026
foreach (var value in values)
2127
{
@@ -26,7 +32,6 @@ public static List<byte> GetBytesForArray<T>(List<List<T>> values)
2632
return bytes;
2733
}
2834

29-
3035
/// <summary>
3136
/// Converts a list of primitive types into a byte array
3237
/// </summary>
@@ -81,6 +86,14 @@ public static byte[] GetBytes<T>(IReadOnlyList<T> values)
8186
}
8287
}
8388

89+
private static List<byte> ConvertJaggedListOfBooleansToBytes(List<List<bool>> values)
90+
{
91+
var bits = new BitArray(values.SelectMany(x => x).ToArray());
92+
var boolBytes = new byte[(bits.Length - 1) / 8 + 1];
93+
bits.CopyTo(boolBytes, 0);
94+
return boolBytes.ToList();
95+
}
96+
8497
private static byte[] Matrix4x4ToBytes<T>(IReadOnlyList<T> values)
8598
{
8699
var result = new byte[values.Count * 64];

src/SharpGLTF.Ext.3DTiles/Schema2/Ext.StructuralMetadataRoot.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -874,7 +874,7 @@ private static int GetBufferView<T>(ModelRoot model, IReadOnlyList<T> values)
874874

875875
private static int GetBufferView<T>(ModelRoot model, List<List<T>> values)
876876
{
877-
List<byte> bytes = BinaryTable.GetBytesForArray(values);
877+
List<byte> bytes = BinaryTable.ConvertJaggedListToBytes(values);
878878
var bufferView = model.UseBufferView(bytes.ToArray());
879879
int logicalIndex = bufferView.LogicalIndex;
880880
return logicalIndex;

tests/SharpGLTF.Ext.3DTiles.Tests/Memory/BinaryTableTests.cs

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,30 @@ namespace SharpGLTF.Memory
88
public class BinaryTableTests
99
{
1010
[Test]
11-
public void ConvertListofListofIntToBytes()
11+
public void ConvertJaggedListOfBoolsToBytes()
12+
{
13+
var values = new List<List<bool>>();
14+
values.Add(new List<bool>() { true, false });
15+
values.Add(new List<bool>() { false, true });
16+
var bytes = BinaryTable.ConvertJaggedListToBytes(values);
17+
// Check size, should be 1 byte for 4 bits
18+
Assert.That(bytes.Count, Is.EqualTo(1));
19+
20+
// read the bits back
21+
var bits = new System.Collections.BitArray(bytes.ToArray());
22+
Assert.That(bits[0], Is.EqualTo(true));
23+
Assert.That(bits[1], Is.EqualTo(false));
24+
Assert.That(bits[2], Is.EqualTo(false));
25+
Assert.That(bits[3], Is.EqualTo(true));
26+
}
27+
28+
[Test]
29+
public void ConvertJaggedListOfIntsToBytes()
1230
{
1331
var values = new List<List<int>>();
1432
values.Add(new List<int>() { 0, 1 });
1533
values.Add(new List<int>() { 2, 3 });
16-
var bytes = BinaryTable.GetBytesForArray(values);
34+
var bytes = BinaryTable.ConvertJaggedListToBytes(values);
1735
Assert.That(bytes.Count, Is.EqualTo(BinaryTable.GetSize<int>() * 4));
1836
}
1937

0 commit comments

Comments
 (0)