cmake_minimum_required(VERSION 3.20)
project(MoonWellWarcraftXL LANGUAGES CXX)

# WarcraftXL remains an upstream submodule. MoonWell modules are attached to
# its aggregate DLL target here, so updating the framework does not mix our
# client-specific offsets and policy into the upstream checkout.
add_subdirectory(vendor/warcraftxl)

set(WXL_EXTERNAL_MODULES_DIR "${CMAKE_CURRENT_SOURCE_DIR}/vendor/modules")

function(wxl_collect_sources output)
    file(GLOB_RECURSE collected CONFIGURE_DEPENDS ${ARGN})
    set(${output} "${collected}" PARENT_SCOPE)
endfunction()

if(TARGET WarcraftXL)
    wxl_collect_sources(WXL_MODERN_ASSETS_RUNTIME
        "${WXL_EXTERNAL_MODULES_DIR}/wxl-modern-assets/src/*.cpp"
        "${WXL_EXTERNAL_MODULES_DIR}/wxl-modern-assets/shared/*.cpp")
    if(WXL_MODERN_ASSETS_EXCLUDE_REGEX)
        list(FILTER WXL_MODERN_ASSETS_RUNTIME EXCLUDE REGEX
            "${WXL_MODERN_ASSETS_EXCLUDE_REGEX}")
    endif()
    wxl_collect_sources(WXL_MODERN_RENDER_RUNTIME
        "${WXL_EXTERNAL_MODULES_DIR}/wxl-modern-render/src/*.cpp")
    wxl_collect_sources(WXL_UNIT_OUTLINE_RUNTIME
        "${WXL_EXTERNAL_MODULES_DIR}/wxl-unit-outline/src/*.cpp")
    wxl_collect_sources(WXL_MODERN_ADT_RUNTIME
        "${WXL_EXTERNAL_MODULES_DIR}/wxl-modern-adt/src/*.cpp"
        "${WXL_EXTERNAL_MODULES_DIR}/wxl-modern-adt/shared/*.cpp")

    target_sources(WarcraftXL PRIVATE
        "${CMAKE_CURRENT_SOURCE_DIR}/modules/moonwell/src/MoonWell.cpp"
        ${WXL_MODERN_ASSETS_RUNTIME}
        ${WXL_MODERN_RENDER_RUNTIME}
        ${WXL_UNIT_OUTLINE_RUNTIME}
        ${WXL_MODERN_ADT_RUNTIME})

    # wxl-modern-render needs its module-root includes and D3D12 import library.
    include("${WXL_EXTERNAL_MODULES_DIR}/wxl-modern-render/module.cmake")
endif()

if(TARGET WarcraftXLHost)
    wxl_collect_sources(WXL_MODERN_ASSETS_HOST
        "${WXL_EXTERNAL_MODULES_DIR}/wxl-modern-assets/host/*.cpp"
        "${WXL_EXTERNAL_MODULES_DIR}/wxl-modern-assets/shared/*.cpp")
    if(WXL_MODERN_ASSETS_EXCLUDE_REGEX)
        list(FILTER WXL_MODERN_ASSETS_HOST EXCLUDE REGEX
            "${WXL_MODERN_ASSETS_EXCLUDE_REGEX}")
    endif()
    wxl_collect_sources(WXL_MODERN_ADT_HOST
        "${WXL_EXTERNAL_MODULES_DIR}/wxl-modern-adt/host/*.cpp"
        "${WXL_EXTERNAL_MODULES_DIR}/wxl-modern-adt/shared/*.cpp")

    target_sources(WarcraftXLHost PRIVATE
        ${WXL_MODERN_ASSETS_HOST}
        ${WXL_MODERN_ADT_HOST})
endif()

# Minimal native-D3D9 proxy retained as a recovery renderer. The regular
# package uses WarcraftXL's D3D9On12 proxy required by wxl-modern-render.
if(CMAKE_SIZEOF_VOID_P EQUAL 4)
    add_library(MoonWellLoader SHARED
        "${CMAKE_CURRENT_SOURCE_DIR}/loader/d3d9.cpp"
        "${CMAKE_CURRENT_SOURCE_DIR}/loader/d3d9.def")
    set_target_properties(MoonWellLoader PROPERTIES
        OUTPUT_NAME "d3d9-native"
        PREFIX ""
        RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/artifacts")
    target_compile_definitions(MoonWellLoader PRIVATE WIN32_LEAN_AND_MEAN NOMINMAX)
endif()
