From e81e2ea117a67364786184aa328bc6e2b543e38f Mon Sep 17 00:00:00 2001 From: Arnold <27396817+arngo@users.noreply.github.com> Date: Fri, 26 May 2023 12:09:26 -0400 Subject: implemented 2d collision system --- src/collision/rodeo_collision.c | 126 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 126 insertions(+) create mode 100644 src/collision/rodeo_collision.c (limited to 'src') diff --git a/src/collision/rodeo_collision.c b/src/collision/rodeo_collision.c new file mode 100644 index 0000000..e4791bf --- /dev/null +++ b/src/collision/rodeo_collision.c @@ -0,0 +1,126 @@ +#include "rodeo/collision.h" +#include "rodeo/collision_t.h" +#include + +bool detect_collision( + const rodeo_collision_2d_world_item_t *a, + const rodeo_collision_2d_world_item_t *b +) +{ + return !(a->x+a->dx > b->x+b->dx + b->width || + b->x+b->dx > a->x+a->dx + a->width || + a->y+a->dy > b->y+b->dy + b->height || + b->y+b->dy > a->y+a->dy + a->height); +} + +rodeo_collision_2d_world_t +rodeo_collision_2d_world_create(void) +{ + return cvec_collision_2d_world_item_init(); +} + +void +rodeo_collision_2d_world_destroy( +rodeo_collision_2d_world_t *world +) +{ + cvec_collision_2d_world_item_drop(world); +} + +cvec_collision_2d_world_item_value* +rodeo_collision_2d_world_item_create( + rodeo_collision_2d_world_t *world, + rodeo_collision_2d_world_item_t item_params +) +{ + static uint32_t next_id = 0; + item_params.id.id = next_id++; + item_params.id.world = world; + cvec_collision_2d_world_item_value* new_item = cvec_collision_2d_world_item_push(world, item_params); + + return new_item; +} + +void +rodeo_collision_2d_world_item_destroy( + cvec_collision_2d_world_item_value* cvec_value +) +{ + + cvec_collision_2d_world_item_value temp = *cvec_collision_2d_world_item_back(cvec_value->id.world); + *cvec_collision_2d_world_item_back(cvec_value->id.world) = *cvec_value; + *cvec_value = temp; + cvec_collision_2d_world_item_pop(cvec_value->id.world); +} + +void +rodeo_collision_2d_world_item_destroy_by_id( + world_id id +) +{ + rodeo_collision_2d_world_item_t* item = rodeo_collision_2d_world_item_get_by_id(id); + rodeo_collision_2d_world_item_destroy(item); +} + +rodeo_collision_2d_world_item_t* +rodeo_collision_2d_world_item_get_by_id( + world_id id +) +{ + c_foreach(i, cvec_collision_2d_world_item, *id.world) { + if (i.ref->id.id == id.id) { + return i.ref; + } + } + return NULL; +} + +void +rodeo_collision_2d_world_compare_self( + rodeo_collision_2d_world_t *world, + void (*resolve)( + rodeo_collision_2d_world_item_t *a, + rodeo_collision_2d_world_item_t *b + ) +) +{ + c_foreach(i, cvec_collision_2d_world_item, *world) { + c_foreach(j, cvec_collision_2d_world_item, cvec_collision_2d_world_item_advance(i, 1), cvec_collision_2d_world_item_end(world)) { + if (detect_collision(i.ref, j.ref)) { + resolve(i.ref, j.ref); + } + } + } +} + +void +rodeo_collision_2d_world_compare_other( + rodeo_collision_2d_world_t *world_a, + rodeo_collision_2d_world_t *world_b, + void (*resolve)( + rodeo_collision_2d_world_item_t *a, + rodeo_collision_2d_world_item_t *b + ) +) +{ + c_foreach(i, cvec_collision_2d_world_item, *world_a) { + c_foreach(j, cvec_collision_2d_world_item, *world_b) { + if (detect_collision(i.ref, j.ref)) { + resolve(i.ref, j.ref); + } + } + } +} + + +int rodeo_collision_2d_item_cmp( + const rodeo_collision_2d_world_item_t* a, + const rodeo_collision_2d_world_item_t* b +) +{ + if (a->id.id == b->id.id) { + return 0; + } else { + return a->id.id > b->id.id ? 1 : -1; + } +} -- cgit v1.2.3