| 646 | } |
| 647 | |
| 648 | void NavMeshRuntime::AddTileInternal(NavMesh* navMesh, NavMeshTileData& tileData) |
| 649 | { |
| 650 | // Check if that tile has been added to navmesh |
| 651 | NavMeshTile* tile = nullptr; |
| 652 | const auto tileRef = _navMesh->getTileRefAt(tileData.PosX, tileData.PosY, tileData.Layer); |
| 653 | if (tileRef) |
| 654 | { |
| 655 | // Remove any existing tile at that location |
| 656 | if (dtStatusFailed(_navMesh->removeTile(tileRef, nullptr, nullptr))) |
| 657 | { |
| 658 | LOG(Warning, "Failed to remove tile from navmesh {0}", Properties.Name); |
| 659 | } |
| 660 | |
| 661 | // Reuse tile data container |
| 662 | for (int32 i = 0; i < _tiles.Count(); i++) |
| 663 | { |
| 664 | auto& e = _tiles[i]; |
| 665 | if (e.X == tileData.PosX && e.Y == tileData.PosY && e.Layer == tileData.Layer) |
| 666 | { |
| 667 | tile = &e; |
| 668 | break; |
| 669 | } |
| 670 | } |
| 671 | } |
| 672 | if (!tile) |
| 673 | { |
| 674 | // Add tile |
| 675 | tile = &_tiles.AddOne(); |
| 676 | } |
| 677 | |
| 678 | // Copy tile properties |
| 679 | tile->NavMesh = navMesh; |
| 680 | tile->X = tileData.PosX; |
| 681 | tile->Y = tileData.PosY; |
| 682 | tile->Layer = tileData.Layer; |
| 683 | #if USE_DATA_LINK |
| 684 | tile->Data.Link(tileData.Data); |
| 685 | #else |
| 686 | tile->Data.Copy(tileData.Data); |
| 687 | #endif |
| 688 | |
| 689 | // Add tile to navmesh |
| 690 | GET_NAV_TILE_DATA(*tile); |
| 691 | const auto result = _navMesh->addTile(data, dataSize, flags, 0, nullptr); |
| 692 | if (dtStatusFailed(result)) |
| 693 | { |
| 694 | LOG(Warning, "Could not add tile ({2}x{3}, layer {4}) to navmesh {0} (error: {1})", Properties.Name, result & ~DT_FAILURE, tileData.PosX, tileData.PosY, tileData.Layer); |
| 695 | #if USE_NAV_MESH_ALLOC |
| 696 | dtFree(data); |
| 697 | #endif |
| 698 | } |
| 699 | } |
nothing calls this directly
no test coverage detected