Skip to content

Commit 262890b

Browse files
committed
GTS re-serialization support, part 1
1 parent b2ef419 commit 262890b

File tree

4 files changed

+436
-53
lines changed

4 files changed

+436
-53
lines changed

LSLib/LS/BinUtils.cs

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,7 @@ public static T ReadStruct<T>(BinaryReader reader)
1313
{
1414
T outStruct;
1515
int count = Marshal.SizeOf(typeof(T));
16-
byte[] readBuffer = new byte[count];
17-
readBuffer = reader.ReadBytes(count);
16+
byte[] readBuffer = reader.ReadBytes(count);
1817
GCHandle handle = GCHandle.Alloc(readBuffer, GCHandleType.Pinned);
1918
outStruct = (T)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(T));
2019
handle.Free();
@@ -25,8 +24,7 @@ public static void ReadStructs<T>(BinaryReader reader, T[] elements)
2524
{
2625
int elementSize = Marshal.SizeOf(typeof(T));
2726
int bytes = elementSize * elements.Length;
28-
byte[] readBuffer = new byte[bytes];
29-
readBuffer = reader.ReadBytes(bytes);
27+
byte[] readBuffer = reader.ReadBytes(bytes);
3028
GCHandle handle = GCHandle.Alloc(readBuffer, GCHandleType.Pinned);
3129
var addr = handle.AddrOfPinnedObject();
3230
for (var i = 0; i < elements.Length; i++)
@@ -47,6 +45,22 @@ public static void WriteStruct<T>(BinaryWriter writer, ref T inStruct)
4745
writer.Write(writeBuffer);
4846
}
4947

48+
public static void WriteStructs<T>(BinaryWriter writer, T[] elements)
49+
{
50+
int elementSize = Marshal.SizeOf(typeof(T));
51+
int bytes = elementSize * elements.Length;
52+
byte[] writeBuffer = new byte[bytes];
53+
GCHandle handle = GCHandle.Alloc(writeBuffer, GCHandleType.Pinned);
54+
var addr = handle.AddrOfPinnedObject();
55+
for (var i = 0; i < elements.Length; i++)
56+
{
57+
var elementAddr = new IntPtr(addr.ToInt64() + elementSize * i);
58+
Marshal.StructureToPtr(elements[i], elementAddr, true);
59+
}
60+
handle.Free();
61+
writer.Write(writeBuffer);
62+
}
63+
5064
public static NodeAttribute ReadAttribute(NodeAttribute.DataType type, BinaryReader reader)
5165
{
5266
var attr = new NodeAttribute(type);

LSLib/VirtualTextures/PageFile.cs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ public void Dispose()
4848

4949
private byte[] DoUnpackTileBC(GTPChunkHeader header, int outputSize)
5050
{
51-
var parameterBlock = TileSet.ParameterBlocks[header.ParameterBlockID];
51+
var parameterBlock = (GTSBCParameterBlock)TileSet.ParameterBlocks[header.ParameterBlockID];
5252
if (parameterBlock.CompressionName1 != "lz77" || parameterBlock.CompressionName2 != "fastlz0.1.0")
5353
{
5454
throw new InvalidDataException($"Unsupported BC compression format: '{parameterBlock.CompressionName1}', '{parameterBlock.CompressionName2}'");
@@ -65,6 +65,8 @@ private byte[] DoUnpackTileBC(GTPChunkHeader header, int outputSize)
6565

6666
private byte[] DoUnpackTileUniform(GTPChunkHeader header)
6767
{
68+
var parameterBlock = (GTSUniformParameterBlock)TileSet.ParameterBlocks[header.ParameterBlockID];
69+
6870
byte[] img = new byte[TileSet.Header.TileWidth * TileSet.Header.TileHeight];
6971
Array.Clear(img, 0, img.Length);
7072
return img;
@@ -76,8 +78,8 @@ public byte[] UnpackTile(int pageIndex, int chunkIndex, int outputSize)
7678
var chunkHeader = BinUtils.ReadStruct<GTPChunkHeader>(Reader);
7779
switch (chunkHeader.Codec)
7880
{
79-
case 0: return DoUnpackTileUniform(chunkHeader);
80-
case 9: return DoUnpackTileBC(chunkHeader, outputSize);
81+
case GTSCodec.Uniform: return DoUnpackTileUniform(chunkHeader);
82+
case GTSCodec.BC: return DoUnpackTileBC(chunkHeader, outputSize);
8183
default: throw new InvalidDataException($"Unsupported codec: {chunkHeader.Codec}");
8284
}
8385
}

0 commit comments

Comments
 (0)