diff options
author | Andrea Catania <info@andreacatania.com> | 2018-04-09 09:33:29 +0200 |
---|---|---|
committer | Andrea Catania <info@andreacatania.com> | 2018-04-09 09:33:29 +0200 |
commit | 45b778c7f85d9d827e1fe2beb42913e1b47361f1 (patch) | |
tree | 0f9fe74b546a5361347d46128ccc77d9c0bbe2a7 /modules | |
parent | 0ee72fbd30b25ff397b570294c3cd2f65c176e34 (diff) |
Fixed area overlap cleaning
Diffstat (limited to 'modules')
-rw-r--r-- | modules/bullet/area_bullet.cpp | 24 | ||||
-rw-r--r-- | modules/bullet/area_bullet.h | 4 | ||||
-rw-r--r-- | 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 ec78cddb6a..bfb452d109 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 4104780de9..b2046c684e 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 77f8df34cb..05c0e653df 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(); |