feat(physics): physics entity no longer requires a collision solver, removing support for custom solvers
This commit is contained in:
parent
90dc3e1792
commit
5043f1a53e
|
@ -85,11 +85,14 @@ void physics_entity_update(PhysicsEntity self) {
|
||||||
list_foreach(Contact*, contact, contacts)
|
list_foreach(Contact*, contact, contacts)
|
||||||
self.tc->on_overlap(self.data, contact->hit.other);
|
self.tc->on_overlap(self.data, contact->hit.other);
|
||||||
} else {
|
} else {
|
||||||
self.tc->collision_solver(self.data, contacts);
|
if(!rigidbody_is_static(body)) {
|
||||||
list_foreach(Contact*, contact, contacts)
|
physics_entity_solve_contacts(self, contacts);
|
||||||
|
}
|
||||||
|
list_foreach(Contact*, contact, contacts) {
|
||||||
self.tc->on_collision(self.data, contact->hit);
|
self.tc->on_collision(self.data, contact->hit);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
rigidbody_collect_contacts(body);
|
rigidbody_collect_contacts(body);
|
||||||
|
|
||||||
ASSERT_RETURN(!visnanf(rigidbody_get_velocity(body)),, "Velocity is NaN (1)");
|
ASSERT_RETURN(!visnanf(rigidbody_get_velocity(body)),, "Velocity is NaN (1)");
|
||||||
|
|
|
@ -15,7 +15,6 @@ typedef struct IPhysicsEntity {
|
||||||
Shape* (*const get_shape)(void* self);
|
Shape* (*const get_shape)(void* self);
|
||||||
void(*const on_collision)(void* self, Collision collision);
|
void(*const on_collision)(void* self, Collision collision);
|
||||||
void(*const on_overlap)(void* self, PhysicsEntity other);
|
void(*const on_overlap)(void* self, PhysicsEntity other);
|
||||||
void(*const collision_solver)(void* self, List* collisions);
|
|
||||||
} IPhysicsEntity;
|
} IPhysicsEntity;
|
||||||
|
|
||||||
typedef struct PhysicsEntity {
|
typedef struct PhysicsEntity {
|
||||||
|
@ -29,20 +28,18 @@ extern void physics_entity_solve_contacts(PhysicsEntity self, List* contacts);
|
||||||
extern void physics_entity_update(PhysicsEntity self);
|
extern void physics_entity_update(PhysicsEntity self);
|
||||||
|
|
||||||
|
|
||||||
#define impl_PhysicsEntity_for(T, get_rigidbody_f, get_shape_f, on_collision_f, on_overlap_f, collision_solver_f)\
|
#define impl_PhysicsEntity_for(T, get_rigidbody_f, get_shape_f, on_collision_f, on_overlap_f)\
|
||||||
static inline PhysicsEntity T##_as_PhysicsEntity(T* x) {\
|
static inline PhysicsEntity T##_as_PhysicsEntity(T* x) {\
|
||||||
TC_FN_TYPECHECK(Transformable, T##_as_Transformable, T*);\
|
TC_FN_TYPECHECK(Transformable, T##_as_Transformable, T*);\
|
||||||
TC_FN_TYPECHECK(RigidBody*, get_rigidbody_f, T*);\
|
TC_FN_TYPECHECK(RigidBody*, get_rigidbody_f, T*);\
|
||||||
TC_FN_TYPECHECK(Shape*, get_shape_f, T*);\
|
TC_FN_TYPECHECK(Shape*, get_shape_f, T*);\
|
||||||
TC_FN_TYPECHECK(void, on_collision_f, T*, Collision);\
|
TC_FN_TYPECHECK(void, on_collision_f, T*, Collision);\
|
||||||
TC_FN_TYPECHECK(void, on_overlap_f, T*, PhysicsEntity);\
|
TC_FN_TYPECHECK(void, on_overlap_f, T*, PhysicsEntity);\
|
||||||
TC_FN_TYPECHECK(void, collision_solver_f, T*, List*);\
|
|
||||||
static IPhysicsEntity const tc = {\
|
static IPhysicsEntity const tc = {\
|
||||||
.get_rigidbody = (RigidBody*(*const)(void*)) get_rigidbody_f,\
|
.get_rigidbody = (RigidBody*(*const)(void*)) get_rigidbody_f,\
|
||||||
.get_shape = (Shape*(*const)(void*)) get_shape_f,\
|
.get_shape = (Shape*(*const)(void*)) get_shape_f,\
|
||||||
.on_collision = (void(*const)(void*,Collision)) on_collision_f,\
|
.on_collision = (void(*const)(void*,Collision)) on_collision_f,\
|
||||||
.on_overlap = (void(*const)(void*,PhysicsEntity)) on_overlap_f\
|
.on_overlap = (void(*const)(void*,PhysicsEntity)) on_overlap_f,\
|
||||||
.collision_solver = (void(*const)(void*,List*)) collision_solver_f,\
|
|
||||||
};\
|
};\
|
||||||
Transformable transformable = T##_as_Transformable(x);\
|
Transformable transformable = T##_as_Transformable(x);\
|
||||||
return (PhysicsEntity){.data = x, .tc = &tc, .transformable = transformable.tc};\
|
return (PhysicsEntity){.data = x, .tc = &tc, .transformable = transformable.tc};\
|
||||||
|
|
Loading…
Reference in a new issue