Skip to content

Commit 6ad9d8d

Browse files
committed
Merge branch 'master' into for-0.56.0/sync
2 parents af4d2c8 + 290f224 commit 6ad9d8d

File tree

9 files changed

+278
-144
lines changed

9 files changed

+278
-144
lines changed

CMakeLists.txt

Lines changed: 3 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ if (Daemon_OUT)
7575
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${Daemon_OUT})
7676
endif()
7777

78-
include(DaemonBuildInfo)
78+
include(DaemonSourceGenerator)
7979
include(DaemonPlatform)
8080

8181
################################################################################
@@ -927,39 +927,8 @@ if (BUILD_CLIENT)
927927
Tests ${CLIENTTESTLIST}
928928
)
929929

930-
# generate glsl include files
931-
set(GLSL_SOURCE_DIR ${ENGINE_DIR}/renderer/glsl_source)
932-
set(EMBED_INCLUDE_DIR ${CMAKE_CURRENT_BINARY_DIR}/embed_data)
933-
file(MAKE_DIRECTORY ${EMBED_INCLUDE_DIR})
934-
935-
set(SHADERS_CPP_TEXT "// This file is auto-generated by CMakeLists.txt.\n")
936-
string(APPEND SHADERS_CPP_TEXT "#include \"common/Common.h\"\n\n")
937-
set(SHADERMAP_TEXT "")
938-
939-
foreach(res ${GLSLSOURCELIST})
940-
get_filename_component(filename_no_ext ${res} NAME_WE)
941-
set(outpath ${EMBED_INCLUDE_DIR}/${filename_no_ext}.glsl.h)
942-
943-
add_custom_command(
944-
OUTPUT ${outpath}
945-
COMMAND ${CMAKE_COMMAND} "-DINPUT_FILE=${res}" "-DOUTPUT_FILE=${outpath}"
946-
"-DVARIABLE_NAME=${filename_no_ext}_glsl" -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/EmbedText.cmake
947-
MAIN_DEPENDENCY ${res}
948-
)
949-
950-
set_property(TARGET client-objects APPEND PROPERTY SOURCES ${outpath})
951-
952-
string(APPEND SHADERS_CPP_TEXT "#include \"../embed_data/${filename_no_ext}.glsl.h\"\n")
953-
string(APPEND SHADERMAP_TEXT "\t{ \"${filename_no_ext}.glsl\", ")
954-
string(APPEND SHADERMAP_TEXT "std::string(reinterpret_cast<const char *>( ${filename_no_ext}_glsl ), ")
955-
string(APPEND SHADERMAP_TEXT "sizeof( ${filename_no_ext}_glsl )) },\n")
956-
endforeach()
957-
958-
string(APPEND SHADERS_CPP_TEXT "\nextern const std::unordered_map<std::string, std::string> shadermap\n{\n")
959-
string(APPEND SHADERS_CPP_TEXT "${SHADERMAP_TEXT}")
960-
string(APPEND SHADERS_CPP_TEXT "};\n")
961-
962-
daemon_write_generated("shaders.cpp" "${SHADERS_CPP_TEXT}")
930+
# Generate GLSL include files.
931+
daemon_embed_files("EngineShaders" "${GLSL_EMBED_DIR}" "${GLSL_EMBED_LIST}" "TEXT" "client-objects")
963932
endif()
964933

965934
if (BUILD_SERVER)

cmake/DaemonBuildInfo.cmake

Lines changed: 0 additions & 44 deletions
This file was deleted.

cmake/DaemonFileEmbedder.cmake

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
# Converts a text file into a C-language char array definition.
2+
# For use in CMake script mode (cmake -P).
3+
# Required definitions on command line:
4+
# INPUT_FILE, OUTPUT_FILE, FILE_FORMAT, VARIABLE_NAME
5+
6+
# Inspired by:
7+
# https://stackoverflow.com/questions/11813271/embed-resources-eg-shader-code-images-into-executable-library-with-cmake/27206982#27206982
8+
9+
file(READ ${INPUT_FILE} contents HEX)
10+
11+
# Translate the file content.
12+
if ("${FILE_FORMAT}" STREQUAL "TEXT")
13+
# Strip \r for consistency.
14+
string(REGEX REPLACE "(0d)?(..)" "0x\\2," contents "${contents}")
15+
elseif("${FILE_FORMAT}" STREQUAL "BINARY")
16+
string(REGEX REPLACE "(..)" "0x\\1," contents "${contents}")
17+
else()
18+
message(FATAL_ERROR "Unknown file format: ${FILE_FORMAT}")
19+
endif()
20+
21+
# Add null terminator.
22+
set(contents "${contents}0x00,")
23+
24+
# Split long lines.
25+
string(REGEX REPLACE
26+
"(0x..,0x..,0x..,0x..,0x..,0x..,0x..,0x..,0x..,0x..,0x..,0x..,0x..,0x..,0x..,)" "\\1\n"
27+
contents "${contents}"
28+
)
29+
30+
# A bit more of beautification.
31+
string(REGEX REPLACE ",$" ",\n" contents "${contents}")
32+
set(DATA_VARIABLE_NAME "data_${VARIABLE_NAME}")
33+
34+
file(WRITE ${OUTPUT_FILE}
35+
"constexpr unsigned char ${DATA_VARIABLE_NAME}[] =\n"
36+
"{\n"
37+
"${contents}"
38+
"};\n"
39+
"const embeddedFileMapEntry_t ${VARIABLE_NAME} =\n"
40+
"{\n"
41+
"reinterpret_cast<const char*>( ${DATA_VARIABLE_NAME} ),\n"
42+
"sizeof( ${DATA_VARIABLE_NAME} ) - 1,\n"
43+
"};\n"
44+
)

