Partial checkin or tile cache endian swap.

This commit is contained in:
Mikko Mononen 2011-12-19 19:31:09 +00:00
parent ce2f07736a
commit 0e4a53fb0d
2 changed files with 77 additions and 77 deletions

View File

@ -436,6 +436,43 @@ inline int dtAlign4(int x) { return (x+3) & ~3; }
inline int dtOppositeTile(int side) { return (side+4) & 0x7; } inline int dtOppositeTile(int side) { return (side+4) & 0x7; }
inline void dtSwapByte(unsigned char* a, unsigned char* b)
{
unsigned char tmp = *a;
*a = *b;
*b = tmp;
}
inline void dtSwapEndian(unsigned short* v)
{
unsigned char* x = (unsigned char*)v;
dtSwapByte(x+0, x+1);
}
inline void dtSwapEndian(short* v)
{
unsigned char* x = (unsigned char*)v;
dtSwapByte(x+0, x+1);
}
inline void dtSwapEndian(unsigned int* v)
{
unsigned char* x = (unsigned char*)v;
dtSwapByte(x+0, x+3); dtSwapByte(x+1, x+2);
}
inline void dtSwapEndian(int* v)
{
unsigned char* x = (unsigned char*)v;
dtSwapByte(x+0, x+3); dtSwapByte(x+1, x+2);
}
inline void dtSwapEndian(float* v)
{
unsigned char* x = (unsigned char*)v;
dtSwapByte(x+0, x+3); dtSwapByte(x+1, x+2);
}
/// @} /// @}
#endif // DETOURCOMMON_H #endif // DETOURCOMMON_H

View File

