diff options
author | chai <chaifix@163.com> | 2018-05-18 08:27:45 +0800 |
---|---|---|
committer | chai <chaifix@163.com> | 2018-05-18 08:27:45 +0800 |
commit | 91a592da979827b1735901388dba8712e6e3ecf3 (patch) | |
tree | 5b34330fc7ab0027557f4a4dfb1417fbe9acfb44 /src/libjin/render/jsl.cpp | |
parent | d66b07724d71321545e80a8e12736be0e9a5d24a (diff) |
修改JSL
Diffstat (limited to 'src/libjin/render/jsl.cpp')
-rw-r--r-- | src/libjin/render/jsl.cpp | 84 |
1 files changed, 74 insertions, 10 deletions
diff --git a/src/libjin/render/jsl.cpp b/src/libjin/render/jsl.cpp index 1935edc..56cbc31 100644 --- a/src/libjin/render/jsl.cpp +++ b/src/libjin/render/jsl.cpp @@ -10,6 +10,7 @@ namespace render "#define number float \n" "#define Image sampler2D \n" "#define Texel texture2D \n" + "#define Color vec4 \n" "#define extern uniform \n" "uniform Image _tex0_; \n" "%s \n" @@ -17,12 +18,15 @@ namespace render "gl_FragColor = effect(gl_Color, _tex0_, gl_TexCoord[0].xy, gl_FragCoord.xy);\n" "}\0"; - shared GLint JSLProgram::_current_texture_unit; - shared GLint JSLProgram::_max_texture_units; + shared GLint JSLProgram::current_texture_unit = 0; + shared GLint JSLProgram::max_texture_units = 0; + + shared JSLProgram* JSLProgram::current_JSL_program = nullptr; void JSLProgram::init(const char* program) { - glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS, &_max_texture_units); + if(max_texture_units == 0) + glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS, &max_texture_units); char* fs = (char*)alloca(strlen(program) + strlen(base_f)); sprintf(fs, base_f, program); @@ -37,41 +41,101 @@ namespace render shared GLint JSLProgram::getTextureUnit(const std::string& name) { - if (++_current_texture_unit >= _max_texture_units) + if (++current_texture_unit >= max_texture_units) return 0; - return _current_texture_unit; + return current_texture_unit; } void JSLProgram::use() { glUseProgram(pid); - _current_texture_unit = 0; + JSLProgram::current_JSL_program = this; + JSLProgram::current_texture_unit = 0; } shared void JSLProgram::unuse() { glUseProgram(0); + JSLProgram::current_JSL_program = nullptr; + JSLProgram::current_texture_unit = 0; } +#define checkJSL() if (current_JSL_program != this) return + void JSLProgram::sendFloat(const char* variable, float number) { + checkJSL(); + int loc = glGetUniformLocation(pid, variable); glUniform1f(loc, number); } - void JSLProgram::sendImage(const char* variable, const Image* image) + void JSLProgram::sendImage(const char* variable, const Image* image) { - GLint texture_unit = getTextureUnit(variable); + checkJSL(); + + GLint texture_unit = JSLProgram::getTextureUnit(variable); GLint location = glGetUniformLocation(pid, variable); glUniform1i(location, texture_unit); glActiveTexture(GL_TEXTURE0 + texture_unit); - glBindTexture(GL_TEXTURE_2D, image->getTexture()); // guarantee it gets bound + glBindTexture(GL_TEXTURE_2D, image->getTexture()); - // reset texture unit glActiveTexture(GL_TEXTURE0); } + + void JSLProgram::sendCanvas(const char* variable, const Canvas* canvas) + { + checkJSL(); + + GLint texture_unit = getTextureUnit(variable); + + GLint location = glGetUniformLocation(pid, variable); + glUniform1i(location, texture_unit); + + glActiveTexture(GL_TEXTURE0 + texture_unit); + glBindTexture(GL_TEXTURE_2D, canvas->getTexture()); + + glActiveTexture(GL_TEXTURE0); + } + + void JSLProgram::sendVec2(const char* name, float x, float y) + { + checkJSL(); + + int loc = glGetUniformLocation(pid, name); + glUniform2f(loc, x, y); + } + + void JSLProgram::sendVec3(const char* name, float x, float y, float z) + { + checkJSL(); + + int loc = glGetUniformLocation(pid, name); + glUniform3f(loc, x, y, z); + } + + void JSLProgram::sendVec4(const char* name, float x, float y, float z, float w) + { + checkJSL(); + + int loc = glGetUniformLocation(pid, name); + glUniform4f(loc, x, y, z, w); + } + void JSLProgram::sendColor(const char* name, const color* col) + { + checkJSL(); + + int loc = glGetUniformLocation(pid, name); + glUniform4f(loc, + col->rgba.r / 255.f, + col->rgba.g / 255.f, + col->rgba.b / 255.f, + col->rgba.a / 255.f + ); + } + } } |