summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
author风青山 <idleman@yeah.net>2023-12-15 20:51:44 +0100
committerYuri Sizov <yuris@humnom.net>2023-12-15 20:54:54 +0100
commitea30aabfb1fe24ea6e98db03452942a87c4d5f94 (patch)
treea04bb073c636cc306126a5d3501c3d2099c99fbe
parentf8a2a9193662b2e8c1d04d65e647399dee94f31e (diff)
downloadredot-engine-ea30aabfb1fe24ea6e98db03452942a87c4d5f94.tar.gz
Clear monitoring in `Area*` when its space changes to invalid
So that it can work properly when the space changes to valid again. Change `space` in advance to prevent disabled areas from being queried again.
-rw-r--r--scene/2d/area_2d.cpp8
-rw-r--r--scene/2d/area_2d.h3
-rw-r--r--scene/2d/collision_object_2d.cpp8
-rw-r--r--scene/2d/collision_object_2d.h2
-rw-r--r--scene/3d/area_3d.cpp10
-rw-r--r--scene/3d/area_3d.h2
-rw-r--r--scene/3d/collision_object_3d.cpp7
-rw-r--r--scene/3d/collision_object_3d.h2
-rw-r--r--servers/physics_2d/godot_area_2d.h4
-rw-r--r--servers/physics_2d/godot_body_2d.cpp3
-rw-r--r--servers/physics_2d/godot_collision_object_2d.cpp11
-rw-r--r--servers/physics_3d/godot_area_3d.h4
-rw-r--r--servers/physics_3d/godot_body_3d.cpp3
-rw-r--r--servers/physics_3d/godot_collision_object_3d.cpp11
14 files changed, 52 insertions, 26 deletions
diff --git a/scene/2d/area_2d.cpp b/scene/2d/area_2d.cpp
index 3aa2a71a2c..2c4bf08f34 100644
--- a/scene/2d/area_2d.cpp
+++ b/scene/2d/area_2d.cpp
@@ -384,11 +384,9 @@ void Area2D::_clear_monitoring() {
}
}
-void Area2D::_notification(int p_what) {
- switch (p_what) {
- case NOTIFICATION_EXIT_TREE: {
- _clear_monitoring();
- } break;
+void Area2D::_space_changed(const RID &p_new_space) {
+ if (p_new_space.is_null()) {
+ _clear_monitoring();
}
}
diff --git a/scene/2d/area_2d.h b/scene/2d/area_2d.h
index 421c29f758..9d6e04b706 100644
--- a/scene/2d/area_2d.h
+++ b/scene/2d/area_2d.h
@@ -133,10 +133,11 @@ private:
StringName audio_bus;
protected:
- void _notification(int p_what);
static void _bind_methods();
void _validate_property(PropertyInfo &p_property) const;
+ virtual void _space_changed(const RID &p_new_space) override;
+
public:
void set_gravity_space_override_mode(SpaceOverride p_mode);
SpaceOverride get_gravity_space_override_mode() const;
diff --git a/scene/2d/collision_object_2d.cpp b/scene/2d/collision_object_2d.cpp
index ab42c52913..2fbe4eb409 100644
--- a/scene/2d/collision_object_2d.cpp
+++ b/scene/2d/collision_object_2d.cpp
@@ -59,6 +59,7 @@ void CollisionObject2D::_notification(int p_what) {
} else {
PhysicsServer2D::get_singleton()->body_set_space(rid, space);
}
+ _space_changed(space);
}
_update_pickable();
@@ -102,6 +103,7 @@ void CollisionObject2D::_notification(int p_what) {
} else {
PhysicsServer2D::get_singleton()->body_set_space(rid, RID());
}
+ _space_changed(RID());
}
}
@@ -125,6 +127,7 @@ void CollisionObject2D::_notification(int p_what) {
} else {
PhysicsServer2D::get_singleton()->body_set_space(rid, space);
}
+ _space_changed(space);
} break;
case NOTIFICATION_DISABLED: {
@@ -246,6 +249,7 @@ void CollisionObject2D::_apply_disabled() {
} else {
PhysicsServer2D::get_singleton()->body_set_space(rid, RID());
}
+ _space_changed(RID());
}
}
} break;
@@ -272,6 +276,7 @@ void CollisionObject2D::_apply_enabled() {
} else {
PhysicsServer2D::get_singleton()->body_set_space(rid, space);
}
+ _space_changed(space);
}
} break;
@@ -569,6 +574,9 @@ void CollisionObject2D::set_body_mode(PhysicsServer2D::BodyMode p_mode) {
PhysicsServer2D::get_singleton()->body_set_mode(rid, p_mode);
}
+void CollisionObject2D::_space_changed(const RID &p_new_space) {
+}
+
void CollisionObject2D::_update_pickable() {
if (!is_inside_tree()) {
return;
diff --git a/scene/2d/collision_object_2d.h b/scene/2d/collision_object_2d.h
index 88429b145d..780793f289 100644
--- a/scene/2d/collision_object_2d.h
+++ b/scene/2d/collision_object_2d.h
@@ -109,6 +109,8 @@ protected:
void set_body_mode(PhysicsServer2D::BodyMode p_mode);
+ virtual void _space_changed(const RID &p_new_space);
+
GDVIRTUAL3(_input_event, Viewport *, Ref<InputEvent>, int)
GDVIRTUAL0(_mouse_enter)
GDVIRTUAL0(_mouse_exit)
diff --git a/scene/3d/area_3d.cpp b/scene/3d/area_3d.cpp
index beb6892435..585bce09fb 100644
--- a/scene/3d/area_3d.cpp
+++ b/scene/3d/area_3d.cpp
@@ -347,12 +347,14 @@ void Area3D::_clear_monitoring() {
}
}
+void Area3D::_space_changed(const RID &p_new_space) {
+ if (p_new_space.is_null()) {
+ _clear_monitoring();
+ }
+}
+
void Area3D::_notification(int p_what) {
switch (p_what) {
- case NOTIFICATION_EXIT_TREE: {
- _clear_monitoring();
- } break;
-
case NOTIFICATION_ENTER_TREE: {
_initialize_wind();
} break;
diff --git a/scene/3d/area_3d.h b/scene/3d/area_3d.h
index 86602d3192..05c558e8f0 100644
--- a/scene/3d/area_3d.h
+++ b/scene/3d/area_3d.h
@@ -149,6 +149,8 @@ protected:
static void _bind_methods();
void _validate_property(PropertyInfo &p_property) const;
+ virtual void _space_changed(const RID &p_new_space) override;
+
public:
void set_gravity_space_override_mode(SpaceOverride p_mode);
SpaceOverride get_gravity_space_override_mode() const;
diff --git a/scene/3d/collision_object_3d.cpp b/scene/3d/collision_object_3d.cpp
index bfe594adc2..4562ecfb5f 100644
--- a/scene/3d/collision_object_3d.cpp
+++ b/scene/3d/collision_object_3d.cpp
@@ -78,6 +78,7 @@ void CollisionObject3D::_notification(int p_what) {
} else {
PhysicsServer3D::get_singleton()->body_set_space(rid, space);
}
+ _space_changed(space);
}
_update_pickable();
@@ -117,6 +118,7 @@ void CollisionObject3D::_notification(int p_what) {
} else {
PhysicsServer3D::get_singleton()->body_set_space(rid, RID());
}
+ _space_changed(RID());
}
}
@@ -244,6 +246,7 @@ void CollisionObject3D::_apply_disabled() {
} else {
PhysicsServer3D::get_singleton()->body_set_space(rid, RID());
}
+ _space_changed(RID());
}
}
} break;
@@ -270,6 +273,7 @@ void CollisionObject3D::_apply_enabled() {
} else {
PhysicsServer3D::get_singleton()->body_set_space(rid, space);
}
+ _space_changed(space);
}
} break;
@@ -320,6 +324,9 @@ void CollisionObject3D::set_body_mode(PhysicsServer3D::BodyMode p_mode) {
PhysicsServer3D::get_singleton()->body_set_mode(rid, p_mode);
}
+void CollisionObject3D::_space_changed(const RID &p_new_space) {
+}
+
void CollisionObject3D::set_only_update_transform_changes(bool p_enable) {
only_update_transform_changes = p_enable;
}
diff --git a/scene/3d/collision_object_3d.h b/scene/3d/collision_object_3d.h
index ebcbb39e0d..b51423f021 100644
--- a/scene/3d/collision_object_3d.h
+++ b/scene/3d/collision_object_3d.h
@@ -116,6 +116,8 @@ protected:
void set_body_mode(PhysicsServer3D::BodyMode p_mode);
+ virtual void _space_changed(const RID &p_new_space);
+
void set_only_update_transform_changes(bool p_enable);
bool is_only_update_transform_changes_enabled() const;
diff --git a/servers/physics_2d/godot_area_2d.h b/servers/physics_2d/godot_area_2d.h
index 234e4eb9a9..d14ddb6a2e 100644
--- a/servers/physics_2d/godot_area_2d.h
+++ b/servers/physics_2d/godot_area_2d.h
@@ -167,7 +167,7 @@ void GodotArea2D::add_body_to_query(GodotBody2D *p_body, uint32_t p_body_shape,
void GodotArea2D::remove_body_from_query(GodotBody2D *p_body, uint32_t p_body_shape, uint32_t p_area_shape) {
BodyKey bk(p_body, p_body_shape, p_area_shape);
monitored_bodies[bk].dec();
- if (!monitor_query_list.in_list()) {
+ if (get_space() && !monitor_query_list.in_list()) {
_queue_monitor_update();
}
}
@@ -183,7 +183,7 @@ void GodotArea2D::add_area_to_query(GodotArea2D *p_area, uint32_t p_area_shape,
void GodotArea2D::remove_area_from_query(GodotArea2D *p_area, uint32_t p_area_shape, uint32_t p_self_shape) {
BodyKey bk(p_area, p_area_shape, p_self_shape);
monitored_areas[bk].dec();
- if (!monitor_query_list.in_list()) {
+ if (get_space() && !monitor_query_list.in_list()) {
_queue_monitor_update();
}
}
diff --git a/servers/physics_2d/godot_body_2d.cpp b/servers/physics_2d/godot_body_2d.cpp
index 12c3e1e5b4..01996dc43c 100644
--- a/servers/physics_2d/godot_body_2d.cpp
+++ b/servers/physics_2d/godot_body_2d.cpp
@@ -407,7 +407,8 @@ void GodotBody2D::set_space(GodotSpace2D *p_space) {
if (get_space()) {
_mass_properties_changed();
- if (active) {
+
+ if (active && !active_list.in_list()) {
get_space()->body_add_to_active_list(&active_list);
}
}
diff --git a/servers/physics_2d/godot_collision_object_2d.cpp b/servers/physics_2d/godot_collision_object_2d.cpp
index 4fb53a2d89..9851cac140 100644
--- a/servers/physics_2d/godot_collision_object_2d.cpp
+++ b/servers/physics_2d/godot_collision_object_2d.cpp
@@ -212,20 +212,21 @@ void GodotCollisionObject2D::_update_shapes_with_motion(const Vector2 &p_motion)
}
void GodotCollisionObject2D::_set_space(GodotSpace2D *p_space) {
- if (space) {
- space->remove_object(this);
+ GodotSpace2D *old_space = space;
+ space = p_space;
+
+ if (old_space) {
+ old_space->remove_object(this);
for (int i = 0; i < shapes.size(); i++) {
Shape &s = shapes.write[i];
if (s.bpid) {
- space->get_broadphase()->remove(s.bpid);
+ old_space->get_broadphase()->remove(s.bpid);
s.bpid = 0;
}
}
}
- space = p_space;
-
if (space) {
space->add_object(this);
_update_shapes();
diff --git a/servers/physics_3d/godot_area_3d.h b/servers/physics_3d/godot_area_3d.h
index f05d0f9019..c3c9e494a4 100644
--- a/servers/physics_3d/godot_area_3d.h
+++ b/servers/physics_3d/godot_area_3d.h
@@ -204,7 +204,7 @@ void GodotArea3D::add_body_to_query(GodotBody3D *p_body, uint32_t p_body_shape,
void GodotArea3D::remove_body_from_query(GodotBody3D *p_body, uint32_t p_body_shape, uint32_t p_area_shape) {
BodyKey bk(p_body, p_body_shape, p_area_shape);
monitored_bodies[bk].dec();
- if (!monitor_query_list.in_list()) {
+ if (get_space() && !monitor_query_list.in_list()) {
_queue_monitor_update();
}
}
@@ -220,7 +220,7 @@ void GodotArea3D::add_area_to_query(GodotArea3D *p_area, uint32_t p_area_shape,
void GodotArea3D::remove_area_from_query(GodotArea3D *p_area, uint32_t p_area_shape, uint32_t p_self_shape) {
BodyKey bk(p_area, p_area_shape, p_self_shape);
monitored_areas[bk].dec();
- if (!monitor_query_list.in_list()) {
+ if (get_space() && !monitor_query_list.in_list()) {
_queue_monitor_update();
}
}
diff --git a/servers/physics_3d/godot_body_3d.cpp b/servers/physics_3d/godot_body_3d.cpp
index e102d0f3c9..407957b904 100644
--- a/servers/physics_3d/godot_body_3d.cpp
+++ b/servers/physics_3d/godot_body_3d.cpp
@@ -454,7 +454,8 @@ void GodotBody3D::set_space(GodotSpace3D *p_space) {
if (get_space()) {
_mass_properties_changed();
- if (active) {
+
+ if (active && !active_list.in_list()) {
get_space()->body_add_to_active_list(&active_list);
}
}
diff --git a/servers/physics_3d/godot_collision_object_3d.cpp b/servers/physics_3d/godot_collision_object_3d.cpp
index 0d7fcb67f6..283614a43d 100644
--- a/servers/physics_3d/godot_collision_object_3d.cpp
+++ b/servers/physics_3d/godot_collision_object_3d.cpp
@@ -210,20 +210,21 @@ void GodotCollisionObject3D::_update_shapes_with_motion(const Vector3 &p_motion)
}
void GodotCollisionObject3D::_set_space(GodotSpace3D *p_space) {
- if (space) {
- space->remove_object(this);
+ GodotSpace3D *old_space = space;
+ space = p_space;
+
+ if (old_space) {
+ old_space->remove_object(this);
for (int i = 0; i < shapes.size(); i++) {
Shape &s = shapes.write[i];
if (s.bpid) {
- space->get_broadphase()->remove(s.bpid);
+ old_space->get_broadphase()->remove(s.bpid);
s.bpid = 0;
}
}
}
- space = p_space;
-
if (space) {
space->add_object(this);
_update_shapes();