Visualine reachable scanline

Also tweak logic for lowest point
scene_man
En Yi 2023-07-20 22:51:15 +08:00
parent dc20a6b992
commit 34655d5c0a
2 changed files with 29 additions and 5 deletions

View File

@ -117,14 +117,19 @@ void update_water_runner_system(Scene_t* scene)
bool to_go[4] = {false, false, false, false}; bool to_go[4] = {false, false, false, false};
Tile_t* curr_tile = tilemap.tiles + curr_idx; 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; 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) if (next < p_crunner->bfs_tilemap.len)
{ {
to_go[0] = next_tile->solid != SOLID; 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 || curr_tile->water_level == tilemap.max_water_level
) )
{ {
next = curr_idx - 1; if (curr_idx % p_crunner->bfs_tilemap.width != 0)
if (next % p_crunner->bfs_tilemap.width != 0)
{ {
next = curr_idx - 1;
next_tile = tilemap.tiles + next; next_tile = tilemap.tiles + next;
to_go[1] = next_tile->solid != SOLID; to_go[1] = next_tile->solid != SOLID;
} }

View File

@ -109,6 +109,25 @@ static void level_scene_render_func(Scene_t* scene)
next_idx = p_runner->bfs_tilemap.tilemap[curr_idx].to; 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}; char buffer[64] = {0};