diff options
Diffstat (limited to 'tests')
-rw-r--r-- | tests/scene/test_navigation_region_3d.h | 40 | ||||
-rw-r--r-- | tests/servers/test_navigation_server_3d.h | 18 |
2 files changed, 58 insertions, 0 deletions
diff --git a/tests/scene/test_navigation_region_3d.h b/tests/scene/test_navigation_region_3d.h index 4c5ae34615..f7cf7c7912 100644 --- a/tests/scene/test_navigation_region_3d.h +++ b/tests/scene/test_navigation_region_3d.h @@ -31,8 +31,10 @@ #ifndef TEST_NAVIGATION_REGION_3D_H #define TEST_NAVIGATION_REGION_3D_H +#include "scene/3d/mesh_instance_3d.h" #include "scene/3d/navigation_region_3d.h" #include "scene/main/window.h" +#include "scene/resources/primitive_meshes.h" #include "tests/test_macros.h" @@ -44,6 +46,44 @@ TEST_SUITE("[Navigation]") { CHECK(region_node->get_region_rid().is_valid()); memdelete(region_node); } + + TEST_CASE("[SceneTree][NavigationRegion3D] Region should bake successfully from valid geometry") { + Node3D *node_3d = memnew(Node3D); + SceneTree::get_singleton()->get_root()->add_child(node_3d); + Ref<NavigationMesh> navigation_mesh = memnew(NavigationMesh); + NavigationRegion3D *navigation_region = memnew(NavigationRegion3D); + navigation_region->set_navigation_mesh(navigation_mesh); + node_3d->add_child(navigation_region); + Ref<PlaneMesh> plane_mesh = memnew(PlaneMesh); + plane_mesh->set_size(Size2(10.0, 10.0)); + MeshInstance3D *mesh_instance = memnew(MeshInstance3D); + mesh_instance->set_mesh(plane_mesh); + navigation_region->add_child(mesh_instance); + + CHECK_FALSE(navigation_region->is_baking()); + CHECK_EQ(navigation_mesh->get_polygon_count(), 0); + CHECK_EQ(navigation_mesh->get_vertices().size(), 0); + + SUBCASE("Synchronous bake should have immediate effects") { + navigation_region->bake_navigation_mesh(false); + CHECK_FALSE(navigation_region->is_baking()); + CHECK_NE(navigation_mesh->get_polygon_count(), 0); + CHECK_NE(navigation_mesh->get_vertices().size(), 0); + } + + // Race condition is present in the below subcase, but baking should take many + // orders of magnitude longer than basic checks on the main thread, so it's fine. + SUBCASE("Asynchronous bake should not be immediate") { + navigation_region->bake_navigation_mesh(true); + CHECK(navigation_region->is_baking()); + CHECK_EQ(navigation_mesh->get_polygon_count(), 0); + CHECK_EQ(navigation_mesh->get_vertices().size(), 0); + } + + memdelete(mesh_instance); + memdelete(navigation_region); + memdelete(node_3d); + } } } //namespace TestNavigationRegion3D diff --git a/tests/servers/test_navigation_server_3d.h b/tests/servers/test_navigation_server_3d.h index 5ab2975b74..5b5c1faac8 100644 --- a/tests/servers/test_navigation_server_3d.h +++ b/tests/servers/test_navigation_server_3d.h @@ -720,6 +720,24 @@ TEST_SUITE("[Navigation]") { navigation_server->free(map); navigation_server->process(0.0); // Give server some cycles to commit. } + + TEST_CASE("[NavigationServer3D] Server should be able to bake asynchronously") { + NavigationServer3D *navigation_server = NavigationServer3D::get_singleton(); + Ref<NavigationMesh> navigation_mesh = memnew(NavigationMesh); + Ref<NavigationMeshSourceGeometryData3D> source_geometry = memnew(NavigationMeshSourceGeometryData3D); + + Array arr; + arr.resize(RS::ARRAY_MAX); + BoxMesh::create_mesh_array(arr, Vector3(10.0, 0.001, 10.0)); + source_geometry->add_mesh_array(arr, Transform3D()); + + // Race condition is present below, but baking should take many orders of magnitude + // longer than basic checks on the main thread, so it's fine. + navigation_server->bake_from_source_geometry_data_async(navigation_mesh, source_geometry, Callable()); + CHECK(navigation_server->is_baking_navigation_mesh(navigation_mesh)); + CHECK_EQ(navigation_mesh->get_polygon_count(), 0); + CHECK_EQ(navigation_mesh->get_vertices().size(), 0); + } } } //namespace TestNavigationServer3D |