feat: colliders now have a separate 'mask' and 'layers'
The mask decides the layers a collider collides with
This commit is contained in:
parent
96acaa0a24
commit
2dec4da52c
|
@ -7,10 +7,11 @@ struct Collider {
|
||||||
PhysicsEntity owner;
|
PhysicsEntity owner;
|
||||||
RigidBody* body;
|
RigidBody* body;
|
||||||
PhysicsMask layers;
|
PhysicsMask layers;
|
||||||
|
PhysicsMask mask;
|
||||||
int overlap;
|
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));
|
Collider* self = malloc(sizeof(Collider));
|
||||||
ASSERT_RETURN(self != NULL, NULL, "Failed to allocate space for Collider");
|
ASSERT_RETURN(self != NULL, NULL, "Failed to allocate space for Collider");
|
||||||
*self = (Collider) {
|
*self = (Collider) {
|
||||||
|
@ -18,6 +19,7 @@ Collider* collider_new(PhysicsEntity owner, Shape* shape, int overlap, PhysicsMa
|
||||||
.owner = owner,
|
.owner = owner,
|
||||||
.body = owner.tc->get_rigidbody(owner.data),
|
.body = owner.tc->get_rigidbody(owner.data),
|
||||||
.layers = layers,
|
.layers = layers,
|
||||||
|
.mask = mask,
|
||||||
.overlap = overlap,
|
.overlap = overlap,
|
||||||
};
|
};
|
||||||
rigidbody_add_collider(self->body, self);
|
rigidbody_add_collider(self->body, self);
|
||||||
|
@ -34,7 +36,7 @@ PhysicsQuery collider_to_query(Collider* self) {
|
||||||
return (PhysicsQuery) {
|
return (PhysicsQuery) {
|
||||||
.shape = self->shape,
|
.shape = self->shape,
|
||||||
.transform = rigidbody_get_transform(self->body),
|
.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;
|
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) {
|
PhysicsEntity collider_get_owner(Collider* self) {
|
||||||
return self->owner;
|
return self->owner;
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
|
|
||||||
typedef struct Collider Collider;
|
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 void collider_destroy(Collider* self);
|
||||||
extern PhysicsQuery collider_to_query(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 int collider_is_overlap(Collider* self);
|
||||||
extern void collider_set_overlap(Collider* self, int value);
|
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);
|
extern PhysicsEntity collider_get_owner(Collider* self);
|
||||||
|
|
||||||
#endif // !_fencer_collider_h
|
#endif // !_fencer_collider_h
|
||||||
|
|
|
@ -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) {
|
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;
|
Collision collision_a, collision_b;
|
||||||
int collision_a_overlaps = _internal_collision_get_collisions(a, b, &collision_a);
|
int collision_a_overlaps = _internal_collision_get_collisions(a, b, &collision_a);
|
||||||
int collision_b_overlaps = _internal_collision_get_collisions(b, a, &collision_b);
|
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) {
|
int overlap_check(PhysicsQuery query, Collider* collider) {
|
||||||
PhysicsQuery collider_query = collider_to_query(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));
|
||||||
}
|
}
|
||||||
|
|
|
@ -59,13 +59,14 @@ Enemy* MakeEnemy() {
|
||||||
};
|
};
|
||||||
|
|
||||||
self->rigidbody = rigidbody_make(Enemy_as_PhysicsEntity(self));
|
self->rigidbody = rigidbody_make(Enemy_as_PhysicsEntity(self));
|
||||||
self->collider = collider_new(Enemy_as_PhysicsEntity(self), shape_new_square(MakeVector(0.2f, 0.05f)), 0, PHYSICS_LAYER_DEFAULT);
|
self->collider = collider_new(Enemy_as_PhysicsEntity(self), shape_new_square(MakeVector(0.2f, 0.05f)), 0,
|
||||||
|
PHYSICS_LAYER_DEFAULT, PHYSICS_LAYER_DEFAULT);
|
||||||
self->collider = collider_new(Enemy_as_PhysicsEntity(self), shape_new((Vector[]){
|
self->collider = collider_new(Enemy_as_PhysicsEntity(self), shape_new((Vector[]){
|
||||||
MakeVector(-0.2f, -0.95f),
|
MakeVector(-0.2f, -0.95f),
|
||||||
MakeVector( 0.2f, -0.95f),
|
MakeVector( 0.2f, -0.95f),
|
||||||
MakeVector( 0.2f, 0.0f),
|
MakeVector( 0.2f, 0.0f),
|
||||||
MakeVector(-0.2f, 0.0f),
|
MakeVector(-0.2f, 0.0f),
|
||||||
}, 4), 1, PHYSICS_LAYER_COMBAT);
|
}, 4), 1, PHYSICS_LAYER_COMBAT, 0x0);
|
||||||
PhysicsEntity pe = Enemy_as_PhysicsEntity(self);
|
PhysicsEntity pe = Enemy_as_PhysicsEntity(self);
|
||||||
LOG_INFO("enemy instantiated mirroring as: %s", pe.mirror->get_typestring(pe.data));
|
LOG_INFO("enemy instantiated mirroring as: %s", pe.mirror->get_typestring(pe.data));
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
#ifndef FIGHT_LAYERS_H
|
#ifndef FIGHT_LAYERS_H
|
||||||
#define FIGHT_LAYERS_H
|
#define FIGHT_LAYERS_H
|
||||||
|
|
||||||
#define PHYSICS_LAYER_COMBAT 0x2
|
#define PHYSICS_LAYER_CHARACTERS 0x2
|
||||||
|
#define PHYSICS_LAYER_COMBAT 0x3
|
||||||
|
|
||||||
#endif // !FIGHT_LAYERS_H
|
#endif // !FIGHT_LAYERS_H
|
||||||
|
|
|
@ -95,13 +95,13 @@ Player* MakePlayer() {
|
||||||
MakeVector( 0.2f, -0.065f),
|
MakeVector( 0.2f, -0.065f),
|
||||||
MakeVector( 0.2f, 0.065f),
|
MakeVector( 0.2f, 0.065f),
|
||||||
MakeVector(-0.2f, 0.065f)
|
MakeVector(-0.2f, 0.065f)
|
||||||
}, 4), 0, PHYSICS_LAYER_DEFAULT);
|
}, 4), 0, PHYSICS_LAYER_CHARACTERS, PHYSICS_LAYER_DEFAULT);
|
||||||
self->hitbox = collider_new(Player_as_PhysicsEntity(self), shape_new((Vector[]){
|
self->hitbox = collider_new(Player_as_PhysicsEntity(self), shape_new((Vector[]){
|
||||||
MakeVector(-0.2f, -0.95f),
|
MakeVector(-0.2f, -0.95f),
|
||||||
MakeVector( 0.2f, -0.95f),
|
MakeVector( 0.2f, -0.95f),
|
||||||
MakeVector( 0.2f, 0.00f),
|
MakeVector( 0.2f, 0.00f),
|
||||||
MakeVector(-0.2f, 0.00f)
|
MakeVector(-0.2f, 0.00f)
|
||||||
}, 3), 1, PHYSICS_LAYER_COMBAT);
|
}, 3), 1, PHYSICS_LAYER_COMBAT, 0x0);
|
||||||
|
|
||||||
sprite_set_origin(self->sprite, MakeVector(0.45f, 0.925f));
|
sprite_set_origin(self->sprite, MakeVector(0.45f, 0.925f));
|
||||||
|
|
||||||
|
|
|
@ -41,7 +41,7 @@ Prop* MakeProp(Sprite* sprite, Shape* shape) {
|
||||||
.collisionShape = NULL
|
.collisionShape = NULL
|
||||||
};
|
};
|
||||||
self->rigidbody = rigidbody_make(Prop_as_PhysicsEntity(self));
|
self->rigidbody = rigidbody_make(Prop_as_PhysicsEntity(self));
|
||||||
self->collisionShape = collider_new(Prop_as_PhysicsEntity(self), shape, 0, PHYSICS_LAYER_DEFAULT);
|
self->collisionShape = collider_new(Prop_as_PhysicsEntity(self), shape, 0, PHYSICS_LAYER_DEFAULT, PHYSICS_LAYER_DEFAULT);
|
||||||
rigidbody_set_static(self->rigidbody, 1);
|
rigidbody_set_static(self->rigidbody, 1);
|
||||||
sprite_set_origin(self->sprite, MakeVector(0.5f, 1.0f));
|
sprite_set_origin(self->sprite, MakeVector(0.5f, 1.0f));
|
||||||
return self;
|
return self;
|
||||||
|
|
Loading…
Reference in a new issue