From ec372977907499aead48796f532ccd01c7df369b Mon Sep 17 00:00:00 2001 From: Abdelrahman Date: Tue, 20 May 2025 07:39:01 +0100 Subject: [PATCH] Switch all conditions to use bit operations --- dod.c | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/dod.c b/dod.c index 23ee751..2aea53f 100644 --- a/dod.c +++ b/dod.c @@ -6,11 +6,16 @@ #include #include +#define MOVABLE_TAG_SHIFT 0 +#define RENDERABLE_TAG_SHIFT 1 +#define COLLIDER_TAG_SHIFT 2 +#define INSIDE_ZONE_TAG_SHIFT 3 + enum EntityTag { - ENTITY_TAG_MOVABLE = 1 << 0, - ENTITY_TAG_RENDERABLE = 1 << 1, - ENTITY_TAG_COLLIDER = 1 << 2, - ENTITY_TAG_INSIDE_ZONE = 1 << 3, + ENTITY_TAG_MOVABLE = 1 << MOVABLE_TAG_SHIFT, + ENTITY_TAG_RENDERABLE = 1 << RENDERABLE_TAG_SHIFT, + ENTITY_TAG_COLLIDER = 1 << COLLIDER_TAG_SHIFT, + ENTITY_TAG_INSIDE_ZONE = 1 << INSIDE_ZONE_TAG_SHIFT, }; typedef struct Entity Entity; @@ -83,10 +88,10 @@ int main(void) { VelocityInitialiser velocity_initialisers[2] = {init_velocity, zero_velocity}; for (u64 i = 0; i < manager.count; ++i) { - u8 is_zone = i < ZONE_COUNT; + u8 is_zone = (i - ZONE_COUNT) >> 63; manager.entities[i].id = i; - manager.tags[i] = (ENTITY_TAG_COLLIDER & (is_zone << 2)) | ENTITY_TAG_MOVABLE | ENTITY_TAG_RENDERABLE; + manager.tags[i] = (ENTITY_TAG_COLLIDER & (is_zone << COLLIDER_TAG_SHIFT)) | ENTITY_TAG_MOVABLE | ENTITY_TAG_RENDERABLE; init_position(&(manager.rects[i].position), &state); scale_initialisers[is_zone](&(manager.rects[i].scale), &state); @@ -175,10 +180,10 @@ void update_positions(u8 *tags, Rect *rects, Velocity *velocities, u64 count) { for (u64 i = ZONE_COUNT; i < count; ++i) { tags[i] &= inside_zone_mask; for (u64 j = 0; j < ZONE_COUNT; ++j) { - tags[i] |= collides(&rects[i], &rects[j]) << 3; + tags[i] |= collides(&rects[i], &rects[j]) << INSIDE_ZONE_TAG_SHIFT; } - index = (tags[i] & ENTITY_TAG_INSIDE_ZONE) == ENTITY_TAG_INSIDE_ZONE; + index = (tags[i] & ENTITY_TAG_INSIDE_ZONE) >> INSIDE_ZONE_TAG_SHIFT; rects[i].position.x += velocities[i].x * multipliers[index]; rects[i].position.y += velocities[i].y * multipliers[index]; @@ -203,8 +208,8 @@ void render_entities(const u8 *tags, const Rect *rects, u64 count) { persistent Color colors[2] = {FG_COLOR, ZONE_COLOR}; for (u64 i = 0; i < count; ++i) { - u8 func_index = (tags[i] & ENTITY_TAG_COLLIDER) == ENTITY_TAG_COLLIDER; - u8 color_index = func_index || (tags[i] & ENTITY_TAG_INSIDE_ZONE) == ENTITY_TAG_INSIDE_ZONE; + u8 func_index = (tags[i] & ENTITY_TAG_COLLIDER) >> COLLIDER_TAG_SHIFT; + u8 color_index = func_index | ((tags[i] & ENTITY_TAG_INSIDE_ZONE) >> INSIDE_ZONE_TAG_SHIFT); renderers[func_index]( rects[i].position.x,