mirror of
https://github.com/love2d/love.git
synced 2026-08-19 04:06:17 +02:00
Changed shader source list from a vector of sources to a map of shader types to source codes
This commit is contained in:
@@ -453,7 +453,7 @@ Canvas *Graphics::newCanvas(int width, int height, Canvas::TextureType texture_t
|
|||||||
return NULL; // never reached
|
return NULL; // never reached
|
||||||
}
|
}
|
||||||
|
|
||||||
ShaderEffect *Graphics::newShaderEffect(const std::vector<ShaderEffect::ShaderSource> shadersources)
|
ShaderEffect *Graphics::newShaderEffect(const ShaderEffect::ShaderSources &shadersources)
|
||||||
{
|
{
|
||||||
ShaderEffect *effect = NULL;
|
ShaderEffect *effect = NULL;
|
||||||
try
|
try
|
||||||
|
|||||||
@@ -270,7 +270,7 @@ public:
|
|||||||
|
|
||||||
Canvas *newCanvas(int width, int height, Canvas::TextureType texture_type = Canvas::TYPE_NORMAL);
|
Canvas *newCanvas(int width, int height, Canvas::TextureType texture_type = Canvas::TYPE_NORMAL);
|
||||||
|
|
||||||
ShaderEffect *newShaderEffect(const std::vector<ShaderEffect::ShaderSource> shadersources);
|
ShaderEffect *newShaderEffect(const ShaderEffect::ShaderSources &shadersources);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets the foreground color.
|
* Sets the foreground color.
|
||||||
|
|||||||
@@ -60,11 +60,11 @@ ShaderEffect *ShaderEffect::current = NULL;
|
|||||||
GLint ShaderEffect::_maxtextureunits = 0;
|
GLint ShaderEffect::_maxtextureunits = 0;
|
||||||
std::vector<int> ShaderEffect::_texturecounters;
|
std::vector<int> ShaderEffect::_texturecounters;
|
||||||
|
|
||||||
ShaderEffect::ShaderEffect(const std::vector<ShaderSource> &shadersources)
|
ShaderEffect::ShaderEffect(const ShaderSources &shadersources)
|
||||||
: _shadersources(shadersources)
|
: _shadersources(shadersources)
|
||||||
, _program(0)
|
, _program(0)
|
||||||
{
|
{
|
||||||
if (shadersources.size() == 0)
|
if (shadersources.empty())
|
||||||
throw love::Exception("Cannot create shader effect: no source code!");
|
throw love::Exception("Cannot create shader effect: no source code!");
|
||||||
|
|
||||||
GLint maxtextureunits;
|
GLint maxtextureunits;
|
||||||
@@ -87,12 +87,12 @@ ShaderEffect::~ShaderEffect()
|
|||||||
unloadVolatile();
|
unloadVolatile();
|
||||||
}
|
}
|
||||||
|
|
||||||
GLuint ShaderEffect::createShader(const ShaderSource &source)
|
GLuint ShaderEffect::createShader(const ShaderType &type, const std::string &code)
|
||||||
{
|
{
|
||||||
GLenum shadertype;
|
GLenum shadertype;
|
||||||
const char *shadertypename = NULL;
|
const char *shadertypename = NULL;
|
||||||
|
|
||||||
switch (source.type)
|
switch (type)
|
||||||
{
|
{
|
||||||
case TYPE_VERTEX:
|
case TYPE_VERTEX:
|
||||||
shadertype = GL_VERTEX_SHADER;
|
shadertype = GL_VERTEX_SHADER;
|
||||||
@@ -134,8 +134,8 @@ GLuint ShaderEffect::createShader(const ShaderSource &source)
|
|||||||
throw love::Exception("Cannot create %s shader object.", shadertypename);
|
throw love::Exception("Cannot create %s shader object.", shadertypename);
|
||||||
}
|
}
|
||||||
|
|
||||||
const char *src = source.code.c_str();
|
const char *src = code.c_str();
|
||||||
size_t srclen = source.code.length();
|
size_t srclen = code.length();
|
||||||
glShaderSource(shaderid, 1, (const GLchar **)&src, (GLint *)&srclen);
|
glShaderSource(shaderid, 1, (const GLchar **)&src, (GLint *)&srclen);
|
||||||
|
|
||||||
glCompileShader(shaderid);
|
glCompileShader(shaderid);
|
||||||
@@ -197,9 +197,12 @@ bool ShaderEffect::loadVolatile()
|
|||||||
|
|
||||||
std::vector<GLuint> shaderids;
|
std::vector<GLuint> shaderids;
|
||||||
|
|
||||||
std::vector<ShaderSource>::const_iterator source;
|
ShaderSources::const_iterator source;
|
||||||
for (source = _shadersources.begin(); source != _shadersources.end(); ++source)
|
for (source = _shadersources.begin(); source != _shadersources.end(); ++source)
|
||||||
shaderids.push_back(createShader(*source));
|
{
|
||||||
|
GLuint shaderid = createShader(source->first, source->second);
|
||||||
|
shaderids.push_back(shaderid);
|
||||||
|
}
|
||||||
|
|
||||||
if (shaderids.size() == 0)
|
if (shaderids.size() == 0)
|
||||||
throw love::Exception("Cannot create shader effect: no valid source code!");
|
throw love::Exception("Cannot create shader effect: no valid source code!");
|
||||||
|
|||||||
@@ -52,20 +52,16 @@ public:
|
|||||||
TYPE_MAX_ENUM
|
TYPE_MAX_ENUM
|
||||||
};
|
};
|
||||||
|
|
||||||
// thin wrapper for GLSL source code.
|
// type for a list of shader source codes in the form of sources[shadertype] = code
|
||||||
struct ShaderSource
|
typedef std::map<ShaderType, std::string> ShaderSources;
|
||||||
{
|
|
||||||
std::string code;
|
|
||||||
ShaderType type;
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a new ShaderEffect using a list of source codes.
|
* Creates a new ShaderEffect using a list of source codes.
|
||||||
* Must contain at least one vertex or fragment shader source.
|
* Must contain at least one vertex or fragment shader source.
|
||||||
*
|
*
|
||||||
* @param shadersources Vector of shader source codes.
|
* @param shadersources map of shader source codes.
|
||||||
**/
|
**/
|
||||||
ShaderEffect(const std::vector<ShaderSource> &shadersources);
|
ShaderEffect(const ShaderSources &shadersources);
|
||||||
|
|
||||||
virtual ~ShaderEffect();
|
virtual ~ShaderEffect();
|
||||||
|
|
||||||
@@ -146,7 +142,7 @@ private:
|
|||||||
GLint getUniformLocation(const std::string &name);
|
GLint getUniformLocation(const std::string &name);
|
||||||
void checkSetUniformError();
|
void checkSetUniformError();
|
||||||
|
|
||||||
GLuint createShader(const ShaderSource &source);
|
GLuint createShader(const ShaderType &type, const std::string &code);
|
||||||
void createProgram(const std::vector<GLuint> &shaderids);
|
void createProgram(const std::vector<GLuint> &shaderids);
|
||||||
|
|
||||||
GLint getTextureUnit(const std::string &name);
|
GLint getTextureUnit(const std::string &name);
|
||||||
@@ -154,7 +150,7 @@ private:
|
|||||||
void sendTexture(const std::string &name, GLuint texture);
|
void sendTexture(const std::string &name, GLuint texture);
|
||||||
|
|
||||||
// list of all shader code attached to this ShaderEffect
|
// list of all shader code attached to this ShaderEffect
|
||||||
std::vector<ShaderSource> _shadersources;
|
ShaderSources _shadersources;
|
||||||
|
|
||||||
GLuint _program; // volatile
|
GLuint _program; // volatile
|
||||||
|
|
||||||
|
|||||||
@@ -452,27 +452,23 @@ int w_newShaderEffect(lua_State *L)
|
|||||||
// call effectCodeToGLSL, returned values will be at the top of the stack
|
// call effectCodeToGLSL, returned values will be at the top of the stack
|
||||||
lua_pcall(L, 2, 2, 0);
|
lua_pcall(L, 2, 2, 0);
|
||||||
|
|
||||||
std::vector<ShaderEffect::ShaderSource> shaderlist;
|
ShaderEffect::ShaderSources shadersources;
|
||||||
|
|
||||||
// vertex shader code
|
// vertex shader code
|
||||||
if (lua_isstring(L, -2))
|
if (lua_isstring(L, -2))
|
||||||
{
|
{
|
||||||
ShaderEffect::ShaderSource vertshader;
|
std::string vertcode(luaL_checkstring(L, -2));
|
||||||
vertshader.type = ShaderEffect::TYPE_VERTEX;
|
shadersources[ShaderEffect::TYPE_VERTEX] = vertcode;
|
||||||
vertshader.code = luaL_checkstring(L, -2);
|
|
||||||
shaderlist.push_back(vertshader);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// fragment shader code
|
// fragment shader code
|
||||||
if (lua_isstring(L, -1))
|
if (lua_isstring(L, -1))
|
||||||
{
|
{
|
||||||
ShaderEffect::ShaderSource fragshader;
|
std::string fragcode(luaL_checkstring(L, -1));
|
||||||
fragshader.type = ShaderEffect::TYPE_FRAGMENT;
|
shadersources[ShaderEffect::TYPE_FRAGMENT] = fragcode;
|
||||||
fragshader.code = luaL_checkstring(L, -1);
|
|
||||||
shaderlist.push_back(fragshader);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ShaderEffect *effect = instance->newShaderEffect(shaderlist);
|
ShaderEffect *effect = instance->newShaderEffect(shadersources);
|
||||||
luax_newtype(L, "ShaderEffect", GRAPHICS_SHADEREFFECT_T, (void *)effect);
|
luax_newtype(L, "ShaderEffect", GRAPHICS_SHADEREFFECT_T, (void *)effect);
|
||||||
}
|
}
|
||||||
catch(const love::Exception &e)
|
catch(const love::Exception &e)
|
||||||
|
|||||||
Reference in New Issue
Block a user