From 2f57162fbfdeca6f9a0d27bc6ed8ae4587a89276 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Sat, 31 Dec 2022 03:34:50 +0100 Subject: [PATCH] Shaders: ditch the insane Phong light initializer setup. Do it the same as for the skinning stuff, format() and string multiplication. No need to get this crazy. --- src/Magnum/Shaders/PhongGL.cpp | 57 +++++++--------------------------- 1 file changed, 11 insertions(+), 46 deletions(-) diff --git a/src/Magnum/Shaders/PhongGL.cpp b/src/Magnum/Shaders/PhongGL.cpp index 836161e57..59a9531b7 100644 --- a/src/Magnum/Shaders/PhongGL.cpp +++ b/src/Magnum/Shaders/PhongGL.cpp @@ -33,7 +33,6 @@ #include #include #include -#include #include #include @@ -190,52 +189,18 @@ PhongGL::CompileState PhongGL::compile(const Configuration& configuration) { GL::Shader frag = Implementation::createCompatibilityShader(rs, version, GL::Shader::Type::Fragment); #ifndef MAGNUM_TARGET_GLES + /* Initializer for the light color / position / range arrays -- we need a + list of initializers joined by commas. For GLES we'll simply upload the + values directly. */ std::string lightInitializer; - if(!(configuration.flags() >= Flag::UniformBuffers) && configuration.lightCount()) { - using namespace Containers::Literals; - - /* Initializer for the light color / position / range arrays -- we need - a list of initializers joined by commas. For GLES we'll simply - upload the values directly. */ - constexpr Containers::StringView lightPositionInitializerPreamble = "#define LIGHT_POSITION_INITIALIZER "_s; - constexpr Containers::StringView lightColorInitializerPreamble = "#define LIGHT_COLOR_INITIALIZER "_s; - constexpr Containers::StringView lightRangeInitializerPreamble = "#define LIGHT_RANGE_INITIALIZER "_s; - constexpr Containers::StringView lightPositionInitializerItem = "vec4(0.0, 0.0, 1.0, 0.0), "_s; - constexpr Containers::StringView lightColorInitializerItem = "vec3(1.0), "_s; - constexpr Containers::StringView lightRangeInitializerItem = "1.0/0.0, "_s; - - lightInitializer.reserve( - lightPositionInitializerPreamble.size() + - lightColorInitializerPreamble.size() + - lightRangeInitializerPreamble.size() + - configuration.lightCount()*(lightPositionInitializerItem.size() + - lightColorInitializerItem.size() + - lightRangeInitializerItem.size())); - - lightInitializer.append(lightPositionInitializerPreamble); - for(std::size_t i = 0; i != configuration.lightCount(); ++i) - lightInitializer.append(lightPositionInitializerItem); - - /* Drop the last comma and add a newline at the end */ - lightInitializer[lightInitializer.size() - 2] = '\n'; - lightInitializer.resize(lightInitializer.size() - 1); - - lightInitializer.append(lightColorInitializerPreamble); - for(std::size_t i = 0; i != configuration.lightCount(); ++i) - lightInitializer.append(lightColorInitializerItem); - - /* Drop the last comma and add a newline at the end */ - lightInitializer[lightInitializer.size() - 2] = '\n'; - lightInitializer.resize(lightInitializer.size() - 1); - - lightInitializer.append(lightRangeInitializerPreamble); - for(std::size_t i = 0; i != configuration.lightCount(); ++i) - lightInitializer.append(lightRangeInitializerItem); - - /* Drop the last comma and add a newline at the end */ - lightInitializer[lightInitializer.size() - 2] = '\n'; - lightInitializer.resize(lightInitializer.size() - 1); - } + if(!(configuration.flags() >= Flag::UniformBuffers) && configuration.lightCount()) + lightInitializer = Utility::formatString( + "#define LIGHT_POSITION_INITIALIZER {}\n" + "#define LIGHT_COLOR_INITIALIZER {}\n" + "#define LIGHT_RANGE_INITIALIZER {}\n", + ("vec4(0.0, 0.0, 1.0, 0.0), "_s*configuration.lightCount()).exceptSuffix(2), + ("vec3(1.0), "_s*configuration.lightCount()).exceptSuffix(2), + ("1.0/0.0, "_s*configuration.lightCount()).exceptSuffix(2)); #endif vert.addSource((configuration.flags() & (Flag::AmbientTexture|Flag::DiffuseTexture|Flag::SpecularTexture|Flag::NormalTexture)