Merge pull request #72570 from DarkKilauea/nav-cleanup-agent
Improve consistency of NavigationAgent setters
This commit is contained in:
commit
388e3eb8b7
6 changed files with 271 additions and 61 deletions
|
@ -168,6 +168,17 @@ void NavigationAgent2D::_notification(int p_what) {
|
|||
set_physics_process_internal(false);
|
||||
} break;
|
||||
|
||||
case NOTIFICATION_EXIT_TREE: {
|
||||
set_agent_parent(nullptr);
|
||||
set_physics_process_internal(false);
|
||||
|
||||
#ifdef DEBUG_ENABLED
|
||||
if (debug_path_instance.is_valid()) {
|
||||
RenderingServer::get_singleton()->canvas_item_set_visible(debug_path_instance, false);
|
||||
}
|
||||
#endif // DEBUG_ENABLED
|
||||
} break;
|
||||
|
||||
case NOTIFICATION_PAUSED: {
|
||||
if (agent_parent && !agent_parent->can_process()) {
|
||||
map_before_pause = NavigationServer2D::get_singleton()->agent_get_map(get_rid());
|
||||
|
@ -188,17 +199,6 @@ void NavigationAgent2D::_notification(int p_what) {
|
|||
}
|
||||
} break;
|
||||
|
||||
case NOTIFICATION_EXIT_TREE: {
|
||||
agent_parent = nullptr;
|
||||
set_physics_process_internal(false);
|
||||
|
||||
#ifdef DEBUG_ENABLED
|
||||
if (debug_path_instance.is_valid()) {
|
||||
RenderingServer::get_singleton()->canvas_item_set_visible(debug_path_instance, false);
|
||||
}
|
||||
#endif // DEBUG_ENABLED
|
||||
} break;
|
||||
|
||||
case NOTIFICATION_INTERNAL_PHYSICS_PROCESS: {
|
||||
if (agent_parent && target_position_submitted) {
|
||||
if (avoidance_enabled) {
|
||||
|
@ -208,7 +208,6 @@ void NavigationAgent2D::_notification(int p_what) {
|
|||
}
|
||||
_check_distance_to_target();
|
||||
}
|
||||
|
||||
#ifdef DEBUG_ENABLED
|
||||
if (debug_path_dirty) {
|
||||
_update_debug_path();
|
||||
|
@ -220,11 +219,11 @@ void NavigationAgent2D::_notification(int p_what) {
|
|||
|
||||
NavigationAgent2D::NavigationAgent2D() {
|
||||
agent = NavigationServer2D::get_singleton()->agent_create();
|
||||
set_neighbor_distance(neighbor_distance);
|
||||
set_max_neighbors(max_neighbors);
|
||||
set_time_horizon(time_horizon);
|
||||
set_radius(radius);
|
||||
set_max_speed(max_speed);
|
||||
NavigationServer2D::get_singleton()->agent_set_neighbor_distance(agent, neighbor_distance);
|
||||
NavigationServer2D::get_singleton()->agent_set_max_neighbors(agent, max_neighbors);
|
||||
NavigationServer2D::get_singleton()->agent_set_time_horizon(agent, time_horizon);
|
||||
NavigationServer2D::get_singleton()->agent_set_radius(agent, radius);
|
||||
NavigationServer2D::get_singleton()->agent_set_max_speed(agent, max_speed);
|
||||
|
||||
// Preallocate query and result objects to improve performance.
|
||||
navigation_query = Ref<NavigationPathQueryParameters2D>();
|
||||
|
@ -254,7 +253,12 @@ NavigationAgent2D::~NavigationAgent2D() {
|
|||
}
|
||||
|
||||
void NavigationAgent2D::set_avoidance_enabled(bool p_enabled) {
|
||||
if (avoidance_enabled == p_enabled) {
|
||||
return;
|
||||
}
|
||||
|
||||
avoidance_enabled = p_enabled;
|
||||
|
||||
if (avoidance_enabled) {
|
||||
NavigationServer2D::get_singleton()->agent_set_callback(agent, callable_mp(this, &NavigationAgent2D::_avoidance_done));
|
||||
} else {
|
||||
|
@ -267,6 +271,10 @@ bool NavigationAgent2D::get_avoidance_enabled() const {
|
|||
}
|
||||
|
||||
void NavigationAgent2D::set_agent_parent(Node *p_agent_parent) {
|
||||
if (agent_parent == p_agent_parent) {
|
||||
return;
|
||||
}
|
||||
|
||||
// remove agent from any avoidance map before changing parent or there will be leftovers on the RVO map
|
||||
NavigationServer2D::get_singleton()->agent_set_callback(agent, Callable());
|
||||
|
||||
|
@ -280,7 +288,9 @@ void NavigationAgent2D::set_agent_parent(Node *p_agent_parent) {
|
|||
}
|
||||
|
||||
// create new avoidance callback if enabled
|
||||
set_avoidance_enabled(avoidance_enabled);
|
||||
if (avoidance_enabled) {
|
||||
NavigationServer2D::get_singleton()->agent_set_callback(agent, callable_mp(this, &NavigationAgent2D::_avoidance_done));
|
||||
}
|
||||
} else {
|
||||
agent_parent = nullptr;
|
||||
NavigationServer2D::get_singleton()->agent_set_map(get_rid(), RID());
|
||||
|
@ -288,11 +298,13 @@ void NavigationAgent2D::set_agent_parent(Node *p_agent_parent) {
|
|||
}
|
||||
|
||||
void NavigationAgent2D::set_navigation_layers(uint32_t p_navigation_layers) {
|
||||
bool navigation_layers_changed = navigation_layers != p_navigation_layers;
|
||||
navigation_layers = p_navigation_layers;
|
||||
if (navigation_layers_changed) {
|
||||
_request_repath();
|
||||
if (navigation_layers == p_navigation_layers) {
|
||||
return;
|
||||
}
|
||||
|
||||
navigation_layers = p_navigation_layers;
|
||||
|
||||
_request_repath();
|
||||
}
|
||||
|
||||
uint32_t NavigationAgent2D::get_navigation_layers() const {
|
||||
|
@ -326,7 +338,12 @@ void NavigationAgent2D::set_path_metadata_flags(BitField<NavigationPathQueryPara
|
|||
}
|
||||
|
||||
void NavigationAgent2D::set_navigation_map(RID p_navigation_map) {
|
||||
if (map_override == p_navigation_map) {
|
||||
return;
|
||||
}
|
||||
|
||||
map_override = p_navigation_map;
|
||||
|
||||
NavigationServer2D::get_singleton()->agent_set_map(agent, map_override);
|
||||
_request_repath();
|
||||
}
|
||||
|
@ -340,41 +357,78 @@ RID NavigationAgent2D::get_navigation_map() const {
|
|||
return RID();
|
||||
}
|
||||
|
||||
void NavigationAgent2D::set_path_desired_distance(real_t p_dd) {
|
||||
path_desired_distance = p_dd;
|
||||
void NavigationAgent2D::set_path_desired_distance(real_t p_path_desired_distance) {
|
||||
if (Math::is_equal_approx(path_desired_distance, p_path_desired_distance)) {
|
||||
return;
|
||||
}
|
||||
|
||||
void NavigationAgent2D::set_target_desired_distance(real_t p_dd) {
|
||||
target_desired_distance = p_dd;
|
||||
path_desired_distance = p_path_desired_distance;
|
||||
}
|
||||
|
||||
void NavigationAgent2D::set_target_desired_distance(real_t p_target_desired_distance) {
|
||||
if (Math::is_equal_approx(target_desired_distance, p_target_desired_distance)) {
|
||||
return;
|
||||
}
|
||||
|
||||
target_desired_distance = p_target_desired_distance;
|
||||
}
|
||||
|
||||
void NavigationAgent2D::set_radius(real_t p_radius) {
|
||||
if (Math::is_equal_approx(radius, p_radius)) {
|
||||
return;
|
||||
}
|
||||
|
||||
radius = p_radius;
|
||||
|
||||
NavigationServer2D::get_singleton()->agent_set_radius(agent, radius);
|
||||
}
|
||||
|
||||
void NavigationAgent2D::set_neighbor_distance(real_t p_distance) {
|
||||
if (Math::is_equal_approx(neighbor_distance, p_distance)) {
|
||||
return;
|
||||
}
|
||||
|
||||
neighbor_distance = p_distance;
|
||||
|
||||
NavigationServer2D::get_singleton()->agent_set_neighbor_distance(agent, neighbor_distance);
|
||||
}
|
||||
|
||||
void NavigationAgent2D::set_max_neighbors(int p_count) {
|
||||
if (max_neighbors == p_count) {
|
||||
return;
|
||||
}
|
||||
|
||||
max_neighbors = p_count;
|
||||
|
||||
NavigationServer2D::get_singleton()->agent_set_max_neighbors(agent, max_neighbors);
|
||||
}
|
||||
|
||||
void NavigationAgent2D::set_time_horizon(real_t p_time) {
|
||||
if (Math::is_equal_approx(time_horizon, p_time)) {
|
||||
return;
|
||||
}
|
||||
|
||||
time_horizon = p_time;
|
||||
|
||||
NavigationServer2D::get_singleton()->agent_set_time_horizon(agent, time_horizon);
|
||||
}
|
||||
|
||||
void NavigationAgent2D::set_max_speed(real_t p_max_speed) {
|
||||
if (Math::is_equal_approx(max_speed, p_max_speed)) {
|
||||
return;
|
||||
}
|
||||
|
||||
max_speed = p_max_speed;
|
||||
|
||||
NavigationServer2D::get_singleton()->agent_set_max_speed(agent, max_speed);
|
||||
}
|
||||
|
||||
void NavigationAgent2D::set_path_max_distance(real_t p_pmd) {
|
||||
path_max_distance = p_pmd;
|
||||
void NavigationAgent2D::set_path_max_distance(real_t p_path_max_distance) {
|
||||
if (Math::is_equal_approx(path_max_distance, p_path_max_distance)) {
|
||||
return;
|
||||
}
|
||||
|
||||
path_max_distance = p_path_max_distance;
|
||||
}
|
||||
|
||||
real_t NavigationAgent2D::get_path_max_distance() {
|
||||
|
@ -382,8 +436,13 @@ real_t NavigationAgent2D::get_path_max_distance() {
|
|||
}
|
||||
|
||||
void NavigationAgent2D::set_target_position(Vector2 p_position) {
|
||||
if (target_position.is_equal_approx(p_position)) {
|
||||
return;
|
||||
}
|
||||
|
||||
target_position = p_position;
|
||||
target_position_submitted = true;
|
||||
|
||||
_request_repath();
|
||||
}
|
||||
|
||||
|
@ -432,10 +491,15 @@ Vector2 NavigationAgent2D::get_final_position() {
|
|||
}
|
||||
|
||||
void NavigationAgent2D::set_velocity(Vector2 p_velocity) {
|
||||
if (target_velocity.is_equal_approx(p_velocity)) {
|
||||
return;
|
||||
}
|
||||
|
||||
target_velocity = p_velocity;
|
||||
velocity_submitted = true;
|
||||
|
||||
NavigationServer2D::get_singleton()->agent_set_target_velocity(agent, target_velocity);
|
||||
NavigationServer2D::get_singleton()->agent_set_velocity(agent, prev_safe_velocity);
|
||||
velocity_submitted = true;
|
||||
}
|
||||
|
||||
void NavigationAgent2D::_avoidance_done(Vector3 p_new_velocity) {
|
||||
|
@ -608,6 +672,10 @@ void NavigationAgent2D::_check_distance_to_target() {
|
|||
|
||||
#ifdef DEBUG_ENABLED
|
||||
void NavigationAgent2D::set_debug_enabled(bool p_enabled) {
|
||||
if (debug_enabled == p_enabled) {
|
||||
return;
|
||||
}
|
||||
|
||||
debug_enabled = p_enabled;
|
||||
debug_path_dirty = true;
|
||||
}
|
||||
|
@ -617,6 +685,10 @@ bool NavigationAgent2D::get_debug_enabled() const {
|
|||
}
|
||||
|
||||
void NavigationAgent2D::set_debug_use_custom(bool p_enabled) {
|
||||
if (debug_use_custom == p_enabled) {
|
||||
return;
|
||||
}
|
||||
|
||||
debug_use_custom = p_enabled;
|
||||
debug_path_dirty = true;
|
||||
}
|
||||
|
@ -626,6 +698,10 @@ bool NavigationAgent2D::get_debug_use_custom() const {
|
|||
}
|
||||
|
||||
void NavigationAgent2D::set_debug_path_custom_color(Color p_color) {
|
||||
if (debug_path_custom_color == p_color) {
|
||||
return;
|
||||
}
|
||||
|
||||
debug_path_custom_color = p_color;
|
||||
debug_path_dirty = true;
|
||||
}
|
||||
|
@ -635,6 +711,10 @@ Color NavigationAgent2D::get_debug_path_custom_color() const {
|
|||
}
|
||||
|
||||
void NavigationAgent2D::set_debug_path_custom_point_size(float p_point_size) {
|
||||
if (Math::is_equal_approx(debug_path_custom_point_size, p_point_size)) {
|
||||
return;
|
||||
}
|
||||
|
||||
debug_path_custom_point_size = MAX(0.1, p_point_size);
|
||||
debug_path_dirty = true;
|
||||
}
|
||||
|
@ -644,6 +724,10 @@ float NavigationAgent2D::get_debug_path_custom_point_size() const {
|
|||
}
|
||||
|
||||
void NavigationAgent2D::set_debug_path_custom_line_width(float p_line_width) {
|
||||
if (Math::is_equal_approx(debug_path_custom_line_width, p_line_width)) {
|
||||
return;
|
||||
}
|
||||
|
||||
debug_path_custom_line_width = p_line_width;
|
||||
debug_path_dirty = true;
|
||||
}
|
||||
|
|
|
@ -57,7 +57,6 @@ class NavigationAgent2D : public Node {
|
|||
int max_neighbors = 10;
|
||||
real_t time_horizon = 1.0;
|
||||
real_t max_speed = 100.0;
|
||||
|
||||
real_t path_max_distance = 100.0;
|
||||
|
||||
Vector2 target_position;
|
||||
|
|
|
@ -185,6 +185,10 @@ real_t NavigationObstacle2D::estimate_agent_radius() const {
|
|||
}
|
||||
|
||||
void NavigationObstacle2D::set_agent_parent(Node *p_agent_parent) {
|
||||
if (parent_node2d == p_agent_parent) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (Object::cast_to<Node2D>(p_agent_parent) != nullptr) {
|
||||
parent_node2d = Object::cast_to<Node2D>(p_agent_parent);
|
||||
if (map_override.is_valid()) {
|
||||
|
@ -200,7 +204,12 @@ void NavigationObstacle2D::set_agent_parent(Node *p_agent_parent) {
|
|||
}
|
||||
|
||||
void NavigationObstacle2D::set_navigation_map(RID p_navigation_map) {
|
||||
if (map_override == p_navigation_map) {
|
||||
return;
|
||||
}
|
||||
|
||||
map_override = p_navigation_map;
|
||||
|
||||
NavigationServer2D::get_singleton()->agent_set_map(agent, map_override);
|
||||
}
|
||||
|
||||
|
@ -214,13 +223,23 @@ RID NavigationObstacle2D::get_navigation_map() const {
|
|||
}
|
||||
|
||||
void NavigationObstacle2D::set_estimate_radius(bool p_estimate_radius) {
|
||||
if (estimate_radius == p_estimate_radius) {
|
||||
return;
|
||||
}
|
||||
|
||||
estimate_radius = p_estimate_radius;
|
||||
|
||||
notify_property_list_changed();
|
||||
reevaluate_agent_radius();
|
||||
}
|
||||
|
||||
void NavigationObstacle2D::set_radius(real_t p_radius) {
|
||||
ERR_FAIL_COND_MSG(p_radius <= 0.0, "Radius must be greater than 0.");
|
||||
if (Math::is_equal_approx(radius, p_radius)) {
|
||||
return;
|
||||
}
|
||||
|
||||
radius = p_radius;
|
||||
|
||||
reevaluate_agent_radius();
|
||||
}
|
||||
|
|
|
@ -207,7 +207,7 @@ void NavigationAgent3D::_notification(int p_what) {
|
|||
if (avoidance_enabled) {
|
||||
// agent_position on NavigationServer is avoidance only and has nothing to do with pathfinding
|
||||
// no point in flooding NavigationServer queue with agent position updates that get send to the void if avoidance is not used
|
||||
NavigationServer3D::get_singleton()->agent_set_position(agent, agent_parent->get_global_transform().origin);
|
||||
NavigationServer3D::get_singleton()->agent_set_position(agent, agent_parent->get_global_position());
|
||||
}
|
||||
_check_distance_to_target();
|
||||
}
|
||||
|
@ -222,12 +222,12 @@ void NavigationAgent3D::_notification(int p_what) {
|
|||
|
||||
NavigationAgent3D::NavigationAgent3D() {
|
||||
agent = NavigationServer3D::get_singleton()->agent_create();
|
||||
set_neighbor_distance(50.0);
|
||||
set_max_neighbors(10);
|
||||
set_time_horizon(5.0);
|
||||
set_radius(1.0);
|
||||
set_max_speed(10.0);
|
||||
set_ignore_y(true);
|
||||
NavigationServer3D::get_singleton()->agent_set_neighbor_distance(agent, neighbor_distance);
|
||||
NavigationServer3D::get_singleton()->agent_set_max_neighbors(agent, max_neighbors);
|
||||
NavigationServer3D::get_singleton()->agent_set_time_horizon(agent, time_horizon);
|
||||
NavigationServer3D::get_singleton()->agent_set_radius(agent, radius);
|
||||
NavigationServer3D::get_singleton()->agent_set_max_speed(agent, max_speed);
|
||||
NavigationServer3D::get_singleton()->agent_set_ignore_y(agent, ignore_y);
|
||||
|
||||
// Preallocate query and result objects to improve performance.
|
||||
navigation_query = Ref<NavigationPathQueryParameters3D>();
|
||||
|
@ -260,7 +260,12 @@ NavigationAgent3D::~NavigationAgent3D() {
|
|||
}
|
||||
|
||||
void NavigationAgent3D::set_avoidance_enabled(bool p_enabled) {
|
||||
if (avoidance_enabled == p_enabled) {
|
||||
return;
|
||||
}
|
||||
|
||||
avoidance_enabled = p_enabled;
|
||||
|
||||
if (avoidance_enabled) {
|
||||
NavigationServer3D::get_singleton()->agent_set_callback(agent, callable_mp(this, &NavigationAgent3D::_avoidance_done));
|
||||
} else {
|
||||
|
@ -273,6 +278,10 @@ bool NavigationAgent3D::get_avoidance_enabled() const {
|
|||
}
|
||||
|
||||
void NavigationAgent3D::set_agent_parent(Node *p_agent_parent) {
|
||||
if (agent_parent == p_agent_parent) {
|
||||
return;
|
||||
}
|
||||
|
||||
// remove agent from any avoidance map before changing parent or there will be leftovers on the RVO map
|
||||
NavigationServer3D::get_singleton()->agent_set_callback(agent, Callable());
|
||||
|
||||
|
@ -286,7 +295,9 @@ void NavigationAgent3D::set_agent_parent(Node *p_agent_parent) {
|
|||
}
|
||||
|
||||
// create new avoidance callback if enabled
|
||||
set_avoidance_enabled(avoidance_enabled);
|
||||
if (avoidance_enabled) {
|
||||
NavigationServer3D::get_singleton()->agent_set_callback(agent, callable_mp(this, &NavigationAgent3D::_avoidance_done));
|
||||
}
|
||||
} else {
|
||||
agent_parent = nullptr;
|
||||
NavigationServer3D::get_singleton()->agent_set_map(get_rid(), RID());
|
||||
|
@ -294,11 +305,13 @@ void NavigationAgent3D::set_agent_parent(Node *p_agent_parent) {
|
|||
}
|
||||
|
||||
void NavigationAgent3D::set_navigation_layers(uint32_t p_navigation_layers) {
|
||||
bool navigation_layers_changed = navigation_layers != p_navigation_layers;
|
||||
navigation_layers = p_navigation_layers;
|
||||
if (navigation_layers_changed) {
|
||||
_request_repath();
|
||||
if (navigation_layers == p_navigation_layers) {
|
||||
return;
|
||||
}
|
||||
|
||||
navigation_layers = p_navigation_layers;
|
||||
|
||||
_request_repath();
|
||||
}
|
||||
|
||||
uint32_t NavigationAgent3D::get_navigation_layers() const {
|
||||
|
@ -332,7 +345,12 @@ void NavigationAgent3D::set_path_metadata_flags(BitField<NavigationPathQueryPara
|
|||
}
|
||||
|
||||
void NavigationAgent3D::set_navigation_map(RID p_navigation_map) {
|
||||
if (map_override == p_navigation_map) {
|
||||
return;
|
||||
}
|
||||
|
||||
map_override = p_navigation_map;
|
||||
|
||||
NavigationServer3D::get_singleton()->agent_set_map(agent, map_override);
|
||||
_request_repath();
|
||||
}
|
||||
|
@ -346,50 +364,96 @@ RID NavigationAgent3D::get_navigation_map() const {
|
|||
return RID();
|
||||
}
|
||||
|
||||
void NavigationAgent3D::set_path_desired_distance(real_t p_dd) {
|
||||
path_desired_distance = p_dd;
|
||||
void NavigationAgent3D::set_path_desired_distance(real_t p_path_desired_distance) {
|
||||
if (Math::is_equal_approx(path_desired_distance, p_path_desired_distance)) {
|
||||
return;
|
||||
}
|
||||
|
||||
void NavigationAgent3D::set_target_desired_distance(real_t p_dd) {
|
||||
target_desired_distance = p_dd;
|
||||
path_desired_distance = p_path_desired_distance;
|
||||
}
|
||||
|
||||
void NavigationAgent3D::set_target_desired_distance(real_t p_target_desired_distance) {
|
||||
if (Math::is_equal_approx(target_desired_distance, p_target_desired_distance)) {
|
||||
return;
|
||||
}
|
||||
|
||||
target_desired_distance = p_target_desired_distance;
|
||||
}
|
||||
|
||||
void NavigationAgent3D::set_radius(real_t p_radius) {
|
||||
if (Math::is_equal_approx(radius, p_radius)) {
|
||||
return;
|
||||
}
|
||||
|
||||
radius = p_radius;
|
||||
|
||||
NavigationServer3D::get_singleton()->agent_set_radius(agent, radius);
|
||||
}
|
||||
|
||||
void NavigationAgent3D::set_agent_height_offset(real_t p_hh) {
|
||||
navigation_height_offset = p_hh;
|
||||
void NavigationAgent3D::set_agent_height_offset(real_t p_agent_height_offset) {
|
||||
if (Math::is_equal_approx(navigation_height_offset, p_agent_height_offset)) {
|
||||
return;
|
||||
}
|
||||
|
||||
navigation_height_offset = p_agent_height_offset;
|
||||
}
|
||||
|
||||
void NavigationAgent3D::set_ignore_y(bool p_ignore_y) {
|
||||
if (ignore_y == p_ignore_y) {
|
||||
return;
|
||||
}
|
||||
|
||||
ignore_y = p_ignore_y;
|
||||
|
||||
NavigationServer3D::get_singleton()->agent_set_ignore_y(agent, ignore_y);
|
||||
}
|
||||
|
||||
void NavigationAgent3D::set_neighbor_distance(real_t p_distance) {
|
||||
if (Math::is_equal_approx(neighbor_distance, p_distance)) {
|
||||
return;
|
||||
}
|
||||
|
||||
neighbor_distance = p_distance;
|
||||
|
||||
NavigationServer3D::get_singleton()->agent_set_neighbor_distance(agent, neighbor_distance);
|
||||
}
|
||||
|
||||
void NavigationAgent3D::set_max_neighbors(int p_count) {
|
||||
if (max_neighbors == p_count) {
|
||||
return;
|
||||
}
|
||||
|
||||
max_neighbors = p_count;
|
||||
|
||||
NavigationServer3D::get_singleton()->agent_set_max_neighbors(agent, max_neighbors);
|
||||
}
|
||||
|
||||
void NavigationAgent3D::set_time_horizon(real_t p_time) {
|
||||
if (Math::is_equal_approx(time_horizon, p_time)) {
|
||||
return;
|
||||
}
|
||||
|
||||
time_horizon = p_time;
|
||||
|
||||
NavigationServer3D::get_singleton()->agent_set_time_horizon(agent, time_horizon);
|
||||
}
|
||||
|
||||
void NavigationAgent3D::set_max_speed(real_t p_max_speed) {
|
||||
if (Math::is_equal_approx(max_speed, p_max_speed)) {
|
||||
return;
|
||||
}
|
||||
|
||||
max_speed = p_max_speed;
|
||||
|
||||
NavigationServer3D::get_singleton()->agent_set_max_speed(agent, max_speed);
|
||||
}
|
||||
|
||||
void NavigationAgent3D::set_path_max_distance(real_t p_pmd) {
|
||||
path_max_distance = p_pmd;
|
||||
void NavigationAgent3D::set_path_max_distance(real_t p_path_max_distance) {
|
||||
if (Math::is_equal_approx(path_max_distance, p_path_max_distance)) {
|
||||
return;
|
||||
}
|
||||
|
||||
path_max_distance = p_path_max_distance;
|
||||
}
|
||||
|
||||
real_t NavigationAgent3D::get_path_max_distance() {
|
||||
|
@ -397,8 +461,13 @@ real_t NavigationAgent3D::get_path_max_distance() {
|
|||
}
|
||||
|
||||
void NavigationAgent3D::set_target_position(Vector3 p_position) {
|
||||
if (target_position.is_equal_approx(p_position)) {
|
||||
return;
|
||||
}
|
||||
|
||||
target_position = p_position;
|
||||
target_position_submitted = true;
|
||||
|
||||
_request_repath();
|
||||
}
|
||||
|
||||
|
@ -412,7 +481,7 @@ Vector3 NavigationAgent3D::get_next_path_position() {
|
|||
const Vector<Vector3> &navigation_path = navigation_result->get_path();
|
||||
if (navigation_path.size() == 0) {
|
||||
ERR_FAIL_COND_V_MSG(agent_parent == nullptr, Vector3(), "The agent has no parent.");
|
||||
return agent_parent->get_global_transform().origin;
|
||||
return agent_parent->get_global_position();
|
||||
} else {
|
||||
return navigation_path[navigation_path_index] - Vector3(0, navigation_height_offset, 0);
|
||||
}
|
||||
|
@ -420,7 +489,7 @@ Vector3 NavigationAgent3D::get_next_path_position() {
|
|||
|
||||
real_t NavigationAgent3D::distance_to_target() const {
|
||||
ERR_FAIL_COND_V_MSG(agent_parent == nullptr, 0.0, "The agent has no parent.");
|
||||
return agent_parent->get_global_transform().origin.distance_to(target_position);
|
||||
return agent_parent->get_global_position().distance_to(target_position);
|
||||
}
|
||||
|
||||
bool NavigationAgent3D::is_target_reached() const {
|
||||
|
@ -447,10 +516,15 @@ Vector3 NavigationAgent3D::get_final_position() {
|
|||
}
|
||||
|
||||
void NavigationAgent3D::set_velocity(Vector3 p_velocity) {
|
||||
if (target_velocity.is_equal_approx(p_velocity)) {
|
||||
return;
|
||||
}
|
||||
|
||||
target_velocity = p_velocity;
|
||||
velocity_submitted = true;
|
||||
|
||||
NavigationServer3D::get_singleton()->agent_set_target_velocity(agent, target_velocity);
|
||||
NavigationServer3D::get_singleton()->agent_set_velocity(agent, prev_safe_velocity);
|
||||
velocity_submitted = true;
|
||||
}
|
||||
|
||||
void NavigationAgent3D::_avoidance_done(Vector3 p_new_velocity) {
|
||||
|
@ -491,7 +565,7 @@ void NavigationAgent3D::update_navigation() {
|
|||
|
||||
update_frame_id = Engine::get_singleton()->get_physics_frames();
|
||||
|
||||
Vector3 origin = agent_parent->get_global_transform().origin;
|
||||
Vector3 origin = agent_parent->get_global_position();
|
||||
|
||||
bool reload_path = false;
|
||||
|
||||
|
@ -624,6 +698,10 @@ void NavigationAgent3D::_check_distance_to_target() {
|
|||
|
||||
#ifdef DEBUG_ENABLED
|
||||
void NavigationAgent3D::set_debug_enabled(bool p_enabled) {
|
||||
if (debug_enabled == p_enabled) {
|
||||
return;
|
||||
}
|
||||
|
||||
debug_enabled = p_enabled;
|
||||
debug_path_dirty = true;
|
||||
}
|
||||
|
@ -633,6 +711,10 @@ bool NavigationAgent3D::get_debug_enabled() const {
|
|||
}
|
||||
|
||||
void NavigationAgent3D::set_debug_use_custom(bool p_enabled) {
|
||||
if (debug_use_custom == p_enabled) {
|
||||
return;
|
||||
}
|
||||
|
||||
debug_use_custom = p_enabled;
|
||||
debug_path_dirty = true;
|
||||
}
|
||||
|
@ -642,6 +724,10 @@ bool NavigationAgent3D::get_debug_use_custom() const {
|
|||
}
|
||||
|
||||
void NavigationAgent3D::set_debug_path_custom_color(Color p_color) {
|
||||
if (debug_path_custom_color == p_color) {
|
||||
return;
|
||||
}
|
||||
|
||||
debug_path_custom_color = p_color;
|
||||
debug_path_dirty = true;
|
||||
}
|
||||
|
@ -651,6 +737,10 @@ Color NavigationAgent3D::get_debug_path_custom_color() const {
|
|||
}
|
||||
|
||||
void NavigationAgent3D::set_debug_path_custom_point_size(float p_point_size) {
|
||||
if (Math::is_equal_approx(debug_path_custom_point_size, p_point_size)) {
|
||||
return;
|
||||
}
|
||||
|
||||
debug_path_custom_point_size = p_point_size;
|
||||
debug_path_dirty = true;
|
||||
}
|
||||
|
|
|
@ -52,14 +52,13 @@ class NavigationAgent3D : public Node {
|
|||
|
||||
real_t path_desired_distance = 1.0;
|
||||
real_t target_desired_distance = 1.0;
|
||||
real_t radius = 0.0;
|
||||
real_t radius = 1.0;
|
||||
real_t navigation_height_offset = 0.0;
|
||||
bool ignore_y = false;
|
||||
real_t neighbor_distance = 0.0;
|
||||
int max_neighbors = 0;
|
||||
real_t time_horizon = 0.0;
|
||||
real_t max_speed = 0.0;
|
||||
|
||||
bool ignore_y = true;
|
||||
real_t neighbor_distance = 50.0;
|
||||
int max_neighbors = 10;
|
||||
real_t time_horizon = 5.0;
|
||||
real_t max_speed = 10.0;
|
||||
real_t path_max_distance = 3.0;
|
||||
|
||||
Vector3 target_position;
|
||||
|
|
|
@ -192,6 +192,10 @@ real_t NavigationObstacle3D::estimate_agent_radius() const {
|
|||
}
|
||||
|
||||
void NavigationObstacle3D::set_agent_parent(Node *p_agent_parent) {
|
||||
if (parent_node3d == p_agent_parent) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (Object::cast_to<Node3D>(p_agent_parent) != nullptr) {
|
||||
parent_node3d = Object::cast_to<Node3D>(p_agent_parent);
|
||||
if (map_override.is_valid()) {
|
||||
|
@ -207,7 +211,12 @@ void NavigationObstacle3D::set_agent_parent(Node *p_agent_parent) {
|
|||
}
|
||||
|
||||
void NavigationObstacle3D::set_navigation_map(RID p_navigation_map) {
|
||||
if (map_override == p_navigation_map) {
|
||||
return;
|
||||
}
|
||||
|
||||
map_override = p_navigation_map;
|
||||
|
||||
NavigationServer3D::get_singleton()->agent_set_map(agent, map_override);
|
||||
}
|
||||
|
||||
|
@ -221,13 +230,23 @@ RID NavigationObstacle3D::get_navigation_map() const {
|
|||
}
|
||||
|
||||
void NavigationObstacle3D::set_estimate_radius(bool p_estimate_radius) {
|
||||
if (estimate_radius == p_estimate_radius) {
|
||||
return;
|
||||
}
|
||||
|
||||
estimate_radius = p_estimate_radius;
|
||||
|
||||
notify_property_list_changed();
|
||||
reevaluate_agent_radius();
|
||||
}
|
||||
|
||||
void NavigationObstacle3D::set_radius(real_t p_radius) {
|
||||
ERR_FAIL_COND_MSG(p_radius <= 0.0, "Radius must be greater than 0.");
|
||||
if (Math::is_equal_approx(radius, p_radius)) {
|
||||
return;
|
||||
}
|
||||
|
||||
radius = p_radius;
|
||||
|
||||
reevaluate_agent_radius();
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue