From 9ed9f50713fc6bc7335c81e133a056b24e0cc123 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Krupi=C5=84ski?= Date: Sun, 14 Jun 2026 14:40:06 +0200 Subject: [PATCH] shaders: replace SHADERS std::map with a constexpr sorted std::array (#15113) --- scripts/generateShaderIncludes.sh | 12 +++++++++--- src/render/ShaderLoader.cpp | 6 ++++-- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/scripts/generateShaderIncludes.sh b/scripts/generateShaderIncludes.sh index c9419031a..688ab08eb 100755 --- a/scripts/generateShaderIncludes.sh +++ b/scripts/generateShaderIncludes.sh @@ -9,8 +9,14 @@ if [ ! -d ./src/render/shaders ]; then fi echo '#pragma once' > ./src/render/shaders/Shaders.hpp -echo '#include ' >> ./src/render/shaders/Shaders.hpp -echo 'static const std::map SHADERS = {' >> ./src/render/shaders/Shaders.hpp +echo '#include ' >> ./src/render/shaders/Shaders.hpp +echo '#include ' >> ./src/render/shaders/Shaders.hpp +echo '#include ' >> ./src/render/shaders/Shaders.hpp +echo '#include ' >> ./src/render/shaders/Shaders.hpp +echo 'inline constexpr auto SHADERS = [](auto shaders) {' >> ./src/render/shaders/Shaders.hpp +echo 'std::ranges::sort(shaders, {}, [](auto pair) { return pair.first; });' >> ./src/render/shaders/Shaders.hpp +echo 'return shaders;' >> ./src/render/shaders/Shaders.hpp +echo '}(std::to_array>({' >> ./src/render/shaders/Shaders.hpp for filename in `ls ${SHADERS_SRC}`; do echo "-- ${filename}" @@ -21,4 +27,4 @@ for filename in `ls ${SHADERS_SRC}`; do echo "}," >> ./src/render/shaders/Shaders.hpp done -echo '};' >> ./src/render/shaders/Shaders.hpp +echo '}));' >> ./src/render/shaders/Shaders.hpp diff --git a/src/render/ShaderLoader.cpp b/src/render/ShaderLoader.cpp index 989ff603f..673ccf988 100644 --- a/src/render/ShaderLoader.cpp +++ b/src/render/ShaderLoader.cpp @@ -183,7 +183,9 @@ std::string CShaderLoader::loadShader(const std::string& filename) { if (src.has_value()) return src.value(); } - if (SHADERS.contains(filename)) - return SHADERS.at(filename); + + const auto shader = std::ranges::lower_bound(SHADERS, filename, {}, [](const auto& filenameSource) { return filenameSource.first; }); + if (shader != SHADERS.end() && shader->first == filename) + return std::string{shader->second}; throw std::runtime_error(std::format("Couldn't load shader {}", filename)); }