Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
19 commits
Select commit Hold shift + click to select a range
e14fcdc
media: smaller files
illwieckz Oct 4, 2025
4f1fe1e
media: embed unifont
illwieckz Oct 4, 2025
ef93748
client: NUKE bigchars
illwieckz Oct 4, 2025
bf7dbd8
engine: add an empty “*daemon” builtin basepak, delete the daemon dpkdir
illwieckz Oct 4, 2025
dcebec8
engine: embed media files '*daemon-client' builtin pak
illwieckz Oct 4, 2025
b61e6ba
cl_main: do not error on font registration in tty client
illwieckz Oct 4, 2025
9cbd087
cmake: rename DaemonBuildInfo as DaemonSourceGenerator
illwieckz Oct 6, 2025
5bd7f03
DaemonSourceGenerator: rework it a bit
illwieckz Oct 6, 2025
02dfe9a
DaemonSourceGenerator: make the embedded file generator reusable
illwieckz Oct 3, 2025
3ea31c6
EmbedText make possible to chose between TEXT and BINARY formats when…
illwieckz Oct 6, 2025
d8dc9f4
DaemonSourceGenerator: provide embedded files as part as the namespace
illwieckz Oct 6, 2025
c997f71
EmbedText: split embedded source lines just in case if an editor or d…
illwieckz Oct 6, 2025
3c0a902
DaemonSourceGenerator: also add the generated source entry-point to t…
illwieckz Oct 6, 2025
4b03142
DaemonSourceGenerator: lowercase local variables (even if the leak ou…
illwieckz Oct 6, 2025
9e4e780
DaemonSourceGenerator: also make generated sources depend on EmbedTex…
illwieckz Oct 6, 2025
ff5cf6c
DaemonSourceGenerator: also make source depend on it to regenerate wh…
illwieckz Oct 6, 2025
5b12eb2
FileSystem: implement internal paks
illwieckz Oct 4, 2025
95e1b3e
DaemonSourceGenerator: explicit mkdir
illwieckz Oct 7, 2025
c9e7f9c
DaemonSourceGenerator: do not copy the embedded files in the map
illwieckz Oct 6, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
38 changes: 5 additions & 33 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,7 @@ if (Daemon_OUT)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${Daemon_OUT})
endif()

include(DaemonBuildInfo)
include(DaemonSourceGenerator)
include(DaemonPlatform)

################################################################################
Expand Down Expand Up @@ -1038,39 +1038,11 @@ if (BUILD_CLIENT)
Tests ${CLIENTTESTLIST}
)

# generate glsl include files
set(GLSL_SOURCE_DIR ${ENGINE_DIR}/renderer/glsl_source)
set(EMBED_INCLUDE_DIR ${CMAKE_CURRENT_BINARY_DIR}/embed_data)
file(MAKE_DIRECTORY ${EMBED_INCLUDE_DIR})
# Generate GLSL include files.
daemon_embed_files("EngineShaders" "GLSL" "TEXT" "client-objects")

set(SHADERS_CPP_TEXT "// This file is auto-generated by CMakeLists.txt.\n")
string(APPEND SHADERS_CPP_TEXT "#include \"common/Common.h\"\n\n")
set(SHADERMAP_TEXT "")

foreach(res ${GLSLSOURCELIST})
get_filename_component(filename_no_ext ${res} NAME_WE)
set(outpath ${EMBED_INCLUDE_DIR}/${filename_no_ext}.glsl.h)

add_custom_command(
OUTPUT ${outpath}
COMMAND ${CMAKE_COMMAND} "-DINPUT_FILE=${res}" "-DOUTPUT_FILE=${outpath}"
"-DVARIABLE_NAME=${filename_no_ext}_glsl" -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/EmbedText.cmake
MAIN_DEPENDENCY ${res}
)

set_property(TARGET client-objects APPEND PROPERTY SOURCES ${outpath})

