diff --git a/modules/gridmap/doc_classes/GridMap.xml b/modules/gridmap/doc_classes/GridMap.xml index 6c64fdc69..070aa03ed 100644 --- a/modules/gridmap/doc_classes/GridMap.xml +++ b/modules/gridmap/doc_classes/GridMap.xml @@ -173,6 +173,13 @@ [code]pos[/code] should be in the GridMap's local coordinate space. + + + + + Sets the [RID] of the navigation map this GridMap node should use for its cell baked navigation meshes. + + diff --git a/modules/gridmap/grid_map.cpp b/modules/gridmap/grid_map.cpp index 85c7f1441..f4ab5e5ce 100644 --- a/modules/gridmap/grid_map.cpp +++ b/modules/gridmap/grid_map.cpp @@ -225,6 +225,30 @@ bool GridMap::is_baking_navigation() { return bake_navigation; } +void GridMap::set_navigation_map(RID p_navigation_map) { + map_override = p_navigation_map; + for (RBMap::Element *E = octant_map.front(); E; E = E->next()) { + Octant &g = *(E->get()); + + for (RBMap::Element *F = g.navmesh_ids.front(); F; F = F->next()) { + if (F->get().region.is_valid()) { + NavigationServer::get_singleton()->region_set_map(F->get().region, map_override); + } + } + } +} + +RID GridMap::get_navigation_map() const { + if (map_override.is_valid()) { + return map_override; + } else if (navigation) { + return navigation->get_rid(); + } else if (is_inside_tree()) { + return get_world_3d()->get_navigation_map(); + } + return RID(); +} + void GridMap::set_navigation_layers(uint32_t p_navigation_layers) { navigation_layers = p_navigation_layers; _recreate_octant_data(); @@ -587,11 +611,7 @@ bool GridMap::_octant_update(const OctantKey &p_key) { NavigationServer::get_singleton()->region_set_navmesh(region, navmesh); NavigationServer::get_singleton()->region_set_transform(region, get_global_transform() * nm.xform); if (is_inside_tree()) { - if (navigation) { - NavigationServer::get_singleton()->region_set_map(region, navigation->get_rid()); - } else { - NavigationServer::get_singleton()->region_set_map(region, get_world_3d()->get_navigation_map()); - } + NavigationServer::get_singleton()->region_set_map(region, get_navigation_map()); } nm.region = region; @@ -711,11 +731,7 @@ void GridMap::_octant_enter_world(const OctantKey &p_key) { NavigationServer::get_singleton()->region_set_navigation_layers(region, navigation_layers); NavigationServer::get_singleton()->region_set_navmesh(region, nm); NavigationServer::get_singleton()->region_set_transform(region, get_global_transform() * E->get().xform); - if (navigation) { - NavigationServer::get_singleton()->region_set_map(region, navigation->get_rid()); - } else { - NavigationServer::get_singleton()->region_set_map(region, get_world_3d()->get_navigation_map()); - } + NavigationServer::get_singleton()->region_set_map(region, get_navigation_map()); E->get().region = region; } } @@ -1004,6 +1020,9 @@ void GridMap::_bind_methods() { ClassDB::bind_method(D_METHOD("set_bake_navigation", "bake_navigation"), &GridMap::set_bake_navigation); ClassDB::bind_method(D_METHOD("is_baking_navigation"), &GridMap::is_baking_navigation); + ClassDB::bind_method(D_METHOD("set_navigation_map", "navigation_map"), &GridMap::set_navigation_map); + ClassDB::bind_method(D_METHOD("get_navigation_map"), &GridMap::get_navigation_map); + ClassDB::bind_method(D_METHOD("set_navigation_layers", "navigation_layers"), &GridMap::set_navigation_layers); ClassDB::bind_method(D_METHOD("get_navigation_layers"), &GridMap::get_navigation_layers); @@ -1318,6 +1337,9 @@ GridMap::GridMap() { clip_above = true; cell_scale = 1.0; + bake_navigation = false; + navigation_layers = 1; + navigation = nullptr; set_notify_transform(true); recreating_octants = false; diff --git a/modules/gridmap/grid_map.h b/modules/gridmap/grid_map.h index 4a1ce59f1..2d5925c76 100644 --- a/modules/gridmap/grid_map.h +++ b/modules/gridmap/grid_map.h @@ -140,8 +140,9 @@ class GridMap : public Spatial { uint32_t collision_layer; uint32_t collision_mask; Ref physics_material; - bool bake_navigation = false; - uint32_t navigation_layers = 1; + bool bake_navigation; + RID map_override; + uint32_t navigation_layers; Transform last_transform; @@ -242,6 +243,9 @@ public: void set_bake_navigation(bool p_bake_navigation); bool is_baking_navigation(); + void set_navigation_map(RID p_navigation_map); + RID get_navigation_map() const; + void set_navigation_layers(uint32_t p_navigation_layers); uint32_t get_navigation_layers() const;