diff --git a/core/src/physics_entity.c b/core/src/physics_entity.c index 1e47578..660f63e 100644 --- a/core/src/physics_entity.c +++ b/core/src/physics_entity.c @@ -26,6 +26,7 @@ void physics_entity_debug_draw(PhysicsEntity self) { SDL_SetRenderDrawColor(g_renderer, 0, 255, 255, 255); SDL_RenderDrawLineF(g_renderer, lhs.x, lhs.y, rhs.x, rhs.y); } + static inline Vector _internal_calculate_contact_force(RigidBody* self, Contact* contact) { const Vector velocity = contact->hit.velocity; diff --git a/core/src/physics_entity.h b/core/src/physics_entity.h index 9d2fb3c..212a606 100644 --- a/core/src/physics_entity.h +++ b/core/src/physics_entity.h @@ -4,6 +4,7 @@ #include "typeclass_helpers.h" #include "list.h" #include "transformable.h" +#include "message_receiver.h" typedef struct Collider Collider; typedef struct Collision Collision; @@ -21,25 +22,26 @@ typedef struct PhysicsEntity { void* data; IPhysicsEntity const* tc; ITransformable const* transformable; + IMessageReceiver const* message_receiver; } PhysicsEntity; extern void physics_entity_debug_draw(PhysicsEntity self); extern void physics_entity_solve_contacts(PhysicsEntity self, List* contacts); extern void physics_entity_update(PhysicsEntity self); - #define impl_PhysicsEntity_for(T, get_rigidbody_f, on_collision_f, on_overlap_f)\ static inline PhysicsEntity T##_as_PhysicsEntity(T* x) {\ TC_FN_TYPECHECK(RigidBody*, get_rigidbody_f, T*);\ TC_FN_TYPECHECK(void, on_collision_f, T*, Collision);\ TC_FN_TYPECHECK(void, on_overlap_f, T*, Collider*);\ static IPhysicsEntity const tc = {\ - .get_rigidbody = (RigidBody*(*const)(void*)) get_rigidbody_f,\ - .on_collision = (void(*const)(void*,Collision)) on_collision_f,\ - .on_overlap = (void(*const)(void*,Collider*)) on_overlap_f,\ + .get_rigidbody = (RigidBody*(*const)(void*)) get_rigidbody_f,\ + .on_collision = (void(*const)(void*,Collision)) on_collision_f,\ + .on_overlap = (void(*const)(void*,Collider*)) on_overlap_f,\ };\ Transformable transformable = T##_as_Transformable(x);\ - return (PhysicsEntity){.data = x, .tc = &tc, .transformable = transformable.tc};\ + MessageReceiver receiver = T##_as_MessageReceiver(x);\ + return (PhysicsEntity){.data = x, .tc = &tc, .transformable = transformable.tc, .message_receiver = receiver.tc};\ } #endif // !_fencer_collidable_h