diff --git a/External/tely b/External/tely index 833c1c5..145a0e8 160000 --- a/External/tely +++ b/External/tely @@ -1 +1 @@ -Subproject commit 833c1c5a7c62ac89442da56cf2453edb6954841b +Subproject commit 145a0e83ad0300a95a527922d4a0446bb9742b57 diff --git a/feely_pona.cpp b/feely_pona.cpp index 12e4478..2669214 100644 --- a/feely_pona.cpp +++ b/feely_pona.cpp @@ -1,6 +1,6 @@ -#if defined(__clang__) -#pragma once -#include "feely_pona_unity.h" +#if defined(_CLANGD) + #pragma once + #include "feely_pona_unity.h" #endif Dqn_f32 const PHYSICS_STEP = 1 / 60.f; @@ -474,7 +474,13 @@ static void FP_PlayReset(FP_Game *game, TELY_Platform *platform) play->camera.scale = Dqn_V2_InitNx1(1); } -extern "C" __declspec(dllexport) +#if defined(DQN_OS_WIN32) + #define FP_DLL_FUNCTION extern "C" __declspec(dllexport) +#else + #define FP_DLL_FUNCTION +#endif + +FP_DLL_FUNCTION void TELY_DLL_Reload(void *user_data) { TELY_Platform *platform = DQN_CAST(TELY_Platform *)user_data; @@ -482,7 +488,7 @@ void TELY_DLL_Reload(void *user_data) } -extern "C" __declspec(dllexport) +FP_DLL_FUNCTION void TELY_DLL_Init(void *user_data) { TELY_Platform *platform = DQN_CAST(TELY_Platform *)user_data; @@ -3565,8 +3571,7 @@ void FP_Render(FP_Game *game, TELY_Platform *platform, TELY_Renderer *renderer, } } - -extern "C" __declspec(dllexport) +FP_DLL_FUNCTION void TELY_DLL_FrameUpdate(void *user_data) { TELY_Platform *platform = DQN_CAST(TELY_Platform *) user_data; diff --git a/feely_pona.h b/feely_pona.h index f28aac4..93be651 100644 --- a/feely_pona.h +++ b/feely_pona.h @@ -1,6 +1,6 @@ -#if defined(__clang__) -#pragma once -#include "feely_pona_unity.h" +#if defined(_CLANGD) + #pragma once + #include "feely_pona_unity.h" #endif enum FP_ProfileZone diff --git a/feely_pona_build.cpp b/feely_pona_build.cpp index 5bda7e6..aaa0d65 100644 --- a/feely_pona_build.cpp +++ b/feely_pona_build.cpp @@ -115,6 +115,7 @@ int main(int argc, char const **argv) build_timings[0] = Dqn_OS_PerfCounterNow(); Dqn_ThreadScratch scratch = Dqn_Thread_GetScratch(nullptr); Dqn_String8 const exe_dir = Dqn_OS_EXEDir(scratch.arena); + Dqn_String8 const code_dir = exe_dir; Dqn_String8 const build_dir = Dqn_FsPath_ConvertF(scratch.arena, "%.*s/Build", DQN_STRING_FMT(exe_dir)); Dqn_String8 const tely_dir = Dqn_FsPath_ConvertF(scratch.arena, "%.*s/External/tely", DQN_STRING_FMT(exe_dir)); @@ -146,25 +147,31 @@ int main(int argc, char const **argv) } // NOTE: Raylib ================================================================================ - Dqn_CPPBuildContext raylib_build_context = {}; Dqn_String8 const raylib_dir = Dqn_FsPath_ConvertF(scratch.arena, "%.*s/External/tely/external/raylib", DQN_STRING_FMT(exe_dir)); + Dqn_Slice base_raylib_files = Dqn_Slice_InitCArrayCopy(scratch.arena, { + Dqn_FsPath_ConvertF(scratch.arena, "%.*s/rcore.c", DQN_STRING_FMT(raylib_dir)), + Dqn_FsPath_ConvertF(scratch.arena, "%.*s/utils.c", DQN_STRING_FMT(raylib_dir)), + Dqn_FsPath_ConvertF(scratch.arena, "%.*s/raudio.c", DQN_STRING_FMT(raylib_dir)), + Dqn_FsPath_ConvertF(scratch.arena, "%.*s/rmodels.c", DQN_STRING_FMT(raylib_dir)), + Dqn_FsPath_ConvertF(scratch.arena, "%.*s/rtext.c", DQN_STRING_FMT(raylib_dir)), + Dqn_FsPath_ConvertF(scratch.arena, "%.*s/rtextures.c", DQN_STRING_FMT(raylib_dir)), + Dqn_FsPath_ConvertF(scratch.arena, "%.*s/rshapes.c", DQN_STRING_FMT(raylib_dir)), + }); + + Dqn_CPPBuildContext raylib_build_context = {}; uint64_t raylib_timings[2] = {}; { raylib_timings[0] = Dqn_OS_PerfCounterNow(); DQN_DEFER { raylib_timings[1] = Dqn_OS_PerfCounterNow(); }; - raylib_build_context.compile_files = Dqn_Slice_InitCArrayCopy(scratch.arena, { - Dqn_CPPBuildCompileFile{{}, Dqn_FsPath_ConvertF(scratch.arena, "%.*s/rcore.c", DQN_STRING_FMT(raylib_dir))}, - Dqn_CPPBuildCompileFile{{}, Dqn_FsPath_ConvertF(scratch.arena, "%.*s/utils.c", DQN_STRING_FMT(raylib_dir))}, - Dqn_CPPBuildCompileFile{{}, Dqn_FsPath_ConvertF(scratch.arena, "%.*s/raudio.c", DQN_STRING_FMT(raylib_dir))}, - Dqn_CPPBuildCompileFile{{}, Dqn_FsPath_ConvertF(scratch.arena, "%.*s/rmodels.c", DQN_STRING_FMT(raylib_dir))}, - Dqn_CPPBuildCompileFile{{}, Dqn_FsPath_ConvertF(scratch.arena, "%.*s/rtext.c", DQN_STRING_FMT(raylib_dir))}, - Dqn_CPPBuildCompileFile{{}, Dqn_FsPath_ConvertF(scratch.arena, "%.*s/rtextures.c", DQN_STRING_FMT(raylib_dir))}, - Dqn_CPPBuildCompileFile{{}, Dqn_FsPath_ConvertF(scratch.arena, "%.*s/rshapes.c", DQN_STRING_FMT(raylib_dir))}, - Dqn_CPPBuildCompileFile{{}, Dqn_FsPath_ConvertF(scratch.arena, "%.*s/rglfw.c", DQN_STRING_FMT(raylib_dir))}, - }); + // NOTE: Create the list of compile files + Dqn_List compile_files = Dqn_List_Init(scratch.arena, 32); + for (Dqn_String8 base_file : base_raylib_files) + Dqn_List_Add(&compile_files, Dqn_CPPBuildCompileFile{{}, base_file}); + Dqn_List_Add(&compile_files, Dqn_CPPBuildCompileFile{{}, Dqn_FsPath_ConvertF(scratch.arena, "%.*s/rglfw.c", DQN_STRING_FMT(raylib_dir))}); + raylib_build_context.compile_files = Dqn_List_ToSliceCopy(&compile_files, scratch.arena); raylib_build_context.include_dirs = Dqn_Slice_InitCArrayCopy(scratch.arena, { Dqn_FsPath_ConvertF(scratch.arena, "%.*s", DQN_STRING_FMT(raylib_dir)), Dqn_FsPath_ConvertF(scratch.arena, "%.*s/external/glfw/include", DQN_STRING_FMT(raylib_dir)), @@ -201,7 +208,6 @@ int main(int argc, char const **argv) feely_pona_sprite_packer_timings[0] = Dqn_OS_PerfCounterNow(); DQN_DEFER { feely_pona_sprite_packer_timings[1] = Dqn_OS_PerfCounterNow(); }; - Dqn_String8 code_dir = exe_dir; Dqn_CPPBuildContext build_context = {}; build_context.compile_files = Dqn_Slice_InitCArrayCopy(scratch.arena, { Dqn_CPPBuildCompileFile{{}, Dqn_FsPath_ConvertF(scratch.arena, "%.*s/feely_pona_sprite_packer.h", DQN_STRING_FMT(code_dir)) }, @@ -221,7 +227,6 @@ int main(int argc, char const **argv) feely_pona_no_dll_timings[0] = Dqn_OS_PerfCounterNow(); DQN_DEFER { feely_pona_no_dll_timings[1] = Dqn_OS_PerfCounterNow(); }; - Dqn_String8 code_dir = exe_dir; feely_pona_no_dll_build_context.compile_files = Dqn_Slice_InitCArrayCopy(scratch.arena, { Dqn_CPPBuildCompileFile{ {Dqn_Slice_InitCArrayCopy(scratch.arena, {DQN_STRING8("/Tp")})}, @@ -267,7 +272,6 @@ int main(int argc, char const **argv) feely_pona_dll_timings[0] = Dqn_OS_PerfCounterNow(); DQN_DEFER { feely_pona_dll_timings[1] = Dqn_OS_PerfCounterNow(); }; - Dqn_String8 code_dir = exe_dir; Dqn_CPPBuildContext build_context = {}; build_context.compile_files = Dqn_Slice_InitCArrayCopy(scratch.arena, { Dqn_CPPBuildCompileFile{ @@ -299,7 +303,6 @@ int main(int argc, char const **argv) feely_pona_platform_timings[0] = Dqn_OS_PerfCounterNow(); DQN_DEFER { feely_pona_platform_timings[1] = Dqn_OS_PerfCounterNow(); }; - Dqn_String8 code_dir = exe_dir; Dqn_CPPBuildContext build_context = {}; build_context.compile_files = Dqn_Slice_InitCArrayCopy(scratch.arena, { Dqn_CPPBuildCompileFile{ @@ -337,13 +340,107 @@ int main(int argc, char const **argv) } } + // NOTE: raylib emscripten ===================================================================== + uint64_t raylib_emscripten_timings[2] = {}; + if (0) { + raylib_emscripten_timings[0] = Dqn_OS_PerfCounterNow(); + DQN_DEFER { raylib_emscripten_timings[1] = Dqn_OS_PerfCounterNow(); }; + + // NOTE: Compile with emcc + Dqn_CPPBuildContext raylib_emscripten_build_context = {}; + { + + // NOTE: Create the list of compile files + Dqn_List compile_files = Dqn_List_Init(scratch.arena, 32); + for (Dqn_String8 base_file : base_raylib_files) + Dqn_List_Add(&compile_files, Dqn_CPPBuildCompileFile{{}, base_file}); + + raylib_emscripten_build_context.compile_files = Dqn_List_ToSliceCopy(&compile_files, scratch.arena); + raylib_emscripten_build_context.compile_flags = Dqn_Slice_InitCArrayCopy(scratch.arena, { + DQN_STRING8("cmd"), + DQN_STRING8("/C"), + DQN_STRING8("emcc.bat"), + DQN_STRING8("-c"), // Compile and assemble, but do not link + DQN_STRING8("-Wall"), + DQN_STRING8("-Os"), // Optimize for size + DQN_STRING8("-D PLATFORM_WEB"), + DQN_STRING8("-D GRAPHICS_API_OPENGL_ES2"), + }); + raylib_emscripten_build_context.build_dir = build_dir; + + if (dry_run) { + Dqn_String8 cmd = Dqn_CPPBuild_ToCommandLine(raylib_emscripten_build_context, Dqn_CPPBuildMode_AlwaysRebuild, scratch.allocator); + Dqn_Print_StdLnF(Dqn_PrintStd_Out, "%.*s\n", DQN_STRING_FMT(cmd)); + } else { + Dqn_CPPBuild_ExecOrAbort(raylib_emscripten_build_context, Dqn_CPPBuildMode_CacheBuild); + } + } + + { + Dqn_String8Builder builder = {}; + builder.allocator = scratch.allocator; + Dqn_String8Builder_AppendF(&builder, "cmd /C emar.bat rcs libraylib.a"); + + for (Dqn_CPPBuildCompileFile file : raylib_emscripten_build_context.compile_files) { + Dqn_String8 file_stem = Dqn_String8_FileNameNoExtension(file.path); + Dqn_String8 obj_file = Dqn_FsPath_ConvertF(scratch.arena, "%.*s/%.*s.o", DQN_STRING_FMT(raylib_emscripten_build_context.build_dir), DQN_STRING_FMT(file_stem)); + Dqn_String8Builder_AppendF(&builder, " %.*s", DQN_STRING_FMT(obj_file)); + } + + Dqn_String8 cmd = Dqn_String8Builder_Build(&builder, scratch.allocator); + if (dry_run) { + Dqn_Print_StdLnF(Dqn_PrintStd_Out, "%.*s\n", DQN_STRING_FMT(cmd)); + } else { + Dqn_OS_ExecOrAbort(cmd, build_dir); + } + } + } + + // NOTE: feely pona emscripten ================================================================= + uint64_t feely_pona_emscripten_timings[2] = {}; + if (0) { + feely_pona_emscripten_timings[0] = Dqn_OS_PerfCounterNow(); + DQN_DEFER { feely_pona_emscripten_timings[1] = Dqn_OS_PerfCounterNow(); }; + + // NOTE: Compile with emcc + Dqn_CPPBuildContext build_context = {}; + build_context.compile_files = Dqn_Slice_InitCArrayCopy(scratch.arena, { + Dqn_CPPBuildCompileFile{{}, Dqn_FsPath_ConvertF(scratch.arena, "%.*s/feely_pona_unity_nodll.cpp", DQN_STRING_FMT(code_dir)) }, + }); + + build_context.compile_flags = Dqn_Slice_InitCArrayCopy(scratch.arena, { + DQN_STRING8("cmd"), + DQN_STRING8("/C"), + DQN_STRING8("emcc.bat"), + DQN_STRING8("-o"), + DQN_STRING8("feely_pona.html"), + DQN_STRING8("-Os"), // Optimize for size + DQN_STRING8("-Wall"), + Dqn_FsPath_ConvertF(scratch.arena, "%.*s/libraylib.a", DQN_STRING_FMT(build_dir)), + DQN_STRING8("-s"), + DQN_STRING8("USE_GLFW=3"), + DQN_STRING8("-msimd128"), + DQN_STRING8("-msse2"), + }); + build_context.build_dir = build_dir; + + if (dry_run) { + Dqn_String8 cmd = Dqn_CPPBuild_ToCommandLine(build_context, Dqn_CPPBuildMode_AlwaysRebuild, scratch.allocator); + Dqn_Print_StdLnF(Dqn_PrintStd_Out, "%.*s\n", DQN_STRING_FMT(cmd)); + } else { + Dqn_CPPBuild_ExecOrAbort(build_context, Dqn_CPPBuildMode_CacheBuild); + } + } + 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, " raylib: %.2fms", Dqn_OS_PerfCounterMs(raylib_timings[0], raylib_timings[1])); Dqn_Print_StdLnF(Dqn_PrintStd_Out, " feely pona sprite packer: %.2fms", Dqn_OS_PerfCounterMs(feely_pona_sprite_packer_timings[0], feely_pona_sprite_packer_timings[1])); Dqn_Print_StdLnF(Dqn_PrintStd_Out, " feely pona (no dll): %.2fms", Dqn_OS_PerfCounterMs(feely_pona_no_dll_timings[0], feely_pona_no_dll_timings[1])); Dqn_Print_StdLnF(Dqn_PrintStd_Out, " feely pona (dll): %.2fms", Dqn_OS_PerfCounterMs(feely_pona_dll_timings[0], feely_pona_dll_timings[1])); Dqn_Print_StdLnF(Dqn_PrintStd_Out, " feely pona (platform-raylib): %.2fms", Dqn_OS_PerfCounterMs(feely_pona_platform_timings[0], feely_pona_platform_timings[1])); + Dqn_Print_StdLnF(Dqn_PrintStd_Out, " raylib (emscripten): %.2fms", Dqn_OS_PerfCounterMs(raylib_emscripten_timings[0], raylib_emscripten_timings[1])); + Dqn_Print_StdLnF(Dqn_PrintStd_Out, " feely pona (emscripten): %.2fms", Dqn_OS_PerfCounterMs(feely_pona_emscripten_timings[0], feely_pona_emscripten_timings[1])); return 0; } diff --git a/feely_pona_entity.h b/feely_pona_entity.h index 6f31a8b..c8cea44 100644 --- a/feely_pona_entity.h +++ b/feely_pona_entity.h @@ -1,6 +1,6 @@ -#if defined(__clang__) -#pragma once -#include "feely_pona_unity.h" +#if defined(_CLANGD) + #pragma once + #include "feely_pona_unity.h" #endif enum FP_EntityType diff --git a/feely_pona_entity_create.cpp b/feely_pona_entity_create.cpp index 3d10fe2..a49afa8 100644 --- a/feely_pona_entity_create.cpp +++ b/feely_pona_entity_create.cpp @@ -1,6 +1,6 @@ -#if defined(__clang__) -#pragma once -#include "feely_pona_unity.h" +#if defined(_CLANGD) + #pragma once + #include "feely_pona_unity.h" #endif static bool FP_Entity_IsBuildingForMobs(FP_GameEntity *entity) diff --git a/feely_pona_game.cpp b/feely_pona_game.cpp index 9fb570e..bc9bd23 100644 --- a/feely_pona_game.cpp +++ b/feely_pona_game.cpp @@ -1,6 +1,6 @@ -#if defined(__clang__) -#pragma once -#include "feely_pona_unity.h" +#if defined(_CLANGD) + #pragma once + #include "feely_pona_unity.h" #endif #define FP_Game_MetersToPixelsNx1(game, val) ((val) * (game).meters_to_pixels) @@ -210,7 +210,7 @@ static FP_GameEntity *FP_Game_MakeEntityPointerFV(FP_Game *game, DQN_FMT_STRING_ game->play.entity_free_list = game->play.entity_free_list->next; result->next = nullptr; } else { - if (game->play.entities.size >= (FP_GAME_ENTITY_HANDLE_INDEX_MAX + 1)) + if (game->play.entities.size > FP_GAME_ENTITY_HANDLE_INDEX_MAX) return result; result = Dqn_VArray_Make(&game->play.entities, Dqn_ZeroMem_Yes); @@ -583,7 +583,7 @@ static Dqn_Slice FP_Game_AStarPathFind(FP_Game *game, Dqn_DSMap_MakeKeyU64(&astar_info, src_tile_u64).value->tile = src_tile; // NOTE: Do the A* process ===================================================================== - Dqn_usize last_successful_manhattan_dist = UINT64_MAX; + Dqn_usize last_successful_manhattan_dist = DQN_USIZE_MAX; Dqn_V2I last_successful_tile = src_tile; auto zone_astar_expand = Dqn_Profiler_BeginZoneWithIndex(DQN_STRING8("FP_Update: A* expand"), FP_ProfileZone_FPUpdate_AStarExpand); @@ -748,7 +748,6 @@ static Dqn_V2 FP_Game_CalcWaypointWorldPos(FP_Game *game, FP_GameEntityHandle en case FP_GameWaypointType_Queue: { Dqn_ArrayFindResult find_result = Dqn_FArray_Find(&waypoint_entity->building_queue, entity_handle); Dqn_usize index_in_queue = find_result.index; - Dqn_Rect entity_hit_box = FP_Game_CalcEntityWorldHitBox(game, entity_handle); Dqn_Rect waypoint_hit_box = FP_Game_CalcEntityWorldHitBox(game, waypoint_entity->handle); Dqn_V2 queue_starting_p = {}; diff --git a/feely_pona_game.h b/feely_pona_game.h index b1791e2..9b01fcf 100644 --- a/feely_pona_game.h +++ b/feely_pona_game.h @@ -1,6 +1,6 @@ -#if defined(__clang__) -#pragma once -#include "feely_pona_unity.h" +#if defined(_CLANGD) + #pragma once + #include "feely_pona_unity.h" #endif enum FP_GameEntityFlag @@ -50,7 +50,7 @@ const uint64_t FP_GAME_ENTITY_HANDLE_GENERATION_RSHIFT = 48; const uint64_t FP_GAME_ENTITY_HANDLE_GENERATION_MAX = FP_GAME_ENTITY_HANDLE_GENERATION_MASK >> FP_GAME_ENTITY_HANDLE_GENERATION_RSHIFT; const uint64_t FP_GAME_ENTITY_HANDLE_INDEX_MASK = 0x0000'FFFF'FFFF'FFFF; -const uint64_t FP_GAME_ENTITY_HANDLE_INDEX_MAX = FP_GAME_ENTITY_HANDLE_INDEX_MASK - 1; +const uint64_t FP_GAME_ENTITY_HANDLE_INDEX_MAX = FP_GAME_ENTITY_HANDLE_INDEX_MASK; struct FP_GameEntityHandle { uint64_t id; diff --git a/feely_pona_misc.cpp b/feely_pona_misc.cpp index 71a88a5..a4dd324 100644 --- a/feely_pona_misc.cpp +++ b/feely_pona_misc.cpp @@ -1,6 +1,6 @@ -#if defined(__clang__) -#pragma once -#include "feely_pona_unity.h" +#if defined(_CLANGD) + #pragma once + #include "feely_pona_unity.h" #endif void FP_UnitTests(TELY_Platform *platform) diff --git a/feely_pona_stdlib.h b/feely_pona_stdlib.h index c270549..9e29833 100644 --- a/feely_pona_stdlib.h +++ b/feely_pona_stdlib.h @@ -1,6 +1,6 @@ -#if defined(__clang__) -#pragma once -#include "feely_pona_unity.h" +#if defined(_CLANGD) + #pragma once + #include "feely_pona_unity.h" #endif template @@ -138,8 +138,8 @@ template FP_SentinelListLink *FP_SentinelList_Find(FP_SentinelList const *list, T const &find) { FP_SentinelListLink *result = nullptr; - for (FP_SentinelListLink *link = nullptr; - !result && FP_SentinelList_Iterate(DQN_CAST(FP_SentinelList *)list, &link); ) { + for (FP_SentinelListLink *link = nullptr; + !result && FP_SentinelList_Iterate(DQN_CAST(FP_SentinelList *)list, &link); ) { if (link->data == find) result = link; } diff --git a/feely_pona_unity_nodll.cpp b/feely_pona_unity_nodll.cpp new file mode 100644 index 0000000..21e4e76 --- /dev/null +++ b/feely_pona_unity_nodll.cpp @@ -0,0 +1 @@ +#include "feely_pona_unity_nodll.h" diff --git a/feely_pona_unity_nodll.h b/feely_pona_unity_nodll.h index 79b4089..5574512 100644 --- a/feely_pona_unity_nodll.h +++ b/feely_pona_unity_nodll.h @@ -42,14 +42,14 @@ DQN_GCC_WARNING_PUSH DQN_GCC_WARNING_DISABLE(-Wunused-function) -#include "External/tely/external/stb/stb_image.h" +#include "External/tely/External/stb/stb_image.h" DQN_GCC_WARNING_POP // ================================================================================================= -#include "External/tely/external/raylib/raylib.h" -#include "External/tely/external/raylib/rlgl.h" -#include "External/tely/external/raylib/external/glfw/include/GLFW/glfw3.h" +#include "External/tely/External/raylib/raylib.h" +#include "External/tely/External/raylib/rlgl.h" +#include "External/tely/External/raylib/external/glfw/include/GLFW/glfw3.h" // NOTE: TELY ====================================================================================== diff --git a/project.rdbg b/project.rdbg index 75dc760..f32db4b 100644 Binary files a/project.rdbg and b/project.rdbg differ