From e900bac80b42d6f405ee284c3c878420e81d7f78 Mon Sep 17 00:00:00 2001 From: Marcel Admiraal Date: Tue, 1 Sep 2020 17:25:02 +0100 Subject: [PATCH] Add area to moved list when changing monitorable, and only remove area from query when deleting pair if it was monitorable. --- servers/physics/area_pair_sw.cpp | 14 ++++++++------ servers/physics/area_pair_sw.h | 2 ++ servers/physics/area_sw.cpp | 1 + servers/physics_2d/area_2d_sw.cpp | 1 + servers/physics_2d/area_pair_2d_sw.cpp | 14 ++++++++------ servers/physics_2d/area_pair_2d_sw.h | 2 ++ 6 files changed, 22 insertions(+), 12 deletions(-) diff --git a/servers/physics/area_pair_sw.cpp b/servers/physics/area_pair_sw.cpp index c8637723edfb..3497494d21fd 100644 --- a/servers/physics/area_pair_sw.cpp +++ b/servers/physics/area_pair_sw.cpp @@ -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); } } @@ -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); } } diff --git a/servers/physics/area_pair_sw.h b/servers/physics/area_pair_sw.h index a348feda5d6e..2955d625ad89 100644 --- a/servers/physics/area_pair_sw.h +++ b/servers/physics/area_pair_sw.h @@ -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); diff --git a/servers/physics/area_sw.cpp b/servers/physics/area_sw.cpp index 1d27d994b730..6297498845ca 100644 --- a/servers/physics/area_sw.cpp +++ b/servers/physics/area_sw.cpp @@ -195,6 +195,7 @@ void AreaSW::set_monitorable(bool p_monitorable) { monitorable = p_monitorable; _set_static(!monitorable); + _shapes_changed(); } void AreaSW::call_queries() { diff --git a/servers/physics_2d/area_2d_sw.cpp b/servers/physics_2d/area_2d_sw.cpp index abf7347a9264..77a2d3889c7b 100644 --- a/servers/physics_2d/area_2d_sw.cpp +++ b/servers/physics_2d/area_2d_sw.cpp @@ -195,6 +195,7 @@ void Area2DSW::set_monitorable(bool p_monitorable) { monitorable = p_monitorable; _set_static(!monitorable); + _shapes_changed(); } void Area2DSW::call_queries() { diff --git a/servers/physics_2d/area_pair_2d_sw.cpp b/servers/physics_2d/area_pair_2d_sw.cpp index 76e54af79295..dce936767106 100644 --- a/servers/physics_2d/area_pair_2d_sw.cpp +++ b/servers/physics_2d/area_pair_2d_sw.cpp @@ -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); } } @@ -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); } } diff --git a/servers/physics_2d/area_pair_2d_sw.h b/servers/physics_2d/area_pair_2d_sw.h index 4015aad5d174..54582c5e44f6 100644 --- a/servers/physics_2d/area_pair_2d_sw.h +++ b/servers/physics_2d/area_pair_2d_sw.h @@ -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);