summaryrefslogtreecommitdiff
path: root/scene
diff options
context:
space:
mode:
authorRémi Verschelde <rverschelde@gmail.com>2023-02-14 11:05:05 +0100
committerRémi Verschelde <rverschelde@gmail.com>2023-02-14 11:05:05 +0100
commit44ad6355054adfa143dbd9d7a1f85bd8231bba14 (patch)
tree0c3ed94e3f4daf8b0538b0f88e003e671c187685 /scene
parent1fcee45ae5c37ef6e8e5a61fc4f246e04aaa8b28 (diff)
parentfef6ffabe5f466545cf26e1a5e401d1c14825f2c (diff)
Merge pull request #73261 from smix8/fix_tilemap_invalid_rid_error_4.x
Fix TileMap NavigationServer 'Invalid ID' error
Diffstat (limited to 'scene')
-rw-r--r--scene/2d/tile_map.cpp7
-rw-r--r--scene/2d/tile_map.h1
2 files changed, 6 insertions, 2 deletions
diff --git a/scene/2d/tile_map.cpp b/scene/2d/tile_map.cpp
index 2e0b16388f..11e59d9858 100644
--- a/scene/2d/tile_map.cpp
+++ b/scene/2d/tile_map.cpp
@@ -754,8 +754,9 @@ TileMap::VisibilityMode TileMap::get_navigation_visibility_mode() {
void TileMap::set_navigation_map(int p_layer, RID p_map) {
ERR_FAIL_INDEX(p_layer, (int)layers.size());
-
+ ERR_FAIL_COND_MSG(!is_inside_tree(), "A TileMap navigation map can only be changed while inside the SceneTree.");
layers[p_layer].navigation_map = p_map;
+ layers[p_layer].uses_world_navigation_map = p_map == get_world_2d()->get_navigation_map();
}
RID TileMap::get_navigation_map(int p_layer) const {
@@ -1111,10 +1112,12 @@ void TileMap::_navigation_update_layer(int p_layer) {
if (p_layer == 0 && is_inside_tree()) {
// Use the default World2D navigation map for the first layer when empty.
layers[p_layer].navigation_map = get_world_2d()->get_navigation_map();
+ layers[p_layer].uses_world_navigation_map = true;
} else {
RID new_layer_map = NavigationServer2D::get_singleton()->map_create();
NavigationServer2D::get_singleton()->map_set_active(new_layer_map, true);
layers[p_layer].navigation_map = new_layer_map;
+ layers[p_layer].uses_world_navigation_map = false;
}
}
}
@@ -1124,7 +1127,7 @@ void TileMap::_navigation_cleanup_layer(int p_layer) {
ERR_FAIL_NULL(NavigationServer2D::get_singleton());
if (layers[p_layer].navigation_map.is_valid()) {
- if (is_inside_tree() && layers[p_layer].navigation_map == get_world_2d()->get_navigation_map()) {
+ if (layers[p_layer].uses_world_navigation_map) {
// Do not delete the World2D default navigation map.
return;
}
diff --git a/scene/2d/tile_map.h b/scene/2d/tile_map.h
index 62d7612be2..e9c1cb0c11 100644
--- a/scene/2d/tile_map.h
+++ b/scene/2d/tile_map.h
@@ -212,6 +212,7 @@ private:
HashMap<Vector2i, TileMapQuadrant> quadrant_map;
SelfList<TileMapQuadrant>::List dirty_quadrant_list;
RID navigation_map;
+ bool uses_world_navigation_map = false;
};
LocalVector<TileMapLayer> layers;
int selected_layer = -1;