fp: Add dev fast build, remove tely_ui

This commit is contained in:
doyle 2023-10-25 20:17:30 +11:00
parent becc839b26
commit 27d55b36d4
8 changed files with 56 additions and 208 deletions

2
External/tely vendored

@ -1 +1 @@
Subproject commit bbfb1a80bf3ec43437c5ae3135e44c1dba86eac1 Subproject commit a1e15e336b6d9eac5538392d2c473c7b740364d5

View File

@ -19,7 +19,7 @@ copy feely_pona_build.exe %code_dir% 1>nul
popd popd
REM Run the build program REM Run the build program
%code_dir%\feely_pona_build.exe %* || exit /B 1 %code_dir%\feely_pona_build.exe --dev-fast-build %* || exit /B 1
popd popd
exit /B 1 exit /B 1

View File

@ -209,7 +209,7 @@ static void FP_PlayReset(FP_Game *game, TELY_Platform *platform)
FP_Game_DeleteEntity(game, game->play.root_entity->handle); FP_Game_DeleteEntity(game, game->play.root_entity->handle);
Dqn_VArray<FP_GameEntity> shallow_entities_copy = play->entities; Dqn_VArray<FP_GameEntity> shallow_entities_copy = play->entities;
*play = {}; DQN_MEMSET(play, 0, sizeof(*play));
play->chunk_pool = &platform->chunk_pool; play->chunk_pool = &platform->chunk_pool;
play->meters_to_pixels = 65.416f; play->meters_to_pixels = 65.416f;
@ -4032,6 +4032,10 @@ static void FP_Render(FP_Game *game, TELY_Platform *platform, TELY_Renderer *ren
if (platform->core.ram_mb) if (platform->core.ram_mb)
Dqn_Str8Builder_AppendF(&builder, " | RAM %.1fGB", platform->core.ram_mb / 1024.0); Dqn_Str8Builder_AppendF(&builder, " | RAM %.1fGB", platform->core.ram_mb / 1024.0);
DQN_MSVC_WARNING_PUSH
DQN_MSVC_WARNING_DISABLE(6272 6271)
// warning C6272: Non-float passed as argument '6' when float is required in call to 'Dqn_Str8Builder_AppendF' Actual type: 'unsigned __int64'.
// warning C6271: Extra argument passed to 'Dqn_Str8Builder_AppendF'.
Dqn_Str8Builder_AppendF(&builder, Dqn_Str8Builder_AppendF(&builder,
" | Work %04.1fms/f (%04.1f%%) | %05.1f FPS | Frame %'I64u | Timer %.1fs", " | Work %04.1fms/f (%04.1f%%) | %05.1f FPS | Frame %'I64u | Timer %.1fs",
input->work_ms, input->work_ms,
@ -4039,6 +4043,7 @@ static void FP_Render(FP_Game *game, TELY_Platform *platform, TELY_Renderer *ren
1000.0 / input->delta_ms, 1000.0 / input->delta_ms,
input->frame_counter, input->frame_counter,
input->timer_s); input->timer_s);
DQN_MSVC_WARNING_POP
Dqn_Str8 text = Dqn_Str8Builder_Build(&builder, scratch.allocator); Dqn_Str8 text = Dqn_Str8Builder_Build(&builder, scratch.allocator);
TELY_RFui_TextBackgroundF(rfui, "%.*s", DQN_STR_FMT(text)); TELY_RFui_TextBackgroundF(rfui, "%.*s", DQN_STR_FMT(text));
@ -4127,6 +4132,8 @@ static void FP_Render(FP_Game *game, TELY_Platform *platform, TELY_Renderer *ren
{ {
Dqn_ArenaInfo arena_info = Dqn_Arena_Info(&platform->arena); Dqn_ArenaInfo arena_info = Dqn_Arena_Info(&platform->arena);
DQN_MSVC_WARNING_PUSH
DQN_MSVC_WARNING_DISABLE(6271) // warning C6271: Extra argument passed to 'TELY_RFui_TextF'.
TELY_RFui_TextF(rfui, TELY_RFui_TextF(rfui,
"Platform Arena[%I64u]: %_$$d/%_$$d (HWM %_$$d, COMMIT %_$$d)", "Platform Arena[%I64u]: %_$$d/%_$$d (HWM %_$$d, COMMIT %_$$d)",
platform->arena.blocks, platform->arena.blocks,
@ -4134,6 +4141,7 @@ static void FP_Render(FP_Game *game, TELY_Platform *platform, TELY_Renderer *ren
arena_info.capacity, arena_info.capacity,
arena_info.used_hwm, arena_info.used_hwm,
arena_info.commit); arena_info.commit);
DQN_MSVC_WARNING_POP
next_y += TELY_Asset_GetFont(assets, TELY_RFui_ActiveFont(rfui))->pixel_height; next_y += TELY_Asset_GetFont(assets, TELY_RFui_ActiveFont(rfui))->pixel_height;
} }
@ -4142,6 +4150,9 @@ static void FP_Render(FP_Game *game, TELY_Platform *platform, TELY_Renderer *ren
next_y += TELY_Asset_GetFont(assets, TELY_RFui_ActiveFont(rfui))->pixel_height; next_y += TELY_Asset_GetFont(assets, TELY_RFui_ActiveFont(rfui))->pixel_height;
Dqn_Arena *arena = item->arena; Dqn_Arena *arena = item->arena;
Dqn_ArenaInfo arena_info = Dqn_Arena_Info(arena); Dqn_ArenaInfo arena_info = Dqn_Arena_Info(arena);
DQN_MSVC_WARNING_PUSH
DQN_MSVC_WARNING_DISABLE(6271) // warning C6271: Extra argument passed to 'TELY_RFui_TextF'.
TELY_RFui_TextF(rfui, TELY_RFui_TextF(rfui,
"%.*s[%I64u]: %_$$d/%_$$d (HWM %_$$d, COMMIT %_$$d)", "%.*s[%I64u]: %_$$d/%_$$d (HWM %_$$d, COMMIT %_$$d)",
DQN_STR_FMT(arena->label), DQN_STR_FMT(arena->label),
@ -4150,6 +4161,7 @@ static void FP_Render(FP_Game *game, TELY_Platform *platform, TELY_Renderer *ren
arena_info.capacity, arena_info.capacity,
arena_info.used_hwm, arena_info.used_hwm,
arena_info.commit); arena_info.commit);
DQN_MSVC_WARNING_POP
} }
} }
@ -4240,6 +4252,7 @@ void TELY_DLL_FrameUpdate(void *user_data)
FP_GameCameraM2x3 const camera_xforms = FP_Game_CameraModelViewM2x3(game->play.camera); FP_GameCameraM2x3 const camera_xforms = FP_Game_CameraModelViewM2x3(game->play.camera);
Dqn_V2 world_mouse_p = Dqn_M2x3_MulV2(camera_xforms.view_model, input->mouse_p); Dqn_V2 world_mouse_p = Dqn_M2x3_MulV2(camera_xforms.view_model, input->mouse_p);
for (FP_GameEntityIterator it = {}; FP_Game_DFSPreOrderWalkEntityTree(game, &it, game->play.root_entity); ) { for (FP_GameEntityIterator it = {}; FP_Game_DFSPreOrderWalkEntityTree(game, &it, game->play.root_entity); ) {
DQN_ASSERT(it.entity);
FP_GameEntity *entity = it.entity; FP_GameEntity *entity = it.entity;
if (entity->local_hit_box_size.x <= 0 || entity->local_hit_box_size.y <= 0) if (entity->local_hit_box_size.x <= 0 || entity->local_hit_box_size.y <= 0)
continue; continue;

View File

@ -87,6 +87,7 @@ int main(int argc, char const **argv)
bool dry_run = false; bool dry_run = false;
bool target_web = false; bool target_web = false;
bool dev_fast_build = false;
for (Dqn_usize arg_index = 1; arg_index < argc; arg_index++) { for (Dqn_usize arg_index = 1; arg_index < argc; arg_index++) {
Dqn_Str8 arg = Dqn_Str8_InitCStr8(argv[arg_index]); Dqn_Str8 arg = Dqn_Str8_InitCStr8(argv[arg_index]);
if (arg == DQN_STR8("--help")) { if (arg == DQN_STR8("--help")) {
@ -96,6 +97,8 @@ int main(int argc, char const **argv)
dry_run = true; dry_run = true;
} else if (arg == DQN_STR8("--web")) { } else if (arg == DQN_STR8("--web")) {
target_web = true; target_web = true;
} else if (arg == DQN_STR8("--dev-fast-build")) {
dev_fast_build = true;
} else { } else {
PRINT_HELP; PRINT_HELP;
return 0; return 0;
@ -275,22 +278,9 @@ int main(int argc, char const **argv)
} }
} }
// NOTE: Feely Pona No DLL ===================================================================== // NOTE: Feely Pona Link Flags =================================================================
uint64_t feely_pona_no_dll_timings[2] = {}; Dqn_Slice<Dqn_Str8> feely_pona_platform_link_flags = {};
Dqn_CPPBuildContext feely_pona_no_dll_build_context = {};
{ {
feely_pona_no_dll_timings[0] = Dqn_OS_PerfCounterNow();
DQN_DEFER { feely_pona_no_dll_timings[1] = Dqn_OS_PerfCounterNow(); };
Dqn_CPPBuildCompileFile build_file = {};
build_file.input_file_path = Dqn_FsPath_ConvertF(scratch.arena, "%.*s/feely_pona_unity_nodll.h", DQN_STR_FMT(code_dir));
build_file.flags = Dqn_Slice_InitCArrayCopy(scratch.arena, {DQN_STR8("/Tp")});
feely_pona_no_dll_build_context.compiler = Dqn_CPPBuildCompiler_MSVC;
feely_pona_no_dll_build_context.compile_files = Dqn_Slice_InitCArrayCopy(scratch.arena, {build_file});
feely_pona_no_dll_build_context.include_dirs = Dqn_Slice_InitCArrayCopy(scratch.arena, {raylib_dir});
feely_pona_no_dll_build_context.compile_flags = common_compile_flags;
feely_pona_no_dll_build_context.build_dir = build_dir;
// NOTE: Link to raylib object files and windows libs ====================================== // NOTE: Link to raylib object files and windows libs ======================================
Dqn_List<Dqn_Str8> link_flags = Dqn_List_InitSliceCopy(scratch.arena, 128, common_link_flags); Dqn_List<Dqn_Str8> link_flags = Dqn_List_InitSliceCopy(scratch.arena, 128, common_link_flags);
{ {
@ -302,7 +292,26 @@ int main(int argc, char const **argv)
Dqn_List_Add(&link_flags, DQN_STR8("user32.lib")); Dqn_List_Add(&link_flags, DQN_STR8("user32.lib"));
Dqn_List_Add(&link_flags, DQN_STR8("shell32.lib")); Dqn_List_Add(&link_flags, DQN_STR8("shell32.lib"));
} }
feely_pona_no_dll_build_context.link_flags = Dqn_List_ToSliceCopy(&link_flags, scratch.arena); feely_pona_platform_link_flags = Dqn_List_ToSliceCopy(&link_flags, scratch.arena);
}
// NOTE: Feely Pona No DLL =====================================================================
uint64_t feely_pona_no_dll_timings[2] = {};
if (!dev_fast_build) {
feely_pona_no_dll_timings[0] = Dqn_OS_PerfCounterNow();
DQN_DEFER { feely_pona_no_dll_timings[1] = Dqn_OS_PerfCounterNow(); };
Dqn_CPPBuildCompileFile build_file = {};
build_file.input_file_path = Dqn_FsPath_ConvertF(scratch.arena, "%.*s/feely_pona_unity_nodll.h", DQN_STR_FMT(code_dir));
build_file.flags = Dqn_Slice_InitCArrayCopy(scratch.arena, {DQN_STR8("/Tp")});
Dqn_CPPBuildContext feely_pona_no_dll_build_context = {};
feely_pona_no_dll_build_context.compiler = Dqn_CPPBuildCompiler_MSVC;
feely_pona_no_dll_build_context.compile_files = Dqn_Slice_InitCArrayCopy(scratch.arena, {build_file});
feely_pona_no_dll_build_context.include_dirs = Dqn_Slice_InitCArrayCopy(scratch.arena, {raylib_dir});
feely_pona_no_dll_build_context.compile_flags = common_compile_flags;
feely_pona_no_dll_build_context.build_dir = build_dir;
feely_pona_no_dll_build_context.link_flags = feely_pona_platform_link_flags;
if (dry_run) { if (dry_run) {
Dqn_Str8 cmd = Dqn_CPPBuild_ToCommandLine(feely_pona_no_dll_build_context, Dqn_CPPBuildMode_AlwaysRebuild, scratch.allocator); Dqn_Str8 cmd = Dqn_CPPBuild_ToCommandLine(feely_pona_no_dll_build_context, Dqn_CPPBuildMode_AlwaysRebuild, scratch.allocator);
@ -325,13 +334,14 @@ int main(int argc, char const **argv)
Dqn_List<Dqn_Str8> compile_flags = Dqn_List_InitSliceCopy(scratch.arena, 128, common_compile_flags); Dqn_List<Dqn_Str8> compile_flags = Dqn_List_InitSliceCopy(scratch.arena, 128, common_compile_flags);
Dqn_List_Add(&compile_flags, DQN_STR8("/LD")); Dqn_List_Add(&compile_flags, DQN_STR8("/LD"));
Dqn_List_Add(&compile_flags, DQN_STR8("/analyze"));
Dqn_List_Add(&compile_flags, DQN_STR8("/Fetely_dll_msvc")); Dqn_List_Add(&compile_flags, DQN_STR8("/Fetely_dll_msvc"));
Dqn_CPPBuildContext build_context = {}; Dqn_CPPBuildContext build_context = {};
build_context.compiler = Dqn_CPPBuildCompiler_MSVC; build_context.compiler = Dqn_CPPBuildCompiler_MSVC;
build_context.compile_files = Dqn_Slice_InitCArrayCopy(scratch.arena, {build_file}); build_context.compile_files = Dqn_Slice_InitCArrayCopy(scratch.arena, {build_file});
build_context.compile_flags = Dqn_List_ToSliceCopy(&compile_flags, scratch.arena); build_context.compile_flags = Dqn_List_ToSliceCopy(&compile_flags, scratch.arena);
build_context.link_flags = feely_pona_no_dll_build_context.link_flags; build_context.link_flags = {};
build_context.build_dir = build_dir; build_context.build_dir = build_dir;
if (dry_run) { if (dry_run) {
@ -360,7 +370,7 @@ int main(int argc, char const **argv)
build_context.compiler = Dqn_CPPBuildCompiler_MSVC; build_context.compiler = Dqn_CPPBuildCompiler_MSVC;
build_context.compile_files = Dqn_Slice_InitCArrayCopy(scratch.arena, {build_file}); build_context.compile_files = Dqn_Slice_InitCArrayCopy(scratch.arena, {build_file});
build_context.compile_flags = Dqn_List_ToSliceCopy(&compile_flags, scratch.arena); build_context.compile_flags = Dqn_List_ToSliceCopy(&compile_flags, scratch.arena);
build_context.link_flags = feely_pona_no_dll_build_context.link_flags; build_context.link_flags = feely_pona_platform_link_flags;
build_context.build_dir = build_dir; build_context.build_dir = build_dir;
build_context.include_dirs = Dqn_Slice_InitCArrayCopy(scratch.arena, {raylib_dir}); build_context.include_dirs = Dqn_Slice_InitCArrayCopy(scratch.arena, {raylib_dir});
@ -573,7 +583,6 @@ int main(int argc, char const **argv)
} }
} }
build_timings[1] = Dqn_OS_PerfCounterNow(); build_timings[1] = Dqn_OS_PerfCounterNow();
Dqn_Print_StdLnF(Dqn_PrintStd_Out, "\n-- Dqn_CPPBuild Timings (%.2fms)", Dqn_OS_PerfCounterMs(build_timings[0], build_timings[1])); Dqn_Print_StdLnF(Dqn_PrintStd_Out, "\n-- Dqn_CPPBuild Timings (%.2fms)", Dqn_OS_PerfCounterMs(build_timings[0], build_timings[1]));
Dqn_Print_StdLnF(Dqn_PrintStd_Out, " robocopy: %.2fms", Dqn_OS_PerfCounterMs(robocopy_timings[0], robocopy_timings[1])); Dqn_Print_StdLnF(Dqn_PrintStd_Out, " robocopy: %.2fms", Dqn_OS_PerfCounterMs(robocopy_timings[0], robocopy_timings[1]));

View File

@ -96,6 +96,9 @@ static bool FP_Game_DFSPreOrderWalkEntityTree(FP_Game *game, FP_GameEntityIterat
it->entity_first_child = it->entity->first_child; it->entity_first_child = it->entity->first_child;
} }
if (!it->entity)
return false;
if (it->entity_first_child) { if (it->entity_first_child) {
it->entity = it->entity_first_child; it->entity = it->entity_first_child;
it->entity_parent = it->entity->parent; it->entity_parent = it->entity->parent;
@ -141,6 +144,9 @@ static bool FP_Game_DFSPostOrderWalkEntityTree(FP_Game *game, FP_GameEntityItera
it->entity_first_child = it->entity->first_child; it->entity_first_child = it->entity->first_child;
} }
if (!it->entity)
return false;
// NOTE: Descend to deepest leaf node // NOTE: Descend to deepest leaf node
if (it->entity_first_child && !ascending_tree) { if (it->entity_first_child && !ascending_tree) {
while (it->entity_first_child) { while (it->entity_first_child) {
@ -389,6 +395,7 @@ static void FP_Game_DeleteEntity(FP_Game *game, FP_GameEntityHandle handle)
// NOTE: The iterator snaps a copy of all the internal n-ary tree pointers // NOTE: The iterator snaps a copy of all the internal n-ary tree pointers
// so as we delete we do not accidentally invalidate any of the pointers. // so as we delete we do not accidentally invalidate any of the pointers.
for (FP_GameEntityIterator it = {}; FP_Game_DFSPostOrderWalkEntityTree(game, &it, root); ) { for (FP_GameEntityIterator it = {}; FP_Game_DFSPostOrderWalkEntityTree(game, &it, root); ) {
DQN_ASSERT(it.entity);
DQN_ASSERT(it.entity != root); DQN_ASSERT(it.entity != root);
FP_GameEntity *entity = it.entity; FP_GameEntity *entity = it.entity;
FP_Game_DetachEntityIntoFreeList(game, entity->handle); FP_Game_DetachEntityIntoFreeList(game, entity->handle);
@ -541,185 +548,6 @@ static Dqn_V2 FP_Game_TilePosToWorldPos(FP_Game *game, Dqn_V2I tile_pos)
return result; return result;
} }
static Dqn_Slice<Dqn_V2I> FP_Game_AStarPathFind(FP_Game *game,
Dqn_Arena *arena,
TELY_Platform *platform,
FP_GameEntityHandle entity,
Dqn_V2I dest_tile)
{
Dqn_Profiler_ZoneScopeWithIndex("FP_Update: A*", FP_ProfileZone_FPUpdate_AStar);
Dqn_usize tile_count_x = DQN_CAST(Dqn_usize)(platform->core.window_size.w / game->play.tile_size);
Dqn_usize tile_count_y = DQN_CAST(Dqn_usize)(platform->core.window_size.h / game->play.tile_size);
Dqn_Slice<Dqn_V2I> result = {};
if (dest_tile.x < 0 || dest_tile.x > tile_count_x ||
dest_tile.y < 0 || dest_tile.y > tile_count_y)
return result;
Dqn_DSMap<FP_GameAStarNode> astar_info = Dqn_DSMap_Init<FP_GameAStarNode>(128);
DQN_DEFER { Dqn_DSMap_Deinit(&astar_info); };
// NOTE: Enumerate the entities that are collidable ============================================
bool dest_tile_is_non_traversable = false;
auto zone_enum_collidables = Dqn_Profiler_BeginZoneWithIndex(DQN_STR8("FP_Update: A* enumerate collidables"), FP_ProfileZone_FPUpdate_AStarEnumerateCollidables);
for (FP_GameEntityIterator it = {}; FP_Game_DFSPreOrderWalkEntityTree(game, &it, game->play.root_entity); ) {
FP_GameEntity const *walk_entity = it.entity;
if (entity == walk_entity->handle)
continue;
if ((walk_entity->flags & FP_GameEntityFlag_NonTraversable) == 0)
continue;
// NOTE: Mark tiles that the entity is on as non-traversable
Dqn_Rect bounding_box = FP_Game_CalcEntityWorldBoundingBox(game, walk_entity->handle);
Dqn_RectMinMax min_max = Dqn_Rect_MinMax(bounding_box);
Dqn_V2I min_tile = FP_Game_WorldPosToTilePos(game, min_max.min);
Dqn_V2I max_tile = FP_Game_WorldPosToTilePos(game, min_max.max);
for (int32_t y = min_tile.y; y < max_tile.y; y++) {
for (int32_t x = min_tile.x; x < max_tile.x; x++) {
uint64_t tile_u64 = (DQN_CAST(uint64_t)y << 32) | (DQN_CAST(uint64_t)x << 0);
FP_GameAStarNode *node = Dqn_DSMap_MakeKeyU64(&astar_info, tile_u64).value;
node->non_traversable = true;
node->tile = Dqn_V2I_InitNx2(x, y);
if (node->tile == dest_tile)
dest_tile_is_non_traversable = true;
}
}
}
Dqn_Profiler_EndZone(zone_enum_collidables);
// NOTE: Setup A* state ========================================================================
Dqn_V2 entity_world_pos = FP_Game_CalcEntityWorldPos(game, entity);
Dqn_V2I src_tile = FP_Game_WorldPosToTilePos(game, entity_world_pos);
Dqn_FArray<Dqn_V2I, 128> frontier = {};
Dqn_FArray_Add(&frontier, src_tile);
// NOTE: Initialise the starting cost
uint64_t src_tile_u64 = (DQN_CAST(uint64_t)src_tile.y << 32) | (DQN_CAST(uint64_t)src_tile.x << 0);
Dqn_DSMap_MakeKeyU64(&astar_info, src_tile_u64).value->tile = src_tile;
// NOTE: Do the A* process =====================================================================
Dqn_usize last_successful_manhattan_dist = DQN_USIZE_MAX;
Dqn_V2I last_successful_tile = src_tile;
auto zone_astar_expand = Dqn_Profiler_BeginZoneWithIndex(DQN_STR8("FP_Update: A* expand"), FP_ProfileZone_FPUpdate_AStarExpand);
while (frontier.size) {
Dqn_Profiler_ZoneScopeWithIndex("FP_Update: A* neighbours", FP_ProfileZone_FPUpdate_AStarExploreNeighbours);
Dqn_V2I curr_tile = Dqn_FArray_PopFront(&frontier, 1);
if (curr_tile == dest_tile)
break;
Dqn_FArray<Dqn_V2I, 4> neighbours = {};
{
Dqn_V2I left = Dqn_V2I_InitNx2(curr_tile.x - 1, curr_tile.y);
Dqn_V2I right = Dqn_V2I_InitNx2(curr_tile.x + 1, curr_tile.y);
Dqn_V2I top = Dqn_V2I_InitNx2(curr_tile.x, curr_tile.y - 1);
Dqn_V2I bottom = Dqn_V2I_InitNx2(curr_tile.x, curr_tile.y + 1);
if (left.x >= 0)
Dqn_FArray_Add(&neighbours, left);
if (right.x <= tile_count_x)
Dqn_FArray_Add(&neighbours, right);
if (top.y >= 0)
Dqn_FArray_Add(&neighbours, top);
if (bottom.y <= tile_count_y)
Dqn_FArray_Add(&neighbours, bottom);
}
uint64_t const curr_tile_u64 = (DQN_CAST(uint64_t)curr_tile.y << 32) | (DQN_CAST(uint64_t)curr_tile.x << 0);
Dqn_usize const curr_cost = Dqn_DSMap_FindKeyU64(&astar_info, curr_tile_u64).value->cost;
for (Dqn_V2I next_tile : neighbours) {
// NOTE: Calculate cost to move to this neighbouring tile.
Dqn_usize new_cost = curr_cost + 1;
uint64_t next_tile_u64 = (DQN_CAST(uint64_t)next_tile.y << 32) | (DQN_CAST(uint64_t)next_tile.x << 0);
Dqn_DSMapResult<FP_GameAStarNode> next_cost_result = Dqn_DSMap_MakeKeyU64(&astar_info, next_tile_u64);
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)
continue;
// NOTE: If we have already visited this node before, we only keep the cost if it's cheaper
if (next_cost_result.found && new_cost >= next_cost_result.value->cost)
continue;
// NOTE: Update the node cost value and the heuristic (estimated cost to the end)
Dqn_usize manhattan_dist = DQN_ABS(dest_tile.x - next_tile.x) + DQN_ABS(dest_tile.y - next_tile.y);
next_cost_result.value->cost = new_cost;
next_cost_result.value->came_from = curr_tile;
next_cost_result.value->heuristic = new_cost + manhattan_dist;
// NOTE: Store the last node we visited that had the best cost.
// We may end up with a partial path find that could only get
// part-way to the solution which this variable will track for us.
if (manhattan_dist < last_successful_manhattan_dist) {
last_successful_manhattan_dist = manhattan_dist;
last_successful_tile = next_tile;
}
// TODO(doyle): Find the insert location into the frontier
bool inserted = false;
DQN_FOR_UINDEX(index, frontier.size) {
Dqn_V2I frontier_tile = frontier.data[index];
uint64_t frontier_tile_u64 = DQN_CAST(uint64_t)frontier_tile.y << 32 | DQN_CAST(uint64_t)frontier_tile.x << 0;
Dqn_usize frontier_heuristic = Dqn_DSMap_FindKeyU64(&astar_info, frontier_tile_u64).value->heuristic;
if (next_cost_result.value->heuristic >= frontier_heuristic)
continue;
Dqn_FArray_Insert(&frontier, index, next_tile);
inserted = true;
break;
}
if (inserted)
continue;
Dqn_FArray_Add(&frontier, next_tile);
}
}
Dqn_Profiler_EndZone(zone_astar_expand);
#if 0
TELY_Renderer *renderer = &platform->renderer;
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;
FP_GameAStarNode const *node = &slot->value;
Dqn_V2 pos = FP_Game_TilePosToWorldPos(game, node->tile) + (game->play.tile_size * .5f);
TELY_Render_CircleColourV4(renderer, pos, 4.f, TELY_RenderShapeMode_Fill, TELY_COLOUR_BLUE_CADET_V4);
}
#endif
Dqn_usize slice_size = 0;
for (Dqn_V2I it = last_successful_tile; it != src_tile; slice_size++) {
uint64_t key_u64 = (DQN_CAST(uint64_t)it.y << 32) | (DQN_CAST(uint64_t)it.x << 0);
it = Dqn_DSMap_FindKeyU64(&astar_info, key_u64).value->came_from;
}
result = Dqn_Slice_Alloc<Dqn_V2I>(arena, slice_size, Dqn_ZeroMem_No);
slice_size = 0;
for (Dqn_V2I it = last_successful_tile; it != src_tile; ) {
result.data[slice_size++] = it;
uint64_t key_u64 = (DQN_CAST(uint64_t)it.y << 32) | (DQN_CAST(uint64_t)it.x << 0);
it = Dqn_DSMap_FindKeyU64(&astar_info, key_u64).value->came_from;
}
DQN_ASSERT(result.size == slice_size);
return result;
}
static Dqn_V2 FP_Game_CalcWaypointWorldPos(FP_Game *game, FP_GameEntityHandle entity_handle, FP_GameWaypoint const *waypoint) static Dqn_V2 FP_Game_CalcWaypointWorldPos(FP_Game *game, FP_GameEntityHandle entity_handle, FP_GameWaypoint const *waypoint)
{ {
Dqn_V2 result = {}; Dqn_V2 result = {};
@ -797,6 +625,7 @@ FP_GameFindClosestEntityResult FP_Game_FindClosestEntityWithType(FP_Game *game,
result.pos = Dqn_V2_InitNx1(DQN_F32_MAX); result.pos = Dqn_V2_InitNx1(DQN_F32_MAX);
for (FP_GameEntityIterator it = {}; FP_Game_DFSPostOrderWalkEntityTree(game, &it, game->play.root_entity); ) { for (FP_GameEntityIterator it = {}; FP_Game_DFSPostOrderWalkEntityTree(game, &it, game->play.root_entity); ) {
DQN_ASSERT(it.entity);
FP_GameEntity *it_entity = it.entity; FP_GameEntity *it_entity = it.entity;
if (it_entity->type != type) if (it_entity->type != type)
continue; continue;
@ -957,6 +786,7 @@ static FP_GameCanMoveToPositionResult FP_Game_CanEntityMoveToPosition(FP_Game *g
if ((entity->flags & FP_GameEntityFlag_NoClip) == 0) { if ((entity->flags & FP_GameEntityFlag_NoClip) == 0) {
for (FP_GameEntityIterator collider_it = {}; FP_Game_DFSPostOrderWalkEntityTree(game, &collider_it, game->play.root_entity);) { for (FP_GameEntityIterator collider_it = {}; FP_Game_DFSPostOrderWalkEntityTree(game, &collider_it, game->play.root_entity);) {
DQN_ASSERT(collider_it.entity);
FP_GameEntity *collider = collider_it.entity; FP_GameEntity *collider = collider_it.entity;
if (collider->handle == entity->handle) if (collider->handle == entity->handle)
continue; continue;

View File

@ -50,7 +50,6 @@ DQN_MSVC_WARNING_DISABLE(4505) // warning C4505: unreferenced function with inte
#include "External/tely/tely_render.h" #include "External/tely/tely_render.h"
#include "External/tely/tely_audio.h" #include "External/tely/tely_audio.h"
#include "External/tely/tely_platform.h" #include "External/tely/tely_platform.h"
#include "External/tely/tely_ui.h"
#include "External/tely/tely_rfui.h" #include "External/tely/tely_rfui.h"
#include "External/tely/tely_tools.cpp" #include "External/tely/tely_tools.cpp"
@ -58,7 +57,6 @@ DQN_MSVC_WARNING_DISABLE(4505) // warning C4505: unreferenced function with inte
#include "External/tely/tely_audio.cpp" #include "External/tely/tely_audio.cpp"
#include "External/tely/tely_render.cpp" #include "External/tely/tely_render.cpp"
#include "External/tely/tely_platform_input.cpp" #include "External/tely/tely_platform_input.cpp"
#include "External/tely/tely_ui.cpp"
#include "External/tely/tely_rfui.cpp" #include "External/tely/tely_rfui.cpp"
// NOTE: feely_pona ================================================================================ // NOTE: feely_pona ================================================================================

View File

@ -67,7 +67,6 @@ DQN_GCC_WARNING_DISABLE(-Wunused-function)
#include "External/tely/tely_render.h" #include "External/tely/tely_render.h"
#include "External/tely/tely_audio.h" #include "External/tely/tely_audio.h"
#include "External/tely/tely_platform.h" #include "External/tely/tely_platform.h"
#include "External/tely/tely_ui.h"
#include "External/tely/tely_rfui.h" #include "External/tely/tely_rfui.h"
#include "External/tely/tely_tools.cpp" #include "External/tely/tely_tools.cpp"
@ -75,7 +74,6 @@ DQN_GCC_WARNING_DISABLE(-Wunused-function)
#include "External/tely/tely_audio.cpp" #include "External/tely/tely_audio.cpp"
#include "External/tely/tely_render.cpp" #include "External/tely/tely_render.cpp"
#include "External/tely/tely_platform_input.cpp" #include "External/tely/tely_platform_input.cpp"
#include "External/tely/tely_ui.cpp"
#include "External/tely/tely_rfui.cpp" #include "External/tely/tely_rfui.cpp"
// NOTE: feely_pona ================================================================================ // NOTE: feely_pona ================================================================================

Binary file not shown.