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
+36 -3
View File
@@ -37,6 +37,8 @@ void NavLink::set_map(NavMap *p_map) {
return;
}
cancel_sync_request();
if (map) {
map->remove_link(this);
}
@@ -46,6 +48,7 @@ void NavLink::set_map(NavMap *p_map) {
if (map) {
map->add_link(this);
request_sync();
}
}
@@ -57,6 +60,8 @@ void NavLink::set_enabled(bool p_enabled) {
// TODO: This should not require a full rebuild as the link has not really changed.
link_dirty = true;
request_sync();
}
void NavLink::set_bidirectional(bool p_bidirectional) {
@@ -65,6 +70,8 @@ void NavLink::set_bidirectional(bool p_bidirectional) {
}
bidirectional = p_bidirectional;
link_dirty = true;
request_sync();
}
void NavLink::set_start_position(const Vector3 p_position) {
@@ -73,6 +80,8 @@ void NavLink::set_start_position(const Vector3 p_position) {
}
start_position = p_position;
link_dirty = true;
request_sync();
}
void NavLink::set_end_position(const Vector3 p_position) {
@@ -81,11 +90,35 @@ void NavLink::set_end_position(const Vector3 p_position) {
}
end_position = p_position;
link_dirty = true;
request_sync();
}
bool NavLink::check_dirty() {
const bool was_dirty = link_dirty;
bool NavLink::is_dirty() const {
return link_dirty;
}
void NavLink::sync() {
link_dirty = false;
return was_dirty;
}
void NavLink::request_sync() {
if (map && !sync_dirty_request_list_element.in_list()) {
map->add_link_sync_dirty_request(&sync_dirty_request_list_element);
}
}
void NavLink::cancel_sync_request() {
if (map && sync_dirty_request_list_element.in_list()) {
map->remove_link_sync_dirty_request(&sync_dirty_request_list_element);
}
}
NavLink::NavLink() :
sync_dirty_request_list_element(this) {
type = NavigationUtilities::PathSegmentType::PATH_SEGMENT_TYPE_LINK;
}
NavLink::~NavLink() {
cancel_sync_request();
}