feat(physics): static colliders and physics response

This commit is contained in:
Sara 2023-11-24 23:19:43 +01:00
parent 9adfac023f
commit e2c4f5d4c9
3 changed files with 10 additions and 2 deletions

View file

@ -81,11 +81,11 @@ void physics_entity_update(PhysicsEntity self) {
List* contacts = rigidbody_get_contacts(body);
if(contacts->len > 0) {
if(rigidbody_get_overlap(body)) {
if(rigidbody_get_overlap(body) == 1) {
list_foreach(Contact*, contact, contacts)
self.tc->on_overlap(self.data, contact->hit.other);
} else {
if(!rigidbody_is_static(body)) {
if(rigidbody_is_static(body) == 0) {
physics_entity_solve_contacts(self, contacts);
}
list_foreach(Contact*, contact, contacts) {

View file

@ -43,6 +43,8 @@ void _internal_physics_narrow_collision() {
if(collision_check(*left, *right, &collision_left, &collision_right)) {
left->tc->on_collision(left->data, collision_left);
right->tc->on_collision(right->data, collision_right);
rigidbody_add_contact(left->tc->get_rigidbody(left->data), collision_left);
rigidbody_add_contact(right->tc->get_rigidbody(right->data), collision_right);
}
}
}

View file

@ -44,8 +44,11 @@ RigidBody* rigidbody_make(Transformable transform) {
.overlap = 0,
.is_static = 0,
.contacts = list_from_type(Contact),
};
self->internal_transform.scale = OneVector;
return self;
}
@ -89,6 +92,9 @@ void _internal_debug_draw_collision_edge(RigidBody* self, Contact* contact) {
}
void rigidbody_integrate_forces(RigidBody* self) {
if(self->is_static)
return;
const float dt = delta_time();
Vector position = self->internal_transform.position;