cmake_minimum_required(VERSION 3.25)
project(DustRecomp VERSION 0.1 LANGUAGES CXX)
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
option(DUST_STATIC_RUNTIME "Link the MSVC runtime into the executables" ON)
option(DUST_BUILD_TOOLS "Build developer probes and laboratories" OFF)
option(BUILD_TESTING "Build private regression tests (requires tests directory)" OFF)
if(MSVC AND DUST_STATIC_RUNTIME)
    set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>")
endif()
add_library(dust_gpu src/gpu_presenter.cpp)
target_include_directories(dust_gpu PUBLIC src)
target_compile_definitions(dust_gpu PUBLIC UNICODE _UNICODE NOMINMAX WIN32_LEAN_AND_MEAN)
target_link_libraries(dust_gpu PUBLIC d3d11 dxgi d3dcompiler)
add_library(dust_settings src/display_settings.cpp)
target_include_directories(dust_settings PUBLIC src)
target_compile_definitions(dust_settings PUBLIC UNICODE _UNICODE NOMINMAX WIN32_LEAN_AND_MEAN)
target_compile_options(dust_settings PUBLIC /utf-8)
add_library(dust_core src/dust.cpp src/scene.cpp src/vm.cpp src/dialogue.cpp src/contexts.cpp src/movie.cpp src/game.cpp src/game_ball.cpp src/game_save.cpp src/sound.cpp src/game_render.cpp src/scaler.cpp src/restoration.cpp src/restoration_temporal.cpp src/checkers.cpp)
target_include_directories(dust_core PUBLIC src)
target_compile_options(dust_core PRIVATE /W4 /permissive-)
if(DUST_BUILD_TOOLS OR BUILD_TESTING)
add_executable(dust_probe src/probe.cpp)
target_link_libraries(dust_probe PRIVATE dust_core)
add_executable(dust_scenes src/scene_probe.cpp)
target_link_libraries(dust_scenes PRIVATE dust_core)
add_executable(dust_vm src/vm_probe.cpp)
target_link_libraries(dust_vm PRIVATE dust_core)
add_executable(dust_puppet src/window.cpp)
add_executable(dust_dialogue src/dialogue_probe.cpp)
target_link_libraries(dust_dialogue PRIVATE dust_core)
add_executable(dust_movie src/movie_probe.cpp)
target_link_libraries(dust_movie PRIVATE dust_core)
add_executable(dust_contexts src/contexts_probe.cpp)
target_link_libraries(dust_contexts PRIVATE dust_core)
add_executable(dust_game_probe src/game_probe.cpp)
add_executable(dust_gameplay_audit src/gameplay_audit.cpp)
target_link_libraries(dust_gameplay_audit PRIVATE dust_core)
target_link_libraries(dust_game_probe PRIVATE dust_core)
add_executable(dust_game_render src/game_render_probe.cpp)
target_link_libraries(dust_game_render PRIVATE dust_core)
add_executable(dust_sound src/sound_probe.cpp)
target_link_libraries(dust_sound PRIVATE dust_core)
endif()
add_executable(dust_game src/game_window.cpp src/movie_window.cpp src/sound_window.cpp src/cursor_window.cpp)
target_compile_definitions(dust_game PRIVATE UNICODE _UNICODE NOMINMAX WIN32_LEAN_AND_MEAN)
target_link_libraries(dust_game PRIVATE dust_core dust_settings dust_gpu user32 gdi32 winmm comdlg32)
add_executable(dust_launcher WIN32 src/launcher.cpp)
target_link_libraries(dust_launcher PRIVATE dust_settings user32 gdi32 comctl32 ole32 shell32 uuid)
if(DUST_BUILD_TOOLS OR BUILD_TESTING)
target_compile_definitions(dust_puppet PRIVATE UNICODE _UNICODE NOMINMAX WIN32_LEAN_AND_MEAN)
target_link_libraries(dust_puppet PRIVATE dust_core user32 gdi32 winmm)
endif()
install(TARGETS dust_launcher dust_game RUNTIME DESTINATION .)
install(FILES LICENSE THIRD_PARTY.md DESTINATION .)
if(BUILD_TESTING)
enable_testing()
add_executable(dust_visual_effect_test tests/visual_effect.cpp)
target_include_directories(dust_visual_effect_test PRIVATE src)
add_test(NAME visual_effect_geometry COMMAND dust_visual_effect_test)
add_executable(dust_gpu_test tests/gpu_presenter.cpp)
target_link_libraries(dust_gpu_test PRIVATE dust_gpu user32)
add_test(NAME gpu_frame_presentation COMMAND dust_gpu_test)
add_test(NAME core_safety COMMAND dust_probe --test)
add_test(NAME typed_vm_core COMMAND dust_vm --test)
add_test(NAME dialogue_continuation COMMAND dust_dialogue --test)
add_test(NAME movie_model COMMAND dust_movie --test)
add_executable(dust_movie_extended_test tests/movie_extended.cpp)
target_link_libraries(dust_movie_extended_test PRIVATE dust_core)
target_compile_definitions(dust_movie_extended_test PRIVATE DUST_TEST_SOURCE="${CMAKE_CURRENT_SOURCE_DIR}")
add_test(NAME movie_extended COMMAND dust_movie_extended_test)
add_executable(dust_checkers_test tests/checkers.cpp)
target_link_libraries(dust_checkers_test PRIVATE dust_core)
target_compile_definitions(dust_checkers_test PRIVATE DUST_TEST_SOURCE="${CMAKE_CURRENT_SOURCE_DIR}")
add_test(NAME checkers_plugin COMMAND dust_checkers_test)
add_executable(dust_checkers_script_test tests/checkers_script.cpp)
target_link_libraries(dust_checkers_script_test PRIVATE dust_core)
add_test(NAME sound_model COMMAND dust_sound --test)
add_executable(dust_sound_output_test tests/sound_output.cpp src/sound_window.cpp)
target_compile_definitions(dust_sound_output_test PRIVATE UNICODE _UNICODE NOMINMAX WIN32_LEAN_AND_MEAN)
target_link_libraries(dust_sound_output_test PRIVATE dust_core dust_settings winmm)
add_test(NAME native_sound_looping COMMAND dust_sound_output_test)
add_test(NAME context_bounds COMMAND dust_contexts --test)
add_executable(dust_vm_routes tests/vm_routes.cpp)
target_link_libraries(dust_vm_routes PRIVATE dust_core)
add_test(NAME vm_context_routes COMMAND dust_vm_routes)
add_executable(dust_scaler src/scaler_probe.cpp)
target_link_libraries(dust_scaler PRIVATE dust_core)
add_test(NAME sprite_scaler COMMAND dust_scaler --test)
add_executable(dust_display_settings_test tests/display_settings.cpp)
target_link_libraries(dust_display_settings_test PRIVATE dust_settings)
add_test(NAME display_settings COMMAND dust_display_settings_test)
add_executable(dust_controls_test tests/controls.cpp)
target_link_libraries(dust_controls_test PRIVATE dust_core)
add_test(NAME control_input COMMAND dust_controls_test)
add_executable(dust_movie_window_test tests/movie_window.cpp src/movie_window.cpp)
target_compile_definitions(dust_movie_window_test PRIVATE UNICODE _UNICODE NOMINMAX WIN32_LEAN_AND_MEAN)
target_link_libraries(dust_movie_window_test PRIVATE dust_core user32 gdi32 winmm)
add_executable(dust_restoration_test tests/restoration.cpp)
target_link_libraries(dust_restoration_test PRIVATE dust_core)
add_test(NAME character_restoration COMMAND dust_restoration_test)
add_library(dust_restoration_reference STATIC tests/restoration_reference.cpp tests/restoration_adaptive_reference.cpp)
target_include_directories(dust_restoration_reference PUBLIC src tests)
target_link_libraries(dust_restoration_test PRIVATE dust_restoration_reference)
add_executable(dust_restoration_compare tests/restoration_compare.cpp)
target_link_libraries(dust_restoration_compare PRIVATE dust_core dust_restoration_reference)
add_executable(dust_restoration_adaptive_test tests/restoration_adaptive.cpp)
target_link_libraries(dust_restoration_adaptive_test PRIVATE dust_core dust_restoration_reference)
add_test(NAME adaptive_restoration_quality COMMAND dust_restoration_adaptive_test)
add_executable(dust_restoration_temporal_test tests/restoration_temporal.cpp)
target_link_libraries(dust_restoration_temporal_test PRIVATE dust_core)
add_test(NAME temporal_restoration_quality COMMAND dust_restoration_temporal_test)
add_executable(dust_restoration_sequence tests/restoration_sequence.cpp)
target_link_libraries(dust_restoration_sequence PRIVATE dust_core dust_restoration_reference)
endif()
