summaryrefslogtreecommitdiffstats
path: root/modules/navigation/3d/nav_mesh_generator_3d.cpp
diff options
context:
space:
mode:
authorRémi Verschelde <rverschelde@gmail.com>2024-04-19 16:28:30 +0200
committerRémi Verschelde <rverschelde@gmail.com>2024-04-19 16:28:30 +0200
commitfba68034860b74039aeaafd160eaeb4e17f7054b (patch)
tree83eb90e81086c0f0f2407a44ca1cb50b34a1e930 /modules/navigation/3d/nav_mesh_generator_3d.cpp
parent626c6a0ff877ee3f4e42e38c42d61a1af07c4c37 (diff)
parent58593d1bb706410bbdbd265ed8b698eb95b7b61f (diff)
downloadredot-engine-fba68034860b74039aeaafd160eaeb4e17f7054b.tar.gz
Merge pull request #90876 from smix8/source_geometry_callback
Add navigation mesh source geometry parsers and callbacks
Diffstat (limited to 'modules/navigation/3d/nav_mesh_generator_3d.cpp')
-rw-r--r--modules/navigation/3d/nav_mesh_generator_3d.cpp60
1 files changed, 60 insertions, 0 deletions
diff --git a/modules/navigation/3d/nav_mesh_generator_3d.cpp b/modules/navigation/3d/nav_mesh_generator_3d.cpp
index b1b3cbed5d..cc3bbdbf01 100644
--- a/modules/navigation/3d/nav_mesh_generator_3d.cpp
+++ b/modules/navigation/3d/nav_mesh_generator_3d.cpp
@@ -66,11 +66,14 @@
NavMeshGenerator3D *NavMeshGenerator3D::singleton = nullptr;
Mutex NavMeshGenerator3D::baking_navmesh_mutex;
Mutex NavMeshGenerator3D::generator_task_mutex;
+RWLock NavMeshGenerator3D::generator_rid_rwlock;
bool NavMeshGenerator3D::use_threads = true;
bool NavMeshGenerator3D::baking_use_multiple_threads = true;
bool NavMeshGenerator3D::baking_use_high_priority_threads = true;
HashSet<Ref<NavigationMesh>> NavMeshGenerator3D::baking_navmeshes;
HashMap<WorkerThreadPool::TaskID, NavMeshGenerator3D::NavMeshGeneratorTask3D *> NavMeshGenerator3D::generator_tasks;
+RID_Owner<NavMeshGenerator3D::NavMeshGeometryParser3D> NavMeshGenerator3D::generator_parser_owner;
+LocalVector<NavMeshGenerator3D::NavMeshGeometryParser3D *> NavMeshGenerator3D::generator_parsers;
NavMeshGenerator3D *NavMeshGenerator3D::get_singleton() {
return singleton;
@@ -139,6 +142,13 @@ void NavMeshGenerator3D::cleanup() {
}
generator_tasks.clear();
+ generator_rid_rwlock.write_lock();
+ for (NavMeshGeometryParser3D *parser : generator_parsers) {
+ generator_parser_owner.free(parser->self);
+ }
+ generator_parsers.clear();
+ generator_rid_rwlock.write_unlock();
+
generator_task_mutex.unlock();
baking_navmesh_mutex.unlock();
}
@@ -254,6 +264,15 @@ void NavMeshGenerator3D::generator_parse_geometry_node(const Ref<NavigationMesh>
#endif
generator_parse_navigationobstacle_node(p_navigation_mesh, p_source_geometry_data, p_node);
+ generator_rid_rwlock.read_lock();
+ for (const NavMeshGeometryParser3D *parser : generator_parsers) {
+ if (!parser->callback.is_valid()) {
+ continue;
+ }
+ parser->callback.call(p_navigation_mesh, p_source_geometry_data, p_node);
+ }
+ generator_rid_rwlock.read_unlock();
+
if (p_recurse_children) {
for (int i = 0; i < p_node->get_child_count(); i++) {
generator_parse_geometry_node(p_navigation_mesh, p_source_geometry_data, p_node->get_child(i), p_recurse_children);
@@ -920,4 +939,45 @@ bool NavMeshGenerator3D::generator_emit_callback(const Callable &p_callback) {
return ce.error == Callable::CallError::CALL_OK;
}
+RID NavMeshGenerator3D::source_geometry_parser_create() {
+ RWLockWrite write_lock(generator_rid_rwlock);
+
+ RID rid = generator_parser_owner.make_rid();
+
+ NavMeshGeometryParser3D *parser = generator_parser_owner.get_or_null(rid);
+ parser->self = rid;
+
+ generator_parsers.push_back(parser);
+
+ return rid;
+}
+
+void NavMeshGenerator3D::source_geometry_parser_set_callback(RID p_parser, const Callable &p_callback) {
+ RWLockWrite write_lock(generator_rid_rwlock);
+
+ NavMeshGeometryParser3D *parser = generator_parser_owner.get_or_null(p_parser);
+ ERR_FAIL_NULL(parser);
+
+ parser->callback = p_callback;
+}
+
+bool NavMeshGenerator3D::owns(RID p_object) {
+ RWLockRead read_lock(generator_rid_rwlock);
+ return generator_parser_owner.owns(p_object);
+}
+
+void NavMeshGenerator3D::free(RID p_object) {
+ RWLockWrite write_lock(generator_rid_rwlock);
+
+ if (generator_parser_owner.owns(p_object)) {
+ NavMeshGeometryParser3D *parser = generator_parser_owner.get_or_null(p_object);
+
+ generator_parsers.erase(parser);
+
+ generator_parser_owner.free(p_object);
+ } else {
+ ERR_PRINT("Attempted to free a NavMeshGenerator3D RID that did not exist (or was already freed).");
+ }
+}
+
#endif // _3D_DISABLED