Skip to content

Commit

Permalink
Merge pull request #41699 from madmiraal/fix-23484-3.2
Browse files Browse the repository at this point in the history
[3.x] Fix Area monitorable in 2D and 3D Godot physics.
  • Loading branch information
akien-mga authored Nov 20, 2021
2 parents e0cdb8f + e900bac commit 2493995
Show file tree
Hide file tree
Showing 6 changed files with 22 additions and 12 deletions.
14 changes: 8 additions & 6 deletions servers/physics/area_pair_sw.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -100,20 +100,20 @@ bool Area2PairSW::setup(real_t p_step) {

if (result != colliding) {
if (result) {
if (area_b->has_area_monitor_callback() && area_a->is_monitorable()) {
if (area_b->has_area_monitor_callback() && area_a_monitorable) {
area_b->add_area_to_query(area_a, shape_a, shape_b);
}

if (area_a->has_area_monitor_callback() && area_b->is_monitorable()) {
if (area_a->has_area_monitor_callback() && area_b_monitorable) {
area_a->add_area_to_query(area_b, shape_b, shape_a);
}

} else {
if (area_b->has_area_monitor_callback() && area_a->is_monitorable()) {
if (area_b->has_area_monitor_callback() && area_a_monitorable) {
area_b->remove_area_from_query(area_a, shape_a, shape_b);
}

if (area_a->has_area_monitor_callback() && area_b->is_monitorable()) {
if (area_a->has_area_monitor_callback() && area_b_monitorable) {
area_a->remove_area_from_query(area_b, shape_b, shape_a);
}
}
Expand All @@ -133,17 +133,19 @@ Area2PairSW::Area2PairSW(AreaSW *p_area_a, int p_shape_a, AreaSW *p_area_b, int
shape_a = p_shape_a;
shape_b = p_shape_b;
colliding = false;
area_a_monitorable = area_a->is_monitorable();
area_b_monitorable = area_b->is_monitorable();
area_a->add_constraint(this);
area_b->add_constraint(this);
}

Area2PairSW::~Area2PairSW() {
if (colliding) {
if (area_b->has_area_monitor_callback()) {
if (area_b->has_area_monitor_callback() && area_a_monitorable) {
area_b->remove_area_from_query(area_a, shape_a, shape_b);
}

if (area_a->has_area_monitor_callback()) {
if (area_a->has_area_monitor_callback() && area_b_monitorable) {
area_a->remove_area_from_query(area_b, shape_b, shape_a);
}
}
Expand Down
2 changes: 2 additions & 0 deletions servers/physics/area_pair_sw.h
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,8 @@ class Area2PairSW : public ConstraintSW {
int shape_a;
int shape_b;
bool colliding;
bool area_a_monitorable;
bool area_b_monitorable;

public:
bool setup(real_t p_step);
Expand Down
1 change: 1 addition & 0 deletions servers/physics/area_sw.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -195,6 +195,7 @@ void AreaSW::set_monitorable(bool p_monitorable) {

monitorable = p_monitorable;
_set_static(!monitorable);
_shapes_changed();
}

void AreaSW::call_queries() {
Expand Down
1 change: 1 addition & 0 deletions servers/physics_2d/area_2d_sw.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -195,6 +195,7 @@ void Area2DSW::set_monitorable(bool p_monitorable) {

monitorable = p_monitorable;
_set_static(!monitorable);
_shapes_changed();
}

void Area2DSW::call_queries() {
Expand Down
14 changes: 8 additions & 6 deletions servers/physics_2d/area_pair_2d_sw.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -100,20 +100,20 @@ bool Area2Pair2DSW::setup(real_t p_step) {

if (result != colliding) {
if (result) {
if (area_b->has_area_monitor_callback() && area_a->is_monitorable()) {
if (area_b->has_area_monitor_callback() && area_a_monitorable) {
area_b->add_area_to_query(area_a, shape_a, shape_b);
}

if (area_a->has_area_monitor_callback() && area_b->is_monitorable()) {
if (area_a->has_area_monitor_callback() && area_b_monitorable) {
area_a->add_area_to_query(area_b, shape_b, shape_a);
}

} else {
if (area_b->has_area_monitor_callback() && area_a->is_monitorable()) {
if (area_b->has_area_monitor_callback() && area_a_monitorable) {
area_b->remove_area_from_query(area_a, shape_a, shape_b);
}

if (area_a->has_area_monitor_callback() && area_b->is_monitorable()) {
if (area_a->has_area_monitor_callback() && area_b_monitorable) {
area_a->remove_area_from_query(area_b, shape_b, shape_a);
}
}
Expand All @@ -133,17 +133,19 @@ Area2Pair2DSW::Area2Pair2DSW(Area2DSW *p_area_a, int p_shape_a, Area2DSW *p_area
shape_a = p_shape_a;
shape_b = p_shape_b;
colliding = false;
area_a_monitorable = area_a->is_monitorable();
area_b_monitorable = area_b->is_monitorable();
area_a->add_constraint(this);
area_b->add_constraint(this);
}

Area2Pair2DSW::~Area2Pair2DSW() {
if (colliding) {
if (area_b->has_area_monitor_callback()) {
if (area_b->has_area_monitor_callback() && area_a_monitorable) {
area_b->remove_area_from_query(area_a, shape_a, shape_b);
}

if (area_a->has_area_monitor_callback()) {
if (area_a->has_area_monitor_callback() && area_b_monitorable) {
area_a->remove_area_from_query(area_b, shape_b, shape_a);
}
}
Expand Down
2 changes: 2 additions & 0 deletions servers/physics_2d/area_pair_2d_sw.h
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,8 @@ class Area2Pair2DSW : public Constraint2DSW {
int shape_a;
int shape_b;
bool colliding;
bool area_a_monitorable;
bool area_b_monitorable;

public:
bool setup(real_t p_step);
Expand Down

0 comments on commit 2493995

Please sign in to comment.