Jelajahi Sumber

Merge pull request #17899 from AndreaCatania/area_cleaning

Fixed physics server area cleaning
Rémi Verschelde 7 tahun lalu
induk
melakukan
bdfa10fc8f

+ 5 - 3
modules/bullet/area_bullet.cpp

@@ -68,7 +68,8 @@ AreaBullet::AreaBullet() :
 }
 
 AreaBullet::~AreaBullet() {
-	remove_all_overlapping_instantly();
+	// Call "remove_all_overlapping_instantly();" is not necessary because the exit
+	// signal are handled by godot, so just clear the array
 }
 
 void AreaBullet::dispatch_callbacks() {
@@ -131,12 +132,13 @@ void AreaBullet::remove_all_overlapping_instantly() {
 	overlappingObjects.clear();
 }
 
-void AreaBullet::remove_overlapping_instantly(CollisionObjectBullet *p_object) {
+void AreaBullet::remove_overlapping_instantly(CollisionObjectBullet *p_object, bool p_notify) {
 	CollisionObjectBullet *supportObject;
 	for (int i = overlappingObjects.size() - 1; 0 <= i; --i) {
 		supportObject = overlappingObjects[i].object;
 		if (supportObject == p_object) {
-			call_event(supportObject, PhysicsServer::AREA_BODY_REMOVED);
+			if (p_notify)
+				call_event(supportObject, PhysicsServer::AREA_BODY_REMOVED);
 			supportObject->on_exit_area(this);
 			overlappingObjects.remove(i);
 			break;

+ 1 - 1
modules/bullet/area_bullet.h

@@ -152,7 +152,7 @@ public:
 
 	void remove_all_overlapping_instantly();
 	// Dispatch the callbacks and removes from overlapping list
-	void remove_overlapping_instantly(CollisionObjectBullet *p_object);
+	void remove_overlapping_instantly(CollisionObjectBullet *p_object, bool p_notify);
 
 	virtual void on_collision_filters_change();
 	virtual void on_collision_checker_start() {}

+ 2 - 4
modules/bullet/collision_object_bullet.cpp

@@ -68,12 +68,10 @@ CollisionObjectBullet::CollisionObjectBullet(Type p_type) :
 		force_shape_reset(false) {}
 
 CollisionObjectBullet::~CollisionObjectBullet() {
-	// Remove all overlapping
+	// Remove all overlapping, notify is not required since godot take care of it
 	for (int i = areasOverlapped.size() - 1; 0 <= i; --i) {
-		areasOverlapped[i]->remove_overlapping_instantly(this);
+		areasOverlapped[i]->remove_overlapping_instantly(this, /*Notify*/ false);
 	}
-	// not required
-	// areasOverlapped.clear();
 
 	destroyBulletCollisionObject();
 }