mirror of
https://github.com/love2d/love.git
synced 2026-08-19 20:19:42 +02:00
In fact, lets just replace Shader:getUniformVariable with Shader:hasUniform. The latter returns true if the uniform with the specified name exists and contributes to the final output of the shader.
--HG-- branch : minor
This commit is contained in:
@@ -621,21 +621,9 @@ int Shader::getTextureUnit(const std::string &name)
|
|||||||
return texunit;
|
return texunit;
|
||||||
}
|
}
|
||||||
|
|
||||||
Shader::UniformType Shader::getUniformVariable(const std::string &name, int &components, int &count)
|
bool Shader::hasUniform(const std::string &name) const
|
||||||
{
|
{
|
||||||
auto it = uniforms.find(name);
|
return uniforms.find(name) != uniforms.end();
|
||||||
|
|
||||||
if (it == uniforms.end())
|
|
||||||
{
|
|
||||||
components = 0;
|
|
||||||
count = 0;
|
|
||||||
return UNIFORM_UNKNOWN;
|
|
||||||
}
|
|
||||||
|
|
||||||
components = getUniformTypeSize(it->second.type);
|
|
||||||
count = (int) it->second.count;
|
|
||||||
|
|
||||||
return it->second.baseType;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
GLint Shader::getAttribLocation(const std::string &name)
|
GLint Shader::getAttribLocation(const std::string &name)
|
||||||
|
|||||||
@@ -168,17 +168,10 @@ public:
|
|||||||
void sendTexture(const std::string &name, Texture *texture);
|
void sendTexture(const std::string &name, Texture *texture);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets the type, number of components, and number of array elements of
|
* Gets whether a uniform with the specified name exists and is actively
|
||||||
* an active uniform variable in the shader. If a uniform variable with the
|
* used in the shader.
|
||||||
* specified name doesn't exist, returns UNIFORM_UNKNOWN and sets the
|
|
||||||
* 'components' and 'count' values to 0.
|
|
||||||
*
|
|
||||||
* @param name The name of the uniform variable in the source code.
|
|
||||||
* @param[out] components Number of components of the variable (2 for vec2.)
|
|
||||||
* @param[out] count Number of array elements, if the variable is an array.
|
|
||||||
* @return The base type of the uniform variable.
|
|
||||||
**/
|
**/
|
||||||
UniformType getUniformVariable(const std::string &name, int &components, int &count);
|
bool hasUniform(const std::string &name) const;
|
||||||
|
|
||||||
GLint getAttribLocation(const std::string &name);
|
GLint getAttribLocation(const std::string &name);
|
||||||
|
|
||||||
|
|||||||
@@ -324,36 +324,12 @@ int w_Shader_send(lua_State *L)
|
|||||||
return luaL_argerror(L, 3, "number, boolean, table, image, or canvas expected");
|
return luaL_argerror(L, 3, "number, boolean, table, image, or canvas expected");
|
||||||
}
|
}
|
||||||
|
|
||||||
int w_Shader_getUniformVariable(lua_State *L)
|
int w_Shader_hasUniform(lua_State *L)
|
||||||
{
|
{
|
||||||
Shader *shader = luax_checkshader(L, 1);
|
Shader *shader = luax_checkshader(L, 1);
|
||||||
const char *name = luaL_checkstring(L, 2);
|
const char *name = luaL_checkstring(L, 2);
|
||||||
|
luax_pushboolean(L, shader->hasUniform(name));
|
||||||
int components = 0;
|
return 1;
|
||||||
int arrayelements = 0;
|
|
||||||
Shader::UniformType type = Shader::UNIFORM_UNKNOWN;
|
|
||||||
|
|
||||||
type = shader->getUniformVariable(name, components, arrayelements);
|
|
||||||
|
|
||||||
// Check if the variable exists (function will set components to 0 if not.)
|
|
||||||
if (components > 0)
|
|
||||||
{
|
|
||||||
const char *tname = nullptr;
|
|
||||||
if (!Shader::getConstant(type, tname))
|
|
||||||
return luaL_error(L, "Unknown uniform variable type name.");
|
|
||||||
|
|
||||||
lua_pushstring(L, tname);
|
|
||||||
lua_pushinteger(L, components);
|
|
||||||
lua_pushinteger(L, arrayelements);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
lua_pushnil(L);
|
|
||||||
lua_pushnil(L);
|
|
||||||
lua_pushnil(L);
|
|
||||||
}
|
|
||||||
|
|
||||||
return 3;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static const luaL_Reg w_Shader_functions[] =
|
static const luaL_Reg w_Shader_functions[] =
|
||||||
@@ -366,7 +342,7 @@ static const luaL_Reg w_Shader_functions[] =
|
|||||||
{ "sendMatrix", w_Shader_sendMatrix },
|
{ "sendMatrix", w_Shader_sendMatrix },
|
||||||
{ "sendTexture", w_Shader_sendTexture },
|
{ "sendTexture", w_Shader_sendTexture },
|
||||||
{ "send", w_Shader_send },
|
{ "send", w_Shader_send },
|
||||||
{ "getUniformVariable", w_Shader_getUniformVariable },
|
{ "hasUniform", w_Shader_hasUniform },
|
||||||
{ 0, 0 }
|
{ 0, 0 }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user