summaryrefslogtreecommitdiffstats
path: root/modules/navigation
diff options
context:
space:
mode:
Diffstat (limited to 'modules/navigation')
-rw-r--r--modules/navigation/godot_navigation_server.cpp28
-rw-r--r--modules/navigation/godot_navigation_server.h5
-rw-r--r--modules/navigation/nav_link.cpp10
-rw-r--r--modules/navigation/nav_link.h4
-rw-r--r--modules/navigation/nav_map.cpp6
-rw-r--r--modules/navigation/nav_region.cpp10
-rw-r--r--modules/navigation/nav_region.h4
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;