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:
@@ -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();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user