PhysicsServer2D and PhysicsServer3D: make body_set_state_sync_callback take a Callable
Prefer Callable to a C-style callback. This is helpful for GDExtension.
This commit is contained in:
parent
4ba934bf3d
commit
ff4e72a0bc
21 changed files with 47 additions and 101 deletions
|
|
@ -674,7 +674,7 @@ void GodotBody3D::integrate_velocities(real_t p_step) {
|
|||
return;
|
||||
}
|
||||
|
||||
if (fi_callback_data || body_state_callback) {
|
||||
if (fi_callback_data || body_state_callback.get_object()) {
|
||||
get_space()->body_add_to_state_query_list(&direct_state_query_list);
|
||||
}
|
||||
|
||||
|
|
@ -756,11 +756,12 @@ void GodotBody3D::wakeup_neighbours() {
|
|||
}
|
||||
|
||||
void GodotBody3D::call_queries() {
|
||||
Variant direct_state_variant = get_direct_state();
|
||||
|
||||
if (fi_callback_data) {
|
||||
if (!fi_callback_data->callable.get_object()) {
|
||||
set_force_integration_callback(Callable());
|
||||
} else {
|
||||
Variant direct_state_variant = get_direct_state();
|
||||
const Variant *vp[2] = { &direct_state_variant, &fi_callback_data->udata };
|
||||
|
||||
Callable::CallError ce;
|
||||
|
|
@ -770,8 +771,11 @@ void GodotBody3D::call_queries() {
|
|||
}
|
||||
}
|
||||
|
||||
if (body_state_callback_instance) {
|
||||
(body_state_callback)(body_state_callback_instance, get_direct_state());
|
||||
if (body_state_callback.get_object()) {
|
||||
const Variant *vp[1] = { &direct_state_variant };
|
||||
Callable::CallError ce;
|
||||
Variant rv;
|
||||
body_state_callback.callp(vp, 1, rv, ce);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -792,9 +796,8 @@ bool GodotBody3D::sleep_test(real_t p_step) {
|
|||
}
|
||||
}
|
||||
|
||||
void GodotBody3D::set_state_sync_callback(void *p_instance, PhysicsServer3D::BodyStateCallback p_callback) {
|
||||
body_state_callback_instance = p_instance;
|
||||
body_state_callback = p_callback;
|
||||
void GodotBody3D::set_state_sync_callback(const Callable &p_callable) {
|
||||
body_state_callback = p_callable;
|
||||
}
|
||||
|
||||
void GodotBody3D::set_force_integration_callback(const Callable &p_callable, const Variant &p_udata) {
|
||||
|
|
|
|||
|
|
@ -131,8 +131,7 @@ class GodotBody3D : public GodotCollisionObject3D {
|
|||
Vector<Contact> contacts; //no contacts by default
|
||||
int contact_count = 0;
|
||||
|
||||
void *body_state_callback_instance = nullptr;
|
||||
PhysicsServer3D::BodyStateCallback body_state_callback = nullptr;
|
||||
Callable body_state_callback;
|
||||
|
||||
struct ForceIntegrationCallbackData {
|
||||
Callable callable;
|
||||
|
|
@ -150,7 +149,7 @@ class GodotBody3D : public GodotCollisionObject3D {
|
|||
friend class GodotPhysicsDirectBodyState3D; // i give up, too many functions to expose
|
||||
|
||||
public:
|
||||
void set_state_sync_callback(void *p_instance, PhysicsServer3D::BodyStateCallback p_callback);
|
||||
void set_state_sync_callback(const Callable &p_callable);
|
||||
void set_force_integration_callback(const Callable &p_callable, const Variant &p_udata = Variant());
|
||||
|
||||
GodotPhysicsDirectBodyState3D *get_direct_state();
|
||||
|
|
|
|||
|
|
@ -877,10 +877,10 @@ int GodotPhysicsServer3D::body_get_max_contacts_reported(RID p_body) const {
|
|||
return body->get_max_contacts_reported();
|
||||
}
|
||||
|
||||
void GodotPhysicsServer3D::body_set_state_sync_callback(RID p_body, void *p_instance, BodyStateCallback p_callback) {
|
||||
void GodotPhysicsServer3D::body_set_state_sync_callback(RID p_body, const Callable &p_callable) {
|
||||
GodotBody3D *body = body_owner.get_or_null(p_body);
|
||||
ERR_FAIL_COND(!body);
|
||||
body->set_state_sync_callback(p_instance, p_callback);
|
||||
body->set_state_sync_callback(p_callable);
|
||||
}
|
||||
|
||||
void GodotPhysicsServer3D::body_set_force_integration_callback(RID p_body, const Callable &p_callable, const Variant &p_udata) {
|
||||
|
|
|
|||
|
|
@ -242,7 +242,7 @@ public:
|
|||
virtual void body_set_max_contacts_reported(RID p_body, int p_contacts) override;
|
||||
virtual int body_get_max_contacts_reported(RID p_body) const override;
|
||||
|
||||
virtual void body_set_state_sync_callback(RID p_body, void *p_instance, BodyStateCallback p_callback) override;
|
||||
virtual void body_set_state_sync_callback(RID p_body, const Callable &p_callable) override;
|
||||
virtual void body_set_force_integration_callback(RID p_body, const Callable &p_callable, const Variant &p_udata = Variant()) override;
|
||||
|
||||
virtual void body_set_ray_pickable(RID p_body, bool p_enable) override;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue