feat: colliders now have a separate 'mask' and 'layers'

The mask decides the layers a collider collides with
This commit is contained in:
Sara 2024-01-15 22:07:46 +01:00
parent 96acaa0a24
commit 2dec4da52c
7 changed files with 39 additions and 11 deletions

View file

@ -7,10 +7,11 @@ struct Collider {
PhysicsEntity owner;
RigidBody* body;
PhysicsMask layers;
PhysicsMask mask;
int overlap;
};
Collider* collider_new(PhysicsEntity owner, Shape* shape, int overlap, PhysicsMask layers) {
Collider* collider_new(PhysicsEntity owner, Shape* shape, int overlap, PhysicsMask layers, PhysicsMask mask) {
Collider* self = malloc(sizeof(Collider));
ASSERT_RETURN(self != NULL, NULL, "Failed to allocate space for Collider");
*self = (Collider) {
@ -18,6 +19,7 @@ Collider* collider_new(PhysicsEntity owner, Shape* shape, int overlap, PhysicsMa
.owner = owner,
.body = owner.tc->get_rigidbody(owner.data),
.layers = layers,
.mask = mask,
.overlap = overlap,
};
rigidbody_add_collider(self->body, self);
@ -34,7 +36,7 @@ PhysicsQuery collider_to_query(Collider* self) {
return (PhysicsQuery) {
.shape = self->shape,
.transform = rigidbody_get_transform(self->body),
.mask = self->layers
.mask = self->mask
};
}
@ -54,6 +56,22 @@ void collider_set_overlap(Collider* self, int value) {
self->overlap = value;
}
PhysicsMask collider_get_mask(const Collider* self) {
return self->mask;
}
void collider_set_mask(Collider* self, PhysicsMask mask) {
self->mask = mask;
}
PhysicsMask collider_get_layers(const Collider* self) {
return self->layers;
}
void collider_set_layers(Collider* self, PhysicsMask layers) {
self->layers = layers;
}
PhysicsEntity collider_get_owner(Collider* self) {
return self->owner;
}

View file

@ -6,7 +6,7 @@
typedef struct Collider Collider;
extern Collider* collider_new(PhysicsEntity owner, Shape* shape, int overlap, PhysicsMask layers);
extern Collider* collider_new(PhysicsEntity owner, Shape* shape, int overlap, PhysicsMask layers, PhysicsMask mask);
extern void collider_destroy(Collider* self);
extern PhysicsQuery collider_to_query(Collider* self);
@ -16,6 +16,12 @@ extern RigidBody* collider_get_rigidbody(Collider* self);
extern int collider_is_overlap(Collider* self);
extern void collider_set_overlap(Collider* self, int value);
extern PhysicsMask collider_get_mask(const Collider* self);
extern void collider_set_mask(Collider* self, PhysicsMask mask);
extern PhysicsMask collider_get_layers(const Collider* self);
extern void collider_set_layers(Collider* self, PhysicsMask layers);
extern PhysicsEntity collider_get_owner(Collider* self);
#endif // !_fencer_collider_h

View file

@ -138,6 +138,8 @@ Collision collision_invert(Collision collision_a, Collider* a) {
}
int collision_check(Collider* a, Collider* b, Collision* out_a, Collision* out_b) {
if(!(collider_get_layers(a) & collider_get_mask(b)) || !(collider_get_mask(a) & collider_get_layers(b)))
return 0;
Collision collision_a, collision_b;
int collision_a_overlaps = _internal_collision_get_collisions(a, b, &collision_a);
int collision_b_overlaps = _internal_collision_get_collisions(b, a, &collision_b);
@ -183,5 +185,5 @@ int _internal_overlap_check(PhysicsQuery a, PhysicsQuery b) {
int overlap_check(PhysicsQuery query, Collider* collider) {
PhysicsQuery collider_query = collider_to_query(collider);
return (query.mask & collider_query.mask) != 0 && (_internal_overlap_check(query, collider_query) || _internal_overlap_check(collider_query, query));
return (query.mask & collider_get_layers(collider)) != 0 && (_internal_overlap_check(query, collider_query) || _internal_overlap_check(collider_query, query));
}