From 4a5982b9e1a1a30a5dfca47c9df3166639faa8e9 Mon Sep 17 00:00:00 2001
From: smix8 <52464204+smix8@users.noreply.github.com>
Date: Sat, 14 May 2022 23:33:09 +0200
Subject: [PATCH] Expose NavigationObstacle2D/3D get_rid() and add config
warning
Exposes get_rid() function for scripting.
Adds configuration warning when obstacle is used with not intended static body parent.
(cherry picked from commit 001d89223f1377717d2b3d5ec453ff8dd3604182)
---
doc/classes/NavigationObstacle.xml | 6 ++++++
doc/classes/NavigationObstacle2D.xml | 6 ++++++
scene/2d/navigation_obstacle_2d.cpp | 8 ++++++++
scene/3d/navigation_obstacle.cpp | 9 ++++++++-
4 files changed, 28 insertions(+), 1 deletion(-)
diff --git a/doc/classes/NavigationObstacle.xml b/doc/classes/NavigationObstacle.xml
index 5adfb0436..33adcce4e 100644
--- a/doc/classes/NavigationObstacle.xml
+++ b/doc/classes/NavigationObstacle.xml
@@ -15,6 +15,12 @@
Returns the [Navigation] node that the obstacle is using for its navigation system.
+
+
+
+ Returns the [RID] of this obstacle on the [NavigationServer].
+
+
diff --git a/doc/classes/NavigationObstacle2D.xml b/doc/classes/NavigationObstacle2D.xml
index adaad7457..d6b03c854 100644
--- a/doc/classes/NavigationObstacle2D.xml
+++ b/doc/classes/NavigationObstacle2D.xml
@@ -15,6 +15,12 @@
Returns the [Navigation2D] node that the obstacle is using for its navigation system.
+
+
+
+ Returns the [RID] of this obstacle on the [Navigation2DServer].
+
+
diff --git a/scene/2d/navigation_obstacle_2d.cpp b/scene/2d/navigation_obstacle_2d.cpp
index ad53cc018..8c1328797 100644
--- a/scene/2d/navigation_obstacle_2d.cpp
+++ b/scene/2d/navigation_obstacle_2d.cpp
@@ -37,8 +37,11 @@
#include "servers/navigation_2d_server.h"
void NavigationObstacle2D::_bind_methods() {
+ ClassDB::bind_method(D_METHOD("get_rid"), &NavigationObstacle2D::get_rid);
+
ClassDB::bind_method(D_METHOD("set_navigation", "navigation"), &NavigationObstacle2D::set_navigation_node);
ClassDB::bind_method(D_METHOD("get_navigation"), &NavigationObstacle2D::get_navigation_node);
+
ClassDB::bind_method(D_METHOD("set_estimate_radius", "estimate_radius"), &NavigationObstacle2D::set_estimate_radius);
ClassDB::bind_method(D_METHOD("is_radius_estimated"), &NavigationObstacle2D::is_radius_estimated);
ClassDB::bind_method(D_METHOD("set_radius", "radius"), &NavigationObstacle2D::set_radius);
@@ -137,6 +140,11 @@ String NavigationObstacle2D::get_configuration_warning() const {
return TTR("The NavigationObstacle2D only serves to provide collision avoidance to a Node2D object.");
}
+ if (Object::cast_to(get_parent())) {
+ return TTR("The NavigationObstacle2D is intended for constantly moving bodies like KinematicBody2D or RigidBody2D as it creates only an RVO avoidance radius and does not follow scene geometry exactly."
+ "\nNot constantly moving or complete static objects should be captured with a refreshed NavigationPolygon so agents can not only avoid them but also move along those objects outline at high detail");
+ }
+
return String();
}
diff --git a/scene/3d/navigation_obstacle.cpp b/scene/3d/navigation_obstacle.cpp
index 27ce81750..a13754cea 100644
--- a/scene/3d/navigation_obstacle.cpp
+++ b/scene/3d/navigation_obstacle.cpp
@@ -38,6 +38,8 @@
#include "servers/navigation_server.h"
void NavigationObstacle::_bind_methods() {
+ ClassDB::bind_method(D_METHOD("get_rid"), &NavigationObstacle::get_rid);
+
ClassDB::bind_method(D_METHOD("set_navigation", "navigation"), &NavigationObstacle::set_navigation_node);
ClassDB::bind_method(D_METHOD("get_navigation"), &NavigationObstacle::get_navigation_node);
ClassDB::bind_method(D_METHOD("is_radius_estimated"), &NavigationObstacle::is_radius_estimated);
@@ -142,7 +144,12 @@ Node *NavigationObstacle::get_navigation_node() const {
String NavigationObstacle::get_configuration_warning() const {
if (!Object::cast_to(get_parent())) {
- return TTR("The NavigationObstacle only serves to provide collision avoidance to a spatial object.");
+ return TTR("The NavigationObstacle only serves to provide collision avoidance to a Spatial inheriting parent object.");
+ }
+
+ if (Object::cast_to(get_parent())) {
+ return TTR("The NavigationObstacle is intended for constantly moving bodies like KinematicBody3D or RigidBody3D as it creates only an RVO avoidance radius and does not follow scene geometry exactly."
+ "\nNot constantly moving or complete static objects should be (re)baked to a NavigationMesh so agents can not only avoid them but also move along those objects outline at high detail");
}
return String();