From 270f0629ebb831de793779cd2786c44972183dfd Mon Sep 17 00:00:00 2001 From: Cameron Reikes Date: Thu, 23 Feb 2023 12:11:41 -0800 Subject: [PATCH] Macros for pass by value appendable arrays --- main.c | 46 +++++++++++++++++++--------------------------- 1 file changed, 19 insertions(+), 27 deletions(-) diff --git a/main.c b/main.c index f4396f4..2f8b219 100644 --- a/main.c +++ b/main.c @@ -139,13 +139,11 @@ typedef struct Overlap Entity *e; } Overlap; -#define MAX_COLLISIONS_RESULTS 16 -typedef struct Overlapping -{ - Overlap results[MAX_COLLISIONS_RESULTS]; - int num_results; -} Overlapping; +#define BUFF(type, max_size) struct { type data[max_size]; int cur_index; } +#define BUFF_APPEND(buff_ptr, element) { (buff_ptr)->data[(buff_ptr)->cur_index++] = element; assert((buff_ptr)->cur_index < ARRLEN((buff_ptr)->data)); } +#define BUFF_ITER(type, buff_ptr) for(type *it = &((buff_ptr)->data[0]); it < (buff_ptr)->data + (buff_ptr)->cur_index; it++) +typedef BUFF(Overlap, 16) Overlapping; #define LEVEL_TILES 60 #define TILE_SIZE 32 // in pixels @@ -722,6 +720,7 @@ bool has_point(AABB aabb, Vec2 point) int num_draw_calls = 0; + float cur_batch_data[1024*10] = {0}; int cur_batch_data_index = 0; // @TODO check last tint as well, do this when factor into drawing parameters @@ -1024,12 +1023,9 @@ Overlapping get_overlapping(Level *l, AABB aabb) TileInstance t = get_tile(l, world_to_tilecoord(q.points[i])); if(is_tile_solid(t)) { - to_return.results[to_return.num_results++] = (Overlap) - { - .is_tile = true, - .t = t - }; - assert(to_return.num_results < ARRLEN(to_return.results)); + Overlap element = ((Overlap){.is_tile = true, .t = t}); + //{ (&to_return)[(&to_return)->cur_index++] = element; assert((&to_return)->cur_index < ARRLEN((&to_return)->data)); } + BUFF_APPEND(&to_return, element); } } @@ -1038,11 +1034,7 @@ Overlapping get_overlapping(Level *l, AABB aabb) { if(!(it->kind == ENTITY_PLAYER && it->is_rolling) && overlapping(aabb, entity_aabb(it))) { - to_return.results[to_return.num_results++] = (Overlap) - { - .e = it, - }; - assert(to_return.num_results < ARRLEN(to_return.results)); + BUFF_APPEND(&to_return, (Overlap){.e = it}); } } @@ -1350,16 +1342,17 @@ void frame(void) it->pos = AddV2(it->pos, MulV2F(it->vel, pixels_per_meter * dt)); draw_quad(true, quad_aabb(entity_aabb(it)), image_white_square, full_region(image_white_square), WHITE); Overlapping over = get_overlapping(cur_level, entity_aabb(it)); - for(int i = 0; i < over.num_results; i++) if(over.results[i].e != it) + Entity *from_bullet = it; + BUFF_ITER(Overlap, &over) if(it->e != from_bullet) { - if(!over.results[i].is_tile) + if(!it->is_tile) { // knockback and damage - Entity *hit = over.results[i].e; + Entity *hit = it->e; if(hit->kind == ENTITY_OLD_MAN) hit->aggressive = true; - hit->vel = MulV2F(NormV2(SubV2(hit->pos, it->pos)), 5.0f); + hit->vel = MulV2F(NormV2(SubV2(hit->pos, from_bullet->pos)), 5.0f); hit->damage += 0.2f; - *it = (Entity){0}; + *from_bullet = (Entity){0}; } } if(!has_point(level_aabb, it->pos)) *it = (Entity){0}; @@ -1461,11 +1454,11 @@ void frame(void) } dbgrect(weapon_aabb); Overlapping overlapping_weapon = get_overlapping(cur_level, weapon_aabb); - for(int i = 0; i < overlapping_weapon.num_results; i++) + BUFF_ITER(Overlap, &overlapping_weapon) { - if(!overlapping_weapon.results[i].is_tile) + if(!it->is_tile) { - Entity *e = overlapping_weapon.results[i].e; + Entity *e = it->e; if(e->kind == ENTITY_OLD_MAN) { e->aggressive = true; @@ -1498,9 +1491,8 @@ void frame(void) Overlapping possible_dialogs = get_overlapping(cur_level, dialog_rect); Entity *closest_talkto = NULL; float closest_talkto_dist = INFINITY; - for(int i = 0; i < possible_dialogs.num_results; i++) + BUFF_ITER(Overlap, &possible_dialogs) { - Overlap *it = &possible_dialogs.results[i]; if(!it->is_tile && it->e->kind == ENTITY_OLD_MAN && !it->e->aggressive) { float dist = LenV2(SubV2(it->e->pos, player->pos));