From ce47bfb110dea594fe072c86383910e1334fb5d1 Mon Sep 17 00:00:00 2001 From: Klemen Plestenjak Date: Sat, 2 Dec 2023 14:31:52 +0100 Subject: [PATCH] Defer component mutation --- game/systems_input.c | 41 ++++++++++++++++++++++++++++++++++++++--- 1 file changed, 38 insertions(+), 3 deletions(-) diff --git a/game/systems_input.c b/game/systems_input.c index bce22fb..2a5e38e 100644 --- a/game/systems_input.c +++ b/game/systems_input.c @@ -4,12 +4,16 @@ #include "pathfinding.h" #include #include +#include Rectangle calculateEntityBounds(Position pos, Size size); bool getEntityBounds(ecs_entity_t entity, Position *outPos, Size *outSize, Rectangle *outBounds); void pickEntity(BzSpatialGrid *entityGrid, Vector2 point); void pickEntities(BzSpatialGrid *entityGrid, Rectangle area); +static void iterateSelectedUnits(ecs_query_t *query, void (*fn)(ecs_entity_t entity, Position *pos, Size *size)); +static void iterRemovePaths(ecs_entity_t entity, Position *pos, Size *size); + void placeUnits(i32 numUnits, f32 unitSpacing, Vector2 start, Vector2 end, BzTileMap *map, Vector2 **outPlaces); static bool isInputDragged(InputState *input) { @@ -53,7 +57,7 @@ void updatePlayerInput() { Vector2 worldPos = GetScreenToWorld2D(GetMousePosition(), game->camera); BzTile tileX = 0, tileY = 0; bzTileMapPosToTile(map, worldPos, &tileX, &tileY); - i32 selectedUnitCount = ecs_count_id(ECS, UnitSelected); + i32 selectedUnitCount = ecs_query_entity_count(input->unitSelectedQuery); switch (input->state) { case INPUT_NONE: if (wasInputDragged(input)) { @@ -112,13 +116,18 @@ void updatePlayerInput() { BZ_ASSERT(bzArraySize(input->unitPositions) == numUnits); i32 unitPosIdx = 0; - ecs_iter_t it = ecs_query_iter(ECS, input->unitSelectedQuery); + ecs_defer_begin(ECS); + iterateSelectedUnits(input->unitSelectedQuery, iterRemovePaths); + ecs_defer_end(ECS); + ecs_iter_t it = ecs_query_iter(ECS, input->unitSelectedQuery); + ecs_defer_begin(ECS); while (ecs_iter_next(&it)) { Position *pos = ecs_field(&it, Position, 1); for (i32 i = 0; i < it.count; i++) { ecs_entity_t entity = it.entities[i]; - ecs_remove(ECS, entity, Path); + + fflush(stdout); Position target = bzArrayGet(input->unitPositions, unitPosIdx); unitPosIdx++; @@ -136,9 +145,15 @@ void updatePlayerInput() { } } + ecs_defer_end(ECS); } else if (wasInputClicked(input)) { + ecs_defer_begin(ECS); + iterateSelectedUnits(input->unitSelectedQuery, iterRemovePaths); + ecs_defer_end(ECS); + ecs_iter_t it = ecs_query_iter(ECS, input->unitSelectedQuery); + ecs_defer_begin(ECS); while (ecs_iter_next(&it)) { Position *pos = ecs_field(&it, Position, 1); for (i32 i = 0; i < it.count; i++) { @@ -158,6 +173,7 @@ void updatePlayerInput() { } } + ecs_defer_end(ECS); } break; case INPUT_SELECTED_OBJECT: @@ -231,6 +247,7 @@ void drawPlayerInputUI() { break; } ecs_iter_t it = ecs_query_iter(ECS, input->unitSelectedQuery); + rlSetLineWidth(2.0f); while (ecs_query_next(&it)) { Position *pos = ecs_field(&it, Position, 1); Size *size = ecs_field(&it, Size, 2); @@ -355,3 +372,21 @@ void placeUnits(i32 numUnits, f32 unitSpacing, Vector2 start, Vector2 end, BzTil pos.x += unitSpacing * 2.0f; } } + +static void iterateSelectedUnits(ecs_query_t *query, void (*fn)(ecs_entity_t entity, Position *pos, Size *size)) { + ecs_iter_t it = ecs_query_iter(ECS, query); + while (ecs_iter_next(&it)) { + Position *pos = ecs_field(&it, Position, 1); + Size *size = ecs_field(&it, Size, 2); + + for (i32 i = 0; i < it.count; i++) { + ecs_entity_t entity = it.entities[i]; + + fn(entity, pos + i, size + i); + } + } +} +static void iterRemovePaths(ecs_entity_t entity, Position *pos, Size *size) { + ecs_remove(ECS, entity, Path); +} +