diff --git a/scene/3d/navigation_mesh_instance.cpp b/scene/3d/navigation_mesh_instance.cpp index d44c283e9..6b9bdc4e5 100644 --- a/scene/3d/navigation_mesh_instance.cpp +++ b/scene/3d/navigation_mesh_instance.cpp @@ -36,10 +36,10 @@ #include "navigation.h" #include "scene/resources/mesh.h" #include "scene/resources/navigation_mesh.h" +#include "scene/resources/navigation_mesh_source_geometry_data_3d.h" #include "scene/resources/world_3d.h" #include "servers/navigation/navigation_mesh_generator.h" #include "servers/navigation_server.h" -#include "scene/resources/navigation_mesh_source_geometry_data_3d.h" void NavigationMeshInstance::set_enabled(bool p_enabled) { if (enabled == p_enabled) { @@ -107,7 +107,12 @@ uint32_t NavigationMeshInstance::get_navigation_layers() const { void NavigationMeshInstance::set_enter_cost(real_t p_enter_cost) { ERR_FAIL_COND_MSG(p_enter_cost < 0.0, "The enter_cost must be positive."); - enter_cost = MAX(p_enter_cost, 0.0); + if (Math::is_equal_approx(enter_cost, p_enter_cost)) { + return; + } + + enter_cost = p_enter_cost; + NavigationServer::get_singleton()->region_set_enter_cost(region, p_enter_cost); } @@ -117,8 +122,12 @@ real_t NavigationMeshInstance::get_enter_cost() const { void NavigationMeshInstance::set_travel_cost(real_t p_travel_cost) { ERR_FAIL_COND_MSG(p_travel_cost < 0.0, "The travel_cost must be positive."); - travel_cost = MAX(p_travel_cost, 0.0); - NavigationServer::get_singleton()->region_set_enter_cost(region, travel_cost); + if (Math::is_equal_approx(travel_cost, p_travel_cost)) { + return; + } + + travel_cost = p_travel_cost; + NavigationServer::get_singleton()->region_set_travel_cost(region, travel_cost); } real_t NavigationMeshInstance::get_travel_cost() const { @@ -373,8 +382,10 @@ NavigationMeshInstance::NavigationMeshInstance() { NavigationMeshInstance::~NavigationMeshInstance() { if (navmesh.is_valid()) { - navmesh->remove_change_receptor(this); + navmesh->disconnect(CoreStringNames::get_singleton()->changed, this, "_navigation_mesh_changed"); } + + ERR_FAIL_NULL(NavigationServer::get_singleton()); NavigationServer::get_singleton()->free(region); #ifdef DEBUG_ENABLED @@ -382,6 +393,8 @@ NavigationMeshInstance::~NavigationMeshInstance() { NavigationServer::get_singleton_mut()->disconnect("navigation_debug_changed", this, "_update_debug_mesh"); NavigationServer::get_singleton_mut()->disconnect("navigation_debug_changed", this, "_update_debug_edge_connections_mesh"); + ERR_FAIL_NULL(RenderingServer::get_singleton()); + if (debug_instance.is_valid()) { RenderingServer::get_singleton()->free(debug_instance); }