diff --git a/doc/classes/PhysicsDirectBodyState2D.xml b/doc/classes/PhysicsDirectBodyState2D.xml index d60cc1ee6b1..c7cca7d7bda 100644 --- a/doc/classes/PhysicsDirectBodyState2D.xml +++ b/doc/classes/PhysicsDirectBodyState2D.xml @@ -232,6 +232,12 @@ The body's center of mass position in the body's local coordinate system. + + The body's collision layer. + + + The body's collision mask. + The inverse of the inertia of the body. diff --git a/doc/classes/PhysicsDirectBodyState2DExtension.xml b/doc/classes/PhysicsDirectBodyState2DExtension.xml index af5750fef85..25ad7e23f14 100644 --- a/doc/classes/PhysicsDirectBodyState2DExtension.xml +++ b/doc/classes/PhysicsDirectBodyState2DExtension.xml @@ -94,6 +94,16 @@ Implement to override the behavior of [member PhysicsDirectBodyState2D.center_of_mass_local] and its respective getter. + + + + + + + + + + @@ -269,6 +279,18 @@ Implement to override the behavior of [member PhysicsDirectBodyState2D.angular_velocity] and its respective setter. + + + + + + + + + + + + diff --git a/doc/classes/PhysicsDirectBodyState3D.xml b/doc/classes/PhysicsDirectBodyState3D.xml index e8c3f3f89db..76a5bdb5b9c 100644 --- a/doc/classes/PhysicsDirectBodyState3D.xml +++ b/doc/classes/PhysicsDirectBodyState3D.xml @@ -232,6 +232,12 @@ The body's center of mass position in the body's local coordinate system. + + The body's collision layer. + + + The body's collision mask. + The inverse of the inertia of the body. diff --git a/doc/classes/PhysicsDirectBodyState3DExtension.xml b/doc/classes/PhysicsDirectBodyState3DExtension.xml index 496c57fcc90..cecc37e30ef 100644 --- a/doc/classes/PhysicsDirectBodyState3DExtension.xml +++ b/doc/classes/PhysicsDirectBodyState3DExtension.xml @@ -82,6 +82,16 @@ + + + + + + + + + + @@ -240,6 +250,18 @@ + + + + + + + + + + + + diff --git a/modules/godot_physics_2d/godot_body_direct_state_2d.cpp b/modules/godot_physics_2d/godot_body_direct_state_2d.cpp index dc8739c656a..9c8bfdee650 100644 --- a/modules/godot_physics_2d/godot_body_direct_state_2d.cpp +++ b/modules/godot_physics_2d/godot_body_direct_state_2d.cpp @@ -166,6 +166,22 @@ bool GodotPhysicsDirectBodyState2D::is_sleeping() const { return !body->is_active(); } +void GodotPhysicsDirectBodyState2D::set_collision_layer(uint32_t p_layer) { + body->set_collision_layer(p_layer); +} + +uint32_t GodotPhysicsDirectBodyState2D::get_collision_layer() const { + return body->get_collision_layer(); +} + +void GodotPhysicsDirectBodyState2D::set_collision_mask(uint32_t p_mask) { + body->set_collision_mask(p_mask); +} + +uint32_t GodotPhysicsDirectBodyState2D::get_collision_mask() const { + return body->get_collision_mask(); +} + int GodotPhysicsDirectBodyState2D::get_contact_count() const { return body->contact_count; } diff --git a/modules/godot_physics_2d/godot_body_direct_state_2d.h b/modules/godot_physics_2d/godot_body_direct_state_2d.h index dcceb860523..cc4710c0ce9 100644 --- a/modules/godot_physics_2d/godot_body_direct_state_2d.h +++ b/modules/godot_physics_2d/godot_body_direct_state_2d.h @@ -81,6 +81,12 @@ public: virtual void set_sleep_state(bool p_enable) override; virtual bool is_sleeping() const override; + virtual void set_collision_layer(uint32_t p_layer) override; + virtual uint32_t get_collision_layer() const override; + + virtual void set_collision_mask(uint32_t p_mask) override; + virtual uint32_t get_collision_mask() const override; + virtual int get_contact_count() const override; virtual Vector2 get_contact_local_position(int p_contact_idx) const override; diff --git a/modules/godot_physics_3d/godot_body_direct_state_3d.cpp b/modules/godot_physics_3d/godot_body_direct_state_3d.cpp index 0af746c68d9..36ea2ce7be7 100644 --- a/modules/godot_physics_3d/godot_body_direct_state_3d.cpp +++ b/modules/godot_physics_3d/godot_body_direct_state_3d.cpp @@ -174,6 +174,22 @@ bool GodotPhysicsDirectBodyState3D::is_sleeping() const { return !body->is_active(); } +void GodotPhysicsDirectBodyState3D::set_collision_layer(uint32_t p_layer) { + body->set_collision_layer(p_layer); +} + +uint32_t GodotPhysicsDirectBodyState3D::get_collision_layer() const { + return body->get_collision_layer(); +} + +void GodotPhysicsDirectBodyState3D::set_collision_mask(uint32_t p_mask) { + body->set_collision_mask(p_mask); +} + +uint32_t GodotPhysicsDirectBodyState3D::get_collision_mask() const { + return body->get_collision_mask(); +} + int GodotPhysicsDirectBodyState3D::get_contact_count() const { return body->contact_count; } diff --git a/modules/godot_physics_3d/godot_body_direct_state_3d.h b/modules/godot_physics_3d/godot_body_direct_state_3d.h index 55246857883..efd8df009df 100644 --- a/modules/godot_physics_3d/godot_body_direct_state_3d.h +++ b/modules/godot_physics_3d/godot_body_direct_state_3d.h @@ -84,6 +84,12 @@ public: virtual void set_sleep_state(bool p_sleep) override; virtual bool is_sleeping() const override; + virtual void set_collision_layer(uint32_t p_layer) override; + virtual uint32_t get_collision_layer() const override; + + virtual void set_collision_mask(uint32_t p_mask) override; + virtual uint32_t get_collision_mask() const override; + virtual int get_contact_count() const override; virtual Vector3 get_contact_local_position(int p_contact_idx) const override; diff --git a/modules/jolt_physics/objects/jolt_physics_direct_body_state_3d.cpp b/modules/jolt_physics/objects/jolt_physics_direct_body_state_3d.cpp index 2e450446116..4bfc23fa9eb 100644 --- a/modules/jolt_physics/objects/jolt_physics_direct_body_state_3d.cpp +++ b/modules/jolt_physics/objects/jolt_physics_direct_body_state_3d.cpp @@ -162,6 +162,22 @@ void JoltPhysicsDirectBodyState3D::set_sleep_state(bool p_enabled) { body->set_is_sleeping(p_enabled); } +void JoltPhysicsDirectBodyState3D::set_collision_layer(uint32_t p_layer) { + body->set_collision_layer(p_layer); +} + +uint32_t JoltPhysicsDirectBodyState3D::get_collision_layer() const { + return body->get_collision_layer(); +} + +void JoltPhysicsDirectBodyState3D::set_collision_mask(uint32_t p_mask) { + body->set_collision_mask(p_mask); +} + +uint32_t JoltPhysicsDirectBodyState3D::get_collision_mask() const { + return body->get_collision_mask(); +} + int JoltPhysicsDirectBodyState3D::get_contact_count() const { return body->get_contact_count(); } diff --git a/modules/jolt_physics/objects/jolt_physics_direct_body_state_3d.h b/modules/jolt_physics/objects/jolt_physics_direct_body_state_3d.h index 77220fe9cf1..1b924ae5568 100644 --- a/modules/jolt_physics/objects/jolt_physics_direct_body_state_3d.h +++ b/modules/jolt_physics/objects/jolt_physics_direct_body_state_3d.h @@ -90,6 +90,12 @@ public: virtual void set_sleep_state(bool p_enabled) override; virtual bool is_sleeping() const override; + virtual void set_collision_layer(uint32_t p_layer) override; + virtual uint32_t get_collision_layer() const override; + + virtual void set_collision_mask(uint32_t p_mask) override; + virtual uint32_t get_collision_mask() const override; + virtual int get_contact_count() const override; virtual Vector3 get_contact_local_position(int p_contact_idx) const override; diff --git a/scene/2d/physics/character_body_2d.cpp b/scene/2d/physics/character_body_2d.cpp index e5022a28b25..c1804c6483e 100644 --- a/scene/2d/physics/character_body_2d.cpp +++ b/scene/2d/physics/character_body_2d.cpp @@ -30,6 +30,10 @@ #include "character_body_2d.h" +#ifndef DISABLE_DEPRECATED +#include "servers/extensions/physics_server_2d_extension.h" +#endif + // So, if you pass 45 as limit, avoid numerical precision errors when angle is 45. #define FLOOR_ANGLE_THRESHOLD 0.01 @@ -416,10 +420,25 @@ void CharacterBody2D::_set_collision_direction(const PhysicsServer2D::MotionResu } void CharacterBody2D::_set_platform_data(const PhysicsServer2D::MotionResult &p_result) { + PhysicsDirectBodyState2D *bs = PhysicsServer2D::get_singleton()->body_get_direct_state(p_result.collider); + if (bs == nullptr) { + return; + } + platform_rid = p_result.collider; platform_object_id = p_result.collider_id; platform_velocity = p_result.collider_velocity; - platform_layer = PhysicsServer2D::get_singleton()->body_get_collision_layer(platform_rid); + +#ifndef DISABLE_DEPRECATED + // Try to accommodate for any physics extensions that have yet to implement `PhysicsDirectBodyState2D::get_collision_layer`. + PhysicsDirectBodyState2DExtension *bs_ext = Object::cast_to(bs); + if (bs_ext != nullptr && !GDVIRTUAL_IS_OVERRIDDEN_PTR(bs_ext, _get_collision_layer)) { + platform_layer = PhysicsServer2D::get_singleton()->body_get_collision_layer(p_result.collider); + } else +#endif + { + platform_layer = bs->get_collision_layer(); + } } const Vector2 &CharacterBody2D::get_velocity() const { diff --git a/scene/3d/physics/character_body_3d.cpp b/scene/3d/physics/character_body_3d.cpp index 886492fe740..a1869a2965f 100644 --- a/scene/3d/physics/character_body_3d.cpp +++ b/scene/3d/physics/character_body_3d.cpp @@ -30,6 +30,10 @@ #include "character_body_3d.h" +#ifndef DISABLE_DEPRECATED +#include "servers/extensions/physics_server_3d_extension.h" +#endif + //so, if you pass 45 as limit, avoid numerical precision errors when angle is 45. #define FLOOR_ANGLE_THRESHOLD 0.01 @@ -607,11 +611,26 @@ void CharacterBody3D::_set_collision_direction(const PhysicsServer3D::MotionResu } void CharacterBody3D::_set_platform_data(const PhysicsServer3D::MotionCollision &p_collision) { + PhysicsDirectBodyState3D *bs = PhysicsServer3D::get_singleton()->body_get_direct_state(p_collision.collider); + if (bs == nullptr) { + return; + } + platform_rid = p_collision.collider; platform_object_id = p_collision.collider_id; platform_velocity = p_collision.collider_velocity; platform_angular_velocity = p_collision.collider_angular_velocity; - platform_layer = PhysicsServer3D::get_singleton()->body_get_collision_layer(platform_rid); + +#ifndef DISABLE_DEPRECATED + // Try to accommodate for any physics extensions that have yet to implement `PhysicsDirectBodyState3D::get_collision_layer`. + PhysicsDirectBodyState3DExtension *bs_ext = Object::cast_to(bs); + if (bs_ext != nullptr && !GDVIRTUAL_IS_OVERRIDDEN_PTR(bs_ext, _get_collision_layer)) { + platform_layer = PhysicsServer3D::get_singleton()->body_get_collision_layer(p_collision.collider); + } else +#endif + { + platform_layer = bs->get_collision_layer(); + } } void CharacterBody3D::set_safe_margin(real_t p_margin) { diff --git a/servers/extensions/physics_server_2d_extension.cpp b/servers/extensions/physics_server_2d_extension.cpp index f8e78d655f4..ea4e229e53b 100644 --- a/servers/extensions/physics_server_2d_extension.cpp +++ b/servers/extensions/physics_server_2d_extension.cpp @@ -92,6 +92,12 @@ void PhysicsDirectBodyState2DExtension::_bind_methods() { GDVIRTUAL_BIND(_set_sleep_state, "enabled"); GDVIRTUAL_BIND(_is_sleeping); + GDVIRTUAL_BIND(_set_collision_layer, "layer"); + GDVIRTUAL_BIND(_get_collision_layer); + + GDVIRTUAL_BIND(_set_collision_mask, "mask"); + GDVIRTUAL_BIND(_get_collision_mask); + GDVIRTUAL_BIND(_get_contact_count); GDVIRTUAL_BIND(_get_contact_local_position, "contact_idx"); diff --git a/servers/extensions/physics_server_2d_extension.h b/servers/extensions/physics_server_2d_extension.h index 6c6d69b2dfe..7803dcfcfca 100644 --- a/servers/extensions/physics_server_2d_extension.h +++ b/servers/extensions/physics_server_2d_extension.h @@ -86,6 +86,12 @@ public: EXBIND1(set_sleep_state, bool) EXBIND0RC(bool, is_sleeping) + EXBIND1(set_collision_layer, uint32_t); + EXBIND0RC(uint32_t, get_collision_layer); + + EXBIND1(set_collision_mask, uint32_t); + EXBIND0RC(uint32_t, get_collision_mask); + EXBIND0RC(int, get_contact_count) EXBIND1RC(Vector2, get_contact_local_position, int) diff --git a/servers/extensions/physics_server_3d_extension.cpp b/servers/extensions/physics_server_3d_extension.cpp index ca0423bb5eb..f630b093cd2 100644 --- a/servers/extensions/physics_server_3d_extension.cpp +++ b/servers/extensions/physics_server_3d_extension.cpp @@ -96,6 +96,12 @@ void PhysicsDirectBodyState3DExtension::_bind_methods() { GDVIRTUAL_BIND(_set_sleep_state, "enabled"); GDVIRTUAL_BIND(_is_sleeping); + GDVIRTUAL_BIND(_set_collision_layer, "layer"); + GDVIRTUAL_BIND(_get_collision_layer); + + GDVIRTUAL_BIND(_set_collision_mask, "mask"); + GDVIRTUAL_BIND(_get_collision_mask); + GDVIRTUAL_BIND(_get_contact_count); GDVIRTUAL_BIND(_get_contact_local_position, "contact_idx"); diff --git a/servers/extensions/physics_server_3d_extension.h b/servers/extensions/physics_server_3d_extension.h index acc811fbca2..95d2ed9a655 100644 --- a/servers/extensions/physics_server_3d_extension.h +++ b/servers/extensions/physics_server_3d_extension.h @@ -88,6 +88,12 @@ public: EXBIND1(set_sleep_state, bool) EXBIND0RC(bool, is_sleeping) + EXBIND1(set_collision_layer, uint32_t); + EXBIND0RC(uint32_t, get_collision_layer); + + EXBIND1(set_collision_mask, uint32_t); + EXBIND0RC(uint32_t, get_collision_mask); + EXBIND0RC(int, get_contact_count) EXBIND1RC(Vector3, get_contact_local_position, int) diff --git a/servers/physics_server_2d.cpp b/servers/physics_server_2d.cpp index 10244cc0580..52a3f962219 100644 --- a/servers/physics_server_2d.cpp +++ b/servers/physics_server_2d.cpp @@ -114,6 +114,12 @@ void PhysicsDirectBodyState2D::_bind_methods() { ClassDB::bind_method(D_METHOD("set_sleep_state", "enabled"), &PhysicsDirectBodyState2D::set_sleep_state); ClassDB::bind_method(D_METHOD("is_sleeping"), &PhysicsDirectBodyState2D::is_sleeping); + ClassDB::bind_method(D_METHOD("set_collision_layer", "layer"), &PhysicsDirectBodyState2D::set_collision_layer); + ClassDB::bind_method(D_METHOD("get_collision_layer"), &PhysicsDirectBodyState2D::get_collision_layer); + + ClassDB::bind_method(D_METHOD("set_collision_mask", "mask"), &PhysicsDirectBodyState2D::set_collision_mask); + ClassDB::bind_method(D_METHOD("get_collision_mask"), &PhysicsDirectBodyState2D::get_collision_mask); + ClassDB::bind_method(D_METHOD("get_contact_count"), &PhysicsDirectBodyState2D::get_contact_count); ClassDB::bind_method(D_METHOD("get_contact_local_position", "contact_idx"), &PhysicsDirectBodyState2D::get_contact_local_position); @@ -142,6 +148,8 @@ void PhysicsDirectBodyState2D::_bind_methods() { ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "angular_velocity"), "set_angular_velocity", "get_angular_velocity"); ADD_PROPERTY(PropertyInfo(Variant::VECTOR2, "linear_velocity"), "set_linear_velocity", "get_linear_velocity"); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "sleeping"), "set_sleep_state", "is_sleeping"); + ADD_PROPERTY(PropertyInfo(Variant::INT, "collision_layer"), "set_collision_layer", "get_collision_layer"); + ADD_PROPERTY(PropertyInfo(Variant::INT, "collision_mask"), "set_collision_mask", "get_collision_mask"); ADD_PROPERTY(PropertyInfo(Variant::TRANSFORM2D, "transform"), "set_transform", "get_transform"); } diff --git a/servers/physics_server_2d.h b/servers/physics_server_2d.h index 9c5bb233e3b..5abdf1be328 100644 --- a/servers/physics_server_2d.h +++ b/servers/physics_server_2d.h @@ -88,6 +88,12 @@ public: virtual void set_sleep_state(bool p_enable) = 0; virtual bool is_sleeping() const = 0; + virtual void set_collision_layer(uint32_t p_layer) = 0; + virtual uint32_t get_collision_layer() const = 0; + + virtual void set_collision_mask(uint32_t p_mask) = 0; + virtual uint32_t get_collision_mask() const = 0; + virtual int get_contact_count() const = 0; virtual Vector2 get_contact_local_position(int p_contact_idx) const = 0; diff --git a/servers/physics_server_2d_dummy.h b/servers/physics_server_2d_dummy.h index 71c55cf614c..f7a9150dc38 100644 --- a/servers/physics_server_2d_dummy.h +++ b/servers/physics_server_2d_dummy.h @@ -79,6 +79,12 @@ public: virtual void set_sleep_state(bool p_enable) override {} virtual bool is_sleeping() const override { return false; } + virtual void set_collision_layer(uint32_t p_layer) override {} + virtual uint32_t get_collision_layer() const override { return 0; } + + virtual void set_collision_mask(uint32_t p_mask) override {} + virtual uint32_t get_collision_mask() const override { return 0; } + virtual int get_contact_count() const override { return 0; } virtual Vector2 get_contact_local_position(int p_contact_idx) const override { return Vector2(); } diff --git a/servers/physics_server_3d.cpp b/servers/physics_server_3d.cpp index 7c907d66c32..8730309fccc 100644 --- a/servers/physics_server_3d.cpp +++ b/servers/physics_server_3d.cpp @@ -138,6 +138,12 @@ void PhysicsDirectBodyState3D::_bind_methods() { ClassDB::bind_method(D_METHOD("set_sleep_state", "enabled"), &PhysicsDirectBodyState3D::set_sleep_state); ClassDB::bind_method(D_METHOD("is_sleeping"), &PhysicsDirectBodyState3D::is_sleeping); + ClassDB::bind_method(D_METHOD("set_collision_layer", "layer"), &PhysicsDirectBodyState3D::set_collision_layer); + ClassDB::bind_method(D_METHOD("get_collision_layer"), &PhysicsDirectBodyState3D::get_collision_layer); + + ClassDB::bind_method(D_METHOD("set_collision_mask", "mask"), &PhysicsDirectBodyState3D::set_collision_mask); + ClassDB::bind_method(D_METHOD("get_collision_mask"), &PhysicsDirectBodyState3D::get_collision_mask); + ClassDB::bind_method(D_METHOD("get_contact_count"), &PhysicsDirectBodyState3D::get_contact_count); ClassDB::bind_method(D_METHOD("get_contact_local_position", "contact_idx"), &PhysicsDirectBodyState3D::get_contact_local_position); @@ -168,6 +174,8 @@ void PhysicsDirectBodyState3D::_bind_methods() { ADD_PROPERTY(PropertyInfo(Variant::VECTOR3, "angular_velocity"), "set_angular_velocity", "get_angular_velocity"); ADD_PROPERTY(PropertyInfo(Variant::VECTOR3, "linear_velocity"), "set_linear_velocity", "get_linear_velocity"); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "sleeping"), "set_sleep_state", "is_sleeping"); + ADD_PROPERTY(PropertyInfo(Variant::INT, "collision_layer"), "set_collision_layer", "get_collision_layer"); + ADD_PROPERTY(PropertyInfo(Variant::INT, "collision_mask"), "set_collision_mask", "get_collision_mask"); ADD_PROPERTY(PropertyInfo(Variant::TRANSFORM3D, "transform"), "set_transform", "get_transform"); } diff --git a/servers/physics_server_3d.h b/servers/physics_server_3d.h index 8c857f18432..04e24c24fdd 100644 --- a/servers/physics_server_3d.h +++ b/servers/physics_server_3d.h @@ -91,6 +91,12 @@ public: virtual void set_sleep_state(bool p_sleep) = 0; virtual bool is_sleeping() const = 0; + virtual void set_collision_layer(uint32_t p_layer) = 0; + virtual uint32_t get_collision_layer() const = 0; + + virtual void set_collision_mask(uint32_t p_mask) = 0; + virtual uint32_t get_collision_mask() const = 0; + virtual int get_contact_count() const = 0; virtual Vector3 get_contact_local_position(int p_contact_idx) const = 0; diff --git a/servers/physics_server_3d_dummy.h b/servers/physics_server_3d_dummy.h index 55368c5d39a..e171c0c98c1 100644 --- a/servers/physics_server_3d_dummy.h +++ b/servers/physics_server_3d_dummy.h @@ -81,6 +81,12 @@ public: virtual void set_sleep_state(bool p_sleep) override {} virtual bool is_sleeping() const override { return false; } + virtual void set_collision_layer(uint32_t p_layer) override {} + virtual uint32_t get_collision_layer() const override { return 0; } + + virtual void set_collision_mask(uint32_t p_mask) override {} + virtual uint32_t get_collision_mask() const override { return 0; } + virtual int get_contact_count() const override { return 0; } virtual Vector3 get_contact_local_position(int p_contact_idx) const override { return Vector3(); }