Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
5b82f4f
media: smaller files
illwieckz Oct 4, 2025
f4503ad
media: embed unifont
illwieckz Oct 4, 2025
cecc3df
client: NUKE bigchars
illwieckz Oct 4, 2025
1958b03
engine: add an empty “*daemon” builtin basepak, delete the daemon dpkdir
illwieckz Oct 4, 2025
e05ef00
engine: embed media files '*daemon-client' builtin pak
illwieckz Oct 4, 2025
035784c
cl_main: do not error on font registration in tty client
illwieckz Oct 4, 2025
db9a7cd
cmake: rename DaemonBuildInfo as DaemonSourceGenerator
illwieckz Oct 6, 2025
530c3ba
DaemonSourceGenerator: rework it a bit
illwieckz Oct 6, 2025
275f03b
DaemonSourceGenerator: make the embedded file generator reusable
illwieckz Oct 3, 2025
3f9e92f
EmbedText make possible to chose between TEXT and BINARY formats when…
illwieckz Oct 6, 2025
5e0ce3f
DaemonSourceGenerator: provide embedded files as part as the namespace
illwieckz Oct 6, 2025
291613e
EmbedText: split embedded source lines just in case if an editor or d…
illwieckz Oct 6, 2025
16236af
DaemonSourceGenerator: also add the generated source entry-point to t…
illwieckz Oct 6, 2025
cef003a
DaemonSourceGenerator: lowercase local variables (even if the leak ou…
illwieckz Oct 6, 2025
e9f7e6d
DaemonSourceGenerator: also make generated source depend on generator…
illwieckz Oct 6, 2025
39ce492
DaemonSourceGenerator: explicit mkdir
illwieckz Oct 7, 2025
5a57364
DaemonSourceGenerator: do not copy the embedded files in the map
illwieckz Oct 6, 2025
05ae5b5
cmake: rename EmbedText as DaemonFileEmbedder
illwieckz Oct 8, 2025
c4c9671
DaemonSourceGenerator: add license
illwieckz Oct 9, 2025
4a62c3a
DaemonSourceGenerator: use file(GENERATE …)
illwieckz Oct 16, 2025
4885b09
DaemonSourceGenerator: use explicit variable names
illwieckz Oct 16, 2025
5c7bc3f
DaemonFileEmbedder: make it fully standalone, do not expose unsigned …
illwieckz Nov 1, 2025
889a806
FileSystem: implement internal paks
illwieckz Oct 4, 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 @@ -75,7 +75,7 @@ if (Daemon_OUT)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${Daemon_OUT})
endif()

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

################################################################################
Expand Down Expand Up @@ -927,39 +927,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_EMBED_DIR}" "${GLSL_EMBED_LIST}" "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_EMBED_DIR}" "${MEDIA_EMBED_LIST}" "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.

44 changes: 44 additions & 0 deletions cmake/DaemonFileEmbedder.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
# 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, FILE_FORMAT, VARIABLE_NAME

# 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)

# Translate the file content.
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.
set(contents "${contents}0x00,")

# 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}"
)

# A bit more of beautification.
string(REGEX REPLACE ",$" ",\n" contents "${contents}")
set(DATA_VARIABLE_NAME "data_${VARIABLE_NAME}")

file(WRITE ${OUTPUT_FILE}
"constexpr unsigned char ${DATA_VARIABLE_NAME}[] =\n"
"{\n"
"${contents}"
"};\n"
"const embeddedFileMapEntry_t ${VARIABLE_NAME} =\n"
"{\n"
"reinterpret_cast<const char*>( ${DATA_VARIABLE_NAME} ),\n"
"sizeof( ${DATA_VARIABLE_NAME} ) - 1,\n"
"};\n"
)
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
175 changes: 175 additions & 0 deletions cmake/DaemonSourceGenerator.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,175 @@
# Daemon BSD Source Code
# Copyright (c) 2025, Daemon Developers
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
# * Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# * Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
# * Neither the name of the <organization> nor the
# names of its contributors may be used to endorse or promote products
# derived from this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
# DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

set(DAEMON_SOURCE_GENERATOR "${CMAKE_CURRENT_LIST_FILE}")
get_filename_component(current_list_dir "${CMAKE_CURRENT_LIST_FILE}" DIRECTORY)
set(DAEMON_FILE_EMBEDDER "${current_list_dir}/DaemonFileEmbedder.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_buildinfo name)
foreach(kind CPP H)
set(buildinfo_file_path "${DAEMON_BUILDINFO_DIR}/${name}${DAEMON_GENERATED_${kind}_EXT}")

file(GENERATE OUTPUT "${buildinfo_file_path}" CONTENT "${DAEMON_BUILDINFO_${kind}_TEXT}")
list(APPEND BUILDINFOLIST "${buildinfo_file_path}")
endforeach()
endmacro()

macro(daemon_embed_files basename dir list format targetname)
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 OBJECT_DEPENDS "${DAEMON_SOURCE_GENERATOR}")
set_property(TARGET "${targetname}" APPEND PROPERTY SOURCES "${embed_${kind}_src_file}")
endforeach()

if (NOT DAEMON_EMBEDDED_FILES_HEADER)
set(DAEMON_EMBEDDED_FILES_HEADER "${DAEMON_EMBEDDED_SUBDIR}/DaemonEmbeddedFiles.h")

string(APPEND embed_header_text
"#ifndef DAEMON_EMBEDDED_FILES_H_\n"
"#define DAEMON_EMBEDDED_FILES_H_\n"
"#include <unordered_map>\n"
"#include <string>\n"
"\n"
"struct embeddedFileMapEntry_t\n"
"{\n"
" const char* data;\n"
" size_t size;\n"
"};\n"
"\n"
"using embeddedFileMap_t = std::unordered_map<std::string, const embeddedFileMapEntry_t>;\n"
"#endif // DAEMON_EMBEDDED_FILES_H_\n"
)

set(embed_header_file "${DAEMON_GENERATED_DIR}/${DAEMON_EMBEDDED_FILES_HEADER}")
file(GENERATE OUTPUT "${embed_header_file}" CONTENT "${embed_header_text}")
add_definitions(-DDAEMON_EMBEDDED_FILES_HEADER="${DAEMON_EMBEDDED_FILES_HEADER}")
endif()

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

string(APPEND embed_H_text
"#include \"${DAEMON_EMBEDDED_FILES_HEADER}\"\n"
"\n"
"namespace ${basename} {\n"
)

set(embed_map_text "")

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

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

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

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 embeddedFileMapEntry_t ${filename_symbol};\n"
)

string(APPEND embed_map_text
"\t{ \"${filename}\", ${filename_symbol} },\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)
set(embed_file "${DAEMON_GENERATED_DIR}/${embed_${kind}_file}")
file(GENERATE OUTPUT "${embed_file}" CONTENT "${embed_${kind}_text}")
endforeach()
endmacro()
8 changes: 0 additions & 8 deletions cmake/EmbedText.cmake

This file was deleted.

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.

Loading
Loading