|
@@ -226,6 +226,27 @@ bool GridMap::is_baking_navigation() {
|
|
|
return bake_navigation;
|
|
|
}
|
|
|
|
|
|
+void GridMap::set_navigation_map(RID p_navigation_map) {
|
|
|
+ map_override = p_navigation_map;
|
|
|
+ for (const KeyValue<OctantKey, Octant *> &E : octant_map) {
|
|
|
+ Octant &g = *octant_map[E.key];
|
|
|
+ for (KeyValue<IndexKey, Octant::NavMesh> &F : g.navmesh_ids) {
|
|
|
+ if (F.value.region.is_valid()) {
|
|
|
+ NavigationServer3D::get_singleton()->region_set_map(F.value.region, map_override);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+RID GridMap::get_navigation_map() const {
|
|
|
+ if (map_override.is_valid()) {
|
|
|
+ return map_override;
|
|
|
+ } 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();
|
|
@@ -639,7 +660,11 @@ bool GridMap::_octant_update(const OctantKey &p_key) {
|
|
|
NavigationServer3D::get_singleton()->region_set_navmesh(region, navmesh);
|
|
|
NavigationServer3D::get_singleton()->region_set_transform(region, get_global_transform() * nm.xform);
|
|
|
if (is_inside_tree()) {
|
|
|
- NavigationServer3D::get_singleton()->region_set_map(region, get_world_3d()->get_navigation_map());
|
|
|
+ if (map_override.is_valid()) {
|
|
|
+ NavigationServer3D::get_singleton()->region_set_map(region, map_override);
|
|
|
+ } else {
|
|
|
+ NavigationServer3D::get_singleton()->region_set_map(region, get_world_3d()->get_navigation_map());
|
|
|
+ }
|
|
|
}
|
|
|
nm.region = region;
|
|
|
|
|
@@ -757,7 +782,11 @@ void GridMap::_octant_enter_world(const OctantKey &p_key) {
|
|
|
NavigationServer3D::get_singleton()->region_set_navigation_layers(region, navigation_layers);
|
|
|
NavigationServer3D::get_singleton()->region_set_navmesh(region, nm);
|
|
|
NavigationServer3D::get_singleton()->region_set_transform(region, get_global_transform() * F.value.xform);
|
|
|
- NavigationServer3D::get_singleton()->region_set_map(region, get_world_3d()->get_navigation_map());
|
|
|
+ if (map_override.is_valid()) {
|
|
|
+ NavigationServer3D::get_singleton()->region_set_map(region, map_override);
|
|
|
+ } else {
|
|
|
+ NavigationServer3D::get_singleton()->region_set_map(region, get_world_3d()->get_navigation_map());
|
|
|
+ }
|
|
|
|
|
|
F.value.region = region;
|
|
|
}
|
|
@@ -1022,6 +1051,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", "layers"), &GridMap::set_navigation_layers);
|
|
|
ClassDB::bind_method(D_METHOD("get_navigation_layers"), &GridMap::get_navigation_layers);
|
|
|
|