Split out state for resetting and starting BFS

scene_man
En Yi 2023-07-20 22:58:09 +08:00
parent 34655d5c0a
commit 7607827420
3 changed files with 12 additions and 5 deletions

View File

@ -143,7 +143,9 @@ typedef struct _BFSTileMap {
typedef enum _WaterRunnerState typedef enum _WaterRunnerState
{ {
LOWEST_POINT_SEARCH = 0, BFS_RESET = 0,
BFS_START,
LOWEST_POINT_SEARCH,
LOWEST_POINT_MOVEMENT, LOWEST_POINT_MOVEMENT,
SCANLINE_FILL, SCANLINE_FILL,
}WaterRunerState_t; }WaterRunerState_t;

View File

@ -91,19 +91,24 @@ void update_water_runner_system(Scene_t* scene)
switch (p_crunner->state) switch (p_crunner->state)
{ {
case LOWEST_POINT_SEARCH: case BFS_RESET:
{
for (size_t i = 0; i < p_crunner->bfs_tilemap.len; ++i) for (size_t i = 0; i < p_crunner->bfs_tilemap.len; ++i)
{ {
p_crunner->bfs_tilemap.tilemap[i].from = -1; p_crunner->bfs_tilemap.tilemap[i].from = -1;
p_crunner->bfs_tilemap.tilemap[i].reachable = false; p_crunner->bfs_tilemap.tilemap[i].reachable = false;
} }
p_crunner->state = BFS_START;
// Want the fallthough
case BFS_START:
memset(p_crunner->visited, 0, p_crunner->bfs_tilemap.len * sizeof(bool)); memset(p_crunner->visited, 0, p_crunner->bfs_tilemap.len * sizeof(bool));
int32_t lowest_tile = p_crunner->current_tile; int32_t lowest_tile = p_crunner->current_tile;
p_crunner->visited[p_crunner->current_tile] = true; p_crunner->visited[p_crunner->current_tile] = true;
p_crunner->bfs_tilemap.tilemap[p_crunner->current_tile].reachable = true; p_crunner->bfs_tilemap.tilemap[p_crunner->current_tile].reachable = true;
sc_queue_add_last(&p_crunner->bfs_queue, p_crunner->current_tile); sc_queue_add_last(&p_crunner->bfs_queue, p_crunner->current_tile);
p_crunner->state = LOWEST_POINT_SEARCH;
// Want the fallthough
case LOWEST_POINT_SEARCH:
{
while (!sc_queue_empty(&p_crunner->bfs_queue)) while (!sc_queue_empty(&p_crunner->bfs_queue))
{ {
unsigned int curr_idx = sc_queue_peek_first(&p_crunner->bfs_queue); unsigned int curr_idx = sc_queue_peek_first(&p_crunner->bfs_queue);

View File

@ -257,7 +257,7 @@ static void toggle_block_system(Scene_t* scene)
CWaterRunner_t* p_crunner; CWaterRunner_t* p_crunner;
sc_map_foreach_value(&scene->ent_manager.component_map[CWATERRUNNER_T], p_crunner) sc_map_foreach_value(&scene->ent_manager.component_map[CWATERRUNNER_T], p_crunner)
{ {
p_crunner->state = LOWEST_POINT_SEARCH; p_crunner->state = BFS_RESET;
} }
} }
else if (IsMouseButtonReleased(MOUSE_RIGHT_BUTTON)) else if (IsMouseButtonReleased(MOUSE_RIGHT_BUTTON))