From 84af1d924851af37c7a26eaafd966cbc9ae21946 Mon Sep 17 00:00:00 2001 From: Marcel Admiraal Date: Thu, 24 Sep 2020 15:11:06 +0100 Subject: [PATCH] Update Bullet Area overlaps when Area properties or shapes change. (cherry picked from commit 0d3e8538ef4703955499fc0f8d532a99c92cb689) --- modules/bullet/area_bullet.cpp | 4 ++++ modules/bullet/area_bullet.h | 2 +- modules/bullet/collision_object_bullet.cpp | 6 +++--- modules/bullet/collision_object_bullet.h | 6 +++--- modules/bullet/rigid_body_bullet.cpp | 2 +- modules/bullet/space_bullet.cpp | 2 +- 6 files changed, 13 insertions(+), 9 deletions(-) diff --git a/modules/bullet/area_bullet.cpp b/modules/bullet/area_bullet.cpp index 15bac71ed76..bb48d16b37d 100644 --- a/modules/bullet/area_bullet.cpp +++ b/modules/bullet/area_bullet.cpp @@ -164,6 +164,7 @@ int AreaBullet::find_overlapping_object(CollisionObjectBullet *p_colObj) { void AreaBullet::set_monitorable(bool p_monitorable) { monitorable = p_monitorable; + updated = true; } bool AreaBullet::is_monitoring() const { @@ -173,6 +174,7 @@ bool AreaBullet::is_monitoring() const { void AreaBullet::main_shape_changed() { CRASH_COND(!get_main_shape()); btGhost->setCollisionShape(get_main_shape()); + updated = true; } void AreaBullet::reload_body() { @@ -203,6 +205,7 @@ void AreaBullet::on_collision_filters_change() { if (space) { space->reload_collision_filters(this); } + updated = true; } void AreaBullet::add_overlap(CollisionObjectBullet *p_otherObject) { @@ -288,6 +291,7 @@ void AreaBullet::set_event_callback(Type p_callbackObjectType, ObjectID p_id, co set_godot_object_flags(get_godot_object_flags() | GOF_IS_MONITORING_AREA); } else { set_godot_object_flags(get_godot_object_flags() & (~GOF_IS_MONITORING_AREA)); + clear_overlaps(true); } } diff --git a/modules/bullet/area_bullet.h b/modules/bullet/area_bullet.h index 5dd6edfc6a9..c15964e99cf 100644 --- a/modules/bullet/area_bullet.h +++ b/modules/bullet/area_bullet.h @@ -156,7 +156,7 @@ public: virtual void on_collision_filters_change(); virtual void on_collision_checker_start() {} - virtual void on_collision_checker_end() { isTransformChanged = false; } + virtual void on_collision_checker_end() { updated = false; } void add_overlap(CollisionObjectBullet *p_otherObject); void put_overlap_as_exit(int p_index); diff --git a/modules/bullet/collision_object_bullet.cpp b/modules/bullet/collision_object_bullet.cpp index 6a4bd5bc0a1..eb9fa283dbf 100644 --- a/modules/bullet/collision_object_bullet.cpp +++ b/modules/bullet/collision_object_bullet.cpp @@ -100,8 +100,7 @@ CollisionObjectBullet::CollisionObjectBullet(Type p_type) : bt_collision_object(nullptr), body_scale(1., 1., 1.), force_shape_reset(false), - space(nullptr), - isTransformChanged(false) {} + space(nullptr) {} CollisionObjectBullet::~CollisionObjectBullet() { // Remove all overlapping, notify is not required since godot take care of it @@ -198,6 +197,7 @@ void CollisionObjectBullet::on_exit_area(AreaBullet *p_area) { void CollisionObjectBullet::set_godot_object_flags(int flags) { bt_collision_object->setUserIndex2(flags); + updated = true; } int CollisionObjectBullet::get_godot_object_flags() const { @@ -231,7 +231,7 @@ const btTransform &CollisionObjectBullet::get_transform__bullet() const { } void CollisionObjectBullet::notify_transform_changed() { - isTransformChanged = true; + updated = true; } RigidCollisionObjectBullet::RigidCollisionObjectBullet(Type p_type) : diff --git a/modules/bullet/collision_object_bullet.h b/modules/bullet/collision_object_bullet.h index 2985ec5460c..1da46185678 100644 --- a/modules/bullet/collision_object_bullet.h +++ b/modules/bullet/collision_object_bullet.h @@ -133,7 +133,7 @@ protected: /// New area is added when overlap with new area (AreaBullet::addOverlap), then is removed when it exit (CollisionObjectBullet::onExitArea) /// This array is used mainly to know which area hold the pointer of this object Vector areasOverlapped; - bool isTransformChanged; + bool updated = false; public: CollisionObjectBullet(Type p_type); @@ -211,9 +211,9 @@ public: Transform get_transform() const; virtual void set_transform__bullet(const btTransform &p_global_transform); virtual const btTransform &get_transform__bullet() const; - - bool is_transform_changed() const { return isTransformChanged; } virtual void notify_transform_changed(); + + bool is_updated() const { return updated; } }; class RigidCollisionObjectBullet : public CollisionObjectBullet, public ShapeOwnerBullet { diff --git a/modules/bullet/rigid_body_bullet.cpp b/modules/bullet/rigid_body_bullet.cpp index 30cac0a60c4..73c35e559f4 100644 --- a/modules/bullet/rigid_body_bullet.cpp +++ b/modules/bullet/rigid_body_bullet.cpp @@ -437,7 +437,7 @@ void RigidBodyBullet::on_collision_checker_start() { void RigidBodyBullet::on_collision_checker_end() { // Always true if active and not a static or kinematic body - isTransformChanged = btBody->isActive() && !btBody->isStaticOrKinematicObject(); + updated = btBody->isActive() && !btBody->isStaticOrKinematicObject(); } bool RigidBodyBullet::add_collision_object(RigidBodyBullet *p_otherObject, const Vector3 &p_hitWorldLocation, const Vector3 &p_hitLocalLocation, const Vector3 &p_hitNormal, const float &p_appliedImpulse, int p_other_shape_index, int p_local_shape_index) { diff --git a/modules/bullet/space_bullet.cpp b/modules/bullet/space_bullet.cpp index 844f23e7b8b..6a6820fa6c8 100644 --- a/modules/bullet/space_bullet.cpp +++ b/modules/bullet/space_bullet.cpp @@ -720,7 +720,7 @@ void SpaceBullet::check_ghost_overlaps() { RigidCollisionObjectBullet *otherObject = static_cast(overlapped_bt_co->getUserPointer()); btVector3 other_body_scale(otherObject->get_bt_body_scale()); - if (!area->is_transform_changed() && !otherObject->is_transform_changed()) { + if (!area->is_updated() && !otherObject->is_updated()) { hasOverlap = -1 != area->find_overlapping_object(otherObject); goto collision_found; }