diff --git a/src/corelib/physics.c b/src/corelib/physics.c index 247d9cb..46fa8d0 100644 --- a/src/corelib/physics.c +++ b/src/corelib/physics.c @@ -13,7 +13,8 @@ physics_t physics_default() { return (physics_t) { .type=COLLIDERTYPE_NONE, .velocity_x = 0.f, - .velocity_y = 0.f + .velocity_y = 0.f, + .solver = &solve_collision_slide }; } @@ -180,12 +181,14 @@ float get_solve_force(const object_t* a, const object_t* b, float* out_px, float } } -static inline -void _solve_collision_slide(object_t* this, object_t* other) { +void solve_collision_slide(object_t* left, object_t* right) { float dx, dy; const float d = get_solve_force(this, other, &dx, &dy); this->sprite.x += dx; this->sprite.y += dy; + const float d = get_solve_force(left, right, &dx, &dy); + left->sprite.x += dx; + right->sprite.y += dy; } static inline @@ -198,7 +201,7 @@ void _solve_move(object_t* this) { if(can_collide(other) && this != other && _collision_check(other, this)) { object_broadcast_collision(other, this); object_broadcast_collision(this, other); - _solve_collision_slide(this, other); + this->physics.solver(this, other); } } } diff --git a/src/corelib/physics.h b/src/corelib/physics.h index f8313d7..2b71a2c 100644 --- a/src/corelib/physics.h +++ b/src/corelib/physics.h @@ -6,6 +6,8 @@ typedef struct object_t object_t; typedef void(*collided_fn)(object_t*, struct object_t*); +typedef void(*collided_fn)(object_t*, object_t*); +typedef void(*solver_fn)(object_t* left, object_t* right); typedef enum collider_type_t { COLLIDERTYPE_MIN, @@ -23,6 +25,7 @@ typedef struct circle_t { typedef struct physics_t { collider_type_t type; collided_fn evt_collision; + solver_fn solver; float velocity_x, velocity_y; float max_interpolate_step_size; union { @@ -40,6 +43,7 @@ void physics_update(); void move_and_slide(object_t* this, float delta_time); extern short can_collide(const object_t* this); +extern void solve_collision_slide(object_t* left, object_t* right); extern float get_solve_force(const object_t* this, const object_t* other, float* solve_x, float* solve_y); #endif /* _physics_h */