move K4os.Compression.LZ4

This commit is contained in:
ikpil 2023-08-05 22:39:18 +09:00
parent 22a699183e
commit 898cf33dbb
28 changed files with 173 additions and 80 deletions

View File

@ -16,7 +16,7 @@
using System; using System;
namespace DotRecast.Detour.TileCache.Io.Compress namespace DotRecast.Core
{ {
/** /**
* Core of FastLZ compression algorithm. * Core of FastLZ compression algorithm.

View File

@ -5,10 +5,6 @@
</PropertyGroup> </PropertyGroup>
<ItemGroup>
<PackageReference Include="K4os.Compression.LZ4" Version="1.3.5" />
</ItemGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\DotRecast.Detour\DotRecast.Detour.csproj" /> <ProjectReference Include="..\DotRecast.Detour\DotRecast.Detour.csproj" />
<ProjectReference Include="..\DotRecast.Recast\DotRecast.Recast.csproj" /> <ProjectReference Include="..\DotRecast.Recast\DotRecast.Recast.csproj" />

View File

@ -24,7 +24,12 @@ namespace DotRecast.Detour.Dynamic.Io
{ {
public class VoxelFileReader public class VoxelFileReader
{ {
private readonly LZ4VoxelTileCompressor compressor = new LZ4VoxelTileCompressor(); private readonly IRcCompressor _compressor;
public VoxelFileReader(IRcCompressor compressor)
{
_compressor = compressor;
}
public VoxelFile Read(BinaryReader stream) public VoxelFile Read(BinaryReader stream)
{ {
@ -127,7 +132,7 @@ namespace DotRecast.Detour.Dynamic.Io
byte[] bytes = buf.ReadBytes(voxelSize).ToArray(); byte[] bytes = buf.ReadBytes(voxelSize).ToArray();
if (compression) if (compression)
{ {
bytes = compressor.Decompress(bytes); bytes = _compressor.Decompress(bytes);
} }
RcByteBuffer data = new RcByteBuffer(bytes); RcByteBuffer data = new RcByteBuffer(bytes);

View File

@ -24,7 +24,12 @@ namespace DotRecast.Detour.Dynamic.Io
{ {
public class VoxelFileWriter : DtWriter public class VoxelFileWriter : DtWriter
{ {
private readonly LZ4VoxelTileCompressor compressor = new LZ4VoxelTileCompressor(); private readonly IRcCompressor _compressor;
public VoxelFileWriter(IRcCompressor compressor)
{
_compressor = compressor;
}
public void Write(BinaryWriter stream, VoxelFile f, bool compression) public void Write(BinaryWriter stream, VoxelFile f, bool compression)
{ {
@ -85,7 +90,7 @@ namespace DotRecast.Detour.Dynamic.Io
byte[] bytes = tile.spanData; byte[] bytes = tile.spanData;
if (compression) if (compression)
{ {
bytes = compressor.Compress(bytes); bytes = _compressor.Compress(bytes);
} }
Write(stream, bytes.Length, byteOrder); Write(stream, bytes.Length, byteOrder);

View File

@ -5,10 +5,6 @@
</PropertyGroup> </PropertyGroup>
<ItemGroup>
<PackageReference Include="K4os.Compression.LZ4" Version="1.3.5" />
</ItemGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\DotRecast.Detour\DotRecast.Detour.csproj" /> <ProjectReference Include="..\DotRecast.Detour\DotRecast.Detour.csproj" />
</ItemGroup> </ItemGroup>

View File

@ -111,8 +111,7 @@ namespace DotRecast.Detour.TileCache
return (int)(refs & tileMask); return (int)(refs & tileMask);
} }
public DtTileCache(DtTileCacheParams option, TileCacheStorageParams storageParams, DtNavMesh navmesh, public DtTileCache(DtTileCacheParams option, TileCacheStorageParams storageParams, DtNavMesh navmesh, IRcCompressor tcomp, IDtTileCacheMeshProcess tmprocs)
IRcCompressor tcomp, IDtTileCacheMeshProcess tmprocs)
{ {
m_params = option; m_params = option;
m_storageParams = storageParams; m_storageParams = storageParams;
@ -677,8 +676,7 @@ namespace DotRecast.Detour.TileCache
public DtTileCacheLayer DecompressTile(DtCompressedTile tile) public DtTileCacheLayer DecompressTile(DtCompressedTile tile)
{ {
DtTileCacheLayer layer = builder.DecompressTileCacheLayer(m_tcomp, tile.data, m_storageParams.byteOrder, DtTileCacheLayer layer = builder.DecompressTileCacheLayer(m_tcomp, tile.data, m_storageParams.byteOrder, m_storageParams.cCompatibility);
m_storageParams.cCompatibility);
return layer; return layer;
} }

View File

@ -1905,7 +1905,7 @@ namespace DotRecast.Detour.TileCache
} }
} }
public byte[] CompressTileCacheLayer(DtTileCacheLayer layer, RcByteOrder order, bool cCompatibility) public byte[] CompressTileCacheLayer(IRcCompressor comp, DtTileCacheLayer layer, RcByteOrder order, bool cCompatibility)
{ {
using var ms = new MemoryStream(); using var ms = new MemoryStream();
using var baos = new BinaryWriter(ms); using var baos = new BinaryWriter(ms);
@ -1922,7 +1922,8 @@ namespace DotRecast.Detour.TileCache
buffer[gridSize * 2 + i] = (byte)layer.cons[i]; buffer[gridSize * 2 + i] = (byte)layer.cons[i];
} }
baos.Write(DtTileCacheCompressorFactory.Get(cCompatibility).Compress(buffer)); var compressed = comp.Compress(buffer);
baos.Write(compressed);
return ms.ToArray(); return ms.ToArray();
} }
catch (IOException e) catch (IOException e)
@ -1931,8 +1932,7 @@ namespace DotRecast.Detour.TileCache
} }
} }
public byte[] CompressTileCacheLayer(DtTileCacheLayerHeader header, int[] heights, int[] areas, int[] cons, public byte[] CompressTileCacheLayer(DtTileCacheLayerHeader header, int[] heights, int[] areas, int[] cons, RcByteOrder order, bool cCompatibility, IRcCompressor comp)
RcByteOrder order, bool cCompatibility)
{ {
using var ms = new MemoryStream(); using var ms = new MemoryStream();
using var baos = new BinaryWriter(ms); using var baos = new BinaryWriter(ms);
@ -1949,7 +1949,8 @@ namespace DotRecast.Detour.TileCache
buffer[gridSize * 2 + i] = (byte)cons[i]; buffer[gridSize * 2 + i] = (byte)cons[i];
} }
baos.Write(DtTileCacheCompressorFactory.Get(cCompatibility).Compress(buffer)); var compressed = comp.Compress(buffer);
baos.Write(compressed);
return ms.ToArray(); return ms.ToArray();
} }
catch (IOException e) catch (IOException e)
@ -1958,8 +1959,7 @@ namespace DotRecast.Detour.TileCache
} }
} }
public DtTileCacheLayer DecompressTileCacheLayer(IRcCompressor comp, byte[] compressed, RcByteOrder order, public DtTileCacheLayer DecompressTileCacheLayer(IRcCompressor comp, byte[] compressed, RcByteOrder order, bool cCompatibility)
bool cCompatibility)
{ {
RcByteBuffer buf = new RcByteBuffer(compressed); RcByteBuffer buf = new RcByteBuffer(compressed);
buf.Order(order); buf.Order(order);

View File

@ -19,15 +19,21 @@ freely, subject to the following restrictions:
*/ */
using DotRecast.Core; using DotRecast.Core;
using K4os.Compression.LZ4;
namespace DotRecast.Detour.TileCache.Io.Compress namespace DotRecast.Detour.TileCache.Io.Compress
{ {
public class DtFastLzCompressor : IRcCompressor public class DtTileCacheFastLzCompressor : IRcCompressor
{ {
public static readonly DtTileCacheFastLzCompressor Shared = new DtTileCacheFastLzCompressor();
private DtTileCacheFastLzCompressor()
{
}
public byte[] Decompress(byte[] buf) public byte[] Decompress(byte[] buf)
{ {
return LZ4Pickler.Unpickle(buf); return Decompress(buf, 0, buf.Length, buf.Length * 3);
} }
public byte[] Decompress(byte[] buf, int offset, int len, int outputlen) public byte[] Decompress(byte[] buf, int offset, int len, int outputlen)

View File

@ -22,14 +22,8 @@ using DotRecast.Core;
namespace DotRecast.Detour.TileCache.Io.Compress namespace DotRecast.Detour.TileCache.Io.Compress
{ {
public static class DtTileCacheCompressorFactory public interface IDtTileCacheCompressorFactory
{ {
public static IRcCompressor Get(bool cCompatibility) IRcCompressor Get(bool cCompatibility);
{
if (cCompatibility)
return new DtFastLzCompressor();
return new DtLz4Compressor();
}
} }
} }

View File

@ -28,6 +28,12 @@ namespace DotRecast.Detour.TileCache.Io
public class DtTileCacheReader public class DtTileCacheReader
{ {
private readonly DtNavMeshParamsReader paramReader = new DtNavMeshParamsReader(); private readonly DtNavMeshParamsReader paramReader = new DtNavMeshParamsReader();
private readonly IDtTileCacheCompressorFactory _compFactory;
public DtTileCacheReader(IDtTileCacheCompressorFactory compFactory)
{
_compFactory = compFactory;
}
public DtTileCache Read(BinaryReader @is, int maxVertPerPoly, IDtTileCacheMeshProcess meshProcessor) public DtTileCache Read(BinaryReader @is, int maxVertPerPoly, IDtTileCacheMeshProcess meshProcessor)
{ {
@ -64,9 +70,8 @@ namespace DotRecast.Detour.TileCache.Io
header.meshParams = paramReader.Read(bb); header.meshParams = paramReader.Read(bb);
header.cacheParams = ReadCacheParams(bb, cCompatibility); header.cacheParams = ReadCacheParams(bb, cCompatibility);
DtNavMesh mesh = new DtNavMesh(header.meshParams, maxVertPerPoly); DtNavMesh mesh = new DtNavMesh(header.meshParams, maxVertPerPoly);
IRcCompressor compressor = DtTileCacheCompressorFactory.Get(cCompatibility); IRcCompressor comp = _compFactory.Get(cCompatibility);
DtTileCache tc = new DtTileCache(header.cacheParams, new TileCacheStorageParams(bb.Order(), cCompatibility), mesh, DtTileCache tc = new DtTileCache(header.cacheParams, new TileCacheStorageParams(bb.Order(), cCompatibility), mesh, comp, meshProcessor);
compressor, meshProcessor);
// Read tiles. // Read tiles.
for (int i = 0; i < header.numTiles; ++i) for (int i = 0; i < header.numTiles; ++i)
{ {

View File

@ -21,6 +21,7 @@ freely, subject to the following restrictions:
using System.IO; using System.IO;
using DotRecast.Core; using DotRecast.Core;
using DotRecast.Detour.Io; using DotRecast.Detour.Io;
using DotRecast.Detour.TileCache.Io.Compress;
namespace DotRecast.Detour.TileCache.Io namespace DotRecast.Detour.TileCache.Io
{ {
@ -28,6 +29,13 @@ namespace DotRecast.Detour.TileCache.Io
{ {
private readonly DtNavMeshParamWriter paramWriter = new DtNavMeshParamWriter(); private readonly DtNavMeshParamWriter paramWriter = new DtNavMeshParamWriter();
private readonly DtTileCacheBuilder builder = new DtTileCacheBuilder(); private readonly DtTileCacheBuilder builder = new DtTileCacheBuilder();
private readonly IDtTileCacheCompressorFactory _compFactory;
public DtTileCacheWriter(IDtTileCacheCompressorFactory compFactory)
{
_compFactory = compFactory;
}
public void Write(BinaryWriter stream, DtTileCache cache, RcByteOrder order, bool cCompatibility) public void Write(BinaryWriter stream, DtTileCache cache, RcByteOrder order, bool cCompatibility)
{ {
@ -55,7 +63,8 @@ namespace DotRecast.Detour.TileCache.Io
Write(stream, (int)cache.GetTileRef(tile), order); Write(stream, (int)cache.GetTileRef(tile), order);
byte[] data = tile.data; byte[] data = tile.data;
DtTileCacheLayer layer = cache.DecompressTile(tile); DtTileCacheLayer layer = cache.DecompressTile(tile);
data = builder.CompressTileCacheLayer(layer, order, cCompatibility); var comp = _compFactory.Get(cCompatibility);
data = builder.CompressTileCacheLayer(comp, layer, order, cCompatibility);
Write(stream, data.Length, order); Write(stream, data.Length, order);
stream.Write(data); stream.Write(data);
} }

View File

@ -13,6 +13,7 @@
<PackageReference Include="Serilog.Sinks.Async" Version="1.5.0" /> <PackageReference Include="Serilog.Sinks.Async" Version="1.5.0" />
<PackageReference Include="Serilog.Sinks.Console" Version="4.1.0" /> <PackageReference Include="Serilog.Sinks.Console" Version="4.1.0" />
<PackageReference Include="Serilog.Sinks.File" Version="5.0.0" /> <PackageReference Include="Serilog.Sinks.File" Version="5.0.0" />
<PackageReference Include="K4os.Compression.LZ4" Version="1.3.5" />
<PackageReference Include="Silk.NET" Version="2.17.1" /> <PackageReference Include="Silk.NET" Version="2.17.1" />
<PackageReference Include="Silk.NET.OpenGL.Extensions.ImGui" Version="2.17.1" /> <PackageReference Include="Silk.NET.OpenGL.Extensions.ImGui" Version="2.17.1" />
</ItemGroup> </ItemGroup>

View File

@ -0,0 +1,35 @@
using System;
using DotRecast.Core;
using DotRecast.Detour.Dynamic.Io;
using K4os.Compression.LZ4;
namespace DotRecast.Recast.Demo;
public class DtVoxelTileLZ4DemoCompressor : IRcCompressor
{
public static readonly DtVoxelTileLZ4DemoCompressor Shared = new();
private DtVoxelTileLZ4DemoCompressor()
{
}
public byte[] Decompress(byte[] data)
{
int compressedSize = ByteUtils.GetIntBE(data, 0);
return LZ4Pickler.Unpickle(data.AsSpan(4, compressedSize));
}
public byte[] Decompress(byte[] buf, int offset, int len, int outputlen)
{
return LZ4Pickler.Unpickle(buf, offset, len);
}
public byte[] Compress(byte[] data)
{
byte[] compressed = LZ4Pickler.Pickle(data, LZ4Level.L12_MAX);
byte[] result = new byte[4 + compressed.Length];
ByteUtils.PutInt(compressed.Length, result, 0, RcByteOrder.BIG_ENDIAN);
Array.Copy(compressed, 0, result, 4, compressed.Length);
return result;
}
}

View File

@ -675,7 +675,7 @@ public class DynamicUpdateTool : IRcTool
{ {
using var fs = new FileStream(filename, FileMode.Open, FileAccess.Read); using var fs = new FileStream(filename, FileMode.Open, FileAccess.Read);
using var br = new BinaryReader(fs); using var br = new BinaryReader(fs);
VoxelFileReader reader = new VoxelFileReader(); VoxelFileReader reader = new VoxelFileReader(DtVoxelTileLZ4DemoCompressor.Shared);
VoxelFile voxelFile = reader.Read(br); VoxelFile voxelFile = reader.Read(br);
dynaMesh = new DynamicNavMesh(voxelFile); dynaMesh = new DynamicNavMesh(voxelFile);
dynaMesh.config.keepIntermediateResults = true; dynaMesh.config.keepIntermediateResults = true;
@ -697,7 +697,7 @@ public class DynamicUpdateTool : IRcTool
using var fs = new FileStream(filename, FileMode.CreateNew, FileAccess.Write); using var fs = new FileStream(filename, FileMode.CreateNew, FileAccess.Write);
using var bw = new BinaryWriter(fs); using var bw = new BinaryWriter(fs);
VoxelFile voxelFile = VoxelFile.From(dynaMesh); VoxelFile voxelFile = VoxelFile.From(dynaMesh);
VoxelFileWriter writer = new VoxelFileWriter(); VoxelFileWriter writer = new VoxelFileWriter(DtVoxelTileLZ4DemoCompressor.Shared);
writer.Write(bw, voxelFile, compression); writer.Write(bw, voxelFile, compression);
} }

View File

@ -6,6 +6,7 @@
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="K4os.Compression.LZ4" Version="1.3.5"/>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.6.3"/> <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.6.3"/>
<PackageReference Include="NUnit" Version="3.13.3"/> <PackageReference Include="NUnit" Version="3.13.3"/>
<PackageReference Include="NUnit3TestAdapter" Version="4.5.0"/> <PackageReference Include="NUnit3TestAdapter" Version="4.5.0"/>

View File

@ -4,6 +4,7 @@ using System.Threading.Tasks;
using DotRecast.Core; using DotRecast.Core;
using DotRecast.Detour.Dynamic.Colliders; using DotRecast.Detour.Dynamic.Colliders;
using DotRecast.Detour.Dynamic.Io; using DotRecast.Detour.Dynamic.Io;
using DotRecast.Detour.Dynamic.Test.Io;
using NUnit.Framework; using NUnit.Framework;
namespace DotRecast.Detour.Dynamic.Test; namespace DotRecast.Detour.Dynamic.Test;
@ -25,7 +26,7 @@ public class DynamicNavMeshTest
using var bis = new BinaryReader(ms); using var bis = new BinaryReader(ms);
// load voxels from file // load voxels from file
VoxelFileReader reader = new VoxelFileReader(); VoxelFileReader reader = new VoxelFileReader(DtVoxelTileLZ4ForTestCompressor.Shared);
VoxelFile f = reader.Read(bis); VoxelFile f = reader.Read(bis);
// create dynamic navmesh // create dynamic navmesh
DynamicNavMesh mesh = new DynamicNavMesh(f); DynamicNavMesh mesh = new DynamicNavMesh(f);

View File

@ -18,12 +18,19 @@ freely, subject to the following restrictions:
using System; using System;
using DotRecast.Core; using DotRecast.Core;
using DotRecast.Detour.Dynamic.Io;
using K4os.Compression.LZ4; using K4os.Compression.LZ4;
namespace DotRecast.Detour.Dynamic.Io namespace DotRecast.Detour.Dynamic.Test.Io
{ {
public class LZ4VoxelTileCompressor : IRcCompressor public class DtVoxelTileLZ4ForTestCompressor : IRcCompressor
{ {
public static readonly DtVoxelTileLZ4ForTestCompressor Shared = new();
private DtVoxelTileLZ4ForTestCompressor()
{
}
public byte[] Decompress(byte[] data) public byte[] Decompress(byte[] data)
{ {
int compressedSize = ByteUtils.GetIntBE(data, 0); int compressedSize = ByteUtils.GetIntBE(data, 0);

View File

@ -33,7 +33,7 @@ public class VoxelFileReaderTest
using var ms = new MemoryStream(bytes); using var ms = new MemoryStream(bytes);
using var bis = new BinaryReader(ms); using var bis = new BinaryReader(ms);
VoxelFileReader reader = new VoxelFileReader(); VoxelFileReader reader = new VoxelFileReader(DtVoxelTileLZ4ForTestCompressor.Shared);
VoxelFile f = reader.Read(bis); VoxelFile f = reader.Read(bis);
Assert.That(f.useTiles, Is.False); Assert.That(f.useTiles, Is.False);
Assert.That(f.bounds, Is.EqualTo(new float[] { -100.0f, 0f, -100f, 100f, 5f, 100f })); Assert.That(f.bounds, Is.EqualTo(new float[] { -100.0f, 0f, -100f, 100f, 5f, 100f }));
@ -59,7 +59,7 @@ public class VoxelFileReaderTest
using var ms = new MemoryStream(bytes); using var ms = new MemoryStream(bytes);
using var bis = new BinaryReader(ms); using var bis = new BinaryReader(ms);
VoxelFileReader reader = new VoxelFileReader(); VoxelFileReader reader = new VoxelFileReader(DtVoxelTileLZ4ForTestCompressor.Shared);
VoxelFile f = reader.Read(bis); VoxelFile f = reader.Read(bis);
Assert.That(f.useTiles, Is.True); Assert.That(f.useTiles, Is.True);

View File

@ -87,12 +87,12 @@ public class VoxelFileReaderWriterTest
private VoxelFile ReadWriteRead(BinaryReader bis, bool compression) private VoxelFile ReadWriteRead(BinaryReader bis, bool compression)
{ {
VoxelFileReader reader = new VoxelFileReader(); VoxelFileReader reader = new VoxelFileReader(DtVoxelTileLZ4ForTestCompressor.Shared);
VoxelFile f = reader.Read(bis); VoxelFile f = reader.Read(bis);
using var msOut = new MemoryStream(); using var msOut = new MemoryStream();
using var bwOut = new BinaryWriter(msOut); using var bwOut = new BinaryWriter(msOut);
VoxelFileWriter writer = new VoxelFileWriter(); VoxelFileWriter writer = new VoxelFileWriter(DtVoxelTileLZ4ForTestCompressor.Shared);
writer.Write(bwOut, f, compression); writer.Write(bwOut, f, compression);
using var msIn = new MemoryStream(msOut.ToArray()); using var msIn = new MemoryStream(msOut.ToArray());

View File

@ -22,6 +22,7 @@ using System.Threading.Tasks;
using System.Collections.Generic; using System.Collections.Generic;
using DotRecast.Core; using DotRecast.Core;
using DotRecast.Detour.Dynamic.Io; using DotRecast.Detour.Dynamic.Io;
using DotRecast.Detour.Dynamic.Test.Io;
using DotRecast.Recast; using DotRecast.Recast;
using Moq; using Moq;
using NUnit.Framework; using NUnit.Framework;
@ -96,7 +97,7 @@ public class VoxelQueryTest
using var bis = new BinaryReader(ms); using var bis = new BinaryReader(ms);
// load voxels from file // load voxels from file
VoxelFileReader reader = new VoxelFileReader(); VoxelFileReader reader = new VoxelFileReader(DtVoxelTileLZ4ForTestCompressor.Shared);
VoxelFile f = reader.Read(bis); VoxelFile f = reader.Read(bis);
// create dynamic navmesh // create dynamic navmesh
var mesh = new DynamicNavMesh(f); var mesh = new DynamicNavMesh(f);

View File

@ -20,6 +20,7 @@ freely, subject to the following restrictions:
using DotRecast.Core; using DotRecast.Core;
using DotRecast.Detour.TileCache.Io.Compress; using DotRecast.Detour.TileCache.Io.Compress;
using DotRecast.Detour.TileCache.Test.Io;
using DotRecast.Recast.Geom; using DotRecast.Recast.Geom;
using NUnit.Framework; using NUnit.Framework;
using static DotRecast.Core.RcMath; using static DotRecast.Core.RcMath;
@ -72,8 +73,8 @@ public class AbstractTileCacheTest
navMeshParams.maxTiles = 256; navMeshParams.maxTiles = 256;
navMeshParams.maxPolys = 16384; navMeshParams.maxPolys = 16384;
DtNavMesh navMesh = new DtNavMesh(navMeshParams, 6); DtNavMesh navMesh = new DtNavMesh(navMeshParams, 6);
DtTileCache tc = new DtTileCache(option, new TileCacheStorageParams(order, cCompatibility), navMesh, var comp = DtTileCacheCompressorForTestFactory.Shared.Get(cCompatibility);
DtTileCacheCompressorFactory.Get(cCompatibility), new TestTileCacheMeshProcess()); DtTileCache tc = new DtTileCache(option, new TileCacheStorageParams(order, cCompatibility), navMesh, comp, new TestTileCacheMeshProcess());
return tc; return tc;
} }
} }

View File

@ -6,6 +6,7 @@
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="K4os.Compression.LZ4" Version="1.3.5"/>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.6.3"/> <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.6.3"/>
<PackageReference Include="NUnit" Version="3.13.3"/> <PackageReference Include="NUnit" Version="3.13.3"/>
<PackageReference Include="NUnit3TestAdapter" Version="4.5.0"/> <PackageReference Include="NUnit3TestAdapter" Version="4.5.0"/>

View File

@ -0,0 +1,21 @@
using DotRecast.Core;
using DotRecast.Detour.TileCache.Io.Compress;
namespace DotRecast.Detour.TileCache.Test.Io;
public class DtTileCacheCompressorForTestFactory : IDtTileCacheCompressorFactory
{
public static readonly DtTileCacheCompressorForTestFactory Shared = new();
private DtTileCacheCompressorForTestFactory()
{
}
public IRcCompressor Get(bool cCompatibility)
{
if (cCompatibility)
return DtTileCacheFastLzCompressor.Shared;
return DtTileCacheLZ4ForTestCompressor.Shared;
}
}

View File

@ -21,10 +21,16 @@ freely, subject to the following restrictions:
using DotRecast.Core; using DotRecast.Core;
using K4os.Compression.LZ4; using K4os.Compression.LZ4;
namespace DotRecast.Detour.TileCache.Io.Compress namespace DotRecast.Detour.TileCache.Test.Io
{ {
public class DtLz4Compressor : IRcCompressor public class DtTileCacheLZ4ForTestCompressor : IRcCompressor
{ {
public static readonly DtTileCacheLZ4ForTestCompressor Shared = new();
private DtTileCacheLZ4ForTestCompressor()
{
}
public byte[] Decompress(byte[] buf) public byte[] Decompress(byte[] buf)
{ {
return LZ4Pickler.Unpickle(buf); return LZ4Pickler.Unpickle(buf);

View File

@ -29,7 +29,7 @@ namespace DotRecast.Detour.TileCache.Test.Io;
[Parallelizable] [Parallelizable]
public class TileCacheReaderTest public class TileCacheReaderTest
{ {
private readonly DtTileCacheReader reader = new DtTileCacheReader(); private readonly DtTileCacheReader reader = new DtTileCacheReader(DtTileCacheCompressorForTestFactory.Shared);
[Test] [Test]
public void TestNavmesh() public void TestNavmesh()

View File

@ -31,8 +31,8 @@ namespace DotRecast.Detour.TileCache.Test.Io;
[Parallelizable] [Parallelizable]
public class TileCacheReaderWriterTest : AbstractTileCacheTest public class TileCacheReaderWriterTest : AbstractTileCacheTest
{ {
private readonly DtTileCacheReader reader = new DtTileCacheReader(); private readonly DtTileCacheReader reader = new DtTileCacheReader(DtTileCacheCompressorForTestFactory.Shared);
private readonly DtTileCacheWriter writer = new DtTileCacheWriter(); private readonly DtTileCacheWriter writer = new DtTileCacheWriter(DtTileCacheCompressorForTestFactory.Shared);
[Test] [Test]
public void TestFastLz() public void TestFastLz()

View File

@ -20,6 +20,7 @@ freely, subject to the following restrictions:
using System.Collections.Generic; using System.Collections.Generic;
using DotRecast.Core; using DotRecast.Core;
using DotRecast.Detour.TileCache.Test.Io;
using DotRecast.Recast; using DotRecast.Recast;
using DotRecast.Recast.Geom; using DotRecast.Recast.Geom;
@ -107,7 +108,9 @@ public class TestTileLayerBuilder : AbstractTileLayersBuilder
header.maxy = layer.maxy; header.maxy = layer.maxy;
header.hmin = layer.hmin; header.hmin = layer.hmin;
header.hmax = layer.hmax; header.hmax = layer.hmax;
result.Add(builder.CompressTileCacheLayer(header, layer.heights, layer.areas, layer.cons, order, cCompatibility));
var comp = DtTileCacheCompressorForTestFactory.Shared.Get(cCompatibility);
result.Add(builder.CompressTileCacheLayer(header, layer.heights, layer.areas, layer.cons, order, cCompatibility, comp));
} }
} }

View File

@ -22,6 +22,7 @@ using System.Collections.Generic;
using System.IO; using System.IO;
using DotRecast.Core; using DotRecast.Core;
using DotRecast.Detour.TileCache.Io; using DotRecast.Detour.TileCache.Io;
using DotRecast.Detour.TileCache.Test.Io;
using NUnit.Framework; using NUnit.Framework;
namespace DotRecast.Detour.TileCache.Test; namespace DotRecast.Detour.TileCache.Test;
@ -38,7 +39,7 @@ public class TileCacheFindPathTest : AbstractTileCacheTest
{ {
using var msis = new MemoryStream(Loader.ToBytes("dungeon_all_tiles_tilecache.bin")); using var msis = new MemoryStream(Loader.ToBytes("dungeon_all_tiles_tilecache.bin"));
using var @is = new BinaryReader(msis); using var @is = new BinaryReader(msis);
DtTileCache tcC = new DtTileCacheReader().Read(@is, 6, new TestTileCacheMeshProcess()); DtTileCache tcC = new DtTileCacheReader(DtTileCacheCompressorForTestFactory.Shared).Read(@is, 6, new TestTileCacheMeshProcess());
navmesh = tcC.GetNavMesh(); navmesh = tcC.GetNavMesh();
query = new DtNavMeshQuery(navmesh); query = new DtNavMeshQuery(navmesh);
} }