string(APPEND SHADERS_CPP_TEXT "#include \"../embed_data/${filename_no_ext}.glsl.h\"\n")
string(APPEND SHADERMAP_TEXT "\t{ \"${filename_no_ext}.glsl\", ")
string(APPEND SHADERMAP_TEXT "std::string(reinterpret_cast<const char *>( ${filename_no_ext}_glsl ), ")
string(APPEND SHADERMAP_TEXT "sizeof( ${filename_no_ext}_glsl )) },\n")
endforeach()

string(APPEND SHADERS_CPP_TEXT "\nextern const std::unordered_map<std::string, std::string> shadermap\n{\n")
string(APPEND SHADERS_CPP_TEXT "${SHADERMAP_TEXT}")
string(APPEND SHADERS_CPP_TEXT "};\n")

daemon_write_generated("shaders.cpp" "${SHADERS_CPP_TEXT}")
# Generate media include files.
daemon_embed_files("EngineMedia" "MEDIA" "BINARY" "client-objects")
endif()

if (BUILD_SERVER)
Expand Down
4 changes: 2 additions & 2 deletions azure-pipelines.yml
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ jobs:
displayName: 'Build'
- bash: |
set -e
build/test-ttyclient -pakpath pkg -set fs_basepak daemon -set vm.cgame.type 3
build/test-ttyclient -pakpath pkg -set fs_basepak '*daemon' -set vm.cgame.type 3
displayName: 'Test'

- job: Linux
Expand Down Expand Up @@ -130,6 +130,6 @@ jobs:
displayName: 'Build'
- bash: |
set -e
SDL_VIDEODRIVER=offscreen ALSOFT_DRIVERS=null build/test-client -pakpath pkg -set fs_basepak daemon -set vm.cgame.type 3
SDL_VIDEODRIVER=offscreen ALSOFT_DRIVERS=null build/test-client -pakpath pkg -set fs_basepak '*daemon' -set vm.cgame.type 3
condition: "and(succeeded(), eq(variables.TOOLCHAIN_FILE, ''))"
displayName: 'Test'
44 changes: 0 additions & 44 deletions cmake/DaemonBuildInfo.cmake

This file was deleted.

