Browse Source

Merge pull request #75756 from smix8/fix_obstacle_avoidance_sim_4.x

Fix NavigationObstacles not being added to avoidance simulation
Yuri Sizov 2 years ago
parent
commit
f38b540273

+ 7 - 0
scene/2d/navigation_obstacle_2d.cpp

@@ -196,13 +196,20 @@ void NavigationObstacle2D::set_agent_parent(Node *p_agent_parent) {
 		} else {
 			NavigationServer2D::get_singleton()->agent_set_map(get_rid(), parent_node2d->get_world_2d()->get_navigation_map());
 		}
+		// Need to register Callback as obstacle requires a valid Callback to be added to avoidance simulation.
+		NavigationServer2D::get_singleton()->agent_set_callback(get_rid(), callable_mp(this, &NavigationObstacle2D::_avoidance_done));
 		reevaluate_agent_radius();
 	} else {
 		parent_node2d = nullptr;
 		NavigationServer2D::get_singleton()->agent_set_map(get_rid(), RID());
+		NavigationServer2D::get_singleton()->agent_set_callback(agent, Callable());
 	}
 }
 
+void NavigationObstacle2D::_avoidance_done(Vector3 p_new_velocity) {
+	// Dummy function as obstacle requires a valid Callback to be added to avoidance simulation.
+}
+
 void NavigationObstacle2D::set_navigation_map(RID p_navigation_map) {
 	if (map_override == p_navigation_map) {
 		return;

+ 2 - 0
scene/2d/navigation_obstacle_2d.h

@@ -75,6 +75,8 @@ public:
 
 	PackedStringArray get_configuration_warnings() const override;
 
+	void _avoidance_done(Vector3 p_new_velocity); // Dummy
+
 private:
 	void initialize_agent();
 	void reevaluate_agent_radius();

+ 7 - 0
scene/3d/navigation_obstacle_3d.cpp

@@ -203,13 +203,20 @@ void NavigationObstacle3D::set_agent_parent(Node *p_agent_parent) {
 		} else {
 			NavigationServer3D::get_singleton()->agent_set_map(get_rid(), parent_node3d->get_world_3d()->get_navigation_map());
 		}
+		// Need to register Callback as obstacle requires a valid Callback to be added to avoidance simulation.
+		NavigationServer3D::get_singleton()->agent_set_callback(get_rid(), callable_mp(this, &NavigationObstacle3D::_avoidance_done));
 		reevaluate_agent_radius();
 	} else {
 		parent_node3d = nullptr;
 		NavigationServer3D::get_singleton()->agent_set_map(get_rid(), RID());
+		NavigationServer3D::get_singleton()->agent_set_callback(agent, Callable());
 	}
 }
 
+void NavigationObstacle3D::_avoidance_done(Vector3 p_new_velocity) {
+	// Dummy function as obstacle requires a valid Callback to be added to avoidance simulation.
+}
+
 void NavigationObstacle3D::set_navigation_map(RID p_navigation_map) {
 	if (map_override == p_navigation_map) {
 		return;

+ 2 - 0
scene/3d/navigation_obstacle_3d.h

@@ -74,6 +74,8 @@ public:
 
 	PackedStringArray get_configuration_warnings() const override;
 
+	void _avoidance_done(Vector3 p_new_velocity); // Dummy
+
 private:
 	void initialize_agent();
 	void reevaluate_agent_radius();