Browse Source

Merge pull request #23083 from Windfisch/pathfollow_configwarn

Add a configuration warning to [Oriented]PathFollow
Rémi Verschelde 6 years ago
parent
commit
bf957a414a
2 changed files with 43 additions and 0 deletions
  1. 39 0
      scene/3d/path.cpp
  2. 4 0
      scene/3d/path.h

+ 39 - 0
scene/3d/path.cpp

@@ -43,6 +43,16 @@ void Path::_curve_changed() {
 	if (is_inside_tree()) {
 		emit_signal("curve_changed");
 	}
+
+	// update the configuration warnings of all children of type OrientedPathFollows
+	if (is_inside_tree()) {
+		for (int i = 0; i < get_child_count(); i++) {
+			OrientedPathFollow *child = Object::cast_to<OrientedPathFollow>(get_child(i));
+			if (child) {
+				child->update_configuration_warning();
+			}
+		}
+	}
 }
 
 void Path::set_curve(const Ref<Curve3D> &p_curve) {
@@ -207,6 +217,18 @@ void PathFollow::_validate_property(PropertyInfo &property) const {
 	}
 }
 
+String PathFollow::get_configuration_warning() const {
+
+	if (!is_visible_in_tree() || !is_inside_tree())
+		return String();
+
+	if (!Object::cast_to<Path>(get_parent())) {
+		return TTR("PathFollow only works when set as a child of a Path node.");
+	}
+
+	return String();
+}
+
 void PathFollow::_bind_methods() {
 
 	ClassDB::bind_method(D_METHOD("set_offset", "offset"), &PathFollow::set_offset);
@@ -444,6 +466,23 @@ void OrientedPathFollow::_validate_property(PropertyInfo &property) const {
 	}
 }
 
+String OrientedPathFollow::get_configuration_warning() const {
+
+	if (!is_visible_in_tree() || !is_inside_tree())
+		return String();
+
+	if (!Object::cast_to<Path>(get_parent())) {
+		return TTR("OrientedPathFollow only works when set as a child of a Path node.");
+	} else {
+		Path *path = Object::cast_to<Path>(get_parent());
+		if (path->get_curve().is_valid() && !path->get_curve()->is_up_vector_enabled()) {
+			return TTR("OrientedPathFollow requires up vectors enabled in its parent Path.");
+		}
+	}
+
+	return String();
+}
+
 void OrientedPathFollow::_bind_methods() {
 
 	ClassDB::bind_method(D_METHOD("set_offset", "offset"), &OrientedPathFollow::set_offset);

+ 4 - 0
scene/3d/path.h

@@ -106,6 +106,8 @@ public:
 	void set_cubic_interpolation(bool p_enable);
 	bool get_cubic_interpolation() const;
 
+	String get_configuration_warning() const;
+
 	PathFollow();
 };
 
@@ -151,6 +153,8 @@ public:
 	void set_cubic_interpolation(bool p_enable);
 	bool get_cubic_interpolation() const;
 
+	String get_configuration_warning() const;
+
 	OrientedPathFollow();
 };