| 1628 | } |
| 1629 | |
| 1630 | bool NavMesh::save() |
| 1631 | { |
| 1632 | if(!dStrlen(mFileName) || !nm) |
| 1633 | return false; |
| 1634 | |
| 1635 | FileStream stream; |
| 1636 | if(!stream.open(mFileName, Torque::FS::File::Write)) |
| 1637 | { |
| 1638 | Con::errorf("Could not open file %s when saving navmesh %s.", |
| 1639 | mFileName, getName() ? getName() : getIdString()); |
| 1640 | return false; |
| 1641 | } |
| 1642 | |
| 1643 | // Store header. |
| 1644 | NavMeshSetHeader header; |
| 1645 | header.magic = NAVMESHSET_MAGIC; |
| 1646 | header.version = NAVMESHSET_VERSION; |
| 1647 | header.numTiles = 0; |
| 1648 | for(U32 i = 0; i < nm->getMaxTiles(); ++i) |
| 1649 | { |
| 1650 | const dtMeshTile* tile = ((const dtNavMesh*)nm)->getTile(i); |
| 1651 | if (!tile || !tile->header || !tile->dataSize) continue; |
| 1652 | header.numTiles++; |
| 1653 | } |
| 1654 | memcpy(&header.params, nm->getParams(), sizeof(dtNavMeshParams)); |
| 1655 | stream.write(sizeof(NavMeshSetHeader), (const char*)&header); |
| 1656 | |
| 1657 | // Store tiles. |
| 1658 | for(U32 i = 0; i < nm->getMaxTiles(); ++i) |
| 1659 | { |
| 1660 | const dtMeshTile* tile = ((const dtNavMesh*)nm)->getTile(i); |
| 1661 | if(!tile || !tile->header || !tile->dataSize) continue; |
| 1662 | |
| 1663 | NavMeshTileHeader tileHeader; |
| 1664 | tileHeader.tileRef = nm->getTileRef(tile); |
| 1665 | tileHeader.dataSize = tile->dataSize; |
| 1666 | |
| 1667 | stream.write(sizeof(tileHeader), (const char*)&tileHeader); |
| 1668 | stream.write(tile->dataSize, (const char*)tile->data); |
| 1669 | } |
| 1670 | |
| 1671 | S32 s = mLinkIDs.size(); |
| 1672 | stream.write(sizeof(S32), (const char*)&s); |
| 1673 | if (s > 0) |
| 1674 | { |
| 1675 | stream.write(sizeof(F32) * s * 6, (const char*)mLinkVerts.address()); |
| 1676 | stream.write(sizeof(F32) * s, (const char*)mLinkRads.address()); |
| 1677 | stream.write(sizeof(U8) * s, (const char*)mLinkDirs.address()); |
| 1678 | stream.write(sizeof(U8) * s, (const char*)mLinkAreas.address()); |
| 1679 | stream.write(sizeof(U16) * s, (const char*)mLinkFlags.address()); |
| 1680 | stream.write(sizeof(U32) * s, (const char*)mLinkIDs.address()); |
| 1681 | } |
| 1682 | |
| 1683 | stream.close(); |
| 1684 | |
| 1685 | return true; |
| 1686 | } |
| 1687 |
no test coverage detected