NavMesh loading from zip file.

This commit is contained in:
OTHGMars 2021-01-11 04:51:21 -05:00
parent e808fc4407
commit 46b0aee637

View file

@ -39,7 +39,7 @@
#include "core/stream/bitStream.h" #include "core/stream/bitStream.h"
#include "math/mathIO.h" #include "math/mathIO.h"
#include "core/fileio.h" #include "core/stream/fileStream.h"
extern bool gEditingMission; extern bool gEditingMission;
@ -1528,10 +1528,9 @@ bool NavMesh::load()
if(!dStrlen(mFileName)) if(!dStrlen(mFileName))
return false; return false;
File file; FileStream stream;
if(file.open(mFileName, File::Read) != File::Ok) if(!stream.open(mFileName, Torque::FS::File::Read))
{ {
file.close();
Con::errorf("Could not open file %s when loading navmesh %s.", Con::errorf("Could not open file %s when loading navmesh %s.",
mFileName, getName() ? getName() : getIdString()); mFileName, getName() ? getName() : getIdString());
return false; return false;
@ -1539,17 +1538,17 @@ bool NavMesh::load()
// Read header. // Read header.
NavMeshSetHeader header; NavMeshSetHeader header;
file.read(sizeof(NavMeshSetHeader), (char*)&header); stream.read(sizeof(NavMeshSetHeader), (char*)&header);
if(header.magic != NAVMESHSET_MAGIC) if(header.magic != NAVMESHSET_MAGIC)
{ {
file.close(); stream.close();
Con::errorf("Navmesh magic incorrect when loading navmesh %s; possible corrupt navmesh file %s.", Con::errorf("Navmesh magic incorrect when loading navmesh %s; possible corrupt navmesh file %s.",
getName() ? getName() : getIdString(), mFileName); getName() ? getName() : getIdString(), mFileName);
return false; return false;
} }
if(header.version != NAVMESHSET_VERSION) if(header.version != NAVMESHSET_VERSION)
{ {
file.close(); stream.close();
Con::errorf("Navmesh version incorrect when loading navmesh %s; possible corrupt navmesh file %s.", Con::errorf("Navmesh version incorrect when loading navmesh %s; possible corrupt navmesh file %s.",
getName() ? getName() : getIdString(), mFileName); getName() ? getName() : getIdString(), mFileName);
return false; return false;
@ -1560,7 +1559,7 @@ bool NavMesh::load()
nm = dtAllocNavMesh(); nm = dtAllocNavMesh();
if(!nm) if(!nm)
{ {
file.close(); stream.close();
Con::errorf("Out of memory when loading navmesh %s.", Con::errorf("Out of memory when loading navmesh %s.",
getName() ? getName() : getIdString()); getName() ? getName() : getIdString());
return false; return false;
@ -1569,7 +1568,7 @@ bool NavMesh::load()
dtStatus status = nm->init(&header.params); dtStatus status = nm->init(&header.params);
if(dtStatusFailed(status)) if(dtStatusFailed(status))
{ {
file.close(); stream.close();
Con::errorf("Failed to initialise navmesh params when loading navmesh %s.", Con::errorf("Failed to initialise navmesh params when loading navmesh %s.",
getName() ? getName() : getIdString()); getName() ? getName() : getIdString());
return false; return false;
@ -1579,35 +1578,35 @@ bool NavMesh::load()
for(U32 i = 0; i < header.numTiles; ++i) for(U32 i = 0; i < header.numTiles; ++i)
{ {
NavMeshTileHeader tileHeader; NavMeshTileHeader tileHeader;
file.read(sizeof(NavMeshTileHeader), (char*)&tileHeader); stream.read(sizeof(NavMeshTileHeader), (char*)&tileHeader);
if(!tileHeader.tileRef || !tileHeader.dataSize) if(!tileHeader.tileRef || !tileHeader.dataSize)
break; break;
unsigned char* data = (unsigned char*)dtAlloc(tileHeader.dataSize, DT_ALLOC_PERM); unsigned char* data = (unsigned char*)dtAlloc(tileHeader.dataSize, DT_ALLOC_PERM);
if(!data) break; if(!data) break;
memset(data, 0, tileHeader.dataSize); memset(data, 0, tileHeader.dataSize);
file.read(tileHeader.dataSize, (char*)data); stream.read(tileHeader.dataSize, (char*)data);
nm->addTile(data, tileHeader.dataSize, DT_TILE_FREE_DATA, tileHeader.tileRef, 0); nm->addTile(data, tileHeader.dataSize, DT_TILE_FREE_DATA, tileHeader.tileRef, 0);
} }
S32 s; S32 s;
file.read(sizeof(S32), (char*)&s); stream.read(sizeof(S32), (char*)&s);
setLinkCount(s); setLinkCount(s);
if (s > 0) if (s > 0)
{ {
file.read(sizeof(F32) * s * 6, (char*)const_cast<F32*>(mLinkVerts.address())); stream.read(sizeof(F32) * s * 6, (char*)const_cast<F32*>(mLinkVerts.address()));
file.read(sizeof(F32) * s, (char*)const_cast<F32*>(mLinkRads.address())); stream.read(sizeof(F32) * s, (char*)const_cast<F32*>(mLinkRads.address()));
file.read(sizeof(U8) * s, (char*)const_cast<U8*>(mLinkDirs.address())); stream.read(sizeof(U8) * s, (char*)const_cast<U8*>(mLinkDirs.address()));
file.read(sizeof(U8) * s, (char*)const_cast<U8*>(mLinkAreas.address())); stream.read(sizeof(U8) * s, (char*)const_cast<U8*>(mLinkAreas.address()));
file.read(sizeof(U16) * s, (char*)const_cast<U16*>(mLinkFlags.address())); stream.read(sizeof(U16) * s, (char*)const_cast<U16*>(mLinkFlags.address()));
file.read(sizeof(F32) * s, (char*)const_cast<U32*>(mLinkIDs.address())); stream.read(sizeof(F32) * s, (char*)const_cast<U32*>(mLinkIDs.address()));
} }
mLinksUnsynced.fill(false); mLinksUnsynced.fill(false);
mLinkSelectStates.fill(Unselected); mLinkSelectStates.fill(Unselected);
mDeleteLinks.fill(false); mDeleteLinks.fill(false);
file.close(); stream.close();
updateTiles(); updateTiles();
@ -1632,10 +1631,9 @@ bool NavMesh::save()
if(!dStrlen(mFileName) || !nm) if(!dStrlen(mFileName) || !nm)
return false; return false;
File file; FileStream stream;
if(file.open(mFileName, File::Write) != File::Ok) if(!stream.open(mFileName, Torque::FS::File::Write))
{ {
file.close();
Con::errorf("Could not open file %s when saving navmesh %s.", Con::errorf("Could not open file %s when saving navmesh %s.",
mFileName, getName() ? getName() : getIdString()); mFileName, getName() ? getName() : getIdString());
return false; return false;
@ -1653,7 +1651,7 @@ bool NavMesh::save()
header.numTiles++; header.numTiles++;
} }
memcpy(&header.params, nm->getParams(), sizeof(dtNavMeshParams)); memcpy(&header.params, nm->getParams(), sizeof(dtNavMeshParams));
file.write(sizeof(NavMeshSetHeader), (const char*)&header); stream.write(sizeof(NavMeshSetHeader), (const char*)&header);
// Store tiles. // Store tiles.
for(U32 i = 0; i < nm->getMaxTiles(); ++i) for(U32 i = 0; i < nm->getMaxTiles(); ++i)
@ -1665,23 +1663,23 @@ bool NavMesh::save()
tileHeader.tileRef = nm->getTileRef(tile); tileHeader.tileRef = nm->getTileRef(tile);
tileHeader.dataSize = tile->dataSize; tileHeader.dataSize = tile->dataSize;
file.write(sizeof(tileHeader), (const char*)&tileHeader); stream.write(sizeof(tileHeader), (const char*)&tileHeader);
file.write(tile->dataSize, (const char*)tile->data); stream.write(tile->dataSize, (const char*)tile->data);
} }
S32 s = mLinkIDs.size(); S32 s = mLinkIDs.size();
file.write(sizeof(S32), (const char*)&s); stream.write(sizeof(S32), (const char*)&s);
if (s > 0) if (s > 0)
{ {
file.write(sizeof(F32) * s * 6, (const char*)mLinkVerts.address()); stream.write(sizeof(F32) * s * 6, (const char*)mLinkVerts.address());
file.write(sizeof(F32) * s, (const char*)mLinkRads.address()); stream.write(sizeof(F32) * s, (const char*)mLinkRads.address());
file.write(sizeof(U8) * s, (const char*)mLinkDirs.address()); stream.write(sizeof(U8) * s, (const char*)mLinkDirs.address());
file.write(sizeof(U8) * s, (const char*)mLinkAreas.address()); stream.write(sizeof(U8) * s, (const char*)mLinkAreas.address());
file.write(sizeof(U16) * s, (const char*)mLinkFlags.address()); stream.write(sizeof(U16) * s, (const char*)mLinkFlags.address());
file.write(sizeof(U32) * s, (const char*)mLinkIDs.address()); stream.write(sizeof(U32) * s, (const char*)mLinkIDs.address());
} }
file.close(); stream.close();
return true; return true;
} }