Skip to content

Commit ce3ebac

Browse files
committed
Merge pull request #107381 from smix8/ref_iterations_2d
Change 2D navigation region and link updates to an async process
2 parents ae33da9 + 2458370 commit ce3ebac

22 files changed

+1064
-461
lines changed

doc/classes/NavigationServer2D.xml

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -905,6 +905,13 @@
905905
Returns the travel cost of this [param region].
906906
</description>
907907
</method>
908+
<method name="region_get_use_async_iterations" qualifiers="const">
909+
<return type="bool" />
910+
<param index="0" name="region" type="RID" />
911+
<description>
912+
Returns [code]true[/code] if the [param region] uses an async synchronization process that runs on a background thread.
913+
</description>
914+
</method>
908915
<method name="region_get_use_edge_connections" qualifiers="const">
909916
<return type="bool" />
910917
<param index="0" name="region" type="RID" />
@@ -986,6 +993,14 @@
986993
Sets the [param travel_cost] for this [param region].
987994
</description>
988995
</method>
996+
<method name="region_set_use_async_iterations">
997+
<return type="void" />
998+
<param index="0" name="region" type="RID" />
999+
<param index="1" name="enabled" type="bool" />
1000+
<description>
1001+
If [param enabled] is [code]true[/code] the [param region] uses an async synchronization process that runs on a background thread.
1002+
</description>
1003+
</method>
9891004
<method name="region_set_use_edge_connections">
9901005
<return type="void" />
9911006
<param index="0" name="region" type="RID" />

modules/navigation_2d/2d/godot_navigation_server_2d.cpp

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -457,6 +457,19 @@ uint32_t GodotNavigationServer2D::region_get_iteration_id(RID p_region) const {
457457
return region->get_iteration_id();
458458
}
459459

460+
COMMAND_2(region_set_use_async_iterations, RID, p_region, bool, p_enabled) {
461+
NavRegion2D *region = region_owner.get_or_null(p_region);
462+
ERR_FAIL_NULL(region);
463+
region->set_use_async_iterations(p_enabled);
464+
}
465+
466+
bool GodotNavigationServer2D::region_get_use_async_iterations(RID p_region) const {
467+
NavRegion2D *region = region_owner.get_or_null(p_region);
468+
ERR_FAIL_NULL_V(region, false);
469+
470+
return region->get_use_async_iterations();
471+
}
472+
460473
COMMAND_2(region_set_enabled, RID, p_region, bool, p_enabled) {
461474
NavRegion2D *region = region_owner.get_or_null(p_region);
462475
ERR_FAIL_NULL(region);
@@ -581,7 +594,7 @@ void GodotNavigationServer2D::region_set_navigation_polygon(RID p_region, Ref<Na
581594
NavRegion2D *region = region_owner.get_or_null(p_region);
582595
ERR_FAIL_NULL(region);
583596

584-
region->set_navigation_polygon(p_navigation_polygon);
597+
region->set_navigation_mesh(p_navigation_polygon);
585598
}
586599

587600
int GodotNavigationServer2D::region_get_connections_count(RID p_region) const {

modules/navigation_2d/2d/godot_navigation_server_2d.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,9 @@ class GodotNavigationServer2D : public NavigationServer2D {
146146
virtual RID region_create() override;
147147
virtual uint32_t region_get_iteration_id(RID p_region) const override;
148148

149+
COMMAND_2(region_set_use_async_iterations, RID, p_region, bool, p_enabled);
150+
virtual bool region_get_use_async_iterations(RID p_region) const override;
151+
149152
COMMAND_2(region_set_enabled, RID, p_region, bool, p_enabled);
150153
virtual bool region_get_enabled(RID p_region) const override;
151154

modules/navigation_2d/2d/nav_base_iteration_2d.h

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,10 +32,13 @@
3232

3333
#include "../nav_utils_2d.h"
3434

35+
#include "core/object/ref_counted.h"
3536
#include "servers/navigation/navigation_utilities.h"
3637

37-
struct NavBaseIteration2D {
38-
uint32_t id = UINT32_MAX;
38+
class NavBaseIteration2D : public RefCounted {
39+
GDCLASS(NavBaseIteration2D, RefCounted);
40+
41+
public:
3942
bool enabled = true;
4043
uint32_t navigation_layers = 1;
4144
real_t enter_cost = 0.0;
@@ -45,6 +48,7 @@ struct NavBaseIteration2D {
4548
RID owner_rid;
4649
bool owner_use_edge_connections = false;
4750
LocalVector<Nav2D::Polygon> navmesh_polygons;
51+
LocalVector<LocalVector<Nav2D::Connection>> internal_connections;
4852

4953
bool get_enabled() const { return enabled; }
5054
NavigationUtilities::PathSegmentType get_type() const { return owner_type; }
@@ -55,4 +59,10 @@ struct NavBaseIteration2D {
5559
real_t get_travel_cost() const { return travel_cost; }
5660
bool get_use_edge_connections() const { return owner_use_edge_connections; }
5761
const LocalVector<Nav2D::Polygon> &get_navmesh_polygons() const { return navmesh_polygons; }
62+
const LocalVector<LocalVector<Nav2D::Connection>> &get_internal_connections() const { return internal_connections; }
63+
64+
virtual ~NavBaseIteration2D() {
65+
navmesh_polygons.clear();
66+
internal_connections.clear();
67+
}
5868
};

0 commit comments

Comments
 (0)