From 1a66ddf71af0f9bc3fcba5d67140f429251210d9 Mon Sep 17 00:00:00 2001 From: Mikko Mononen Date: Mon, 19 Dec 2011 19:31:39 +0000 Subject: [PATCH] Partial checkin or tile cache endian swap. --- .../Include/DetourTileCacheBuilder.h | 6 ++++ .../Source/DetourTileCacheBuilder.cpp | 36 +++++++++++++++++++ 2 files changed, 42 insertions(+) diff --git a/DetourTileCache/Include/DetourTileCacheBuilder.h b/DetourTileCache/Include/DetourTileCacheBuilder.h index edeccdf..a9148f9 100644 --- a/DetourTileCache/Include/DetourTileCacheBuilder.h +++ b/DetourTileCache/Include/DetourTileCacheBuilder.h @@ -136,5 +136,11 @@ dtStatus dtBuildTileCachePolyMesh(dtTileCacheAlloc* alloc, dtTileCacheContourSet& lcset, dtTileCachePolyMesh& mesh); +/// Swaps the endianess of the compressed tile data's header (#dtTileCacheLayerHeader). +/// Tile layer data does not need endian swapping as it consits only of bytes. +/// @param[in,out] data The tile data array. +/// @param[in] dataSize The size of the data array. +bool dtTileCacheHeaderSwapEndian(unsigned char* data, const int dataSize); + #endif // DETOURTILECACHEBUILDER_H diff --git a/DetourTileCache/Source/DetourTileCacheBuilder.cpp b/DetourTileCache/Source/DetourTileCacheBuilder.cpp index a8a6d74..4150638 100644 --- a/DetourTileCache/Source/DetourTileCacheBuilder.cpp +++ b/DetourTileCache/Source/DetourTileCacheBuilder.cpp @@ -2103,3 +2103,39 @@ dtStatus dtDecompressTileCacheLayer(dtTileCacheAlloc* alloc, dtTileCacheCompress return DT_SUCCESS; } + + +bool dtTileCacheHeaderSwapEndian(unsigned char* data, const int dataSize) +{ + dtTileCacheLayerHeader* header = (dtTileCacheLayerHeader*)data; + + int swappedMagic = DT_TILECACHE_MAGIC; + int swappedVersion = DT_TILECACHE_VERSION; + dtSwapEndian(&swappedMagic); + dtSwapEndian(&swappedVersion); + + if ((header->magic != DT_TILECACHE_MAGIC || header->version != DT_TILECACHE_VERSION) && + (header->magic != swappedMagic || header->version != swappedVersion)) + { + return false; + } + + dtSwapEndian(&header->magic); + dtSwapEndian(&header->version); + dtSwapEndian(&header->tx); + dtSwapEndian(&header->ty); + dtSwapEndian(&header->tlayer); + dtSwapEndian(&header->bmin[0]); + dtSwapEndian(&header->bmin[1]); + dtSwapEndian(&header->bmin[2]); + dtSwapEndian(&header->bmax[0]); + dtSwapEndian(&header->bmax[1]); + dtSwapEndian(&header->bmax[2]); + dtSwapEndian(&header->hmin); + dtSwapEndian(&header->hmax); + + // width, height, minx, maxx, miny, maxy are unsigned char, no need to swap. + + return true; +} +