diff --git a/src/physics_entity.h b/src/physics_entity.h index ea0abf9..1f12fa5 100644 --- a/src/physics_entity.h +++ b/src/physics_entity.h @@ -10,24 +10,25 @@ typedef struct { RigidBody* (*const get_rigidbody)(void* self); Shape* (*const get_shape)(void* self); - Transformable (*const as_transformable)(void* self); } IPhysicsEntity; typedef struct { - void* self; + void* data; IPhysicsEntity const* tc; + ITransformable const* transformable; } PhysicsEntity; #define impl_PhysicsEntity_for(T, get_rigidbody_f, get_shape_f)\ static inline PhysicsEntity T##_as_PhysicsEntity(T* x) {\ - TC_FN_TYPECHECK(RigidBody*, get_rigidbody_f, T* e);\ - TC_FN_TYPECHECK(Shape*, get_shape_f, T* e);\ + TC_FN_TYPECHECK(Transformable, T##_as_Transformable, T*);\ + TC_FN_TYPECHECK(RigidBody*, get_rigidbody_f, T*);\ + TC_FN_TYPECHECK(Shape*, get_shape_f, T*);\ static IPhysicsEntity const tc = {\ - .get_rigidbody = (RigidBody*(*const)(void*)) get_transform_f,\ + .get_rigidbody = (RigidBody*(*const)(void*)) get_rigidbody_f,\ .get_shape = (Shape*(*const)(void*)) get_shape_f,\ - .as_transformable = T##_as_Transformable\ };\ - return (PhysicsEntity){.tc = &interface, .self = x};\ + Transformable transformable = T##_as_Transformable(x);\ + return (PhysicsEntity){.data = x, .tc = &tc, .transformable = transformable.tc};\ } #endif // !_fencer_collidable_h