fp: Improve the A* situation, but its not quite fixed yet

This commit is contained in:
doyle 2023-09-23 17:38:10 +10:00
parent a8f5aa41a5
commit 1062e138d6

View File

@ -481,6 +481,7 @@ static Dqn_Slice<Dqn_V2I> FP_Game_AStarPathFind(FP_Game *game,
DQN_DEFER { Dqn_DSMap_Deinit(&astar_info); }; DQN_DEFER { Dqn_DSMap_Deinit(&astar_info); };
// NOTE: Enumerate the entities that are collidable ============================================ // NOTE: Enumerate the entities that are collidable ============================================
bool dest_tile_is_non_traversable = false;
auto zone_enum_collidables = Dqn_Profiler_BeginZoneWithIndex(DQN_STRING8("FP_Update: A* enumerate collidables"), FP_ProfileZone_FPUpdate_AStarEnumerateCollidables); auto zone_enum_collidables = Dqn_Profiler_BeginZoneWithIndex(DQN_STRING8("FP_Update: A* enumerate collidables"), FP_ProfileZone_FPUpdate_AStarEnumerateCollidables);
for (FP_GameEntityIterator it = {}; FP_Game_DFSPreOrderWalkEntityTree(game, &it, game->root_entity); ) { for (FP_GameEntityIterator it = {}; FP_Game_DFSPreOrderWalkEntityTree(game, &it, game->root_entity); ) {
FP_GameEntity const *walk_entity = it.entity; FP_GameEntity const *walk_entity = it.entity;
@ -502,6 +503,9 @@ static Dqn_Slice<Dqn_V2I> FP_Game_AStarPathFind(FP_Game *game,
FP_GameAStarNode *node = Dqn_DSMap_MakeKeyU64(&astar_info, tile_u64).value; FP_GameAStarNode *node = Dqn_DSMap_MakeKeyU64(&astar_info, tile_u64).value;
node->non_traversable = true; node->non_traversable = true;
node->tile = Dqn_V2I_InitNx2(x, y); node->tile = Dqn_V2I_InitNx2(x, y);
if (node->tile == dest_tile)
dest_tile_is_non_traversable = true;
} }
} }
} }
@ -556,6 +560,16 @@ static Dqn_Slice<Dqn_V2I> FP_Game_AStarPathFind(FP_Game *game,
Dqn_DSMapResult<FP_GameAStarNode> next_cost_result = Dqn_DSMap_MakeKeyU64(&astar_info, next_tile_u64); Dqn_DSMapResult<FP_GameAStarNode> next_cost_result = Dqn_DSMap_MakeKeyU64(&astar_info, next_tile_u64);
next_cost_result.value->tile = next_tile; next_cost_result.value->tile = next_tile;
// NOTE: We got as close as possible, we know it's impossible to
// reach, we will stop here.
// TODO(doyle): Doesn't work in the general case, what if there's a
// 2 consecutive blocks that are not traversable, we will never
// realise that
if (dest_tile == next_tile && dest_tile_is_non_traversable) {
Dqn_FArray_Clear(&frontier);
break;
}
if (next_cost_result.value->non_traversable) if (next_cost_result.value->non_traversable)
continue; continue;
@ -599,6 +613,7 @@ static Dqn_Slice<Dqn_V2I> FP_Game_AStarPathFind(FP_Game *game,
} }
Dqn_Profiler_EndZone(zone_astar_expand); Dqn_Profiler_EndZone(zone_astar_expand);
#if 0
TELY_Renderer *renderer = &platform->renderer; TELY_Renderer *renderer = &platform->renderer;
for (uint32_t old_index = 1 /*Sentinel*/; old_index < astar_info.occupied; old_index++) { for (uint32_t old_index = 1 /*Sentinel*/; old_index < astar_info.occupied; old_index++) {
Dqn_DSMapSlot<FP_GameAStarNode> const *slot = astar_info.slots + old_index; Dqn_DSMapSlot<FP_GameAStarNode> const *slot = astar_info.slots + old_index;
@ -606,6 +621,7 @@ static Dqn_Slice<Dqn_V2I> FP_Game_AStarPathFind(FP_Game *game,
Dqn_V2 pos = FP_Game_TilePosToWorldPos(game, node->tile) + (game->tile_size * .5f); Dqn_V2 pos = FP_Game_TilePosToWorldPos(game, node->tile) + (game->tile_size * .5f);
TELY_Render_CircleColourV4(renderer, pos, 4.f, TELY_RenderShapeMode_Fill, TELY_COLOUR_BLUE_CADET_V4); TELY_Render_CircleColourV4(renderer, pos, 4.f, TELY_RenderShapeMode_Fill, TELY_COLOUR_BLUE_CADET_V4);
} }
#endif
Dqn_usize slice_size = 0; Dqn_usize slice_size = 0;
for (Dqn_V2I it = last_successful_tile; it != src_tile; slice_size++) { for (Dqn_V2I it = last_successful_tile; it != src_tile; slice_size++) {