Physics Interpolation - Add editor warning for non-interpolated physics body

(cherry picked from commit 9ad73062e8)
This commit is contained in:
lawnjelly 2025-02-27 10:38:06 +00:00
parent 82158b3f7d
commit fec8e695b6
5 changed files with 34 additions and 2 deletions

View file

@ -60,6 +60,19 @@ void PhysicsBody2D::_bind_methods() {
ADD_PROPERTY(PropertyInfo(Variant::INT, "layers", PROPERTY_HINT_LAYERS_2D_PHYSICS, "", 0), "_set_layers", "_get_layers"); //for backwards compat ADD_PROPERTY(PropertyInfo(Variant::INT, "layers", PROPERTY_HINT_LAYERS_2D_PHYSICS, "", 0), "_set_layers", "_get_layers"); //for backwards compat
} }
String PhysicsBody2D::get_configuration_warning() const {
String warning = CollisionObject2D::get_configuration_warning();
if (!is_physics_interpolated()) {
if (!warning.empty()) {
warning += "\n\n";
}
warning += TTR("PhysicsBody2D will not work correctly on a non-interpolated branch of the SceneTree.\nCheck the node's inherited physics_interpolation_mode.");
}
return warning;
}
PhysicsBody2D::PhysicsBody2D(Physics2DServer::BodyMode p_mode) : PhysicsBody2D::PhysicsBody2D(Physics2DServer::BodyMode p_mode) :
CollisionObject2D(RID_PRIME(Physics2DServer::get_singleton()->body_create()), false) { CollisionObject2D(RID_PRIME(Physics2DServer::get_singleton()->body_create()), false) {
Physics2DServer::get_singleton()->body_set_mode(get_rid(), p_mode); Physics2DServer::get_singleton()->body_set_mode(get_rid(), p_mode);
@ -808,7 +821,7 @@ void RigidBody2D::_notification(int p_what) {
String RigidBody2D::get_configuration_warning() const { String RigidBody2D::get_configuration_warning() const {
Transform2D t = get_transform(); Transform2D t = get_transform();
String warning = CollisionObject2D::get_configuration_warning(); String warning = PhysicsBody2D::get_configuration_warning();
if ((get_mode() == MODE_RIGID || get_mode() == MODE_CHARACTER) && (ABS(t.elements[0].length() - 1.0) > 0.05 || ABS(t.elements[1].length() - 1.0) > 0.05)) { if ((get_mode() == MODE_RIGID || get_mode() == MODE_CHARACTER) && (ABS(t.elements[0].length() - 1.0) > 0.05 || ABS(t.elements[1].length() - 1.0) > 0.05)) {
if (warning != String()) { if (warning != String()) {

View file

@ -51,6 +51,8 @@ protected:
static void _bind_methods(); static void _bind_methods();
public: public:
virtual String get_configuration_warning() const;
Array get_collision_exceptions(); Array get_collision_exceptions();
void add_collision_exception_with(Node *p_node); //must be physicsbody void add_collision_exception_with(Node *p_node); //must be physicsbody
void remove_collision_exception_with(Node *p_node); void remove_collision_exception_with(Node *p_node);

View file

@ -98,6 +98,19 @@ void PhysicsBody::_bind_methods() {
ClassDB::bind_method(D_METHOD("_get_layers"), &PhysicsBody::_get_layers); ClassDB::bind_method(D_METHOD("_get_layers"), &PhysicsBody::_get_layers);
} }
String PhysicsBody::get_configuration_warning() const {
String warning = CollisionObject::get_configuration_warning();
if (!is_physics_interpolated()) {
if (!warning.empty()) {
warning += "\n\n";
}
warning += TTR("PhysicsBody will not work correctly on a non-interpolated branch of the SceneTree.\nCheck the node's inherited physics_interpolation_mode.");
}
return warning;
}
PhysicsBody::PhysicsBody(PhysicsServer::BodyMode p_mode) : PhysicsBody::PhysicsBody(PhysicsServer::BodyMode p_mode) :
CollisionObject(RID_PRIME(PhysicsServer::get_singleton()->body_create(p_mode)), false) { CollisionObject(RID_PRIME(PhysicsServer::get_singleton()->body_create(p_mode)), false) {
} }
@ -783,7 +796,7 @@ Array RigidBody::get_colliding_bodies() const {
String RigidBody::get_configuration_warning() const { String RigidBody::get_configuration_warning() const {
Transform t = get_transform(); Transform t = get_transform();
String warning = CollisionObject::get_configuration_warning(); String warning = PhysicsBody::get_configuration_warning();
if ((get_mode() == MODE_RIGID || get_mode() == MODE_CHARACTER) && (ABS(t.basis.get_axis(0).length() - 1.0) > 0.05 || ABS(t.basis.get_axis(1).length() - 1.0) > 0.05 || ABS(t.basis.get_axis(2).length() - 1.0) > 0.05)) { if ((get_mode() == MODE_RIGID || get_mode() == MODE_CHARACTER) && (ABS(t.basis.get_axis(0).length() - 1.0) > 0.05 || ABS(t.basis.get_axis(1).length() - 1.0) > 0.05 || ABS(t.basis.get_axis(2).length() - 1.0) > 0.05)) {
if (warning != String()) { if (warning != String()) {

View file

@ -49,6 +49,8 @@ protected:
PhysicsBody(PhysicsServer::BodyMode p_mode); PhysicsBody(PhysicsServer::BodyMode p_mode);
public: public:
virtual String get_configuration_warning() const;
virtual Vector3 get_linear_velocity() const; virtual Vector3 get_linear_velocity() const;
virtual Vector3 get_angular_velocity() const; virtual Vector3 get_angular_velocity() const;
virtual float get_inverse_mass() const; virtual float get_inverse_mass() const;

View file

@ -225,6 +225,8 @@ void Node::_propagate_physics_interpolated(bool p_interpolated) {
// allow a call to the VisualServer etc in derived classes // allow a call to the VisualServer etc in derived classes
_physics_interpolated_changed(); _physics_interpolated_changed();
update_configuration_warning();
data.blocked++; data.blocked++;
for (int i = 0; i < data.children.size(); i++) { for (int i = 0; i < data.children.size(); i++) {
data.children[i]->_propagate_physics_interpolated(p_interpolated); data.children[i]->_propagate_physics_interpolated(p_interpolated);