@ -590,51 +590,14 @@ bool dtCreateNavMeshData(dtNavMeshCreateParams* params, unsigned char** outData,
return true; return true;
} }
inline void swapByte(unsigned char* a, unsigned char* b)
{
unsigned char tmp = *a;
*a = *b;
*b = tmp;
}
inline void swapEndian(unsigned short* v)
{
unsigned char* x = (unsigned char*)v;
swapByte(x+0, x+1);
}
inline void swapEndian(short* v)
{
unsigned char* x = (unsigned char*)v;
swapByte(x+0, x+1);
}
inline void swapEndian(unsigned int* v)
{
unsigned char* x = (unsigned char*)v;
swapByte(x+0, x+3); swapByte(x+1, x+2);
}
inline void swapEndian(int* v)
{
unsigned char* x = (unsigned char*)v;
swapByte(x+0, x+3); swapByte(x+1, x+2);
}
inline void swapEndian(float* v)
{
unsigned char* x = (unsigned char*)v;
swapByte(x+0, x+3); swapByte(x+1, x+2);
}
bool dtNavMeshHeaderSwapEndian(unsigned char* data, const int /*dataSize*/) bool dtNavMeshHeaderSwapEndian(unsigned char* data, const int /*dataSize*/)
{ {
dtMeshHeader* header = (dtMeshHeader*)data; dtMeshHeader* header = (dtMeshHeader*)data;
int swappedMagic = DT_NAVMESH_MAGIC; int swappedMagic = DT_NAVMESH_MAGIC;
int swappedVersion = DT_NAVMESH_VERSION; int swappedVersion = DT_NAVMESH_VERSION;
swapEndian(&swappedMagic); dtSwapEndian(&swappedMagic);
swapEndian(&swappedVersion); dtSwapEndian(&swappedVersion);
if ((header->magic != DT_NAVMESH_MAGIC || header->version != DT_NAVMESH_VERSION) && if ((header->magic != DT_NAVMESH_MAGIC || header->version != DT_NAVMESH_VERSION) &&
(header->magic != swappedMagic || header->version != swappedVersion)) (header->magic != swappedMagic || header->version != swappedVersion))
@ -642,31 +605,31 @@ bool dtNavMeshHeaderSwapEndian(unsigned char* data, const int /*dataSize*/)
return false; return false;
} }
swapEndian(&header->magic); dtSwapEndian(&header->magic);
swapEndian(&header->version); dtSwapEndian(&header->version);
swapEndian(&header->x); dtSwapEndian(&header->x);
swapEndian(&header->y); dtSwapEndian(&header->y);
swapEndian(&header->layer); dtSwapEndian(&header->layer);
swapEndian(&header->userId); dtSwapEndian(&header->userId);
swapEndian(&header->polyCount); dtSwapEndian(&header->polyCount);
swapEndian(&header->vertCount); dtSwapEndian(&header->vertCount);
swapEndian(&header->maxLinkCount); dtSwapEndian(&header->maxLinkCount);
swapEndian(&header->detailMeshCount); dtSwapEndian(&header->detailMeshCount);
swapEndian(&header->detailVertCount); dtSwapEndian(&header->detailVertCount);
swapEndian(&header->detailTriCount); dtSwapEndian(&header->detailTriCount);
swapEndian(&header->bvNodeCount); dtSwapEndian(&header->bvNodeCount);
swapEndian(&header->offMeshConCount); dtSwapEndian(&header->offMeshConCount);
swapEndian(&header->offMeshBase); dtSwapEndian(&header->offMeshBase);
swapEndian(&header->walkableHeight); dtSwapEndian(&header->walkableHeight);
swapEndian(&header->walkableRadius); dtSwapEndian(&header->walkableRadius);
swapEndian(&header->walkableClimb); dtSwapEndian(&header->walkableClimb);
swapEndian(&header->bmin[0]); dtSwapEndian(&header->bmin[0]);
swapEndian(&header->bmin[1]); dtSwapEndian(&header->bmin[1]);
swapEndian(&header->bmin[2]); dtSwapEndian(&header->bmin[2]);
swapEndian(&header->bmax[0]); dtSwapEndian(&header->bmax[0]);
swapEndian(&header->bmax[1]); dtSwapEndian(&header->bmax[1]);
swapEndian(&header->bmax[2]); dtSwapEndian(&header->bmax[2]);
swapEndian(&header->bvQuantFactor); dtSwapEndian(&header->bvQuantFactor);
// Freelist index and pointers are updated when tile is added, no need to swap. // Freelist index and pointers are updated when tile is added, no need to swap.
@ -712,7 +675,7 @@ bool dtNavMeshDataSwapEndian(unsigned char* data, const int /*dataSize*/)
// Vertices // Vertices
for (int i = 0; i < header->vertCount*3; ++i) for (int i = 0; i < header->vertCount*3; ++i)
{ {
swapEndian(&verts[i]); dtSwapEndian(&verts[i]);
} }
// Polys // Polys
@ -722,10 +685,10 @@ bool dtNavMeshDataSwapEndian(unsigned char* data, const int /*dataSize*/)
// poly->firstLink is update when tile is added, no need to swap. // poly->firstLink is update when tile is added, no need to swap.
for (int j = 0; j < DT_VERTS_PER_POLYGON; ++j) for (int j = 0; j < DT_VERTS_PER_POLYGON; ++j)
{ {
swapEndian(&p->verts[j]); dtSwapEndian(&p->verts[j]);
swapEndian(&p->neis[j]); dtSwapEndian(&p->neis[j]);
} }
swapEndian(&p->flags); dtSwapEndian(&p->flags);
} }
// Links are rebuild when tile is added, no need to swap. // Links are rebuild when tile is added, no need to swap.
@ -734,14 +697,14 @@ bool dtNavMeshDataSwapEndian(unsigned char* data, const int /*dataSize*/)
for (int i = 0; i < header->detailMeshCount; ++i) for (int i = 0; i < header->detailMeshCount; ++i)
{ {
dtPolyDetail* pd = &detailMeshes[i]; dtPolyDetail* pd = &detailMeshes[i];
swapEndian(&pd->vertBase); dtSwapEndian(&pd->vertBase);
swapEndian(&pd->triBase); dtSwapEndian(&pd->triBase);
} }
// Detail verts // Detail verts
for (int i = 0; i < header->detailVertCount*3; ++i) for (int i = 0; i < header->detailVertCount*3; ++i)
{ {
swapEndian(&detailVerts[i]); dtSwapEndian(&detailVerts[i]);
} }
// BV-tree // BV-tree
@ -750,10 +713,10 @@ bool dtNavMeshDataSwapEndian(unsigned char* data, const int /*dataSize*/)
dtBVNode* node = &bvTree[i]; dtBVNode* node = &bvTree[i];
for (int j = 0; j < 3; ++j) for (int j = 0; j < 3; ++j)
{ {
swapEndian(&node->bmin[j]); dtSwapEndian(&node->bmin[j]);
swapEndian(&node->bmax[j]); dtSwapEndian(&node->bmax[j]);
} }
swapEndian(&node->i); dtSwapEndian(&node->i);
} }
// Off-mesh Connections. // Off-mesh Connections.
@ -761,9 +724,9 @@ bool dtNavMeshDataSwapEndian(unsigned char* data, const int /*dataSize*/)
{ {
dtOffMeshConnection* con = &offMeshCons[i]; dtOffMeshConnection* con = &offMeshCons[i];
for (int j = 0; j < 6; ++j) for (int j = 0; j < 6; ++j)
swapEndian(&con->pos[j]); dtSwapEndian(&con->pos[j]);
swapEndian(&con->rad); dtSwapEndian(&con->rad);
swapEndian(&con->poly); dtSwapEndian(&con->poly);
} }
return true; return true;