diff --git a/CMakeLists.txt b/CMakeLists.txt index 9fb0284..04f3c06 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -220,6 +220,7 @@ set(EMBEDDED_INPUT shader/simple.frag shader/simpleColor.frag shader/simpleAlpha.frag + shader/simpleAlphaUni.frag shader/flashMap.frag shader/simple.vert shader/simpleColor.vert diff --git a/mkxp.pro b/mkxp.pro index 0753a8a..f223482 100644 --- a/mkxp.pro +++ b/mkxp.pro @@ -193,6 +193,7 @@ EMBED = \ shader/simple.frag \ shader/simpleColor.frag \ shader/simpleAlpha.frag \ + shader/simpleAlphaUni.frag \ shader/flashMap.frag \ shader/simple.vert \ shader/simpleColor.vert \ diff --git a/shader/simpleAlphaUni.frag b/shader/simpleAlphaUni.frag new file mode 100644 index 0000000..cc0cac3 --- /dev/null +++ b/shader/simpleAlphaUni.frag @@ -0,0 +1,11 @@ + +uniform sampler2D texture; +uniform lowp float alpha; + +varying vec2 v_texCoord; + +void main() +{ + gl_FragColor = texture2D(texture, v_texCoord); + gl_FragColor.a *= alpha; +} diff --git a/src/shader.cpp b/src/shader.cpp index a31e376..4f891f2 100644 --- a/src/shader.cpp +++ b/src/shader.cpp @@ -38,6 +38,7 @@ #include "simple.frag.xxd" #include "simpleColor.frag.xxd" #include "simpleAlpha.frag.xxd" +#include "simpleAlphaUni.frag.xxd" #include "flashMap.frag.xxd" #include "simple.vert.xxd" #include "simpleColor.vert.xxd" @@ -314,6 +315,27 @@ void SimpleSpriteShader::setSpriteMat(const float value[16]) } +AlphaSpriteShader::AlphaSpriteShader() +{ + INIT_SHADER(sprite, simpleAlphaUni, AlphaSpriteShader); + + ShaderBase::init(); + + GET_U(spriteMat); + GET_U(alpha); +} + +void AlphaSpriteShader::setSpriteMat(const float value[16]) +{ + gl.UniformMatrix4fv(u_spriteMat, 1, GL_FALSE, value); +} + +void AlphaSpriteShader::setAlpha(float value) +{ + gl.Uniform1f(u_alpha, value); +} + + TransShader::TransShader() { INIT_SHADER(simple, trans, TransShader); diff --git a/src/shader.h b/src/shader.h index 768d53b..96a6e3b 100644 --- a/src/shader.h +++ b/src/shader.h @@ -121,6 +121,18 @@ private: GLint u_spriteMat; }; +class AlphaSpriteShader : public ShaderBase +{ +public: + AlphaSpriteShader(); + + void setSpriteMat(const float value[16]); + void setAlpha(float value); + +private: + GLint u_spriteMat, u_alpha; +}; + class TransShader : public ShaderBase { public: @@ -277,6 +289,7 @@ struct ShaderSet SimpleColorShader simpleColor; SimpleAlphaShader simpleAlpha; SimpleSpriteShader simpleSprite; + AlphaSpriteShader alphaSprite; SpriteShader sprite; PlaneShader plane; TilemapShader tilemap; diff --git a/src/sprite.cpp b/src/sprite.cpp index 9603099..df2106f 100644 --- a/src/sprite.cpp +++ b/src/sprite.cpp @@ -515,7 +515,6 @@ void Sprite::draw() bool renderEffect = p->color->hasEffect() || p->tone->hasEffect() || - p->opacity != 255 || flashing || p->bushDepth != 0; @@ -541,6 +540,16 @@ void Sprite::draw() base = &shader; } + else if (p->opacity != 255) + { + AlphaSpriteShader &shader = shState->shaders().alphaSprite; + shader.bind(); + + shader.setSpriteMat(p->trans.getMatrix()); + shader.setAlpha(p->opacity.norm); + shader.applyViewportProj(); + base = &shader; + } else { SimpleSpriteShader &shader = shState->shaders().simpleSprite;