Browse Source

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.
HybridDog 3 months ago
parent
commit
f08e4bb27d
3 changed files with 15 additions and 3 deletions
  1. 4 0
      src/client/clientlauncher.cpp
  2. 6 3
      src/client/shader.cpp
  3. 5 0
      src/exceptions.h

+ 4 - 0
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) {

+ 6 - 3
src/client/shader.cpp

@@ -35,6 +35,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include <IShaderConstantSetCallBack.h>
 #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

+ 5 - 0
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) {}