From 34655d5c0a24444a05c1e6b768b3501b346d8003 Mon Sep 17 00:00:00 2001 From: En Yi Date: Thu, 20 Jul 2023 22:51:15 +0800 Subject: [PATCH] Visualine reachable scanline Also tweak logic for lowest point --- scenes/water_flow.c | 15 ++++++++++----- water_test.c | 19 +++++++++++++++++++ 2 files changed, 29 insertions(+), 5 deletions(-) diff --git a/scenes/water_flow.c b/scenes/water_flow.c index 1748615..5314bf7 100644 --- a/scenes/water_flow.c +++ b/scenes/water_flow.c @@ -117,14 +117,19 @@ void update_water_runner_system(Scene_t* scene) bool to_go[4] = {false, false, false, false}; Tile_t* curr_tile = tilemap.tiles + curr_idx; - if (curr_height > curr_low && curr_tile->water_level < tilemap.max_water_level) + unsigned int next = curr_idx + p_crunner->bfs_tilemap.width; + Tile_t* next_tile = tilemap.tiles + next; + + if ( + curr_height > curr_low + && curr_tile->water_level < tilemap.max_water_level + && next_tile->water_level < tilemap.max_water_level + ) { lowest_tile = curr_idx; } - unsigned int next = curr_idx + p_crunner->bfs_tilemap.width; - Tile_t* next_tile = tilemap.tiles + next; if (next < p_crunner->bfs_tilemap.len) { to_go[0] = next_tile->solid != SOLID; @@ -136,9 +141,9 @@ void update_water_runner_system(Scene_t* scene) || curr_tile->water_level == tilemap.max_water_level ) { - next = curr_idx - 1; - if (next % p_crunner->bfs_tilemap.width != 0) + if (curr_idx % p_crunner->bfs_tilemap.width != 0) { + next = curr_idx - 1; next_tile = tilemap.tiles + next; to_go[1] = next_tile->solid != SOLID; } diff --git a/water_test.c b/water_test.c index f22ee64..ed99ea5 100644 --- a/water_test.c +++ b/water_test.c @@ -109,6 +109,25 @@ static void level_scene_render_func(Scene_t* scene) next_idx = p_runner->bfs_tilemap.tilemap[curr_idx].to; } } + else if (p_runner->state == SCANLINE_FILL) + { + unsigned int tile_y = ((p_runner->current_tile) / tilemap.width); + for (size_t i = 0; i < tilemap.width; ++i) + { + unsigned int tile_idx = i + tile_y * tilemap.width; + if ( + p_runner->bfs_tilemap.tilemap[tile_idx].reachable + && tilemap.tiles[tile_idx].water_level < tilemap.max_water_level + ) + { + DrawRectangle( + i * tilemap.tile_size, tile_y * tilemap.tile_size, + tilemap.tile_size, tilemap.tile_size, ColorAlpha(GREEN, 0.4) + ); + } + + } + } } char buffer[64] = {0};