diff --git a/modules/godot_physics_3d/godot_physics_server_3d.cpp b/modules/godot_physics_3d/godot_physics_server_3d.cpp index 35aa538ef51..7fb7fa7c44c 100644 --- a/modules/godot_physics_3d/godot_physics_server_3d.cpp +++ b/modules/godot_physics_3d/godot_physics_server_3d.cpp @@ -656,6 +656,13 @@ uint32_t GodotPhysicsServer3D::body_get_user_flags(RID p_body) const { return 0; } +AABB GodotPhysicsServer3D::body_get_aabb(RID p_body, int p_shape) const { + GodotBody3D *body = body_owner.get_or_null(p_body); + ERR_FAIL_NULL_V(body, AABB()); + + return body->get_shape_aabb(p_shape); +} + void GodotPhysicsServer3D::body_set_param(RID p_body, BodyParameter p_param, const Variant &p_value) { GodotBody3D *body = body_owner.get_or_null(p_body); ERR_FAIL_NULL(body); diff --git a/modules/godot_physics_3d/godot_physics_server_3d.h b/modules/godot_physics_3d/godot_physics_server_3d.h index 94003a7087f..b8f2cf8ac93 100644 --- a/modules/godot_physics_3d/godot_physics_server_3d.h +++ b/modules/godot_physics_3d/godot_physics_server_3d.h @@ -201,6 +201,8 @@ public: virtual void body_set_user_flags(RID p_body, uint32_t p_flags) override; virtual uint32_t body_get_user_flags(RID p_body) const override; + virtual AABB body_get_aabb(RID p_body, int p_shape) const override; + virtual void body_set_param(RID p_body, BodyParameter p_param, const Variant &p_value) override; virtual Variant body_get_param(RID p_body, BodyParameter p_param) const override; diff --git a/modules/jolt_physics/jolt_physics_server_3d.cpp b/modules/jolt_physics/jolt_physics_server_3d.cpp index d126f8bde7b..338c2678c8f 100644 --- a/modules/jolt_physics/jolt_physics_server_3d.cpp +++ b/modules/jolt_physics/jolt_physics_server_3d.cpp @@ -700,6 +700,18 @@ uint32_t JoltPhysicsServer3D::body_get_user_flags(RID p_body) const { return 0; } +AABB JoltPhysicsServer3D::body_get_aabb(RID p_body, int p_shape) const { + JoltBody3D *body = body_owner.get_or_null(p_body); + ERR_FAIL_NULL_V(body, AABB()); + + // Unlike Godot Physics, JoltBody3D::get_aabb() does not accept an index. Instead, it combines + // all of its shapes' AABBs into a single AABB. For parity, we manually retrieve and transform a + // single shape here. + // + // TODO: Check that this behaves as expected (not familiar with JoltPhysics). + return body->get_transform_scaled().xform(body->get_shape(p_shape)->get_aabb()); +} + void JoltPhysicsServer3D::body_set_param(RID p_body, BodyParameter p_param, const Variant &p_value) { JoltBody3D *body = body_owner.get_or_null(p_body); ERR_FAIL_NULL(body); diff --git a/modules/jolt_physics/jolt_physics_server_3d.h b/modules/jolt_physics/jolt_physics_server_3d.h index 7dac7610f71..481c97fd4f2 100644 --- a/modules/jolt_physics/jolt_physics_server_3d.h +++ b/modules/jolt_physics/jolt_physics_server_3d.h @@ -246,6 +246,8 @@ public: virtual void body_set_user_flags(RID p_body, uint32_t p_flags) override; virtual uint32_t body_get_user_flags(RID p_body) const override; + virtual AABB body_get_aabb(RID p_body, int p_shape) const override; + virtual void body_set_param(RID p_body, PhysicsServer3D::BodyParameter p_param, const Variant &p_value) override; virtual Variant body_get_param(RID p_body, PhysicsServer3D::BodyParameter p_param) const override; diff --git a/scene/3d/physics/collision_object_3d.cpp b/scene/3d/physics/collision_object_3d.cpp index 653cbd1e5bd..b937a027d12 100644 --- a/scene/3d/physics/collision_object_3d.cpp +++ b/scene/3d/physics/collision_object_3d.cpp @@ -30,6 +30,7 @@ #include "collision_object_3d.h" +#include "collision_shape_3d.h" #include "scene/resources/3d/shape_3d.h" void CollisionObject3D::_notification(int p_what) { @@ -490,6 +491,7 @@ void CollisionObject3D::_bind_methods() { ClassDB::bind_method(D_METHOD("shape_owner_remove_shape", "owner_id", "shape_id"), &CollisionObject3D::shape_owner_remove_shape); ClassDB::bind_method(D_METHOD("shape_owner_clear_shapes", "owner_id"), &CollisionObject3D::shape_owner_clear_shapes); ClassDB::bind_method(D_METHOD("shape_find_owner", "shape_index"), &CollisionObject3D::shape_find_owner); + ClassDB::bind_method(D_METHOD("shape_owner_get_shape_aabb", "owner_id", "shape_id"), &CollisionObject3D::shape_owner_get_shape_aabb); GDVIRTUAL_BIND(_input_event, "camera", "event", "event_position", "normal", "shape_idx"); GDVIRTUAL_BIND(_mouse_enter); @@ -649,6 +651,13 @@ int CollisionObject3D::shape_owner_get_shape_index(uint32_t p_owner, int p_shape return shapes[p_owner].shapes[p_shape].index; } +AABB CollisionObject3D::shape_owner_get_shape_aabb(uint32_t p_owner, int p_shape) const { + ERR_FAIL_COND_V(!shapes.has(p_owner), AABB()); + ERR_FAIL_INDEX_V(p_shape, shapes[p_owner].shapes.size(), AABB()); + + return PhysicsServer3D::get_singleton()->body_get_aabb(rid, shapes[p_owner].shapes[p_shape].index); +} + void CollisionObject3D::shape_owner_remove_shape(uint32_t p_owner, int p_shape) { ERR_FAIL_NULL(RenderingServer::get_singleton()); ERR_FAIL_COND(!shapes.has(p_owner)); diff --git a/scene/3d/physics/collision_object_3d.h b/scene/3d/physics/collision_object_3d.h index b51423f0215..27d6a37af5f 100644 --- a/scene/3d/physics/collision_object_3d.h +++ b/scene/3d/physics/collision_object_3d.h @@ -159,6 +159,7 @@ public: int shape_owner_get_shape_count(uint32_t p_owner) const; Ref shape_owner_get_shape(uint32_t p_owner, int p_shape) const; int shape_owner_get_shape_index(uint32_t p_owner, int p_shape) const; + AABB shape_owner_get_shape_aabb(uint32_t p_owner, int p_shape) const; void shape_owner_remove_shape(uint32_t p_owner, int p_shape); void shape_owner_clear_shapes(uint32_t p_owner); diff --git a/servers/extensions/physics_server_3d_extension.h b/servers/extensions/physics_server_3d_extension.h index aba124ab9cd..8bb79662745 100644 --- a/servers/extensions/physics_server_3d_extension.h +++ b/servers/extensions/physics_server_3d_extension.h @@ -324,6 +324,8 @@ public: EXBIND2(body_set_user_flags, RID, uint32_t) EXBIND1RC(uint32_t, body_get_user_flags, RID) + EXBIND2RC(AABB, body_get_aabb, RID, int) + EXBIND3(body_set_param, RID, BodyParameter, const Variant &) EXBIND2RC(Variant, body_get_param, RID, BodyParameter) diff --git a/servers/physics_server_3d.cpp b/servers/physics_server_3d.cpp index f85ce55d991..80e74142489 100644 --- a/servers/physics_server_3d.cpp +++ b/servers/physics_server_3d.cpp @@ -770,6 +770,8 @@ void PhysicsServer3D::_bind_methods() { ClassDB::bind_method(D_METHOD("body_set_collision_priority", "body", "priority"), &PhysicsServer3D::body_set_collision_priority); ClassDB::bind_method(D_METHOD("body_get_collision_priority", "body"), &PhysicsServer3D::body_get_collision_priority); + ClassDB::bind_method(D_METHOD("body_get_aabb", "body", "shape"), &PhysicsServer3D::body_get_aabb); + ClassDB::bind_method(D_METHOD("body_add_shape", "body", "shape", "transform", "disabled"), &PhysicsServer3D::body_add_shape, DEFVAL(Transform3D()), DEFVAL(false)); ClassDB::bind_method(D_METHOD("body_set_shape", "body", "shape_idx", "shape"), &PhysicsServer3D::body_set_shape); ClassDB::bind_method(D_METHOD("body_set_shape_transform", "body", "shape_idx", "transform"), &PhysicsServer3D::body_set_shape_transform); diff --git a/servers/physics_server_3d.h b/servers/physics_server_3d.h index 61e62aed148..76c3c804636 100644 --- a/servers/physics_server_3d.h +++ b/servers/physics_server_3d.h @@ -432,6 +432,8 @@ public: virtual void body_set_user_flags(RID p_body, uint32_t p_flags) = 0; virtual uint32_t body_get_user_flags(RID p_body) const = 0; + virtual AABB body_get_aabb(RID p_body, int p_shape) const = 0; + // common body variables enum BodyParameter { BODY_PARAM_BOUNCE, diff --git a/servers/physics_server_3d_dummy.h b/servers/physics_server_3d_dummy.h index 209a541fea0..e57bfb10196 100644 --- a/servers/physics_server_3d_dummy.h +++ b/servers/physics_server_3d_dummy.h @@ -250,6 +250,8 @@ public: virtual void body_set_user_flags(RID p_body, uint32_t p_flags) override {} virtual uint32_t body_get_user_flags(RID p_body) const override { return 0; } + virtual AABB body_get_aabb(RID p_body, int p_shape) const override { return AABB(); } + virtual void body_set_param(RID p_body, BodyParameter p_param, const Variant &p_value) override {} virtual Variant body_get_param(RID p_body, BodyParameter p_param) const override { return Variant(); } diff --git a/servers/physics_server_3d_wrap_mt.h b/servers/physics_server_3d_wrap_mt.h index 2fd39546a59..a7dcd3a8fe6 100644 --- a/servers/physics_server_3d_wrap_mt.h +++ b/servers/physics_server_3d_wrap_mt.h @@ -210,6 +210,8 @@ public: FUNC2(body_set_user_flags, RID, uint32_t); FUNC1RC(uint32_t, body_get_user_flags, RID); + FUNC2RC(AABB, body_get_aabb, RID, int); + FUNC3(body_set_param, RID, BodyParameter, const Variant &); FUNC2RC(Variant, body_get_param, RID, BodyParameter);