diff --git a/Engine/source/T3D/aiPlayer.h b/Engine/source/T3D/aiPlayer.h index ca5b2d596..692fd6c3f 100644 --- a/Engine/source/T3D/aiPlayer.h +++ b/Engine/source/T3D/aiPlayer.h @@ -28,9 +28,9 @@ #endif #ifdef TORQUE_NAVIGATION_ENABLED -#include "walkabout/navPath.h" -#include "walkabout/navMesh.h" -#include "walkabout/coverPoint.h" +#include "navigation/navPath.h" +#include "navigation/navMesh.h" +#include "navigation/coverPoint.h" #endif // TORQUE_NAVIGATION_ENABLED class AIPlayer : public Player { diff --git a/Engine/source/navigation/navMesh.cpp b/Engine/source/navigation/navMesh.cpp index c078988be..38386b551 100644 --- a/Engine/source/navigation/navMesh.cpp +++ b/Engine/source/navigation/navMesh.cpp @@ -20,8 +20,6 @@ // IN THE SOFTWARE. //----------------------------------------------------------------------------- -#include - #include "navMesh.h" #include "navContext.h" #include @@ -41,6 +39,8 @@ #include "core/stream/bitStream.h" #include "math/mathIO.h" +#include "core/fileio.h" + extern bool gEditingMission; IMPLEMENT_CO_NETOBJECT_V1(NavMesh); @@ -1496,22 +1496,31 @@ bool NavMesh::load() if(!dStrlen(mFileName)) return false; - FILE* fp = fopen(mFileName, "rb"); - if(!fp) + File file; + if(file.open(mFileName, File::Read) != File::Ok) + { + file.close(); + Con::errorf("Could not open file %s when loading navmesh %s.", + mFileName, getName() ? getName() : getIdString()); return false; + } // Read header. NavMeshSetHeader header; - fread(&header, sizeof(NavMeshSetHeader), 1, fp); + file.read(sizeof(NavMeshSetHeader), (char*)&header); if(header.magic != NAVMESHSET_MAGIC) { - fclose(fp); - return 0; + file.close(); + Con::errorf("Navmesh magic incorrect when loading navmesh %s; possible corrupt navmesh file %s.", + getName() ? getName() : getIdString(), mFileName); + return false; } if(header.version != NAVMESHSET_VERSION) { - fclose(fp); - return 0; + file.close(); + Con::errorf("Navmesh version incorrect when loading navmesh %s; possible corrupt navmesh file %s.", + getName() ? getName() : getIdString(), mFileName); + return false; } if(nm) @@ -1519,14 +1528,18 @@ bool NavMesh::load() nm = dtAllocNavMesh(); if(!nm) { - fclose(fp); + file.close(); + Con::errorf("Out of memory when loading navmesh %s.", + getName() ? getName() : getIdString()); return false; } dtStatus status = nm->init(&header.params); if(dtStatusFailed(status)) { - fclose(fp); + file.close(); + Con::errorf("Failed to initialise navmesh params when loading navmesh %s.", + getName() ? getName() : getIdString()); return false; } @@ -1534,32 +1547,32 @@ bool NavMesh::load() for(U32 i = 0; i < header.numTiles; ++i) { NavMeshTileHeader tileHeader; - fread(&tileHeader, sizeof(tileHeader), 1, fp); + file.read(sizeof(NavMeshTileHeader), (char*)&tileHeader); if(!tileHeader.tileRef || !tileHeader.dataSize) break; unsigned char* data = (unsigned char*)dtAlloc(tileHeader.dataSize, DT_ALLOC_PERM); if(!data) break; memset(data, 0, tileHeader.dataSize); - fread(data, tileHeader.dataSize, 1, fp); + file.read(tileHeader.dataSize, (char*)data); nm->addTile(data, tileHeader.dataSize, DT_TILE_FREE_DATA, tileHeader.tileRef, 0); } S32 s; - fread(&s, sizeof(S32), 1, fp); + file.read(sizeof(S32), (char*)&s); setLinkCount(s); - fread(const_cast(mLinkVerts.address()), sizeof(F32), s * 6, fp); - fread(const_cast(mLinkRads.address()), sizeof(F32), s, fp); - fread(const_cast(mLinkDirs.address()), sizeof(U8), s, fp); - fread(const_cast(mLinkAreas.address()), sizeof(U8), s, fp); - fread(const_cast(mLinkFlags.address()), sizeof(unsigned short), s, fp); - fread(const_cast(mLinkIDs.address()), sizeof(U32), s, fp); + file.read(sizeof(F32) * s * 6, (char*)const_cast(mLinkVerts.address())); + file.read(sizeof(F32) * s, (char*)const_cast(mLinkRads.address())); + file.read(sizeof(U8) * s, (char*)const_cast(mLinkDirs.address())); + file.read(sizeof(U8) * s, (char*)const_cast(mLinkAreas.address())); + file.read(sizeof(U16) * s, (char*)const_cast(mLinkFlags.address())); + file.read(sizeof(F32) * s, (char*)const_cast(mLinkIDs.address())); mLinksUnsynced.fill(false); mLinkSelectStates.fill(Unselected); mDeleteLinks.fill(false); - fclose(fp); + file.close(); updateTiles(); @@ -1581,18 +1594,17 @@ DefineEngineMethod(NavMesh, load, bool, (),, bool NavMesh::save() { -#ifdef WALKABOUT_DEMO - Con::errorf("Sorry, this demo code doesn't allow you to save NavMeshes to files."); - Con::executef("OnWalkaboutDemoSave"); - return false; -#else if(!dStrlen(mFileName) || !nm) return false; - - // Save our navmesh into a file to load from next time - FILE* fp = fopen(mFileName, "wb"); - if(!fp) + + File file; + if(file.open(mFileName, File::Write) != File::Ok) + { + file.close(); + Con::errorf("Could not open file %s when saving navmesh %s.", + mFileName, getName() ? getName() : getIdString()); return false; + } // Store header. NavMeshSetHeader header; @@ -1606,7 +1618,7 @@ bool NavMesh::save() header.numTiles++; } memcpy(&header.params, nm->getParams(), sizeof(dtNavMeshParams)); - fwrite(&header, sizeof(NavMeshSetHeader), 1, fp); + file.write(sizeof(NavMeshSetHeader), (const char*)&header); // Store tiles. for(U32 i = 0; i < nm->getMaxTiles(); ++i) @@ -1617,24 +1629,23 @@ bool NavMesh::save() NavMeshTileHeader tileHeader; tileHeader.tileRef = nm->getTileRef(tile); tileHeader.dataSize = tile->dataSize; - fwrite(&tileHeader, sizeof(tileHeader), 1, fp); - fwrite(tile->data, tile->dataSize, 1, fp); + file.write(sizeof(tileHeader), (const char*)&tileHeader); + file.write(tile->dataSize, (const char*)tile->data); } S32 s = mLinkIDs.size(); - fwrite(&s, sizeof(S32), 1, fp); - fwrite(mLinkVerts.address(), sizeof(F32), s * 6, fp); - fwrite(mLinkRads.address(), sizeof(F32), s, fp); - fwrite(mLinkDirs.address(), sizeof(U8), s, fp); - fwrite(mLinkAreas.address(), sizeof(U8), s, fp); - fwrite(mLinkFlags.address(), sizeof(unsigned short), s, fp); - fwrite(mLinkIDs.address(), sizeof(U32), s, fp); + file.write(sizeof(S32), (const char*)&s); + file.write(sizeof(F32) * s * 6, (const char*)mLinkVerts.address()); + file.write(sizeof(F32) * s, (const char*)mLinkRads.address()); + file.write(sizeof(U8) * s, (const char*)mLinkDirs.address()); + file.write(sizeof(U8) * s, (const char*)mLinkAreas.address()); + file.write(sizeof(U16) * s, (const char*)mLinkFlags.address()); + file.write(sizeof(U32) * s, (const char*)mLinkIDs.address()); - fclose(fp); + file.close(); return true; -#endif } DefineEngineMethod(NavMesh, save, void, (),, diff --git a/Engine/source/navigation/navMesh.h b/Engine/source/navigation/navMesh.h index 2d689dd57..6fd8d65bf 100644 --- a/Engine/source/navigation/navMesh.h +++ b/Engine/source/navigation/navMesh.h @@ -349,7 +349,7 @@ private: Vector mLinkRads; ///< Radius of each link Vector mLinkDirs; ///< Direction (one-way or bidirectional) Vector mLinkAreas; ///< Area ID - Vector mLinkFlags; ///< Flags + Vector mLinkFlags; ///< Flags Vector mLinkIDs; ///< ID number of each link Vector mLinkSelectStates; ///< Selection state of links Vector mDeleteLinks; ///< Link will be deleted next build. diff --git a/Engine/source/navigation/navPath.h b/Engine/source/navigation/navPath.h index 29a291963..ccc16386d 100644 --- a/Engine/source/navigation/navPath.h +++ b/Engine/source/navigation/navPath.h @@ -154,7 +154,7 @@ private: dtQueryFilter mFilter; S32 mCurIndex; Vector mPoints; - Vector mFlags; + Vector mFlags; Vector mVisitPoints; F32 mLength; diff --git a/Engine/source/navigation/torqueRecast.h b/Engine/source/navigation/torqueRecast.h index 57fe7fdc5..e703e6349 100644 --- a/Engine/source/navigation/torqueRecast.h +++ b/Engine/source/navigation/torqueRecast.h @@ -78,7 +78,7 @@ struct LinkData { bool ledge; bool climb; bool teleport; - LinkData(unsigned short flags = 0) + LinkData(U16 flags = 0) { walk = flags & WalkFlag; jump = flags & JumpFlag; @@ -88,7 +88,7 @@ struct LinkData { climb = flags & ClimbFlag; teleport = flags & TeleportFlag; } - unsigned short getFlags() const + U16 getFlags() const { return (walk ? WalkFlag : 0) |