1
0
Fork 0

Allow getting aabb of collision object shapes

This commit is contained in:
Terry Nguyen 2025-01-12 18:18:03 -08:00
parent d79ff848fa
commit 15cff45912
11 changed files with 43 additions and 0 deletions

View File

@ -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);

View File

@ -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;

View File

@ -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);

View File

@ -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;

View File

@ -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));

View File

@ -159,6 +159,7 @@ public:
int shape_owner_get_shape_count(uint32_t p_owner) const;
Ref<Shape3D> 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);

View File

@ -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)

View File

@ -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);

View File

@ -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,

View File

@ -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(); }

View File

@ -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);