1
0
mirror of https://github.com/godotengine/godot.git synced 2025-11-18 14:21:41 +00:00

Make NavMap objects request sync only on demand

Replaces brute-force sync check loop with a self-listing system where each object is responsible for its own dirty sync, requesting it on demand only.
This commit is contained in:
smix8
2024-11-24 18:30:19 +01:00
parent bbc54692c0
commit ba5a3577a5
10 changed files with 341 additions and 73 deletions

View File

@@ -32,9 +32,6 @@
#include "nav_map.h"
NavAgent::NavAgent() {
}
void NavAgent::set_avoidance_enabled(bool p_enabled) {
avoidance_enabled = p_enabled;
_update_rvo_agent_properties();
@@ -87,6 +84,8 @@ void NavAgent::_update_rvo_agent_properties() {
}
}
agent_dirty = true;
request_sync();
}
void NavAgent::set_map(NavMap *p_map) {
@@ -94,6 +93,8 @@ void NavAgent::set_map(NavMap *p_map) {
return;
}
cancel_sync_request();
if (map) {
map->remove_agent(this);
}
@@ -106,6 +107,8 @@ void NavAgent::set_map(NavMap *p_map) {
if (avoidance_enabled) {
map->set_agent_as_controlled(this);
}
request_sync();
}
}
@@ -156,6 +159,8 @@ void NavAgent::set_neighbor_distance(real_t p_neighbor_distance) {
rvo_agent_2d.neighborDist_ = neighbor_distance;
}
agent_dirty = true;
request_sync();
}
void NavAgent::set_max_neighbors(int p_max_neighbors) {
@@ -166,6 +171,8 @@ void NavAgent::set_max_neighbors(int p_max_neighbors) {
rvo_agent_2d.maxNeighbors_ = max_neighbors;
}
agent_dirty = true;
request_sync();
}
void NavAgent::set_time_horizon_agents(real_t p_time_horizon) {
@@ -176,6 +183,8 @@ void NavAgent::set_time_horizon_agents(real_t p_time_horizon) {
rvo_agent_2d.timeHorizon_ = time_horizon_agents;
}
agent_dirty = true;
request_sync();
}
void NavAgent::set_time_horizon_obstacles(real_t p_time_horizon) {
@@ -186,6 +195,8 @@ void NavAgent::set_time_horizon_obstacles(real_t p_time_horizon) {
rvo_agent_2d.timeHorizonObst_ = time_horizon_obstacles;
}
agent_dirty = true;
request_sync();
}
void NavAgent::set_radius(real_t p_radius) {
@@ -196,6 +207,8 @@ void NavAgent::set_radius(real_t p_radius) {
rvo_agent_2d.radius_ = radius;
}
agent_dirty = true;
request_sync();
}
void NavAgent::set_height(real_t p_height) {
@@ -206,6 +219,8 @@ void NavAgent::set_height(real_t p_height) {
rvo_agent_2d.height_ = height;
}
agent_dirty = true;
request_sync();
}
void NavAgent::set_max_speed(real_t p_max_speed) {
@@ -218,6 +233,8 @@ void NavAgent::set_max_speed(real_t p_max_speed) {
}
}
agent_dirty = true;
request_sync();
}
void NavAgent::set_position(const Vector3 p_position) {
@@ -231,6 +248,8 @@ void NavAgent::set_position(const Vector3 p_position) {
}
}
agent_dirty = true;
request_sync();
}
void NavAgent::set_target_position(const Vector3 p_target_position) {
@@ -249,6 +268,8 @@ void NavAgent::set_velocity(const Vector3 p_velocity) {
}
}
agent_dirty = true;
request_sync();
}
void NavAgent::set_velocity_forced(const Vector3 p_velocity) {
@@ -265,6 +286,8 @@ void NavAgent::set_velocity_forced(const Vector3 p_velocity) {
}
}
agent_dirty = true;
request_sync();
}
void NavAgent::update() {
@@ -286,6 +309,8 @@ void NavAgent::set_avoidance_mask(uint32_t p_mask) {
rvo_agent_2d.avoidance_mask_ = avoidance_mask;
}
agent_dirty = true;
request_sync();
}
void NavAgent::set_avoidance_layers(uint32_t p_layers) {
@@ -296,6 +321,8 @@ void NavAgent::set_avoidance_layers(uint32_t p_layers) {
rvo_agent_2d.avoidance_layers_ = avoidance_layers;
}
agent_dirty = true;
request_sync();
}
void NavAgent::set_avoidance_priority(real_t p_priority) {
@@ -308,12 +335,16 @@ void NavAgent::set_avoidance_priority(real_t p_priority) {
rvo_agent_2d.avoidance_priority_ = avoidance_priority;
}
agent_dirty = true;
request_sync();
}
bool NavAgent::check_dirty() {
const bool was_dirty = agent_dirty;
bool NavAgent::is_dirty() const {
return agent_dirty;
}
void NavAgent::sync() {
agent_dirty = false;
return was_dirty;
}
const Dictionary NavAgent::get_avoidance_data() const {
@@ -372,3 +403,23 @@ void NavAgent::set_paused(bool p_paused) {
bool NavAgent::get_paused() const {
return paused;
}
void NavAgent::request_sync() {
if (map && !sync_dirty_request_list_element.in_list()) {
map->add_agent_sync_dirty_request(&sync_dirty_request_list_element);
}
}
void NavAgent::cancel_sync_request() {
if (map && sync_dirty_request_list_element.in_list()) {
map->remove_agent_sync_dirty_request(&sync_dirty_request_list_element);
}
}
NavAgent::NavAgent() :
sync_dirty_request_list_element(this) {
}
NavAgent::~NavAgent() {
cancel_sync_request();
}