diff --git a/core/src/collider.c b/core/src/collider.c index 4175bd0..ef64b6b 100644 --- a/core/src/collider.c +++ b/core/src/collider.c @@ -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; } diff --git a/core/src/collider.h b/core/src/collider.h index e0af726..8199d93 100644 --- a/core/src/collider.h +++ b/core/src/collider.h @@ -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 diff --git a/core/src/collision.c b/core/src/collision.c index 9dd49fa..0de7149 100644 --- a/core/src/collision.c +++ b/core/src/collision.c @@ -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)); } diff --git a/game/src/Enemy.c b/game/src/Enemy.c index c651387..3787179 100644 --- a/game/src/Enemy.c +++ b/game/src/Enemy.c @@ -59,13 +59,14 @@ Enemy* MakeEnemy() { }; 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[]){ MakeVector(-0.2f, -0.95f), MakeVector( 0.2f, -0.95f), 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); LOG_INFO("enemy instantiated mirroring as: %s", pe.mirror->get_typestring(pe.data)); diff --git a/game/src/Layers.h b/game/src/Layers.h index 9983988..24814d9 100644 --- a/game/src/Layers.h +++ b/game/src/Layers.h @@ -1,6 +1,7 @@ #ifndef 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 \ No newline at end of file +#endif // !FIGHT_LAYERS_H diff --git a/game/src/Player.c b/game/src/Player.c index a6b14d1..e70cfb8 100644 --- a/game/src/Player.c +++ b/game/src/Player.c @@ -95,13 +95,13 @@ Player* MakePlayer() { 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[]){ MakeVector(-0.2f, -0.95f), MakeVector( 0.2f, -0.95f), 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)); diff --git a/game/src/Prop.c b/game/src/Prop.c index 61a83f6..70699f5 100644 --- a/game/src/Prop.c +++ b/game/src/Prop.c @@ -41,7 +41,7 @@ Prop* MakeProp(Sprite* sprite, Shape* shape) { .collisionShape = NULL }; 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); sprite_set_origin(self->sprite, MakeVector(0.5f, 1.0f)); return self;