2 changes: 1 addition & 1 deletion cmake/DaemonGame.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ option(BUILD_GAME_NATIVE_DLL "Build the shared library files, mostly useful for
option(BUILD_GAME_NATIVE_EXE "Build native executable, which might be used for better performances by server owners" OFF)

include(ExternalProject)
include(DaemonBuildInfo)
include(DaemonSourceGenerator)
include(DaemonPlatform)

# Do not report unused native compiler if native vms are not built.
Expand Down
139 changes: 139 additions & 0 deletions cmake/DaemonSourceGenerator.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,139 @@
set(DAEMON_TEXT_EMBEDDER "${CMAKE_CURRENT_SOURCE_DIR}/cmake/EmbedText.cmake")
set(DAEMON_SOURCE_GENERATOR "${CMAKE_CURRENT_SOURCE_DIR}/cmake/DaemonSourceGenerator.cmake")

set(DAEMON_GENERATED_SUBDIR "GeneratedSource")
set(DAEMON_GENERATED_DIR "${CMAKE_CURRENT_BINARY_DIR}/${DAEMON_GENERATED_SUBDIR}")

set(DAEMON_BUILDINFO_SUBDIR "DaemonBuildInfo")
set(DAEMON_EMBEDDED_SUBDIR "DaemonEmbeddedFiles")

set(DAEMON_BUILDINFO_DIR "${DAEMON_GENERATED_DIR}/${DAEMON_BUILDINFO_SUBDIR}")
set(DAEMON_EMBEDDED_DIR "${DAEMON_GENERATED_DIR}/${DAEMON_EMBEDDED_SUBDIR}")

file(MAKE_DIRECTORY "${DAEMON_GENERATED_DIR}")
include_directories("${DAEMON_GENERATED_DIR}")

file(MAKE_DIRECTORY "${DAEMON_BUILDINFO_DIR}")
file(MAKE_DIRECTORY "${DAEMON_EMBEDDED_DIR}")

set(DAEMON_GENERATED_HEADER "// Automatically generated, do not modify!\n")
set(DAEMON_GENERATED_CPP_EXT ".cpp")
set(DAEMON_GENERATED_H_EXT ".h")

set(BUILDINFOLIST)

foreach(kind CPP H)
set(DAEMON_BUILDINFO_${kind}_TEXT "${DAEMON_GENERATED_HEADER}")
endforeach()

macro(daemon_add_buildinfo type name value)
string(APPEND DAEMON_BUILDINFO_CPP_TEXT "const ${type} ${name}=${value};\n")
string(APPEND DAEMON_BUILDINFO_H_TEXT "extern const ${type} ${name};\n")
endmacro()

macro(daemon_write_generated generated_path generated_content)
set(DAEMON_GENERATED_FILE ${DAEMON_GENERATED_DIR}/${generated_path})

if (EXISTS "${DAEMON_GENERATED_FILE}")
file(READ "${DAEMON_GENERATED_FILE}" generated_content_read)
endif()

if (NOT "${generated_content}" STREQUAL "${generated_content_read}")
message(STATUS "Generating ${generated_path}")
file(WRITE "${DAEMON_GENERATED_FILE}" "${generated_content}")
endif()
endmacro()

macro(daemon_write_buildinfo name)
foreach(kind CPP H)
set(daemon_buildinfo_${kind}_name "${name}${DAEMON_GENERATED_${kind}_EXT}")
set(daemon_buildinfo_${kind}_path "${DAEMON_BUILDINFO_SUBDIR}/${daemon_buildinfo_${kind}_name}")

daemon_write_generated("${daemon_buildinfo_${kind}_path}" "${DAEMON_BUILDINFO_${kind}_TEXT}")
list(APPEND BUILDINFOLIST "${DAEMON_GENERATED_FILE}")
endforeach()
endmacro()

macro(daemon_embed_files basename slug format targetname)
set(embed_source_dir "${slug}_EMBED_DIR")
set(embed_source_list "${slug}_EMBED_LIST")

set(embed_subdir "${DAEMON_EMBEDDED_SUBDIR}/${basename}")
set(embed_dir "${DAEMON_GENERATED_DIR}/${embed_subdir}")

file(MAKE_DIRECTORY "${embed_dir}")

foreach(kind CPP H)
set(embed_${kind}_basename "${basename}${DAEMON_GENERATED_${kind}_EXT}")
set(embed_${kind}_src_file "${DAEMON_EMBEDDED_DIR}/${embed_${kind}_basename}")
set(embed_${kind}_file "${DAEMON_EMBEDDED_SUBDIR}/${embed_${kind}_basename}")
set(embed_${kind}_text "${DAEMON_GENERATED_HEADER}")
set_property(SOURCE "${embed_${kind}_src_file}" APPEND PROPERTY SOURCES "${DAEMON_SOURCE_GENERATOR}")
set_property(TARGET "${targetname}" APPEND PROPERTY SOURCES "${embed_${kind}_src_file}")
endforeach()

string(APPEND embed_CPP_text
"#include \"${embed_H_file}\"\n"
"\n"
"namespace ${basename} {\n"
)

string(APPEND embed_H_text
"#include \"common/Common.h\"\n"
"\n"
"namespace ${basename} {\n"
)

set(embed_map_text "")

foreach(filename ${${embed_source_list}})
string(REGEX REPLACE "[^A-Za-z0-9]" "_" filename_symbol "${filename}")

set(inpath "${${embed_source_dir}}/${filename}")
set(outpath "${embed_dir}/${filename_symbol}${DAEMON_GENERATED_H_EXT}")

set_property(SOURCE "${inpath}" APPEND PROPERTY SOURCES "${DAEMON_TEXT_EMBEDDER}")

add_custom_command(
OUTPUT "${outpath}"
COMMAND ${CMAKE_COMMAND}
"-DINPUT_FILE=${inpath}"
"-DOUTPUT_FILE=${outpath}"
"-DFILE_FORMAT=${format}"
"-DVARIABLE_NAME=${filename_symbol}"
-P "${DAEMON_TEXT_EMBEDDER}"
MAIN_DEPENDENCY ${inpath}
)

set_property(TARGET "${targetname}" APPEND PROPERTY SOURCES "${outpath}")

string(APPEND embed_CPP_text
"#include \"${basename}/${filename_symbol}.h\"\n"
)

string(APPEND embed_H_text
"extern const unsigned char ${filename_symbol}[];\n"
)

string(APPEND embed_map_text
"\t{ \"${filename}\", { ${filename_symbol}, sizeof( ${filename_symbol}) - 1 } },\n"
)
endforeach()

string(APPEND embed_CPP_text
"\n"
"const embeddedFileMap_t FileMap\n{\n"
"${embed_map_text}"
"};\n"
"}"
)

string(APPEND embed_H_text
"extern const embeddedFileMap_t FileMap;\n"
"};\n"
)

foreach(kind CPP H)
daemon_write_generated("${embed_${kind}_file}" "${embed_${kind}_text}")
endforeach()
endmacro()
36 changes: 32 additions & 4 deletions cmake/EmbedText.cmake
Original file line number Diff line number Diff line change
@@ -1,8 +1,36 @@
# Converts a text file into a C-language char array definition.
# For use in CMake script mode (cmake -P).
# Required definitions on command line: INPUT_FILE, OUTPUT_FILE, VARIABLE_NAME
# Required definitions on command line:
# INPUT_FILE, OUTPUT_FILE, FILE_FORMAT, VARIABLE_NAME

# Inspired by:
# https://stackoverflow.com/questions/11813271/embed-resources-eg-shader-code-images-into-executable-library-with-cmake/27206982#27206982

# Inspired by https://stackoverflow.com/questions/11813271/embed-resources-eg-shader-code-images-into-executable-library-with-cmake/27206982#27206982
file(READ ${INPUT_FILE} contents HEX)
string(REGEX REPLACE "(0d)?(..)" "0x\\2," contents ${contents}) # Strip \r for consistency
file(WRITE ${OUTPUT_FILE} "const unsigned char ${VARIABLE_NAME}[] = {${contents}};\n")

if ("${FILE_FORMAT}" STREQUAL "TEXT")
# Strip \r for consistency.
string(REGEX REPLACE "(0d)?(..)" "0x\\2," contents "${contents}")
elseif("${FILE_FORMAT}" STREQUAL "BINARY")
string(REGEX REPLACE "(..)" "0x\\1," contents "${contents}")
else()
message(FATAL_ERROR "Unknown file format: ${FILE_FORMAT}")
endif()

# Add null terminator.
string(REGEX REPLACE ",$" ",0x00," contents "${contents}")

# Split long lines.
string(REGEX REPLACE
"(0x..,0x..,0x..,0x..,0x..,0x..,0x..,0x..,0x..,0x..,0x..,0x..,0x..,0x..,0x..,)" "\\1\n"
contents "${contents}"
)

string(REGEX REPLACE ",$" ",\n" contents "${contents}")

file(WRITE ${OUTPUT_FILE}
"constexpr unsigned char ${VARIABLE_NAME}[] =\n"
"{\n"
"${contents}"
"};\n"
)
Binary file removed pkg/daemon_src.dpkdir/gfx/2d/bigchars.png
Binary file not shown.
21 changes: 0 additions & 21 deletions pkg/daemon_src.dpkdir/scripts/engine.shader

This file was deleted.

Binary file removed pkg/daemon_src.dpkdir/sound/null.wav
Binary file not shown.
Loading
Loading