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