From 45b778c7f85d9d827e1fe2beb42913e1b47361f1 Mon Sep 17 00:00:00 2001 From: Andrea Catania Date: Mon, 9 Apr 2018 09:33:29 +0200 Subject: [PATCH] Fixed area overlap cleaning --- modules/bullet/area_bullet.cpp | 24 ++++++++++------------ modules/bullet/area_bullet.h | 4 ++-- modules/bullet/collision_object_bullet.cpp | 2 +- 3 files changed, 14 insertions(+), 16 deletions(-) diff --git a/modules/bullet/area_bullet.cpp b/modules/bullet/area_bullet.cpp index ec78cddb6ae..bfb452d109c 100644 --- a/modules/bullet/area_bullet.cpp +++ b/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; } diff --git a/modules/bullet/area_bullet.h b/modules/bullet/area_bullet.h index 4104780de93..b2046c684e9 100644 --- a/modules/bullet/area_bullet.h +++ b/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() {} diff --git a/modules/bullet/collision_object_bullet.cpp b/modules/bullet/collision_object_bullet.cpp index 77f8df34cb7..05c0e653df4 100644 --- a/modules/bullet/collision_object_bullet.cpp +++ b/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();