Return RID instead of Object id in area-body_shape_entered-exited signals.
This commit is contained in:
parent
17e66382b8
commit
38f2e32e32
@ -153,7 +153,7 @@
|
|||||||
</description>
|
</description>
|
||||||
</signal>
|
</signal>
|
||||||
<signal name="area_shape_entered">
|
<signal name="area_shape_entered">
|
||||||
<argument index="0" name="area_id" type="int">
|
<argument index="0" name="area_rid" type="RID">
|
||||||
</argument>
|
</argument>
|
||||||
<argument index="1" name="area" type="Area2D">
|
<argument index="1" name="area" type="Area2D">
|
||||||
</argument>
|
</argument>
|
||||||
@ -170,7 +170,7 @@
|
|||||||
</description>
|
</description>
|
||||||
</signal>
|
</signal>
|
||||||
<signal name="area_shape_exited">
|
<signal name="area_shape_exited">
|
||||||
<argument index="0" name="area_id" type="int">
|
<argument index="0" name="area_rid" type="RID">
|
||||||
</argument>
|
</argument>
|
||||||
<argument index="1" name="area" type="Area2D">
|
<argument index="1" name="area" type="Area2D">
|
||||||
</argument>
|
</argument>
|
||||||
@ -203,7 +203,7 @@
|
|||||||
</description>
|
</description>
|
||||||
</signal>
|
</signal>
|
||||||
<signal name="body_shape_entered">
|
<signal name="body_shape_entered">
|
||||||
<argument index="0" name="body_id" type="int">
|
<argument index="0" name="body_rid" type="RID">
|
||||||
</argument>
|
</argument>
|
||||||
<argument index="1" name="body" type="Node2D">
|
<argument index="1" name="body" type="Node2D">
|
||||||
</argument>
|
</argument>
|
||||||
@ -220,7 +220,7 @@
|
|||||||
</description>
|
</description>
|
||||||
</signal>
|
</signal>
|
||||||
<signal name="body_shape_exited">
|
<signal name="body_shape_exited">
|
||||||
<argument index="0" name="body_id" type="int">
|
<argument index="0" name="body_rid" type="RID">
|
||||||
</argument>
|
</argument>
|
||||||
<argument index="1" name="body" type="Node2D">
|
<argument index="1" name="body" type="Node2D">
|
||||||
</argument>
|
</argument>
|
||||||
|
@ -163,7 +163,7 @@
|
|||||||
</description>
|
</description>
|
||||||
</signal>
|
</signal>
|
||||||
<signal name="area_shape_entered">
|
<signal name="area_shape_entered">
|
||||||
<argument index="0" name="area_id" type="int">
|
<argument index="0" name="area_rid" type="RID">
|
||||||
</argument>
|
</argument>
|
||||||
<argument index="1" name="area" type="Area3D">
|
<argument index="1" name="area" type="Area3D">
|
||||||
</argument>
|
</argument>
|
||||||
@ -180,7 +180,7 @@
|
|||||||
</description>
|
</description>
|
||||||
</signal>
|
</signal>
|
||||||
<signal name="area_shape_exited">
|
<signal name="area_shape_exited">
|
||||||
<argument index="0" name="area_id" type="int">
|
<argument index="0" name="area_rid" type="RID">
|
||||||
</argument>
|
</argument>
|
||||||
<argument index="1" name="area" type="Area3D">
|
<argument index="1" name="area" type="Area3D">
|
||||||
</argument>
|
</argument>
|
||||||
@ -213,7 +213,7 @@
|
|||||||
</description>
|
</description>
|
||||||
</signal>
|
</signal>
|
||||||
<signal name="body_shape_entered">
|
<signal name="body_shape_entered">
|
||||||
<argument index="0" name="body_id" type="int">
|
<argument index="0" name="body_rid" type="RID">
|
||||||
</argument>
|
</argument>
|
||||||
<argument index="1" name="body" type="Node3D">
|
<argument index="1" name="body" type="Node3D">
|
||||||
</argument>
|
</argument>
|
||||||
@ -230,7 +230,7 @@
|
|||||||
</description>
|
</description>
|
||||||
</signal>
|
</signal>
|
||||||
<signal name="body_shape_exited">
|
<signal name="body_shape_exited">
|
||||||
<argument index="0" name="body_id" type="int">
|
<argument index="0" name="body_rid" type="RID">
|
||||||
</argument>
|
</argument>
|
||||||
<argument index="1" name="body" type="Node3D">
|
<argument index="1" name="body" type="Node3D">
|
||||||
</argument>
|
</argument>
|
||||||
|
@ -193,7 +193,7 @@
|
|||||||
</description>
|
</description>
|
||||||
</signal>
|
</signal>
|
||||||
<signal name="body_shape_entered">
|
<signal name="body_shape_entered">
|
||||||
<argument index="0" name="body_id" type="int">
|
<argument index="0" name="body_rid" type="RID">
|
||||||
</argument>
|
</argument>
|
||||||
<argument index="1" name="body" type="Node">
|
<argument index="1" name="body" type="Node">
|
||||||
</argument>
|
</argument>
|
||||||
@ -210,7 +210,7 @@
|
|||||||
</description>
|
</description>
|
||||||
</signal>
|
</signal>
|
||||||
<signal name="body_shape_exited">
|
<signal name="body_shape_exited">
|
||||||
<argument index="0" name="body_id" type="int">
|
<argument index="0" name="body_rid" type="RID">
|
||||||
</argument>
|
</argument>
|
||||||
<argument index="1" name="body" type="Node">
|
<argument index="1" name="body" type="Node">
|
||||||
</argument>
|
</argument>
|
||||||
|
@ -217,7 +217,7 @@
|
|||||||
</description>
|
</description>
|
||||||
</signal>
|
</signal>
|
||||||
<signal name="body_shape_entered">
|
<signal name="body_shape_entered">
|
||||||
<argument index="0" name="body_id" type="int">
|
<argument index="0" name="body_rid" type="RID">
|
||||||
</argument>
|
</argument>
|
||||||
<argument index="1" name="body" type="Node">
|
<argument index="1" name="body" type="Node">
|
||||||
</argument>
|
</argument>
|
||||||
@ -235,7 +235,7 @@
|
|||||||
</description>
|
</description>
|
||||||
</signal>
|
</signal>
|
||||||
<signal name="body_shape_exited">
|
<signal name="body_shape_exited">
|
||||||
<argument index="0" name="body_id" type="int">
|
<argument index="0" name="body_rid" type="RID">
|
||||||
</argument>
|
</argument>
|
||||||
<argument index="1" name="body" type="Node">
|
<argument index="1" name="body" type="Node">
|
||||||
</argument>
|
</argument>
|
||||||
|
@ -118,7 +118,7 @@ void Area2D::_body_enter_tree(ObjectID p_id) {
|
|||||||
E->get().in_tree = true;
|
E->get().in_tree = true;
|
||||||
emit_signal(SceneStringNames::get_singleton()->body_entered, node);
|
emit_signal(SceneStringNames::get_singleton()->body_entered, node);
|
||||||
for (int i = 0; i < E->get().shapes.size(); i++) {
|
for (int i = 0; i < E->get().shapes.size(); i++) {
|
||||||
emit_signal(SceneStringNames::get_singleton()->body_shape_entered, p_id, node, E->get().shapes[i].body_shape, E->get().shapes[i].area_shape);
|
emit_signal(SceneStringNames::get_singleton()->body_shape_entered, E->get().rid, node, E->get().shapes[i].body_shape, E->get().shapes[i].area_shape);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -132,7 +132,7 @@ void Area2D::_body_exit_tree(ObjectID p_id) {
|
|||||||
E->get().in_tree = false;
|
E->get().in_tree = false;
|
||||||
emit_signal(SceneStringNames::get_singleton()->body_exited, node);
|
emit_signal(SceneStringNames::get_singleton()->body_exited, node);
|
||||||
for (int i = 0; i < E->get().shapes.size(); i++) {
|
for (int i = 0; i < E->get().shapes.size(); i++) {
|
||||||
emit_signal(SceneStringNames::get_singleton()->body_shape_exited, p_id, node, E->get().shapes[i].body_shape, E->get().shapes[i].area_shape);
|
emit_signal(SceneStringNames::get_singleton()->body_shape_exited, E->get().rid, node, E->get().shapes[i].body_shape, E->get().shapes[i].area_shape);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -154,6 +154,7 @@ void Area2D::_body_inout(int p_status, const RID &p_body, ObjectID p_instance, i
|
|||||||
if (body_in) {
|
if (body_in) {
|
||||||
if (!E) {
|
if (!E) {
|
||||||
E = body_map.insert(objid, BodyState());
|
E = body_map.insert(objid, BodyState());
|
||||||
|
E->get().rid = p_body;
|
||||||
E->get().rc = 0;
|
E->get().rc = 0;
|
||||||
E->get().in_tree = node && node->is_inside_tree();
|
E->get().in_tree = node && node->is_inside_tree();
|
||||||
if (node) {
|
if (node) {
|
||||||
@ -170,7 +171,7 @@ void Area2D::_body_inout(int p_status, const RID &p_body, ObjectID p_instance, i
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!node || E->get().in_tree) {
|
if (!node || E->get().in_tree) {
|
||||||
emit_signal(SceneStringNames::get_singleton()->body_shape_entered, objid, node, p_body_shape, p_area_shape);
|
emit_signal(SceneStringNames::get_singleton()->body_shape_entered, p_body, node, p_body_shape, p_area_shape);
|
||||||
}
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
@ -192,7 +193,7 @@ void Area2D::_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, objid, obj, p_body_shape, p_area_shape);
|
emit_signal(SceneStringNames::get_singleton()->body_shape_exited, p_body, obj, p_body_shape, p_area_shape);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -211,7 +212,7 @@ void Area2D::_area_enter_tree(ObjectID p_id) {
|
|||||||
E->get().in_tree = true;
|
E->get().in_tree = true;
|
||||||
emit_signal(SceneStringNames::get_singleton()->area_entered, node);
|
emit_signal(SceneStringNames::get_singleton()->area_entered, node);
|
||||||
for (int i = 0; i < E->get().shapes.size(); i++) {
|
for (int i = 0; i < E->get().shapes.size(); i++) {
|
||||||
emit_signal(SceneStringNames::get_singleton()->area_shape_entered, p_id, node, E->get().shapes[i].area_shape, E->get().shapes[i].self_shape);
|
emit_signal(SceneStringNames::get_singleton()->area_shape_entered, E->get().rid, node, E->get().shapes[i].area_shape, E->get().shapes[i].self_shape);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -225,7 +226,7 @@ void Area2D::_area_exit_tree(ObjectID p_id) {
|
|||||||
E->get().in_tree = false;
|
E->get().in_tree = false;
|
||||||
emit_signal(SceneStringNames::get_singleton()->area_exited, node);
|
emit_signal(SceneStringNames::get_singleton()->area_exited, node);
|
||||||
for (int i = 0; i < E->get().shapes.size(); i++) {
|
for (int i = 0; i < E->get().shapes.size(); i++) {
|
||||||
emit_signal(SceneStringNames::get_singleton()->area_shape_exited, p_id, node, E->get().shapes[i].area_shape, E->get().shapes[i].self_shape);
|
emit_signal(SceneStringNames::get_singleton()->area_shape_exited, E->get().rid, node, E->get().shapes[i].area_shape, E->get().shapes[i].self_shape);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -246,6 +247,7 @@ void Area2D::_area_inout(int p_status, const RID &p_area, ObjectID p_instance, i
|
|||||||
if (area_in) {
|
if (area_in) {
|
||||||
if (!E) {
|
if (!E) {
|
||||||
E = area_map.insert(objid, AreaState());
|
E = area_map.insert(objid, AreaState());
|
||||||
|
E->get().rid = p_area;
|
||||||
E->get().rc = 0;
|
E->get().rc = 0;
|
||||||
E->get().in_tree = node && node->is_inside_tree();
|
E->get().in_tree = node && node->is_inside_tree();
|
||||||
if (node) {
|
if (node) {
|
||||||
@ -262,7 +264,7 @@ void Area2D::_area_inout(int p_status, const RID &p_area, ObjectID p_instance, i
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!node || E->get().in_tree) {
|
if (!node || E->get().in_tree) {
|
||||||
emit_signal(SceneStringNames::get_singleton()->area_shape_entered, objid, node, p_area_shape, p_self_shape);
|
emit_signal(SceneStringNames::get_singleton()->area_shape_entered, p_area, node, p_area_shape, p_self_shape);
|
||||||
}
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
@ -284,7 +286,7 @@ void Area2D::_area_inout(int p_status, const RID &p_area, ObjectID p_instance, i
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!node || in_tree) {
|
if (!node || in_tree) {
|
||||||
emit_signal(SceneStringNames::get_singleton()->area_shape_exited, objid, obj, p_area_shape, p_self_shape);
|
emit_signal(SceneStringNames::get_singleton()->area_shape_exited, p_area, obj, p_area_shape, p_self_shape);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -315,7 +317,7 @@ void Area2D::_clear_monitoring() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
for (int i = 0; i < E->get().shapes.size(); i++) {
|
for (int i = 0; i < E->get().shapes.size(); i++) {
|
||||||
emit_signal(SceneStringNames::get_singleton()->body_shape_exited, E->key(), node, E->get().shapes[i].body_shape, E->get().shapes[i].area_shape);
|
emit_signal(SceneStringNames::get_singleton()->body_shape_exited, E->get().rid, node, E->get().shapes[i].body_shape, E->get().shapes[i].area_shape);
|
||||||
}
|
}
|
||||||
|
|
||||||
emit_signal(SceneStringNames::get_singleton()->body_exited, obj);
|
emit_signal(SceneStringNames::get_singleton()->body_exited, obj);
|
||||||
@ -343,7 +345,7 @@ void Area2D::_clear_monitoring() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
for (int i = 0; i < E->get().shapes.size(); i++) {
|
for (int i = 0; i < E->get().shapes.size(); i++) {
|
||||||
emit_signal(SceneStringNames::get_singleton()->area_shape_exited, E->key(), node, E->get().shapes[i].area_shape, E->get().shapes[i].self_shape);
|
emit_signal(SceneStringNames::get_singleton()->area_shape_exited, E->get().rid, node, E->get().shapes[i].area_shape, E->get().shapes[i].self_shape);
|
||||||
}
|
}
|
||||||
|
|
||||||
emit_signal(SceneStringNames::get_singleton()->area_exited, obj);
|
emit_signal(SceneStringNames::get_singleton()->area_exited, obj);
|
||||||
@ -590,13 +592,13 @@ void Area2D::_bind_methods() {
|
|||||||
ClassDB::bind_method(D_METHOD("_body_inout"), &Area2D::_body_inout);
|
ClassDB::bind_method(D_METHOD("_body_inout"), &Area2D::_body_inout);
|
||||||
ClassDB::bind_method(D_METHOD("_area_inout"), &Area2D::_area_inout);
|
ClassDB::bind_method(D_METHOD("_area_inout"), &Area2D::_area_inout);
|
||||||
|
|
||||||
ADD_SIGNAL(MethodInfo("body_shape_entered", PropertyInfo(Variant::INT, "body_id"), PropertyInfo(Variant::OBJECT, "body", PROPERTY_HINT_RESOURCE_TYPE, "Node2D"), PropertyInfo(Variant::INT, "body_shape"), PropertyInfo(Variant::INT, "local_shape")));
|
ADD_SIGNAL(MethodInfo("body_shape_entered", PropertyInfo(Variant::RID, "body_rid"), PropertyInfo(Variant::OBJECT, "body", PROPERTY_HINT_RESOURCE_TYPE, "Node2D"), PropertyInfo(Variant::INT, "body_shape"), PropertyInfo(Variant::INT, "local_shape")));
|
||||||
ADD_SIGNAL(MethodInfo("body_shape_exited", PropertyInfo(Variant::INT, "body_id"), PropertyInfo(Variant::OBJECT, "body", PROPERTY_HINT_RESOURCE_TYPE, "Node2D"), PropertyInfo(Variant::INT, "body_shape"), PropertyInfo(Variant::INT, "local_shape")));
|
ADD_SIGNAL(MethodInfo("body_shape_exited", PropertyInfo(Variant::RID, "body_rid"), PropertyInfo(Variant::OBJECT, "body", PROPERTY_HINT_RESOURCE_TYPE, "Node2D"), PropertyInfo(Variant::INT, "body_shape"), PropertyInfo(Variant::INT, "local_shape")));
|
||||||
ADD_SIGNAL(MethodInfo("body_entered", PropertyInfo(Variant::OBJECT, "body", PROPERTY_HINT_RESOURCE_TYPE, "Node2D")));
|
ADD_SIGNAL(MethodInfo("body_entered", PropertyInfo(Variant::OBJECT, "body", PROPERTY_HINT_RESOURCE_TYPE, "Node2D")));
|
||||||
ADD_SIGNAL(MethodInfo("body_exited", PropertyInfo(Variant::OBJECT, "body", PROPERTY_HINT_RESOURCE_TYPE, "Node2D")));
|
ADD_SIGNAL(MethodInfo("body_exited", PropertyInfo(Variant::OBJECT, "body", PROPERTY_HINT_RESOURCE_TYPE, "Node2D")));
|
||||||
|
|
||||||
ADD_SIGNAL(MethodInfo("area_shape_entered", PropertyInfo(Variant::INT, "area_id"), PropertyInfo(Variant::OBJECT, "area", PROPERTY_HINT_RESOURCE_TYPE, "Area2D"), PropertyInfo(Variant::INT, "area_shape"), PropertyInfo(Variant::INT, "local_shape")));
|
ADD_SIGNAL(MethodInfo("area_shape_entered", PropertyInfo(Variant::RID, "area_rid"), PropertyInfo(Variant::OBJECT, "area", PROPERTY_HINT_RESOURCE_TYPE, "Area2D"), PropertyInfo(Variant::INT, "area_shape"), PropertyInfo(Variant::INT, "local_shape")));
|
||||||
ADD_SIGNAL(MethodInfo("area_shape_exited", PropertyInfo(Variant::INT, "area_id"), PropertyInfo(Variant::OBJECT, "area", PROPERTY_HINT_RESOURCE_TYPE, "Area2D"), PropertyInfo(Variant::INT, "area_shape"), PropertyInfo(Variant::INT, "local_shape")));
|
ADD_SIGNAL(MethodInfo("area_shape_exited", PropertyInfo(Variant::RID, "area_rid"), PropertyInfo(Variant::OBJECT, "area", PROPERTY_HINT_RESOURCE_TYPE, "Area2D"), PropertyInfo(Variant::INT, "area_shape"), PropertyInfo(Variant::INT, "local_shape")));
|
||||||
ADD_SIGNAL(MethodInfo("area_entered", PropertyInfo(Variant::OBJECT, "area", PROPERTY_HINT_RESOURCE_TYPE, "Area2D")));
|
ADD_SIGNAL(MethodInfo("area_entered", PropertyInfo(Variant::OBJECT, "area", PROPERTY_HINT_RESOURCE_TYPE, "Area2D")));
|
||||||
ADD_SIGNAL(MethodInfo("area_exited", PropertyInfo(Variant::OBJECT, "area", PROPERTY_HINT_RESOURCE_TYPE, "Area2D")));
|
ADD_SIGNAL(MethodInfo("area_exited", PropertyInfo(Variant::OBJECT, "area", PROPERTY_HINT_RESOURCE_TYPE, "Area2D")));
|
||||||
|
|
||||||
|
@ -85,6 +85,7 @@ private:
|
|||||||
};
|
};
|
||||||
|
|
||||||
struct BodyState {
|
struct BodyState {
|
||||||
|
RID rid;
|
||||||
int rc = 0;
|
int rc = 0;
|
||||||
bool in_tree = false;
|
bool in_tree = false;
|
||||||
VSet<ShapePair> shapes;
|
VSet<ShapePair> shapes;
|
||||||
@ -116,6 +117,7 @@ private:
|
|||||||
};
|
};
|
||||||
|
|
||||||
struct AreaState {
|
struct AreaState {
|
||||||
|
RID rid;
|
||||||
int rc = 0;
|
int rc = 0;
|
||||||
bool in_tree = false;
|
bool in_tree = false;
|
||||||
VSet<AreaShapePair> shapes;
|
VSet<AreaShapePair> shapes;
|
||||||
|
@ -226,7 +226,7 @@ void RigidBody2D::_body_enter_tree(ObjectID p_id) {
|
|||||||
emit_signal(SceneStringNames::get_singleton()->body_entered, node);
|
emit_signal(SceneStringNames::get_singleton()->body_entered, node);
|
||||||
|
|
||||||
for (int i = 0; i < E->get().shapes.size(); i++) {
|
for (int i = 0; i < E->get().shapes.size(); i++) {
|
||||||
emit_signal(SceneStringNames::get_singleton()->body_shape_entered, p_id, node, E->get().shapes[i].body_shape, E->get().shapes[i].local_shape);
|
emit_signal(SceneStringNames::get_singleton()->body_shape_entered, E->get().rid, node, E->get().shapes[i].body_shape, E->get().shapes[i].local_shape);
|
||||||
}
|
}
|
||||||
|
|
||||||
contact_monitor->locked = false;
|
contact_monitor->locked = false;
|
||||||
@ -247,13 +247,13 @@ void RigidBody2D::_body_exit_tree(ObjectID p_id) {
|
|||||||
emit_signal(SceneStringNames::get_singleton()->body_exited, node);
|
emit_signal(SceneStringNames::get_singleton()->body_exited, node);
|
||||||
|
|
||||||
for (int i = 0; i < E->get().shapes.size(); i++) {
|
for (int i = 0; i < E->get().shapes.size(); i++) {
|
||||||
emit_signal(SceneStringNames::get_singleton()->body_shape_exited, p_id, node, E->get().shapes[i].body_shape, E->get().shapes[i].local_shape);
|
emit_signal(SceneStringNames::get_singleton()->body_shape_exited, E->get().rid, node, E->get().shapes[i].body_shape, E->get().shapes[i].local_shape);
|
||||||
}
|
}
|
||||||
|
|
||||||
contact_monitor->locked = false;
|
contact_monitor->locked = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void RigidBody2D::_body_inout(int p_status, ObjectID p_instance, int p_body_shape, int p_local_shape) {
|
void RigidBody2D::_body_inout(int p_status, const RID &p_body, ObjectID p_instance, int p_body_shape, int p_local_shape) {
|
||||||
bool body_in = p_status == 1;
|
bool body_in = p_status == 1;
|
||||||
ObjectID objid = p_instance;
|
ObjectID objid = p_instance;
|
||||||
|
|
||||||
@ -268,6 +268,7 @@ void RigidBody2D::_body_inout(int p_status, ObjectID p_instance, int p_body_shap
|
|||||||
if (body_in) {
|
if (body_in) {
|
||||||
if (!E) {
|
if (!E) {
|
||||||
E = contact_monitor->body_map.insert(objid, BodyState());
|
E = contact_monitor->body_map.insert(objid, BodyState());
|
||||||
|
E->get().rid = p_body;
|
||||||
//E->get().rc=0;
|
//E->get().rc=0;
|
||||||
E->get().in_scene = node && node->is_inside_tree();
|
E->get().in_scene = node && node->is_inside_tree();
|
||||||
if (node) {
|
if (node) {
|
||||||
@ -286,7 +287,7 @@ void RigidBody2D::_body_inout(int p_status, ObjectID p_instance, int p_body_shap
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (E->get().in_scene) {
|
if (E->get().in_scene) {
|
||||||
emit_signal(SceneStringNames::get_singleton()->body_shape_entered, objid, node, p_body_shape, p_local_shape);
|
emit_signal(SceneStringNames::get_singleton()->body_shape_entered, p_body, node, p_body_shape, p_local_shape);
|
||||||
}
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
@ -310,12 +311,13 @@ void RigidBody2D::_body_inout(int p_status, ObjectID p_instance, int p_body_shap
|
|||||||
contact_monitor->body_map.erase(E);
|
contact_monitor->body_map.erase(E);
|
||||||
}
|
}
|
||||||
if (node && in_scene) {
|
if (node && in_scene) {
|
||||||
emit_signal(SceneStringNames::get_singleton()->body_shape_exited, objid, node, p_body_shape, p_local_shape);
|
emit_signal(SceneStringNames::get_singleton()->body_shape_exited, p_body, node, p_body_shape, p_local_shape);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
struct _RigidBody2DInOut {
|
struct _RigidBody2DInOut {
|
||||||
|
RID rid;
|
||||||
ObjectID id;
|
ObjectID id;
|
||||||
int shape = 0;
|
int shape = 0;
|
||||||
int local_shape = 0;
|
int local_shape = 0;
|
||||||
@ -371,6 +373,7 @@ void RigidBody2D::_direct_state_changed(Object *p_state) {
|
|||||||
//put the ones to add
|
//put the ones to add
|
||||||
|
|
||||||
for (int i = 0; i < state->get_contact_count(); i++) {
|
for (int i = 0; i < state->get_contact_count(); i++) {
|
||||||
|
RID rid = state->get_contact_collider(i);
|
||||||
ObjectID obj = state->get_contact_collider_id(i);
|
ObjectID obj = state->get_contact_collider_id(i);
|
||||||
int local_shape = state->get_contact_local_shape(i);
|
int local_shape = state->get_contact_local_shape(i);
|
||||||
int shape = state->get_contact_collider_shape(i);
|
int shape = state->get_contact_collider_shape(i);
|
||||||
@ -379,6 +382,7 @@ void RigidBody2D::_direct_state_changed(Object *p_state) {
|
|||||||
|
|
||||||
Map<ObjectID, BodyState>::Element *E = contact_monitor->body_map.find(obj);
|
Map<ObjectID, BodyState>::Element *E = contact_monitor->body_map.find(obj);
|
||||||
if (!E) {
|
if (!E) {
|
||||||
|
toadd[toadd_count].rid = rid;
|
||||||
toadd[toadd_count].local_shape = local_shape;
|
toadd[toadd_count].local_shape = local_shape;
|
||||||
toadd[toadd_count].id = obj;
|
toadd[toadd_count].id = obj;
|
||||||
toadd[toadd_count].shape = shape;
|
toadd[toadd_count].shape = shape;
|
||||||
@ -389,6 +393,7 @@ void RigidBody2D::_direct_state_changed(Object *p_state) {
|
|||||||
ShapePair sp(shape, local_shape);
|
ShapePair sp(shape, local_shape);
|
||||||
int idx = E->get().shapes.find(sp);
|
int idx = E->get().shapes.find(sp);
|
||||||
if (idx == -1) {
|
if (idx == -1) {
|
||||||
|
toadd[toadd_count].rid = rid;
|
||||||
toadd[toadd_count].local_shape = local_shape;
|
toadd[toadd_count].local_shape = local_shape;
|
||||||
toadd[toadd_count].id = obj;
|
toadd[toadd_count].id = obj;
|
||||||
toadd[toadd_count].shape = shape;
|
toadd[toadd_count].shape = shape;
|
||||||
@ -404,6 +409,7 @@ void RigidBody2D::_direct_state_changed(Object *p_state) {
|
|||||||
for (Map<ObjectID, BodyState>::Element *E = contact_monitor->body_map.front(); E; E = E->next()) {
|
for (Map<ObjectID, BodyState>::Element *E = contact_monitor->body_map.front(); E; E = E->next()) {
|
||||||
for (int i = 0; i < E->get().shapes.size(); i++) {
|
for (int i = 0; i < E->get().shapes.size(); i++) {
|
||||||
if (!E->get().shapes[i].tagged) {
|
if (!E->get().shapes[i].tagged) {
|
||||||
|
toremove[toremove_count].rid = E->get().rid;
|
||||||
toremove[toremove_count].body_id = E->key();
|
toremove[toremove_count].body_id = E->key();
|
||||||
toremove[toremove_count].pair = E->get().shapes[i];
|
toremove[toremove_count].pair = E->get().shapes[i];
|
||||||
toremove_count++;
|
toremove_count++;
|
||||||
@ -414,13 +420,13 @@ void RigidBody2D::_direct_state_changed(Object *p_state) {
|
|||||||
//process remotions
|
//process remotions
|
||||||
|
|
||||||
for (int i = 0; i < toremove_count; i++) {
|
for (int i = 0; i < toremove_count; i++) {
|
||||||
_body_inout(0, toremove[i].body_id, toremove[i].pair.body_shape, toremove[i].pair.local_shape);
|
_body_inout(0, toremove[i].rid, toremove[i].body_id, toremove[i].pair.body_shape, toremove[i].pair.local_shape);
|
||||||
}
|
}
|
||||||
|
|
||||||
//process aditions
|
//process aditions
|
||||||
|
|
||||||
for (int i = 0; i < toadd_count; i++) {
|
for (int i = 0; i < toadd_count; i++) {
|
||||||
_body_inout(1, toadd[i].id, toadd[i].shape, toadd[i].local_shape);
|
_body_inout(1, toadd[i].rid, toadd[i].id, toadd[i].shape, toadd[i].local_shape);
|
||||||
}
|
}
|
||||||
|
|
||||||
contact_monitor->locked = false;
|
contact_monitor->locked = false;
|
||||||
@ -820,8 +826,8 @@ void RigidBody2D::_bind_methods() {
|
|||||||
ADD_PROPERTY(PropertyInfo(Variant::VECTOR2, "applied_force"), "set_applied_force", "get_applied_force");
|
ADD_PROPERTY(PropertyInfo(Variant::VECTOR2, "applied_force"), "set_applied_force", "get_applied_force");
|
||||||
ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "applied_torque"), "set_applied_torque", "get_applied_torque");
|
ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "applied_torque"), "set_applied_torque", "get_applied_torque");
|
||||||
|
|
||||||
ADD_SIGNAL(MethodInfo("body_shape_entered", PropertyInfo(Variant::INT, "body_id"), PropertyInfo(Variant::OBJECT, "body", PROPERTY_HINT_RESOURCE_TYPE, "Node"), PropertyInfo(Variant::INT, "body_shape"), PropertyInfo(Variant::INT, "local_shape")));
|
ADD_SIGNAL(MethodInfo("body_shape_entered", PropertyInfo(Variant::RID, "body_rid"), PropertyInfo(Variant::OBJECT, "body", PROPERTY_HINT_RESOURCE_TYPE, "Node"), PropertyInfo(Variant::INT, "body_shape"), PropertyInfo(Variant::INT, "local_shape")));
|
||||||
ADD_SIGNAL(MethodInfo("body_shape_exited", PropertyInfo(Variant::INT, "body_id"), PropertyInfo(Variant::OBJECT, "body", PROPERTY_HINT_RESOURCE_TYPE, "Node"), PropertyInfo(Variant::INT, "body_shape"), PropertyInfo(Variant::INT, "local_shape")));
|
ADD_SIGNAL(MethodInfo("body_shape_exited", PropertyInfo(Variant::RID, "body_rid"), PropertyInfo(Variant::OBJECT, "body", PROPERTY_HINT_RESOURCE_TYPE, "Node"), PropertyInfo(Variant::INT, "body_shape"), PropertyInfo(Variant::INT, "local_shape")));
|
||||||
ADD_SIGNAL(MethodInfo("body_entered", PropertyInfo(Variant::OBJECT, "body", PROPERTY_HINT_RESOURCE_TYPE, "Node")));
|
ADD_SIGNAL(MethodInfo("body_entered", PropertyInfo(Variant::OBJECT, "body", PROPERTY_HINT_RESOURCE_TYPE, "Node")));
|
||||||
ADD_SIGNAL(MethodInfo("body_exited", PropertyInfo(Variant::OBJECT, "body", PROPERTY_HINT_RESOURCE_TYPE, "Node")));
|
ADD_SIGNAL(MethodInfo("body_exited", PropertyInfo(Variant::OBJECT, "body", PROPERTY_HINT_RESOURCE_TYPE, "Node")));
|
||||||
ADD_SIGNAL(MethodInfo("sleeping_state_changed"));
|
ADD_SIGNAL(MethodInfo("sleeping_state_changed"));
|
||||||
|
@ -155,10 +155,12 @@ private:
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
struct RigidBody2D_RemoveAction {
|
struct RigidBody2D_RemoveAction {
|
||||||
|
RID rid;
|
||||||
ObjectID body_id;
|
ObjectID body_id;
|
||||||
ShapePair pair;
|
ShapePair pair;
|
||||||
};
|
};
|
||||||
struct BodyState {
|
struct BodyState {
|
||||||
|
RID rid;
|
||||||
//int rc;
|
//int rc;
|
||||||
bool in_scene = false;
|
bool in_scene = false;
|
||||||
VSet<ShapePair> shapes;
|
VSet<ShapePair> shapes;
|
||||||
@ -173,7 +175,7 @@ private:
|
|||||||
void _body_enter_tree(ObjectID p_id);
|
void _body_enter_tree(ObjectID p_id);
|
||||||
void _body_exit_tree(ObjectID p_id);
|
void _body_exit_tree(ObjectID p_id);
|
||||||
|
|
||||||
void _body_inout(int p_status, ObjectID p_instance, int p_body_shape, int p_local_shape);
|
void _body_inout(int p_status, const RID &p_body, ObjectID p_instance, int p_body_shape, int p_local_shape);
|
||||||
void _direct_state_changed(Object *p_state);
|
void _direct_state_changed(Object *p_state);
|
||||||
|
|
||||||
bool _test_motion(const Vector2 &p_motion, bool p_infinite_inertia = true, real_t p_margin = 0.08, const Ref<PhysicsTestMotionResult2D> &p_result = Ref<PhysicsTestMotionResult2D>());
|
bool _test_motion(const Vector2 &p_motion, bool p_infinite_inertia = true, real_t p_margin = 0.08, const Ref<PhysicsTestMotionResult2D> &p_result = Ref<PhysicsTestMotionResult2D>());
|
||||||
|
@ -118,7 +118,7 @@ void Area3D::_body_enter_tree(ObjectID p_id) {
|
|||||||
E->get().in_tree = true;
|
E->get().in_tree = true;
|
||||||
emit_signal(SceneStringNames::get_singleton()->body_entered, node);
|
emit_signal(SceneStringNames::get_singleton()->body_entered, node);
|
||||||
for (int i = 0; i < E->get().shapes.size(); i++) {
|
for (int i = 0; i < E->get().shapes.size(); i++) {
|
||||||
emit_signal(SceneStringNames::get_singleton()->body_shape_entered, p_id, node, E->get().shapes[i].body_shape, E->get().shapes[i].area_shape);
|
emit_signal(SceneStringNames::get_singleton()->body_shape_entered, E->get().rid, node, E->get().shapes[i].body_shape, E->get().shapes[i].area_shape);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -132,7 +132,7 @@ void Area3D::_body_exit_tree(ObjectID p_id) {
|
|||||||
E->get().in_tree = false;
|
E->get().in_tree = false;
|
||||||
emit_signal(SceneStringNames::get_singleton()->body_exited, node);
|
emit_signal(SceneStringNames::get_singleton()->body_exited, node);
|
||||||
for (int i = 0; i < E->get().shapes.size(); i++) {
|
for (int i = 0; i < E->get().shapes.size(); i++) {
|
||||||
emit_signal(SceneStringNames::get_singleton()->body_shape_exited, p_id, node, E->get().shapes[i].body_shape, E->get().shapes[i].area_shape);
|
emit_signal(SceneStringNames::get_singleton()->body_shape_exited, E->get().rid, node, E->get().shapes[i].body_shape, E->get().shapes[i].area_shape);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -154,6 +154,7 @@ void Area3D::_body_inout(int p_status, const RID &p_body, ObjectID p_instance, i
|
|||||||
if (body_in) {
|
if (body_in) {
|
||||||
if (!E) {
|
if (!E) {
|
||||||
E = body_map.insert(objid, BodyState());
|
E = body_map.insert(objid, BodyState());
|
||||||
|
E->get().rid = p_body;
|
||||||
E->get().rc = 0;
|
E->get().rc = 0;
|
||||||
E->get().in_tree = node && node->is_inside_tree();
|
E->get().in_tree = node && node->is_inside_tree();
|
||||||
if (node) {
|
if (node) {
|
||||||
@ -170,7 +171,7 @@ void Area3D::_body_inout(int p_status, const RID &p_body, ObjectID p_instance, i
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (E->get().in_tree) {
|
if (E->get().in_tree) {
|
||||||
emit_signal(SceneStringNames::get_singleton()->body_shape_entered, objid, node, p_body_shape, p_area_shape);
|
emit_signal(SceneStringNames::get_singleton()->body_shape_entered, p_body, node, p_body_shape, p_area_shape);
|
||||||
}
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
@ -192,7 +193,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, objid, obj, p_body_shape, p_area_shape);
|
emit_signal(SceneStringNames::get_singleton()->body_shape_exited, p_body, obj, p_body_shape, p_area_shape);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -224,7 +225,7 @@ void Area3D::_clear_monitoring() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
for (int i = 0; i < E->get().shapes.size(); i++) {
|
for (int i = 0; i < E->get().shapes.size(); i++) {
|
||||||
emit_signal(SceneStringNames::get_singleton()->body_shape_exited, E->key(), node, E->get().shapes[i].body_shape, E->get().shapes[i].area_shape);
|
emit_signal(SceneStringNames::get_singleton()->body_shape_exited, E->get().rid, node, E->get().shapes[i].body_shape, E->get().shapes[i].area_shape);
|
||||||
}
|
}
|
||||||
|
|
||||||
emit_signal(SceneStringNames::get_singleton()->body_exited, node);
|
emit_signal(SceneStringNames::get_singleton()->body_exited, node);
|
||||||
@ -253,7 +254,7 @@ void Area3D::_clear_monitoring() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
for (int i = 0; i < E->get().shapes.size(); i++) {
|
for (int i = 0; i < E->get().shapes.size(); i++) {
|
||||||
emit_signal(SceneStringNames::get_singleton()->area_shape_exited, E->key(), node, E->get().shapes[i].area_shape, E->get().shapes[i].self_shape);
|
emit_signal(SceneStringNames::get_singleton()->area_shape_exited, E->get().rid, node, E->get().shapes[i].area_shape, E->get().shapes[i].self_shape);
|
||||||
}
|
}
|
||||||
|
|
||||||
emit_signal(SceneStringNames::get_singleton()->area_exited, obj);
|
emit_signal(SceneStringNames::get_singleton()->area_exited, obj);
|
||||||
@ -298,7 +299,7 @@ void Area3D::_area_enter_tree(ObjectID p_id) {
|
|||||||
E->get().in_tree = true;
|
E->get().in_tree = true;
|
||||||
emit_signal(SceneStringNames::get_singleton()->area_entered, node);
|
emit_signal(SceneStringNames::get_singleton()->area_entered, node);
|
||||||
for (int i = 0; i < E->get().shapes.size(); i++) {
|
for (int i = 0; i < E->get().shapes.size(); i++) {
|
||||||
emit_signal(SceneStringNames::get_singleton()->area_shape_entered, p_id, node, E->get().shapes[i].area_shape, E->get().shapes[i].self_shape);
|
emit_signal(SceneStringNames::get_singleton()->area_shape_entered, E->get().rid, node, E->get().shapes[i].area_shape, E->get().shapes[i].self_shape);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -312,7 +313,7 @@ void Area3D::_area_exit_tree(ObjectID p_id) {
|
|||||||
E->get().in_tree = false;
|
E->get().in_tree = false;
|
||||||
emit_signal(SceneStringNames::get_singleton()->area_exited, node);
|
emit_signal(SceneStringNames::get_singleton()->area_exited, node);
|
||||||
for (int i = 0; i < E->get().shapes.size(); i++) {
|
for (int i = 0; i < E->get().shapes.size(); i++) {
|
||||||
emit_signal(SceneStringNames::get_singleton()->area_shape_exited, p_id, node, E->get().shapes[i].area_shape, E->get().shapes[i].self_shape);
|
emit_signal(SceneStringNames::get_singleton()->area_shape_exited, E->get().rid, node, E->get().shapes[i].area_shape, E->get().shapes[i].self_shape);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -334,6 +335,7 @@ void Area3D::_area_inout(int p_status, const RID &p_area, ObjectID p_instance, i
|
|||||||
if (area_in) {
|
if (area_in) {
|
||||||
if (!E) {
|
if (!E) {
|
||||||
E = area_map.insert(objid, AreaState());
|
E = area_map.insert(objid, AreaState());
|
||||||
|
E->get().rid = p_area;
|
||||||
E->get().rc = 0;
|
E->get().rc = 0;
|
||||||
E->get().in_tree = node && node->is_inside_tree();
|
E->get().in_tree = node && node->is_inside_tree();
|
||||||
if (node) {
|
if (node) {
|
||||||
@ -350,7 +352,7 @@ void Area3D::_area_inout(int p_status, const RID &p_area, ObjectID p_instance, i
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!node || E->get().in_tree) {
|
if (!node || E->get().in_tree) {
|
||||||
emit_signal(SceneStringNames::get_singleton()->area_shape_entered, objid, node, p_area_shape, p_self_shape);
|
emit_signal(SceneStringNames::get_singleton()->area_shape_entered, p_area, node, p_area_shape, p_self_shape);
|
||||||
}
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
@ -372,7 +374,7 @@ void Area3D::_area_inout(int p_status, const RID &p_area, ObjectID p_instance, i
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!node || in_tree) {
|
if (!node || in_tree) {
|
||||||
emit_signal(SceneStringNames::get_singleton()->area_shape_exited, objid, obj, p_area_shape, p_self_shape);
|
emit_signal(SceneStringNames::get_singleton()->area_shape_exited, p_area, obj, p_area_shape, p_self_shape);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -640,13 +642,13 @@ void Area3D::_bind_methods() {
|
|||||||
ClassDB::bind_method(D_METHOD("set_reverb_uniformity", "amount"), &Area3D::set_reverb_uniformity);
|
ClassDB::bind_method(D_METHOD("set_reverb_uniformity", "amount"), &Area3D::set_reverb_uniformity);
|
||||||
ClassDB::bind_method(D_METHOD("get_reverb_uniformity"), &Area3D::get_reverb_uniformity);
|
ClassDB::bind_method(D_METHOD("get_reverb_uniformity"), &Area3D::get_reverb_uniformity);
|
||||||
|
|
||||||
ADD_SIGNAL(MethodInfo("body_shape_entered", PropertyInfo(Variant::INT, "body_id"), PropertyInfo(Variant::OBJECT, "body", PROPERTY_HINT_RESOURCE_TYPE, "Node3D"), PropertyInfo(Variant::INT, "body_shape"), PropertyInfo(Variant::INT, "local_shape")));
|
ADD_SIGNAL(MethodInfo("body_shape_entered", PropertyInfo(Variant::RID, "body_rid"), PropertyInfo(Variant::OBJECT, "body", PROPERTY_HINT_RESOURCE_TYPE, "Node3D"), PropertyInfo(Variant::INT, "body_shape"), PropertyInfo(Variant::INT, "local_shape")));
|
||||||
ADD_SIGNAL(MethodInfo("body_shape_exited", PropertyInfo(Variant::INT, "body_id"), PropertyInfo(Variant::OBJECT, "body", PROPERTY_HINT_RESOURCE_TYPE, "Node3D"), PropertyInfo(Variant::INT, "body_shape"), PropertyInfo(Variant::INT, "local_shape")));
|
ADD_SIGNAL(MethodInfo("body_shape_exited", PropertyInfo(Variant::RID, "body_rid"), PropertyInfo(Variant::OBJECT, "body", PROPERTY_HINT_RESOURCE_TYPE, "Node3D"), PropertyInfo(Variant::INT, "body_shape"), PropertyInfo(Variant::INT, "local_shape")));
|
||||||
ADD_SIGNAL(MethodInfo("body_entered", PropertyInfo(Variant::OBJECT, "body", PROPERTY_HINT_RESOURCE_TYPE, "Node3D")));
|
ADD_SIGNAL(MethodInfo("body_entered", PropertyInfo(Variant::OBJECT, "body", PROPERTY_HINT_RESOURCE_TYPE, "Node3D")));
|
||||||
ADD_SIGNAL(MethodInfo("body_exited", PropertyInfo(Variant::OBJECT, "body", PROPERTY_HINT_RESOURCE_TYPE, "Node3D")));
|
ADD_SIGNAL(MethodInfo("body_exited", PropertyInfo(Variant::OBJECT, "body", PROPERTY_HINT_RESOURCE_TYPE, "Node3D")));
|
||||||
|
|
||||||
ADD_SIGNAL(MethodInfo("area_shape_entered", PropertyInfo(Variant::INT, "area_id"), PropertyInfo(Variant::OBJECT, "area", PROPERTY_HINT_RESOURCE_TYPE, "Area3D"), PropertyInfo(Variant::INT, "area_shape"), PropertyInfo(Variant::INT, "local_shape")));
|
ADD_SIGNAL(MethodInfo("area_shape_entered", PropertyInfo(Variant::RID, "area_rid"), PropertyInfo(Variant::OBJECT, "area", PROPERTY_HINT_RESOURCE_TYPE, "Area3D"), PropertyInfo(Variant::INT, "area_shape"), PropertyInfo(Variant::INT, "local_shape")));
|
||||||
ADD_SIGNAL(MethodInfo("area_shape_exited", PropertyInfo(Variant::INT, "area_id"), PropertyInfo(Variant::OBJECT, "area", PROPERTY_HINT_RESOURCE_TYPE, "Area3D"), PropertyInfo(Variant::INT, "area_shape"), PropertyInfo(Variant::INT, "local_shape")));
|
ADD_SIGNAL(MethodInfo("area_shape_exited", PropertyInfo(Variant::RID, "area_rid"), PropertyInfo(Variant::OBJECT, "area", PROPERTY_HINT_RESOURCE_TYPE, "Area3D"), PropertyInfo(Variant::INT, "area_shape"), PropertyInfo(Variant::INT, "local_shape")));
|
||||||
ADD_SIGNAL(MethodInfo("area_entered", PropertyInfo(Variant::OBJECT, "area", PROPERTY_HINT_RESOURCE_TYPE, "Area3D")));
|
ADD_SIGNAL(MethodInfo("area_entered", PropertyInfo(Variant::OBJECT, "area", PROPERTY_HINT_RESOURCE_TYPE, "Area3D")));
|
||||||
ADD_SIGNAL(MethodInfo("area_exited", PropertyInfo(Variant::OBJECT, "area", PROPERTY_HINT_RESOURCE_TYPE, "Area3D")));
|
ADD_SIGNAL(MethodInfo("area_exited", PropertyInfo(Variant::OBJECT, "area", PROPERTY_HINT_RESOURCE_TYPE, "Area3D")));
|
||||||
|
|
||||||
|
@ -85,6 +85,7 @@ private:
|
|||||||
};
|
};
|
||||||
|
|
||||||
struct BodyState {
|
struct BodyState {
|
||||||
|
RID rid;
|
||||||
int rc = 0;
|
int rc = 0;
|
||||||
bool in_tree = false;
|
bool in_tree = false;
|
||||||
VSet<ShapePair> shapes;
|
VSet<ShapePair> shapes;
|
||||||
@ -116,6 +117,7 @@ private:
|
|||||||
};
|
};
|
||||||
|
|
||||||
struct AreaState {
|
struct AreaState {
|
||||||
|
RID rid;
|
||||||
int rc = 0;
|
int rc = 0;
|
||||||
bool in_tree = false;
|
bool in_tree = false;
|
||||||
VSet<AreaShapePair> shapes;
|
VSet<AreaShapePair> shapes;
|
||||||
|
@ -242,7 +242,7 @@ void RigidBody3D::_body_enter_tree(ObjectID p_id) {
|
|||||||
emit_signal(SceneStringNames::get_singleton()->body_entered, node);
|
emit_signal(SceneStringNames::get_singleton()->body_entered, node);
|
||||||
|
|
||||||
for (int i = 0; i < E->get().shapes.size(); i++) {
|
for (int i = 0; i < E->get().shapes.size(); i++) {
|
||||||
emit_signal(SceneStringNames::get_singleton()->body_shape_entered, p_id, node, E->get().shapes[i].body_shape, E->get().shapes[i].local_shape);
|
emit_signal(SceneStringNames::get_singleton()->body_shape_entered, E->get().rid, node, E->get().shapes[i].body_shape, E->get().shapes[i].local_shape);
|
||||||
}
|
}
|
||||||
|
|
||||||
contact_monitor->locked = false;
|
contact_monitor->locked = false;
|
||||||
@ -263,13 +263,13 @@ void RigidBody3D::_body_exit_tree(ObjectID p_id) {
|
|||||||
emit_signal(SceneStringNames::get_singleton()->body_exited, node);
|
emit_signal(SceneStringNames::get_singleton()->body_exited, node);
|
||||||
|
|
||||||
for (int i = 0; i < E->get().shapes.size(); i++) {
|
for (int i = 0; i < E->get().shapes.size(); i++) {
|
||||||
emit_signal(SceneStringNames::get_singleton()->body_shape_exited, p_id, node, E->get().shapes[i].body_shape, E->get().shapes[i].local_shape);
|
emit_signal(SceneStringNames::get_singleton()->body_shape_exited, E->get().rid, node, E->get().shapes[i].body_shape, E->get().shapes[i].local_shape);
|
||||||
}
|
}
|
||||||
|
|
||||||
contact_monitor->locked = false;
|
contact_monitor->locked = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void RigidBody3D::_body_inout(int p_status, ObjectID p_instance, int p_body_shape, int p_local_shape) {
|
void RigidBody3D::_body_inout(int p_status, const RID &p_body, ObjectID p_instance, int p_body_shape, int p_local_shape) {
|
||||||
bool body_in = p_status == 1;
|
bool body_in = p_status == 1;
|
||||||
ObjectID objid = p_instance;
|
ObjectID objid = p_instance;
|
||||||
|
|
||||||
@ -284,6 +284,7 @@ void RigidBody3D::_body_inout(int p_status, ObjectID p_instance, int p_body_shap
|
|||||||
if (body_in) {
|
if (body_in) {
|
||||||
if (!E) {
|
if (!E) {
|
||||||
E = contact_monitor->body_map.insert(objid, BodyState());
|
E = contact_monitor->body_map.insert(objid, BodyState());
|
||||||
|
E->get().rid = p_body;
|
||||||
//E->get().rc=0;
|
//E->get().rc=0;
|
||||||
E->get().in_tree = node && node->is_inside_tree();
|
E->get().in_tree = node && node->is_inside_tree();
|
||||||
if (node) {
|
if (node) {
|
||||||
@ -300,7 +301,7 @@ void RigidBody3D::_body_inout(int p_status, ObjectID p_instance, int p_body_shap
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (E->get().in_tree) {
|
if (E->get().in_tree) {
|
||||||
emit_signal(SceneStringNames::get_singleton()->body_shape_entered, objid, node, p_body_shape, p_local_shape);
|
emit_signal(SceneStringNames::get_singleton()->body_shape_entered, p_body, node, p_body_shape, p_local_shape);
|
||||||
}
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
@ -324,12 +325,13 @@ void RigidBody3D::_body_inout(int p_status, ObjectID p_instance, int p_body_shap
|
|||||||
contact_monitor->body_map.erase(E);
|
contact_monitor->body_map.erase(E);
|
||||||
}
|
}
|
||||||
if (node && in_tree) {
|
if (node && in_tree) {
|
||||||
emit_signal(SceneStringNames::get_singleton()->body_shape_exited, objid, obj, p_body_shape, p_local_shape);
|
emit_signal(SceneStringNames::get_singleton()->body_shape_exited, p_body, obj, p_body_shape, p_local_shape);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
struct _RigidBodyInOut {
|
struct _RigidBodyInOut {
|
||||||
|
RID rid;
|
||||||
ObjectID id;
|
ObjectID id;
|
||||||
int shape = 0;
|
int shape = 0;
|
||||||
int local_shape = 0;
|
int local_shape = 0;
|
||||||
@ -376,6 +378,7 @@ void RigidBody3D::_direct_state_changed(Object *p_state) {
|
|||||||
//put the ones to add
|
//put the ones to add
|
||||||
|
|
||||||
for (int i = 0; i < state->get_contact_count(); i++) {
|
for (int i = 0; i < state->get_contact_count(); i++) {
|
||||||
|
RID rid = state->get_contact_collider(i);
|
||||||
ObjectID obj = state->get_contact_collider_id(i);
|
ObjectID obj = state->get_contact_collider_id(i);
|
||||||
int local_shape = state->get_contact_local_shape(i);
|
int local_shape = state->get_contact_local_shape(i);
|
||||||
int shape = state->get_contact_collider_shape(i);
|
int shape = state->get_contact_collider_shape(i);
|
||||||
@ -384,6 +387,7 @@ void RigidBody3D::_direct_state_changed(Object *p_state) {
|
|||||||
|
|
||||||
Map<ObjectID, BodyState>::Element *E = contact_monitor->body_map.find(obj);
|
Map<ObjectID, BodyState>::Element *E = contact_monitor->body_map.find(obj);
|
||||||
if (!E) {
|
if (!E) {
|
||||||
|
toadd[toadd_count].rid = rid;
|
||||||
toadd[toadd_count].local_shape = local_shape;
|
toadd[toadd_count].local_shape = local_shape;
|
||||||
toadd[toadd_count].id = obj;
|
toadd[toadd_count].id = obj;
|
||||||
toadd[toadd_count].shape = shape;
|
toadd[toadd_count].shape = shape;
|
||||||
@ -394,6 +398,7 @@ void RigidBody3D::_direct_state_changed(Object *p_state) {
|
|||||||
ShapePair sp(shape, local_shape);
|
ShapePair sp(shape, local_shape);
|
||||||
int idx = E->get().shapes.find(sp);
|
int idx = E->get().shapes.find(sp);
|
||||||
if (idx == -1) {
|
if (idx == -1) {
|
||||||
|
toadd[toadd_count].rid = rid;
|
||||||
toadd[toadd_count].local_shape = local_shape;
|
toadd[toadd_count].local_shape = local_shape;
|
||||||
toadd[toadd_count].id = obj;
|
toadd[toadd_count].id = obj;
|
||||||
toadd[toadd_count].shape = shape;
|
toadd[toadd_count].shape = shape;
|
||||||
@ -409,6 +414,7 @@ void RigidBody3D::_direct_state_changed(Object *p_state) {
|
|||||||
for (Map<ObjectID, BodyState>::Element *E = contact_monitor->body_map.front(); E; E = E->next()) {
|
for (Map<ObjectID, BodyState>::Element *E = contact_monitor->body_map.front(); E; E = E->next()) {
|
||||||
for (int i = 0; i < E->get().shapes.size(); i++) {
|
for (int i = 0; i < E->get().shapes.size(); i++) {
|
||||||
if (!E->get().shapes[i].tagged) {
|
if (!E->get().shapes[i].tagged) {
|
||||||
|
toremove[toremove_count].rid = E->get().rid;
|
||||||
toremove[toremove_count].body_id = E->key();
|
toremove[toremove_count].body_id = E->key();
|
||||||
toremove[toremove_count].pair = E->get().shapes[i];
|
toremove[toremove_count].pair = E->get().shapes[i];
|
||||||
toremove_count++;
|
toremove_count++;
|
||||||
@ -419,13 +425,13 @@ void RigidBody3D::_direct_state_changed(Object *p_state) {
|
|||||||
//process remotions
|
//process remotions
|
||||||
|
|
||||||
for (int i = 0; i < toremove_count; i++) {
|
for (int i = 0; i < toremove_count; i++) {
|
||||||
_body_inout(0, toremove[i].body_id, toremove[i].pair.body_shape, toremove[i].pair.local_shape);
|
_body_inout(0, toremove[i].rid, toremove[i].body_id, toremove[i].pair.body_shape, toremove[i].pair.local_shape);
|
||||||
}
|
}
|
||||||
|
|
||||||
//process aditions
|
//process aditions
|
||||||
|
|
||||||
for (int i = 0; i < toadd_count; i++) {
|
for (int i = 0; i < toadd_count; i++) {
|
||||||
_body_inout(1, toadd[i].id, toadd[i].shape, toadd[i].local_shape);
|
_body_inout(1, toremove[i].rid, toadd[i].id, toadd[i].shape, toadd[i].local_shape);
|
||||||
}
|
}
|
||||||
|
|
||||||
contact_monitor->locked = false;
|
contact_monitor->locked = false;
|
||||||
@ -812,8 +818,8 @@ void RigidBody3D::_bind_methods() {
|
|||||||
ADD_PROPERTY(PropertyInfo(Variant::VECTOR3, "angular_velocity"), "set_angular_velocity", "get_angular_velocity");
|
ADD_PROPERTY(PropertyInfo(Variant::VECTOR3, "angular_velocity"), "set_angular_velocity", "get_angular_velocity");
|
||||||
ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "angular_damp", PROPERTY_HINT_RANGE, "-1,100,0.001,or_greater"), "set_angular_damp", "get_angular_damp");
|
ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "angular_damp", PROPERTY_HINT_RANGE, "-1,100,0.001,or_greater"), "set_angular_damp", "get_angular_damp");
|
||||||
|
|
||||||
ADD_SIGNAL(MethodInfo("body_shape_entered", PropertyInfo(Variant::INT, "body_id"), PropertyInfo(Variant::OBJECT, "body", PROPERTY_HINT_RESOURCE_TYPE, "Node"), PropertyInfo(Variant::INT, "body_shape"), PropertyInfo(Variant::INT, "local_shape")));
|
ADD_SIGNAL(MethodInfo("body_shape_entered", PropertyInfo(Variant::RID, "body_rid"), PropertyInfo(Variant::OBJECT, "body", PROPERTY_HINT_RESOURCE_TYPE, "Node"), PropertyInfo(Variant::INT, "body_shape"), PropertyInfo(Variant::INT, "local_shape")));
|
||||||
ADD_SIGNAL(MethodInfo("body_shape_exited", PropertyInfo(Variant::INT, "body_id"), PropertyInfo(Variant::OBJECT, "body", PROPERTY_HINT_RESOURCE_TYPE, "Node"), PropertyInfo(Variant::INT, "body_shape"), PropertyInfo(Variant::INT, "local_shape")));
|
ADD_SIGNAL(MethodInfo("body_shape_exited", PropertyInfo(Variant::RID, "body_rid"), PropertyInfo(Variant::OBJECT, "body", PROPERTY_HINT_RESOURCE_TYPE, "Node"), PropertyInfo(Variant::INT, "body_shape"), PropertyInfo(Variant::INT, "local_shape")));
|
||||||
ADD_SIGNAL(MethodInfo("body_entered", PropertyInfo(Variant::OBJECT, "body", PROPERTY_HINT_RESOURCE_TYPE, "Node")));
|
ADD_SIGNAL(MethodInfo("body_entered", PropertyInfo(Variant::OBJECT, "body", PROPERTY_HINT_RESOURCE_TYPE, "Node")));
|
||||||
ADD_SIGNAL(MethodInfo("body_exited", PropertyInfo(Variant::OBJECT, "body", PROPERTY_HINT_RESOURCE_TYPE, "Node")));
|
ADD_SIGNAL(MethodInfo("body_exited", PropertyInfo(Variant::OBJECT, "body", PROPERTY_HINT_RESOURCE_TYPE, "Node")));
|
||||||
ADD_SIGNAL(MethodInfo("sleeping_state_changed"));
|
ADD_SIGNAL(MethodInfo("sleeping_state_changed"));
|
||||||
|
@ -152,10 +152,12 @@ protected:
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
struct RigidBody3D_RemoveAction {
|
struct RigidBody3D_RemoveAction {
|
||||||
|
RID rid;
|
||||||
ObjectID body_id;
|
ObjectID body_id;
|
||||||
ShapePair pair;
|
ShapePair pair;
|
||||||
};
|
};
|
||||||
struct BodyState {
|
struct BodyState {
|
||||||
|
RID rid;
|
||||||
//int rc;
|
//int rc;
|
||||||
bool in_tree = false;
|
bool in_tree = false;
|
||||||
VSet<ShapePair> shapes;
|
VSet<ShapePair> shapes;
|
||||||
@ -170,7 +172,7 @@ protected:
|
|||||||
void _body_enter_tree(ObjectID p_id);
|
void _body_enter_tree(ObjectID p_id);
|
||||||
void _body_exit_tree(ObjectID p_id);
|
void _body_exit_tree(ObjectID p_id);
|
||||||
|
|
||||||
void _body_inout(int p_status, ObjectID p_instance, int p_body_shape, int p_local_shape);
|
void _body_inout(int p_status, const RID &p_body, ObjectID p_instance, int p_body_shape, int p_local_shape);
|
||||||
virtual void _direct_state_changed(Object *p_state);
|
virtual void _direct_state_changed(Object *p_state);
|
||||||
|
|
||||||
void _notification(int p_what);
|
void _notification(int p_what);
|
||||||
|
Loading…
Reference in New Issue
Block a user