Fix Joint2D/Joint3D node path reset on scene switch

When one of the bodies exited the tree, the corresponding node path was
reset instead of just resetting the joint from the physics server. That
was causing the node path to be reset on scene switch when one of the
bodies is under the joint in the scene tree.
This commit is contained in:
PouleyKetchoupp 2021-03-01 17:48:44 -07:00
parent f01e95eb55
commit 2dc5ff0caa
4 changed files with 10 additions and 30 deletions

View file

@ -49,19 +49,9 @@ void Joint2D::_disconnect_signals() {
}
}
void Joint2D::_body_exit_tree(const ObjectID &p_body_id) {
void Joint2D::_body_exit_tree() {
_disconnect_signals();
Object *object = ObjectDB::get_instance(p_body_id);
PhysicsBody2D *body = Object::cast_to<PhysicsBody2D>(object);
ERR_FAIL_NULL(body);
RID body_rid = body->get_rid();
if (ba == body_rid) {
a = NodePath();
}
if (bb == body_rid) {
b = NodePath();
}
_update_joint();
_update_joint(true);
}
void Joint2D::_update_joint(bool p_only_free) {
@ -142,8 +132,8 @@ void Joint2D::_update_joint(bool p_only_free) {
ba = body_a->get_rid();
bb = body_b->get_rid();
body_a->connect(SceneStringNames::get_singleton()->tree_exiting, callable_mp(this, &Joint2D::_body_exit_tree), make_binds(body_a->get_instance_id()));
body_b->connect(SceneStringNames::get_singleton()->tree_exiting, callable_mp(this, &Joint2D::_body_exit_tree), make_binds(body_b->get_instance_id()));
body_a->connect(SceneStringNames::get_singleton()->tree_exiting, callable_mp(this, &Joint2D::_body_exit_tree));
body_b->connect(SceneStringNames::get_singleton()->tree_exiting, callable_mp(this, &Joint2D::_body_exit_tree));
PhysicsServer2D::get_singleton()->joint_disable_collisions_between_bodies(joint, exclude_from_collision);
}

View file

@ -51,7 +51,7 @@ class Joint2D : public Node2D {
protected:
void _disconnect_signals();
void _body_exit_tree(const ObjectID &p_body_id);
void _body_exit_tree();
void _update_joint(bool p_only_free = false);
void _notification(int p_what);

View file

@ -46,19 +46,9 @@ void Joint3D::_disconnect_signals() {
}
}
void Joint3D::_body_exit_tree(const ObjectID &p_body_id) {
void Joint3D::_body_exit_tree() {
_disconnect_signals();
Object *object = ObjectDB::get_instance(p_body_id);
PhysicsBody3D *body = Object::cast_to<PhysicsBody3D>(object);
ERR_FAIL_NULL(body);
RID body_rid = body->get_rid();
if (ba == body_rid) {
a = NodePath();
}
if (bb == body_rid) {
b = NodePath();
}
_update_joint();
_update_joint(true);
}
void Joint3D::_update_joint(bool p_only_free) {
@ -133,12 +123,12 @@ void Joint3D::_update_joint(bool p_only_free) {
if (body_a) {
ba = body_a->get_rid();
body_a->connect(SceneStringNames::get_singleton()->tree_exiting, callable_mp(this, &Joint3D::_body_exit_tree), make_binds(body_a->get_instance_id()));
body_a->connect(SceneStringNames::get_singleton()->tree_exiting, callable_mp(this, &Joint3D::_body_exit_tree));
}
if (body_b) {
bb = body_b->get_rid();
body_b->connect(SceneStringNames::get_singleton()->tree_exiting, callable_mp(this, &Joint3D::_body_exit_tree), make_binds(body_b->get_instance_id()));
body_b->connect(SceneStringNames::get_singleton()->tree_exiting, callable_mp(this, &Joint3D::_body_exit_tree));
}
PhysicsServer3D::get_singleton()->joint_disable_collisions_between_bodies(joint, exclude_from_collision);

View file

@ -51,7 +51,7 @@ class Joint3D : public Node3D {
protected:
void _disconnect_signals();
void _body_exit_tree(const ObjectID &p_body_id);
void _body_exit_tree();
void _update_joint(bool p_only_free = false);
void _notification(int p_what);