diff --git a/core/src/collider.c b/core/src/collider.c new file mode 100644 index 0000000..ce98fbc --- /dev/null +++ b/core/src/collider.c @@ -0,0 +1,53 @@ +#include "collider.h" +#include "collision.h" +#include "debug.h" + +struct Collider { + Shape* shape; + RigidBody* body; + PhysicsMask layers; + int overlap; +}; + +Collider* collider_new(RigidBody* body, Shape* shape, int overlap, PhysicsMask layers) { + Collider* self = malloc(sizeof(Collider)); + ASSERT_RETURN(self != NULL, NULL, "Failed to allocate space for Collider"); + *self = (Collider) { + .shape = shape, + .body = body, + .layers = layers, + .overlap = overlap, + }; + rigidbody_add_collider(self->body, self); + return self; +} + +void collider_destroy(Collider* self) { + shape_destroy(self->shape); + rigidbody_remove_collider(self->body, self); + free(self); +} + +PhysicsQuery collider_to_query(Collider* self) { + return (PhysicsQuery) { + .shape = self->shape, + .transform = rigidbody_get_transform(self->body), + .mask = self->layers + }; +} + +Shape* collider_get_shape(Collider* self) { + return self->shape; +} + +RigidBody* collider_get_rigidbody(Collider* self) { + return self->body; +} + +int collider_is_overlap(Collider* self) { + return self->overlap; +} + +void collider_set_overlap(Collider* self, int value) { + self->overlap = value; +} diff --git a/core/src/collider.h b/core/src/collider.h new file mode 100644 index 0000000..ddb65ba --- /dev/null +++ b/core/src/collider.h @@ -0,0 +1,19 @@ +#ifndef _fencer_collider_h +#define _fencer_collider_h + +#include "shape.h" +#include "rigidbody.h" + +typedef struct Collider Collider; + +extern Collider* collider_new(RigidBody* owner, Shape* shape, int overlap, PhysicsMask layers); +extern void collider_destroy(Collider* self); +extern PhysicsQuery collider_to_query(Collider* self); + +extern Shape* collider_get_shape(Collider* self); +extern RigidBody* collider_get_rigidbody(Collider* self); + +extern int collider_is_overlap(Collider* self); +extern void collider_set_overlap(Collider* self, int value); + +#endif // !_fencer_collider_h