Skip to content
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
1 change: 1 addition & 0 deletions doc/classes/Area2D.xml
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
<description>
[Area2D] is a region of 2D space defined by one or multiple [CollisionShape2D] or [CollisionPolygon2D] child nodes. It detects when other [CollisionObject2D]s enter or exit it, and it also keeps track of which collision objects haven't exited it yet (i.e. which one are overlapping it).
This node can also locally alter or override physics parameters (gravity, damping) and route audio to custom audio buses.
[b]Note:[/b] Areas and bodies created with [PhysicsServer2D] might not interact as expected with [Area2D]s, and might not emit signals or track objects correctly.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[b]Note:[/b] [Area2D]s and [PhysicalBody2D]s created..

Also, is this correct? This makes it sound like creating them from PhysicsServer would result in instability. Is this only at the very beginning of simulation or?

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is correct, they are not associated with a node so they work differently,

</description>
<tutorials>
<link title="Using Area2D">$DOCS_URL/tutorials/physics/using_area_2d.html</link>
Expand Down
1 change: 1 addition & 0 deletions doc/classes/Area3D.xml
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
<description>
[Area3D] is a region of 3D space defined by one or multiple [CollisionShape3D] or [CollisionPolygon3D] child nodes. It detects when other [CollisionObject3D]s enter or exit it, and it also keeps track of which collision objects haven't exited it yet (i.e. which one are overlapping it).
This node can also locally alter or override physics parameters (gravity, damping) and route audio to custom audio buses.
[b]Note:[/b] Areas and bodies created with [PhysicsServer3D] might not interact as expected with [Area3D]s, and might not emit signals or track objects correctly.
[b]Warning:[/b] Using a [ConcavePolygonShape3D] inside a [CollisionShape3D] child of this node (created e.g. by using the [b]Create Trimesh Collision Sibling[/b] option in the [b]Mesh[/b] menu that appears when selecting a [MeshInstance3D] node) may give unexpected results, since this collision shape is hollow. If this is not desired, it has to be split into multiple [ConvexPolygonShape3D]s or primitive shapes like [BoxShape3D], or in some cases it may be replaceable by a [CollisionPolygon3D].
</description>
<tutorials>
Expand Down
30 changes: 30 additions & 0 deletions scene/2d/area_2d.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -166,6 +166,21 @@ void Area2D::_body_inout(int p_status, const RID &p_body, ObjectID p_instance, i
bool body_in = p_status == PhysicsServer2D::AREA_BODY_ADDED;
ObjectID objid = p_instance;

// Exit early if instance is invalid.
if (objid.is_null()) {
// Emit the appropriate signals.
lock_callback();
locked = true;
if (body_in) {
emit_signal(SceneStringNames::get_singleton()->body_shape_entered, p_body, (Node *)nullptr, p_body_shape, p_area_shape);
} else {
emit_signal(SceneStringNames::get_singleton()->body_shape_exited, p_body, (Node *)nullptr, p_body_shape, p_area_shape);
}
Comment thread
AThousandShips marked this conversation as resolved.
Outdated
locked = false;
unlock_callback();
return;
}

Object *obj = ObjectDB::get_instance(objid);
Node *node = Object::cast_to<Node>(obj);

Expand Down Expand Up @@ -262,6 +277,21 @@ void Area2D::_area_inout(int p_status, const RID &p_area, ObjectID p_instance, i
bool area_in = p_status == PhysicsServer2D::AREA_BODY_ADDED;
ObjectID objid = p_instance;

// Exit early if instance is invalid.
if (objid.is_null()) {
// Emit the appropriate signals.
lock_callback();
locked = true;
if (area_in) {
emit_signal(SceneStringNames::get_singleton()->area_shape_entered, p_area, (Node *)nullptr, p_area_shape, p_self_shape);
} else {
emit_signal(SceneStringNames::get_singleton()->area_shape_exited, p_area, (Node *)nullptr, p_area_shape, p_self_shape);
}
Comment thread
AThousandShips marked this conversation as resolved.
Outdated
locked = false;
unlock_callback();
return;
}

Object *obj = ObjectDB::get_instance(objid);
Node *node = Object::cast_to<Node>(obj);

Expand Down
34 changes: 32 additions & 2 deletions scene/3d/area_3d.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -223,6 +223,21 @@ void Area3D::_body_inout(int p_status, const RID &p_body, ObjectID p_instance, i
bool body_in = p_status == PhysicsServer3D::AREA_BODY_ADDED;
ObjectID objid = p_instance;

// Exit early if instance is invalid.
if (objid.is_null()) {
Comment thread
AThousandShips marked this conversation as resolved.
Outdated
lock_callback();
locked = true;
// Emit the appropriate signals.
if (body_in) {
emit_signal(SceneStringNames::get_singleton()->body_shape_entered, p_body, (Node *)nullptr, p_body_shape, p_area_shape);
} else {
emit_signal(SceneStringNames::get_singleton()->body_shape_exited, p_body, (Node *)nullptr, p_body_shape, p_area_shape);
}
locked = false;
unlock_callback();
return;
}

Object *obj = ObjectDB::get_instance(objid);
Node *node = Object::cast_to<Node>(obj);

Expand Down Expand Up @@ -254,7 +269,7 @@ void Area3D::_body_inout(int p_status, const RID &p_body, ObjectID p_instance, i
E->value.shapes.insert(ShapePair(p_body_shape, p_area_shape));
}

if (E->value.in_tree) {
if (!node || E->value.in_tree) {
emit_signal(SceneStringNames::get_singleton()->body_shape_entered, p_body, node, p_body_shape, p_area_shape);
}

Expand All @@ -276,7 +291,7 @@ void Area3D::_body_inout(int p_status, const RID &p_body, ObjectID p_instance, i
}
}
}
if (node && in_tree) {
if (!node || in_tree) {
emit_signal(SceneStringNames::get_singleton()->body_shape_exited, p_body, obj, p_body_shape, p_area_shape);
}
}
Expand Down Expand Up @@ -414,6 +429,21 @@ void Area3D::_area_inout(int p_status, const RID &p_area, ObjectID p_instance, i
bool area_in = p_status == PhysicsServer3D::AREA_BODY_ADDED;
ObjectID objid = p_instance;

// Exit if instance is invalid.
if (objid.is_null()) {
lock_callback();
locked = true;
// Emit the appropriate signals.
if (area_in) {
emit_signal(SceneStringNames::get_singleton()->area_shape_entered, p_area, (Node *)nullptr, p_area_shape, p_self_shape);
} else {
emit_signal(SceneStringNames::get_singleton()->area_shape_exited, p_area, (Node *)nullptr, p_area_shape, p_self_shape);
}
Comment thread
AThousandShips marked this conversation as resolved.
Outdated
locked = false;
unlock_callback();
return;
}

Object *obj = ObjectDB::get_instance(objid);
Node *node = Object::cast_to<Node>(obj);

Expand Down