From f08e4bb27d5de31d92b77dfadcfe0167a0cec2cb Mon Sep 17 00:00:00 2001 From: HybridDog <3192173+HybridDog@users.noreply.github.com> Date: Fri, 19 Jan 2024 11:51:46 +0100 Subject: [PATCH] Return to the main menu if a shader compilation fails (#14256) Before this change, if the shaders are broken, only an error message is shown and the player enters the world nonetheless, where he/she sees broken graphics. --- src/client/clientlauncher.cpp | 4 ++++ src/client/shader.cpp | 9 ++++++--- src/exceptions.h | 5 +++++ 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/src/client/clientlauncher.cpp b/src/client/clientlauncher.cpp index 61afb2930..93d181082 100644 --- a/src/client/clientlauncher.cpp +++ b/src/client/clientlauncher.cpp @@ -278,6 +278,10 @@ bool ClientLauncher::run(GameStartData &start_data, const Settings &cmd_args) error_message = gettext("Connection error (timed out?)"); errorstream << error_message << std::endl; } + catch (ShaderException &e) { + error_message = e.what(); + errorstream << error_message << std::endl; + } #ifdef NDEBUG catch (std::exception &e) { diff --git a/src/client/shader.cpp b/src/client/shader.cpp index dacc3470b..65f135a82 100644 --- a/src/client/shader.cpp +++ b/src/client/shader.cpp @@ -35,6 +35,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include #include "client/renderingengine.h" #include "EShaderTypes.h" +#include "gettext.h" #include "log.h" #include "gamedef.h" #include "client/tile.h" @@ -588,8 +589,8 @@ ShaderInfo ShaderSource::generateShader(const std::string &name, video::IVideoDriver *driver = RenderingEngine::get_video_driver(); if (!driver->queryFeature(video::EVDF_ARB_GLSL)) { - errorstream << "Shaders are enabled but GLSL is not supported by the driver\n"; - return shaderinfo; + throw ShaderException(gettext("Shaders are enabled but GLSL is not " + "supported by the driver.")); } video::IGPUProgrammingServices *gpu = driver->getGPUProgrammingServices(); @@ -792,7 +793,9 @@ ShaderInfo ShaderSource::generateShader(const std::string &name, dumpShaderProgram(warningstream, "Vertex", vertex_shader); dumpShaderProgram(warningstream, "Fragment", fragment_shader); dumpShaderProgram(warningstream, "Geometry", geometry_shader); - return shaderinfo; + throw ShaderException( + fmtgettext("Failed to compile the \"%s\" shader.", name.c_str()) + + strgettext("\nCheck debug.txt for details.")); } // Apply the newly created material type diff --git a/src/exceptions.h b/src/exceptions.h index a558adc5d..184f8ed60 100644 --- a/src/exceptions.h +++ b/src/exceptions.h @@ -92,6 +92,11 @@ public: PrngException(const std::string &s): BaseException(s) {} }; +class ShaderException : public BaseException { +public: + ShaderException(const std::string &s): BaseException(s) {} +}; + class ModError : public BaseException { public: ModError(const std::string &s): BaseException(s) {}