cmake/DaemonGame.cmake

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ option(BUILD_GAME_NATIVE_DLL "Build the shared library files, mostly useful for
3939
option(BUILD_GAME_NATIVE_EXE "Build native executable, which might be used for better performances by server owners" OFF)
4040

4141
include(ExternalProject)
42-
include(DaemonBuildInfo)
42+
include(DaemonSourceGenerator)
4343
include(DaemonPlatform)
4444

4545
# Do not report unused native compiler if native vms are not built.

cmake/DaemonSourceGenerator.cmake

Lines changed: 174 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,174 @@
1+
# Daemon BSD Source Code
2+
# Copyright (c) 2025, Daemon Developers
3+
# All rights reserved.
4+
#
5+
# Redistribution and use in source and binary forms, with or without
6+
# modification, are permitted provided that the following conditions are met:
7+
# * Redistributions of source code must retain the above copyright
8+
# notice, this list of conditions and the following disclaimer.
9+
# * Redistributions in binary form must reproduce the above copyright
10+
# notice, this list of conditions and the following disclaimer in the
11+
# documentation and/or other materials provided with the distribution.
12+
# * Neither the name of the <organization> nor the
13+
# names of its contributors may be used to endorse or promote products
14+
# derived from this software without specific prior written permission.
15+
#
16+
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
17+
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18+
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19+
# DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
20+
# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21+
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22+
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23+
# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24+
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25+
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26+
27+
set(DAEMON_SOURCE_GENERATOR "${CMAKE_CURRENT_LIST_FILE}")
28+
get_filename_component(current_list_dir "${CMAKE_CURRENT_LIST_FILE}" DIRECTORY)
29+
set(DAEMON_FILE_EMBEDDER "${current_list_dir}/DaemonFileEmbedder.cmake")
30+
31+
set(DAEMON_GENERATED_SUBDIR "GeneratedSource")
32+
set(DAEMON_GENERATED_DIR "${CMAKE_CURRENT_BINARY_DIR}/${DAEMON_GENERATED_SUBDIR}")
33+
34+
set(DAEMON_BUILDINFO_SUBDIR "DaemonBuildInfo")
35+
set(DAEMON_EMBEDDED_SUBDIR "DaemonEmbeddedFiles")
36+
37+
set(DAEMON_BUILDINFO_DIR "${DAEMON_GENERATED_DIR}/${DAEMON_BUILDINFO_SUBDIR}")
38+
set(DAEMON_EMBEDDED_DIR "${DAEMON_GENERATED_DIR}/${DAEMON_EMBEDDED_SUBDIR}")
39+
40+
file(MAKE_DIRECTORY "${DAEMON_GENERATED_DIR}")
41+
include_directories("${DAEMON_GENERATED_DIR}")
42+
43+
file(MAKE_DIRECTORY "${DAEMON_BUILDINFO_DIR}")
44+
file(MAKE_DIRECTORY "${DAEMON_EMBEDDED_DIR}")
45+
46+
set(DAEMON_GENERATED_HEADER "// Automatically generated, do not modify!\n")
47+
set(DAEMON_GENERATED_CPP_EXT ".cpp")
48+
set(DAEMON_GENERATED_H_EXT ".h")
49+
50+
set(BUILDINFOLIST)
51+
52+
foreach(kind CPP H)
53+
set(DAEMON_BUILDINFO_${kind}_TEXT "${DAEMON_GENERATED_HEADER}")
54+
endforeach()
55+
56+
macro(daemon_add_buildinfo type name value)
57+
string(APPEND DAEMON_BUILDINFO_CPP_TEXT "const ${type} ${name}=${value};\n")
58+
string(APPEND DAEMON_BUILDINFO_H_TEXT "extern const ${type} ${name};\n")
59+
endmacro()
60+
61+
macro(daemon_write_buildinfo name)
62+
foreach(kind CPP H)
63+
set(buildinfo_file_path "${DAEMON_BUILDINFO_DIR}/${name}${DAEMON_GENERATED_${kind}_EXT}")
64+
65+
file(GENERATE OUTPUT "${buildinfo_file_path}" CONTENT "${DAEMON_BUILDINFO_${kind}_TEXT}")
66+
list(APPEND BUILDINFOLIST "${buildinfo_file_path}")
67+
endforeach()
68+
endmacro()
69+
70+
macro(daemon_embed_files basename dir list format targetname)
71+
set(embed_subdir "${DAEMON_EMBEDDED_SUBDIR}/${basename}")
72+
set(embed_dir "${DAEMON_GENERATED_DIR}/${embed_subdir}")
73+
74+
file(MAKE_DIRECTORY "${embed_dir}")
75+
76+
foreach(kind CPP H)
77+
set(embed_${kind}_basename "${basename}${DAEMON_GENERATED_${kind}_EXT}")
78+
set(embed_${kind}_src_file "${DAEMON_EMBEDDED_DIR}/${embed_${kind}_basename}")
79+
set(embed_${kind}_file "${DAEMON_EMBEDDED_SUBDIR}/${embed_${kind}_basename}")
80+
set(embed_${kind}_text "${DAEMON_GENERATED_HEADER}")
81+
set_property(SOURCE "${embed_${kind}_src_file}" APPEND PROPERTY OBJECT_DEPENDS "${DAEMON_SOURCE_GENERATOR}")
82+
set_property(TARGET "${targetname}" APPEND PROPERTY SOURCES "${embed_${kind}_src_file}")
83+
endforeach()
84+
85+
if (NOT DAEMON_EMBEDDED_FILES_HEADER)
86+
set(DAEMON_EMBEDDED_FILES_HEADER "${DAEMON_EMBEDDED_SUBDIR}/DaemonEmbeddedFiles.h")
87+
88+
string(APPEND embed_header_text
89+
"#ifndef DAEMON_EMBEDDED_FILES_H_\n"
90+
"#define DAEMON_EMBEDDED_FILES_H_\n"
91+
"#include <unordered_map>\n"
92+
"#include <string>\n"
93+
"\n"
94+
"struct embeddedFileMapEntry_t\n"
95+
"{\n"
96+
" const char* data;\n"
97+
" size_t size;\n"
98+
"};\n"
99+
"\n"
100+
"using embeddedFileMap_t = std::unordered_map<std::string, const embeddedFileMapEntry_t>;\n"
101+
"#endif // DAEMON_EMBEDDED_FILES_H_\n"
102+
)
103+
104+
set(embed_header_file "${DAEMON_GENERATED_DIR}/${DAEMON_EMBEDDED_FILES_HEADER}")
105+
file(GENERATE OUTPUT "${embed_header_file}" CONTENT "${embed_header_text}")
106+
endif()
107+
108+
string(APPEND embed_CPP_text
109+
"#include \"${embed_H_file}\"\n"
110+
"\n"
111+
"namespace ${basename} {\n"
112+
)
113+
114+
string(APPEND embed_H_text
115+
"#include \"${DAEMON_EMBEDDED_FILES_HEADER}\"\n"
116+
"\n"
117+
"namespace ${basename} {\n"
118+
)
119+
120+
set(embed_map_text "")
121+
122+
foreach(filename ${list})
123+
string(REGEX REPLACE "[^A-Za-z0-9]" "_" filename_symbol "${filename}")
124+
125+
set(inpath "${dir}/${filename}")
126+
set(outpath "${embed_dir}/${filename_symbol}${DAEMON_GENERATED_H_EXT}")
127+
128+
add_custom_command(
129+
OUTPUT "${outpath}"
130+
COMMAND ${CMAKE_COMMAND}
131+
"-DINPUT_FILE=${inpath}"
132+
"-DOUTPUT_FILE=${outpath}"
133+
"-DFILE_FORMAT=${format}"
134+
"-DVARIABLE_NAME=${filename_symbol}"
135+
-P "${DAEMON_FILE_EMBEDDER}"
136+
MAIN_DEPENDENCY ${inpath}
137+
DEPENDS
138+
"${DAEMON_FILE_EMBEDDER}"
139+
"${DAEMON_SOURCE_GENERATOR}"
140+
)
141+
142+
set_property(TARGET "${targetname}" APPEND PROPERTY SOURCES "${outpath}")
143+
144+
string(APPEND embed_CPP_text
145+
"#include \"${basename}/${filename_symbol}.h\"\n"
146+
)
147+
148+
string(APPEND embed_H_text
149+
"extern const embeddedFileMapEntry_t ${filename_symbol};\n"
150+
)
151+
152+
string(APPEND embed_map_text
153+
"\t{ \"${filename}\", ${filename_symbol} },\n"
154+
)
155+
endforeach()
156+
157+
string(APPEND embed_CPP_text
158+
"\n"
159+
"const embeddedFileMap_t FileMap\n{\n"
160+
"${embed_map_text}"
161+
"};\n"
162+
"}"
163+
)
164+
165+
string(APPEND embed_H_text
166+
"extern const embeddedFileMap_t FileMap;\n"
167+
"};\n"
168+
)
169+
170+
foreach(kind CPP H)
171+
set(embed_file "${DAEMON_GENERATED_DIR}/${embed_${kind}_file}")
172+
file(GENERATE OUTPUT "${embed_file}" CONTENT "${embed_${kind}_text}")
173+
endforeach()
174+
endmacro()

cmake/EmbedText.cmake

Lines changed: 0 additions & 8 deletions
This file was deleted.

0 commit comments

Comments
 (0)