| 1525 | }; |
| 1526 | |
| 1527 | bool NavMesh::load() |
| 1528 | { |
| 1529 | if(!dStrlen(mFileName)) |
| 1530 | return false; |
| 1531 | |
| 1532 | File file; |
| 1533 | if(file.open(mFileName, File::Read) != File::Ok) |
| 1534 | { |
| 1535 | file.close(); |
| 1536 | Con::errorf("Could not open file %s when loading navmesh %s.", |
| 1537 | mFileName, getName() ? getName() : getIdString()); |
| 1538 | return false; |
| 1539 | } |
| 1540 | |
| 1541 | // Read header. |
| 1542 | NavMeshSetHeader header; |
| 1543 | file.read(sizeof(NavMeshSetHeader), (char*)&header); |
| 1544 | if(header.magic != NAVMESHSET_MAGIC) |
| 1545 | { |
| 1546 | file.close(); |
| 1547 | Con::errorf("Navmesh magic incorrect when loading navmesh %s; possible corrupt navmesh file %s.", |
| 1548 | getName() ? getName() : getIdString(), mFileName); |
| 1549 | return false; |
| 1550 | } |
| 1551 | if(header.version != NAVMESHSET_VERSION) |
| 1552 | { |
| 1553 | file.close(); |
| 1554 | Con::errorf("Navmesh version incorrect when loading navmesh %s; possible corrupt navmesh file %s.", |
| 1555 | getName() ? getName() : getIdString(), mFileName); |
| 1556 | return false; |
| 1557 | } |
| 1558 | |
| 1559 | if(nm) |
| 1560 | dtFreeNavMesh(nm); |
| 1561 | nm = dtAllocNavMesh(); |
| 1562 | if(!nm) |
| 1563 | { |
| 1564 | file.close(); |
| 1565 | Con::errorf("Out of memory when loading navmesh %s.", |
| 1566 | getName() ? getName() : getIdString()); |
| 1567 | return false; |
| 1568 | } |
| 1569 | |
| 1570 | dtStatus status = nm->init(&header.params); |
| 1571 | if(dtStatusFailed(status)) |
| 1572 | { |
| 1573 | file.close(); |
| 1574 | Con::errorf("Failed to initialise navmesh params when loading navmesh %s.", |
| 1575 | getName() ? getName() : getIdString()); |
| 1576 | return false; |
| 1577 | } |
| 1578 | |
| 1579 | // Read tiles. |
| 1580 | for(U32 i = 0; i < header.numTiles; ++i) |
| 1581 | { |
| 1582 | NavMeshTileHeader tileHeader; |
| 1583 | file.read(sizeof(NavMeshTileHeader), (char*)&tileHeader); |
| 1584 | if(!tileHeader.tileRef || !tileHeader.dataSize) |
no test coverage detected