Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[3.x] Fix Area monitorable in 2D and 3D Godot physics. #41699

Merged
merged 1 commit into from
Nov 20, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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