Quellcode durchsuchen

Move removal of the constraints from bodies to Joint3DSW destructor

Joint3DSW instances are also destroyed without explicitly calling free()
for example when changing constrainted bodies at runtime using
set_node method.
Eryk Dwornicki vor 4 Jahren
Ursprung
Commit
aa42e8920b
2 geänderte Dateien mit 9 neuen und 3 gelöschten Zeilen
  1. 9 0
      servers/physics_3d/joints_3d_sw.h
  2. 0 3
      servers/physics_3d/physics_server_3d_sw.cpp

+ 9 - 0
servers/physics_3d/joints_3d_sw.h

@@ -49,6 +49,15 @@ public:
 	_FORCE_INLINE_ Joint3DSW(Body3DSW **p_body_ptr = nullptr, int p_body_count = 0) :
 			Constraint3DSW(p_body_ptr, p_body_count) {
 	}
+
+	virtual ~Joint3DSW() {
+		for (int i = 0; i < get_body_count(); i++) {
+			Body3DSW *body = get_body_ptr()[i];
+			if (body) {
+				body->remove_constraint(this);
+			}
+		}
+	}
 };
 
 #endif // JOINTS_SW_H

+ 0 - 3
servers/physics_3d/physics_server_3d_sw.cpp

@@ -1312,9 +1312,6 @@ void PhysicsServer3DSW::free(RID p_rid) {
 	} else if (joint_owner.owns(p_rid)) {
 		Joint3DSW *joint = joint_owner.getornull(p_rid);
 
-		for (int i = 0; i < joint->get_body_count(); i++) {
-			joint->get_body_ptr()[i]->remove_constraint(joint);
-		}
 		joint_owner.free(p_rid);
 		memdelete(joint);