Files
dayz-dma/CMakeLists.txt
T
67 361c6baa8f feat: add relay-backed web radar sharing
- publish radar state/bootstrap snapshots to an HTTP relay
- add shared waypoint sync through relay APIs and SSE updates
- add remote Caddy/deploy tooling and mock relay push script
- add static POIs, topo-tile availability checks, and tile-load throttling
- add WASM 3D map engine and Python map data-prep pipeline
- update worn clothing reads to include slot metadata
- add grid controls, render perf HUD, and marker/label scaling tweaks
- remove embedded map resource generation in favor of disk/relay maps
2026-06-23 03:11:52 +08:00

279 lines
11 KiB
CMake

cmake_minimum_required(VERSION 3.20)
project(dayz-memory-cpp CXX)
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
# -------------------------------------------------------------------------
# Platform guard
# -------------------------------------------------------------------------
if(NOT WIN32)
message(FATAL_ERROR "dayz-memory-cpp is Windows-only (requires VolkDMA / WinAPI)")
endif()
# -------------------------------------------------------------------------
# Paths to VolkDMA (sibling checkout)
# -------------------------------------------------------------------------
set(VOLKDMA_ROOT "${CMAKE_CURRENT_SOURCE_DIR}/../dayz-dma/dma-dayz-cpp-master/VolkDMA")
# -------------------------------------------------------------------------
# Dependencies — nlohmann/json, spdlog via FetchContent; ImGui from local copy
# -------------------------------------------------------------------------
include(FetchContent)
FetchContent_Declare(json
URL https://github.com/nlohmann/json/releases/download/v3.11.3/json.tar.xz
URL_HASH SHA256=d6c65aca6b1ed68e7a182f4757257b107ae403032760ed6ef121c9d55e81757d
)
FetchContent_Declare(spdlog
GIT_REPOSITORY https://github.com/gabime/spdlog.git
GIT_TAG v1.14.1
GIT_SHALLOW TRUE
)
# cpp-httplib — header-only HTTP/1.1 server used by WebRadarServer
FetchContent_Declare(httplib
URL https://github.com/yhirose/cpp-httplib/archive/refs/tags/v0.18.1.tar.gz
DOWNLOAD_EXTRACT_TIMESTAMP TRUE
)
# stb — single-file image load/write libraries
FetchContent_Declare(stb
GIT_REPOSITORY https://github.com/nothings/stb.git
GIT_TAG master
GIT_SHALLOW TRUE
)
FetchContent_MakeAvailable(json spdlog httplib stb)
# Vendored Lumin ImGui (1.91.3 + FreeType) and its menu framework.
set(LUMIN_DIR "${CMAKE_CURRENT_SOURCE_DIR}/external/lumin")
set(IMGUI_DIR "${LUMIN_DIR}/thirdparty/imgui")
set(FREETYPE_DIR "${LUMIN_DIR}/thirdparty/freetype")
set(FRAMEWORK_DIR "${LUMIN_DIR}/framework")
# -------------------------------------------------------------------------
# ImGui sources (Lumin's bundled ImGui + FreeType atlas builder)
# -------------------------------------------------------------------------
set(IMGUI_SOURCES
"${IMGUI_DIR}/imgui.cpp"
"${IMGUI_DIR}/imgui_draw.cpp"
"${IMGUI_DIR}/imgui_tables.cpp"
"${IMGUI_DIR}/imgui_widgets.cpp"
"${IMGUI_DIR}/imgui_freetype.cpp"
"${IMGUI_DIR}/backends/imgui_impl_win32.cpp"
"${IMGUI_DIR}/backends/imgui_impl_dx11.cpp"
)
# -------------------------------------------------------------------------
# Lumin menu framework sources (the actual menu UI)
# -------------------------------------------------------------------------
set(FRAMEWORK_SOURCES
"${FRAMEWORK_DIR}/gui.cpp"
"${FRAMEWORK_DIR}/helpers/draw.cpp"
"${FRAMEWORK_DIR}/helpers/fonts.cpp"
"${FRAMEWORK_DIR}/widgets/helpers.cpp"
"${FRAMEWORK_DIR}/widgets/notify.cpp"
"${FRAMEWORK_DIR}/widgets/text_field.cpp"
"${FRAMEWORK_DIR}/widgets/widgets.cpp"
"${FRAMEWORK_DIR}/widgets/window.cpp"
)
# -------------------------------------------------------------------------
# Sources — project + VolkDMA implementation files
# -------------------------------------------------------------------------
file(GLOB_RECURSE PROJECT_SOURCES "src/*.cpp")
# Explicit list ensures new files are picked up without a CMake cache reset.
list(APPEND PROJECT_SOURCES
"${CMAKE_CURRENT_SOURCE_DIR}/src/SigScanner/SigScanner.cpp"
"${CMAKE_CURRENT_SOURCE_DIR}/src/Overlay/BoneInterpolator.cpp"
"${CMAKE_CURRENT_SOURCE_DIR}/src/Overlay/OverlayWindow.cpp"
"${CMAKE_CURRENT_SOURCE_DIR}/src/Overlay/GameOverlay.cpp"
"${CMAKE_CURRENT_SOURCE_DIR}/src/Web/ServerPublisher.cpp"
)
list(REMOVE_DUPLICATES PROJECT_SOURCES)
set(VOLKDMA_SOURCES
"${VOLKDMA_ROOT}/src/dma.cpp"
"${VOLKDMA_ROOT}/src/process.cpp"
"${VOLKDMA_ROOT}/src/inputstate.cpp"
)
# -------------------------------------------------------------------------
# EmbeddedMaps stub — maps are served from the relay server, not baked into the binary.
# MapTileService falls back to this when no disk PNG is found; returning
# {nullptr, 0} means it will always load from maps/ on disk (or return 404).
# -------------------------------------------------------------------------
set(EMBEDDED_MAPS_CPP "${CMAKE_CURRENT_BINARY_DIR}/EmbeddedMaps.cpp")
file(WRITE "${EMBEDDED_MAPS_CPP}"
"// Auto-generated by CMake — maps served from relay server, no embedded resources.
#include \"EmbeddedMaps.h\"
std::pair<const uint8_t*, size_t> GetEmbeddedMap(const std::string&) {
return {nullptr, 0};
}
")
add_executable(dayz-memory-cpp
${PROJECT_SOURCES}
${VOLKDMA_SOURCES}
${IMGUI_SOURCES}
${FRAMEWORK_SOURCES}
)
target_sources(dayz-memory-cpp PRIVATE "${EMBEDDED_MAPS_CPP}")
# -------------------------------------------------------------------------
# Include directories
# -------------------------------------------------------------------------
target_include_directories(dayz-memory-cpp PRIVATE
# Own source tree
"${CMAKE_CURRENT_SOURCE_DIR}/src"
# ImGui core + Win32/DX11 backends
"${IMGUI_DIR}"
"${IMGUI_DIR}/backends"
# FreeType headers (atlas builder)
"${FREETYPE_DIR}/include"
# Lumin framework root — lets sources include "framework/headers/includes.h"
"${LUMIN_DIR}"
"${FRAMEWORK_DIR}"
# VolkDMA repo root — VolkDMA's own source files use paths like
# "include/VolkDMA/dma.hh" and "external/vmm/vmmdll.h" that are
# relative to this root, so this entry must come first.
"${VOLKDMA_ROOT}"
# VolkDMA public headers (provides <VolkDMA/dma.hh> etc.)
"${VOLKDMA_ROOT}/include"
# VolkLog (required by VolkDMA's dma.cpp / process.cpp)
"${VOLKDMA_ROOT}/external/VolkLog/include"
# Raw vmmdll / leechcore headers (used in VmmAccessor.cpp + VolkDMA sources)
"${VOLKDMA_ROOT}/external/vmm"
"${VOLKDMA_ROOT}/external/leechcore"
# cpp-httplib (header-only; FetchContent populates httplib_SOURCE_DIR)
"${httplib_SOURCE_DIR}"
# stb (header-only image library; stb_impl.cpp provides the implementation)
"${stb_SOURCE_DIR}"
)
# -------------------------------------------------------------------------
# Link directories
# -------------------------------------------------------------------------
target_link_directories(dayz-memory-cpp PRIVATE
"${VOLKDMA_ROOT}/external/vmm"
"${VOLKDMA_ROOT}/external/leechcore"
)
# -------------------------------------------------------------------------
# Link libraries
# -------------------------------------------------------------------------
target_link_libraries(dayz-memory-cpp PRIVATE
nlohmann_json::nlohmann_json
spdlog::spdlog
vmm
leechcore
# FreeType (prebuilt x64) — Lumin font atlas builder
"${FREETYPE_DIR}/win64/freetype.lib"
# DirectX 11 + DXGI (for ImGui DX11 window)
d3d11
dxgi
# WinSock2 — required by cpp-httplib on Windows
Ws2_32
)
# -------------------------------------------------------------------------
# Post-build: copy VolkDMA runtime DLLs next to the executable.
# Without these (vmm.dll, leechcore.dll, FTD3XX.dll) the process exits with
# 0xC0000135 (STATUS_DLL_NOT_FOUND) immediately on launch.
# -------------------------------------------------------------------------
set(VOLKDMA_DLLS_DIR "${VOLKDMA_ROOT}/dlls")
foreach(DLL vmm.dll leechcore.dll FTD3XX.dll)
add_custom_command(TARGET dayz-memory-cpp POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_if_different
"${VOLKDMA_DLLS_DIR}/${DLL}"
"$<TARGET_FILE_DIR:dayz-memory-cpp>/${DLL}"
COMMENT "Copying ${DLL} to output directory"
)
endforeach()
# Copy webroot/ directory next to the executable so the HTTP server can serve it.
add_custom_command(TARGET dayz-memory-cpp POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_directory
"${CMAKE_CURRENT_SOURCE_DIR}/webroot"
"$<TARGET_FILE_DIR:dayz-memory-cpp>/webroot"
COMMENT "Copying webroot to output directory"
)
# Copy the Lumin icon font next to the executable so the menu's tab icons load
# (flaticon_uicons_regular_rounded_path is resolved relative to the work dir).
add_custom_command(TARGET dayz-memory-cpp POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_directory
"${FRAMEWORK_DIR}/data/uicons"
"$<TARGET_FILE_DIR:dayz-memory-cpp>/data/uicons"
COMMENT "Copying Lumin uicons font to output directory"
)
# Copy config/ directory next to the executable (config.cfg, item_filters.json).
add_custom_command(TARGET dayz-memory-cpp POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_directory
"${CMAKE_CURRENT_SOURCE_DIR}/config"
"$<TARGET_FILE_DIR:dayz-memory-cpp>/config"
COMMENT "Copying config to output directory"
)
# Copy maps/ directory next to the executable so MapTileService can find PNGs.
# maps/ is git-ignored (user-supplied), so only copy when it exists.
if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/maps")
add_custom_command(TARGET dayz-memory-cpp POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_directory
"${CMAKE_CURRENT_SOURCE_DIR}/maps"
"$<TARGET_FILE_DIR:dayz-memory-cpp>/maps"
COMMENT "Copying maps to output directory"
)
endif()
# Copy data/processed/ next to the executable so the 3D HTTP routes can serve it.
# Only copy when the directory exists (requires running: py -m dayzmap fakedata).
if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/data/processed")
add_custom_command(TARGET dayz-memory-cpp POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_directory
"${CMAKE_CURRENT_SOURCE_DIR}/data/processed"
"$<TARGET_FILE_DIR:dayz-memory-cpp>/data/processed"
COMMENT "Copying processed map data to output directory"
)
endif()
# -------------------------------------------------------------------------
# Compiler definitions
# -------------------------------------------------------------------------
target_compile_definitions(dayz-memory-cpp PRIVATE
_WIN32_WINNT=0x0601
# Build the ImGui font atlas with FreeType (Lumin requirement; also set in
# the vendored imconfig.h, kept here so every TU agrees).
IMGUI_ENABLE_FREETYPE
IMGUI_DEFINE_MATH_OPERATORS
# WIN32_LEAN_AND_MEAN is intentionally NOT set globally: vmmdll.h requires
# NTSTATUS from <winternl.h>, which windows.h omits when LEAN_AND_MEAN is
# defined. Our own headers define it locally before including <Windows.h>.
NOMINMAX
)
# -------------------------------------------------------------------------
# MSVC-specific flags
# -------------------------------------------------------------------------
if(MSVC)
target_compile_options(dayz-memory-cpp PRIVATE
/W4
/WX- # vmmdll / VolkDMA headers generate some W4 noise
/permissive-
/utf-8
)
endif()