Browse Source

Slightly improved error messages when love.graphics.newShader fails

Alex Szpakowski 12 years ago
parent
commit
e8c6a3f77c
1 changed files with 32 additions and 22 deletions
  1. 32 22
      src/modules/graphics/opengl/wrap_Graphics.cpp

+ 32 - 22
src/modules/graphics/opengl/wrap_Graphics.cpp

@@ -505,40 +505,50 @@ int w_newShader(lua_State *L)
 	if (!Shader::isSupported())
 		return luaL_error(L, "Sorry, your graphics card does not support shaders.");
 
-	try
-	{
-		// clamp stack to 2 elements
-		lua_settop(L, 2);
+	// clamp stack to 2 elements
+	lua_settop(L, 2);
 
-		luax_getfunction(L, "graphics", "_shaderCodeToGLSL");
+	luax_getfunction(L, "graphics", "_shaderCodeToGLSL");
 
-		// push vertcode and fragcode strings to the top of the stack so they become arguments for the function
-		lua_pushvalue(L, 1);
-		lua_pushvalue(L, 2);
+	// push vertcode and fragcode strings to the top of the stack so they become arguments for the function
+	lua_pushvalue(L, 1);
+	lua_pushvalue(L, 2);
 
-		// call effectCodeToGLSL, returned values will be at the top of the stack
-		lua_pcall(L, 2, 2, 0);
+	// call effectCodeToGLSL, returned values will be at the top of the stack
+	lua_pcall(L, 2, 2, 0);
 
-		Shader::ShaderSources sources;
+	Shader::ShaderSources sources;
 
-		// vertex shader code
-		if (lua_isstring(L, -2))
-		{
-			std::string vertcode(luaL_checkstring(L, -2));
-			sources[Shader::TYPE_VERTEX] = vertcode;
-		}
+	// vertex shader code
+	if (lua_isstring(L, -2))
+	{
+		std::string vertcode(luaL_checkstring(L, -2));
+		sources[Shader::TYPE_VERTEX] = vertcode;
+	}
 
-		// fragment shader code
-		if (lua_isstring(L, -1))
+	// fragment shader code
+	if (lua_isstring(L, -1))
+	{
+		std::string fragcode(luaL_checkstring(L, -1));
+		sources[Shader::TYPE_FRAGMENT] = fragcode;
+	}
+
+	if (sources.empty())
+	{
+		// Original args had source code, but effectCodeToGLSL couldn't translate it
+		for (int i = 1; i <= 2; i++)
 		{
-			std::string fragcode(luaL_checkstring(L, -1));
-			sources[Shader::TYPE_FRAGMENT] = fragcode;
+			if (lua_isstring(L, i))
+				return luaL_argerror(L, i, "invalid or incomplete shader code");
 		}
+	}
 
+	try
+	{
 		Shader *shader = instance->newShader(sources);
 		luax_newtype(L, "Shader", GRAPHICS_SHADER_T, (void *)shader);
 	}
-	catch(const love::Exception &e)
+	catch (const love::Exception &e)
 	{
 		// memory is freed in Graphics::newShader
 		luax_getfunction(L, "graphics", "_transformGLSLErrorMessages");