diff options
Diffstat (limited to 'modules/navigation')
-rw-r--r-- | modules/navigation/godot_navigation_server.cpp | 28 | ||||
-rw-r--r-- | modules/navigation/godot_navigation_server.h | 5 | ||||
-rw-r--r-- | modules/navigation/nav_link.cpp | 10 | ||||
-rw-r--r-- | modules/navigation/nav_link.h | 4 | ||||
-rw-r--r-- | modules/navigation/nav_map.cpp | 6 | ||||
-rw-r--r-- | modules/navigation/nav_region.cpp | 10 | ||||
-rw-r--r-- | modules/navigation/nav_region.h | 4 |
7 files changed, 67 insertions, 0 deletions
diff --git a/modules/navigation/godot_navigation_server.cpp b/modules/navigation/godot_navigation_server.cpp index b73c5ca3e2..29fa73aa85 100644 --- a/modules/navigation/godot_navigation_server.cpp +++ b/modules/navigation/godot_navigation_server.cpp @@ -340,6 +340,20 @@ RID GodotNavigationServer::region_create() { return rid; } +COMMAND_2(region_set_enabled, RID, p_region, bool, p_enabled) { + NavRegion *region = region_owner.get_or_null(p_region); + ERR_FAIL_COND(region == nullptr); + + region->set_enabled(p_enabled); +} + +bool GodotNavigationServer::region_get_enabled(RID p_region) const { + const NavRegion *region = region_owner.get_or_null(p_region); + ERR_FAIL_COND_V(region == nullptr, false); + + return region->get_enabled(); +} + COMMAND_2(region_set_use_edge_connections, RID, p_region, bool, p_enabled) { NavRegion *region = region_owner.get_or_null(p_region); ERR_FAIL_COND(region == nullptr); @@ -512,6 +526,20 @@ RID GodotNavigationServer::link_get_map(const RID p_link) const { return RID(); } +COMMAND_2(link_set_enabled, RID, p_link, bool, p_enabled) { + NavLink *link = link_owner.get_or_null(p_link); + ERR_FAIL_COND(link == nullptr); + + link->set_enabled(p_enabled); +} + +bool GodotNavigationServer::link_get_enabled(RID p_link) const { + const NavLink *link = link_owner.get_or_null(p_link); + ERR_FAIL_COND_V(link == nullptr, false); + + return link->get_enabled(); +} + COMMAND_2(link_set_bidirectional, RID, p_link, bool, p_bidirectional) { NavLink *link = link_owner.get_or_null(p_link); ERR_FAIL_COND(link == nullptr); diff --git a/modules/navigation/godot_navigation_server.h b/modules/navigation/godot_navigation_server.h index 95aa88194e..0b3789102c 100644 --- a/modules/navigation/godot_navigation_server.h +++ b/modules/navigation/godot_navigation_server.h @@ -135,6 +135,9 @@ public: virtual RID region_create() override; + COMMAND_2(region_set_enabled, RID, p_region, bool, p_enabled); + virtual bool region_get_enabled(RID p_region) const override; + COMMAND_2(region_set_use_edge_connections, RID, p_region, bool, p_enabled); virtual bool region_get_use_edge_connections(RID p_region) const override; @@ -164,6 +167,8 @@ public: virtual RID link_create() override; COMMAND_2(link_set_map, RID, p_link, RID, p_map); virtual RID link_get_map(RID p_link) const override; + COMMAND_2(link_set_enabled, RID, p_link, bool, p_enabled); + virtual bool link_get_enabled(RID p_link) const override; COMMAND_2(link_set_bidirectional, RID, p_link, bool, p_bidirectional); virtual bool link_is_bidirectional(RID p_link) const override; COMMAND_2(link_set_navigation_layers, RID, p_link, uint32_t, p_navigation_layers); diff --git a/modules/navigation/nav_link.cpp b/modules/navigation/nav_link.cpp index d712987a46..c693cc91c8 100644 --- a/modules/navigation/nav_link.cpp +++ b/modules/navigation/nav_link.cpp @@ -49,6 +49,16 @@ void NavLink::set_map(NavMap *p_map) { } } +void NavLink::set_enabled(bool p_enabled) { + if (enabled == p_enabled) { + return; + } + enabled = p_enabled; + + // TODO: This should not require a full rebuild as the link has not really changed. + link_dirty = true; +}; + void NavLink::set_bidirectional(bool p_bidirectional) { if (bidirectional == p_bidirectional) { return; diff --git a/modules/navigation/nav_link.h b/modules/navigation/nav_link.h index 0b8ad4db69..a7609831db 100644 --- a/modules/navigation/nav_link.h +++ b/modules/navigation/nav_link.h @@ -39,6 +39,7 @@ class NavLink : public NavBase { bool bidirectional = true; Vector3 start_position; Vector3 end_position; + bool enabled = true; bool link_dirty = true; @@ -52,6 +53,9 @@ public: return map; } + void set_enabled(bool p_enabled); + bool get_enabled() const { return enabled; } + void set_bidirectional(bool p_bidirectional); bool is_bidirectional() const { return bidirectional; diff --git a/modules/navigation/nav_map.cpp b/modules/navigation/nav_map.cpp index 3a1d412618..745c227fe5 100644 --- a/modules/navigation/nav_map.cpp +++ b/modules/navigation/nav_map.cpp @@ -804,6 +804,9 @@ void NavMap::sync() { // Resize the polygon count. int count = 0; for (const NavRegion *region : regions) { + if (!region->get_enabled()) { + continue; + } count += region->get_polygons().size(); } polygons.resize(count); @@ -811,6 +814,9 @@ void NavMap::sync() { // Copy all region polygons in the map. count = 0; for (const NavRegion *region : regions) { + if (!region->get_enabled()) { + continue; + } const LocalVector<gd::Polygon> &polygons_source = region->get_polygons(); for (uint32_t n = 0; n < polygons_source.size(); n++) { polygons[count + n] = polygons_source[n]; diff --git a/modules/navigation/nav_region.cpp b/modules/navigation/nav_region.cpp index 9c0ce3e71e..4e7964ed76 100644 --- a/modules/navigation/nav_region.cpp +++ b/modules/navigation/nav_region.cpp @@ -51,6 +51,16 @@ void NavRegion::set_map(NavMap *p_map) { } } +void NavRegion::set_enabled(bool p_enabled) { + if (enabled == p_enabled) { + return; + } + enabled = p_enabled; + + // TODO: This should not require a full rebuild as the region has not really changed. + polygons_dirty = true; +}; + void NavRegion::set_use_edge_connections(bool p_enabled) { if (use_edge_connections != p_enabled) { use_edge_connections = p_enabled; diff --git a/modules/navigation/nav_region.h b/modules/navigation/nav_region.h index 0c3c1b56b6..6a8ebe5336 100644 --- a/modules/navigation/nav_region.h +++ b/modules/navigation/nav_region.h @@ -41,6 +41,7 @@ class NavRegion : public NavBase { Transform3D transform; Ref<NavigationMesh> mesh; Vector<gd::Edge::Connection> connections; + bool enabled = true; bool use_edge_connections = true; @@ -58,6 +59,9 @@ public: polygons_dirty = true; } + void set_enabled(bool p_enabled); + bool get_enabled() const { return enabled; } + void set_map(NavMap *p_map); NavMap *get_map() const { return map; |