Partial checkin or tile cache endian swap.
This commit is contained in:
parent
ce2f07736a
commit
0e4a53fb0d
@ -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
|
||||||
|
@ -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;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user