Browse Source

Merge pull request #45160 from madmiraal/fix-45145-3.2

[3.2] Only remove Bullet's body constraints when removing body from space
Rémi Verschelde 4 years ago
parent
commit
b64fe918aa

+ 2 - 1
modules/bullet/rigid_body_bullet.cpp

@@ -338,7 +338,8 @@ void RigidBodyBullet::set_space(SpaceBullet *p_space) {
 	if (space) {
 	if (space) {
 		can_integrate_forces = false;
 		can_integrate_forces = false;
 		isScratchedSpaceOverrideModificator = false;
 		isScratchedSpaceOverrideModificator = false;
-
+		// Remove any constraints
+		space->remove_rigid_body_constraints(this);
 		// Remove this object form the physics world
 		// Remove this object form the physics world
 		space->remove_rigid_body(this);
 		space->remove_rigid_body(this);
 	}
 	}

+ 5 - 1
modules/bullet/space_bullet.cpp

@@ -497,7 +497,7 @@ void SpaceBullet::add_rigid_body(RigidBodyBullet *p_body) {
 	}
 	}
 }
 }
 
 
-void SpaceBullet::remove_rigid_body(RigidBodyBullet *p_body) {
+void SpaceBullet::remove_rigid_body_constraints(RigidBodyBullet *p_body) {
 	btRigidBody *btBody = p_body->get_bt_rigid_body();
 	btRigidBody *btBody = p_body->get_bt_rigid_body();
 
 
 	int constraints = btBody->getNumConstraintRefs();
 	int constraints = btBody->getNumConstraintRefs();
@@ -507,6 +507,10 @@ void SpaceBullet::remove_rigid_body(RigidBodyBullet *p_body) {
 			dynamicsWorld->removeConstraint(btBody->getConstraintRef(i));
 			dynamicsWorld->removeConstraint(btBody->getConstraintRef(i));
 		}
 		}
 	}
 	}
+}
+
+void SpaceBullet::remove_rigid_body(RigidBodyBullet *p_body) {
+	btRigidBody *btBody = p_body->get_bt_rigid_body();
 
 
 	if (p_body->is_static()) {
 	if (p_body->is_static()) {
 		dynamicsWorld->removeCollisionObject(btBody);
 		dynamicsWorld->removeCollisionObject(btBody);

+ 1 - 0
modules/bullet/space_bullet.h

@@ -149,6 +149,7 @@ public:
 	void reload_collision_filters(AreaBullet *p_area);
 	void reload_collision_filters(AreaBullet *p_area);
 
 
 	void add_rigid_body(RigidBodyBullet *p_body);
 	void add_rigid_body(RigidBodyBullet *p_body);
+	void remove_rigid_body_constraints(RigidBodyBullet *p_body);
 	void remove_rigid_body(RigidBodyBullet *p_body);
 	void remove_rigid_body(RigidBodyBullet *p_body);
 	void reload_collision_filters(RigidBodyBullet *p_body);
 	void reload_collision_filters(RigidBodyBullet *p_body);