cmake_minimum_required(VERSION 3.21)
project(EmotesLoader LANGUAGES CXX RC)
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>")
set(IMGUI_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../emotes_dll_source/build_fixed/_deps/imgui-src" CACHE PATH "Dear ImGui source")
if(NOT EXISTS "${IMGUI_DIR}/imgui.cpp")
  include(FetchContent)
  FetchContent_Declare(imgui GIT_REPOSITORY https://github.com/ocornut/imgui.git GIT_TAG v1.91.5 GIT_SHALLOW TRUE)
  FetchContent_MakeAvailable(imgui)
  set(IMGUI_DIR "${imgui_SOURCE_DIR}")
endif()
add_library(loader_imgui STATIC ${IMGUI_DIR}/imgui.cpp ${IMGUI_DIR}/imgui_draw.cpp ${IMGUI_DIR}/imgui_widgets.cpp ${IMGUI_DIR}/imgui_tables.cpp ${IMGUI_DIR}/backends/imgui_impl_win32.cpp ${IMGUI_DIR}/backends/imgui_impl_dx11.cpp)
target_include_directories(loader_imgui PUBLIC ${IMGUI_DIR} ${IMGUI_DIR}/backends)
target_compile_definitions(loader_imgui PUBLIC IMGUI_DEFINE_MATH_OPERATORS NOMINMAX WIN32_LEAN_AND_MEAN UNICODE _UNICODE)
add_library(manual_map STATIC src/ManualMap.cpp)
target_include_directories(manual_map PUBLIC src)
target_compile_definitions(manual_map PUBLIC NOMINMAX WIN32_LEAN_AND_MEAN UNICODE _UNICODE)
target_compile_options(manual_map PRIVATE /GS- /GL- /utf-8)
set_source_files_properties(src/ManualMap.cpp PROPERTIES COMPILE_OPTIONS "/guard:cf-")
add_executable(EmotesLoader WIN32 src/Main.cpp src/PreviewAudio.cpp src/Preview3D.cpp src/Cloud.cpp src/Library.cpp assets/loader.rc ../emotes_dll_source/src/ui/ImageTexture.cpp ../emotes_dll_source/assets/fonts.rc)
target_include_directories(EmotesLoader PRIVATE assets thirdparty ../emotes_dll_source/src ../emotes_dll_source/assets)
target_compile_options(EmotesLoader PRIVATE /utf-8 /W4)
target_link_options(EmotesLoader PRIVATE /INCREMENTAL:NO /OPT:NOICF)
target_link_libraries(EmotesLoader PRIVATE manual_map loader_imgui d3d11 d3dcompiler dxgi dwmapi windowscodecs ole32 shell32 comdlg32 winmm winhttp bcrypt)
set_target_properties(EmotesLoader PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin")
enable_testing()
add_executable(MapperHost tests/Host.cpp)
add_library(MapperFixture SHARED tests/Fixture.cpp ../emotes_dll_source/src/core/ManualMapSupport.cpp)
target_compile_options(MapperFixture PRIVATE /Zc:threadSafeInit-)
add_executable(MapperTests tests/MapperTests.cpp)
target_link_libraries(MapperTests PRIVATE manual_map)
target_link_options(MapperTests PRIVATE /INCREMENTAL:NO /OPT:NOICF)
add_test(NAME manual_map_owned_process COMMAND MapperTests $<TARGET_FILE:MapperHost> $<TARGET_FILE:MapperFixture>)
add_executable(LibraryTests tests/LibraryTests.cpp src/Library.cpp)
target_include_directories(LibraryTests PRIVATE src ../emotes_dll_source/src)
target_compile_definitions(LibraryTests PRIVATE NOMINMAX WIN32_LEAN_AND_MEAN UNICODE _UNICODE)
target_link_libraries(LibraryTests PRIVATE shell32 ole32)
add_test(NAME library_and_config COMMAND LibraryTests "${CMAKE_CURRENT_SOURCE_DIR}/../work/repair_pack")
add_executable(CloudTests tests/CloudTests.cpp src/Cloud.cpp src/Library.cpp)
target_include_directories(CloudTests PRIVATE src ../emotes_dll_source/src)
target_compile_definitions(CloudTests PRIVATE NOMINMAX WIN32_LEAN_AND_MEAN UNICODE _UNICODE)
target_link_libraries(CloudTests PRIVATE shell32 ole32 winhttp bcrypt)
add_test(NAME cloud_release_metadata COMMAND CloudTests)
add_executable(Preview3DTests tests/Preview3DTests.cpp src/Preview3D.cpp src/Library.cpp ../emotes_dll_source/src/ui/ImageTexture.cpp)
target_include_directories(Preview3DTests PRIVATE src thirdparty ../emotes_dll_source/src)
target_compile_definitions(Preview3DTests PRIVATE NOMINMAX WIN32_LEAN_AND_MEAN UNICODE _UNICODE)
target_compile_options(Preview3DTests PRIVATE /utf-8)
target_link_libraries(Preview3DTests PRIVATE d3d11 d3dcompiler windowscodecs ole32 shell32)
add_test(NAME native_3d_previews COMMAND Preview3DTests "${CMAKE_CURRENT_SOURCE_DIR}/../work/loader_preview_assets" "${CMAKE_CURRENT_SOURCE_DIR}/../work/repair_pack")
add_executable(PreviewAudioTests tests/PreviewAudioTests.cpp src/PreviewAudio.cpp)
target_include_directories(PreviewAudioTests PRIVATE src)
target_compile_definitions(PreviewAudioTests PRIVATE NOMINMAX WIN32_LEAN_AND_MEAN UNICODE _UNICODE)
target_link_libraries(PreviewAudioTests PRIVATE winmm)
add_test(NAME preview_audio_pause_resume COMMAND PreviewAudioTests "${CMAKE_CURRENT_SOURCE_DIR}/../work/repair_pack/music/SunnyStroll_r4.wav" "${CMAKE_CURRENT_SOURCE_DIR}/../work/repair_pack/music/SunnyStroll_r4_intro.wav")
set_tests_properties(preview_audio_pause_resume PROPERTIES SKIP_RETURN_CODE 77)
add_executable(PreviewTimelineTests tests/PreviewTimelineTests.cpp)
target_include_directories(PreviewTimelineTests PRIVATE src)
add_test(NAME preview_audio_animation_phase COMMAND PreviewTimelineTests)
add_test(NAME self_update_install_and_rollback COMMAND powershell.exe -NoProfile -NonInteractive -ExecutionPolicy Bypass -File "${CMAKE_CURRENT_SOURCE_DIR}/tests/UpdateInstallerTests.ps1" -Installer "${CMAKE_CURRENT_SOURCE_DIR}/assets/install-update.ps1" -Loader $<TARGET_FILE:EmotesLoader> -Dll "${CMAKE_CURRENT_SOURCE_DIR}/../emotes_dll_source/build_fixed/bin/emotes.dll")
add_executable(ReleaseDisplayTests tests/ReleaseDisplayTests.cpp)
target_include_directories(ReleaseDisplayTests PRIVATE src)
add_test(NAME github_release_display COMMAND ReleaseDisplayTests)
add_test(NAME standalone_content_and_exe_update COMMAND powershell.exe -NoProfile -NonInteractive -ExecutionPolicy Bypass -File "${CMAKE_CURRENT_SOURCE_DIR}/tests/StandaloneInstallTests.ps1" -Installer "${CMAKE_CURRENT_SOURCE_DIR}/assets/install-update.ps1" -Loader $<TARGET_FILE:EmotesLoader> -Dll "${CMAKE_CURRENT_SOURCE_DIR}/../emotes_dll_source/build_fixed/bin/emotes.dll")
