diff --git a/scene/2d/physics/physics_body_2d.cpp b/scene/2d/physics/physics_body_2d.cpp index df6ec65d9c..18a29ee134 100644 --- a/scene/2d/physics/physics_body_2d.cpp +++ b/scene/2d/physics/physics_body_2d.cpp @@ -169,3 +169,13 @@ void PhysicsBody2D::remove_collision_exception_with(Node *p_node) { ERR_FAIL_NULL_MSG(physics_body, "Collision exception only works between two nodes that inherit from PhysicsBody2D."); PhysicsServer2D::get_singleton()->body_remove_collision_exception(get_rid(), physics_body->get_rid()); } + +PackedStringArray PhysicsBody2D::get_configuration_warnings() const { + PackedStringArray warnings = CollisionObject2D::get_configuration_warnings(); + + if (!is_physics_interpolated()) { + warnings.push_back(RTR("PhysicsBody2D will not work correctly on a non-interpolated branch of the SceneTree.\nCheck the node's inherited physics_interpolation_mode.")); + } + + return warnings; +} diff --git a/scene/2d/physics/physics_body_2d.h b/scene/2d/physics/physics_body_2d.h index de69c62393..6646bfd808 100644 --- a/scene/2d/physics/physics_body_2d.h +++ b/scene/2d/physics/physics_body_2d.h @@ -47,6 +47,8 @@ protected: Ref _move(const Vector2 &p_motion, bool p_test_only = false, real_t p_margin = 0.08, bool p_recovery_as_collision = false); public: + PackedStringArray get_configuration_warnings() const override; + bool move_and_collide(const PhysicsServer2D::MotionParameters &p_parameters, PhysicsServer2D::MotionResult &r_result, bool p_test_only = false, bool p_cancel_sliding = true); bool test_move(const Transform2D &p_from, const Vector2 &p_motion, const Ref &r_collision = Ref(), real_t p_margin = 0.08, bool p_recovery_as_collision = false); Vector2 get_gravity() const; diff --git a/scene/3d/physics/physics_body_3d.cpp b/scene/3d/physics/physics_body_3d.cpp index fa27312dd5..c844e5ddf7 100644 --- a/scene/3d/physics/physics_body_3d.cpp +++ b/scene/3d/physics/physics_body_3d.cpp @@ -210,6 +210,16 @@ real_t PhysicsBody3D::get_inverse_mass() const { return 0; } +PackedStringArray PhysicsBody3D::get_configuration_warnings() const { + PackedStringArray warnings = CollisionObject3D::get_configuration_warnings(); + + if (!is_physics_interpolated()) { + warnings.push_back(RTR("PhysicsBody3D will not work correctly on a non-interpolated branch of the SceneTree.\nCheck the node's inherited physics_interpolation_mode.")); + } + + return warnings; +} + /////////////////////////////////////// //so, if you pass 45 as limit, avoid numerical precision errors when angle is 45. diff --git a/scene/3d/physics/physics_body_3d.h b/scene/3d/physics/physics_body_3d.h index e2145e609b..5ad4f99e32 100644 --- a/scene/3d/physics/physics_body_3d.h +++ b/scene/3d/physics/physics_body_3d.h @@ -49,6 +49,8 @@ protected: Ref _move(const Vector3 &p_motion, bool p_test_only = false, real_t p_margin = 0.001, bool p_recovery_as_collision = false, int p_max_collisions = 1); public: + PackedStringArray get_configuration_warnings() const override; + bool move_and_collide(const PhysicsServer3D::MotionParameters &p_parameters, PhysicsServer3D::MotionResult &r_result, bool p_test_only = false, bool p_cancel_sliding = true); bool test_move(const Transform3D &p_from, const Vector3 &p_motion, const Ref &r_collision = Ref(), real_t p_margin = 0.001, bool p_recovery_as_collision = false, int p_max_collisions = 1); Vector3 get_gravity() const; diff --git a/scene/main/node.cpp b/scene/main/node.cpp index e069170c81..c6d91b2609 100644 --- a/scene/main/node.cpp +++ b/scene/main/node.cpp @@ -516,6 +516,8 @@ void Node::_propagate_physics_interpolated(bool p_interpolated) { // Allow a call to the RenderingServer etc. in derived classes. _physics_interpolated_changed(); + update_configuration_warnings(); + data.blocked++; for (KeyValue &K : data.children) { K.value->_propagate_physics_interpolated(p_interpolated);