You've already forked godot
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:
@@ -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();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user