Browse Source

Merge pull request #18081 from AndreaCatania/arcle

Corrected area overlap cleaning
Rémi Verschelde 7 years ago
parent
commit
e15f2636ea

+ 11 - 13
modules/bullet/area_bullet.cpp

@@ -68,8 +68,9 @@ AreaBullet::AreaBullet() :
 }
 
 AreaBullet::~AreaBullet() {
-	// Call "remove_all_overlapping_instantly();" is not necessary because the exit
-	// signal are handled by godot, so just clear the array
+	// signal are handled by godot, so just clear without notify
+	for (int i = overlappingObjects.size() - 1; 0 <= i; --i)
+		overlappingObjects[i].object->on_exit_area(this);
 }
 
 void AreaBullet::dispatch_callbacks() {
@@ -122,24 +123,21 @@ void AreaBullet::scratch() {
 	isScratched = true;
 }
 
-void AreaBullet::remove_all_overlapping_instantly() {
-	CollisionObjectBullet *supportObject;
+void AreaBullet::clear_overlaps(bool p_notify) {
 	for (int i = overlappingObjects.size() - 1; 0 <= i; --i) {
-		supportObject = overlappingObjects[i].object;
-		call_event(supportObject, PhysicsServer::AREA_BODY_REMOVED);
-		supportObject->on_exit_area(this);
+		if (p_notify)
+			call_event(overlappingObjects[i].object, PhysicsServer::AREA_BODY_REMOVED);
+		overlappingObjects[i].object->on_exit_area(this);
 	}
 	overlappingObjects.clear();
 }
 
-void AreaBullet::remove_overlapping_instantly(CollisionObjectBullet *p_object, bool p_notify) {
-	CollisionObjectBullet *supportObject;
+void AreaBullet::remove_overlap(CollisionObjectBullet *p_object, bool p_notify) {
 	for (int i = overlappingObjects.size() - 1; 0 <= i; --i) {
-		supportObject = overlappingObjects[i].object;
-		if (supportObject == p_object) {
+		if (overlappingObjects[i].object == p_object) {
 			if (p_notify)
-				call_event(supportObject, PhysicsServer::AREA_BODY_REMOVED);
-			supportObject->on_exit_area(this);
+				call_event(overlappingObjects[i].object, PhysicsServer::AREA_BODY_REMOVED);
+			overlappingObjects[i].object->on_exit_area(this);
 			overlappingObjects.remove(i);
 			break;
 		}

+ 2 - 2
modules/bullet/area_bullet.h

@@ -150,9 +150,9 @@ public:
 	void set_on_state_change(ObjectID p_id, const StringName &p_method, const Variant &p_udata = Variant());
 	void scratch();
 
-	void remove_all_overlapping_instantly();
+	void clear_overlaps(bool p_notify);
 	// Dispatch the callbacks and removes from overlapping list
-	void remove_overlapping_instantly(CollisionObjectBullet *p_object, bool p_notify);
+	void remove_overlap(CollisionObjectBullet *p_object, bool p_notify);
 
 	virtual void on_collision_filters_change();
 	virtual void on_collision_checker_start() {}

+ 1 - 1
modules/bullet/collision_object_bullet.cpp

@@ -70,7 +70,7 @@ CollisionObjectBullet::CollisionObjectBullet(Type p_type) :
 CollisionObjectBullet::~CollisionObjectBullet() {
 	// 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, /*Notify*/ false);
+		areasOverlapped[i]->remove_overlap(this, /*Notify*/ false);
 	}
 
 	destroyBulletCollisionObject();