mirror of https://github.com/godotengine/godot
Allow getting aabb of collision object shapes
This commit is contained in:
parent
d79ff848fa
commit
15cff45912
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
|
|
@ -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));
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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(); }
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue