diff --git a/mkxp.pro b/mkxp.pro index b46fed3..03a0085 100644 --- a/mkxp.pro +++ b/mkxp.pro @@ -96,6 +96,7 @@ EMBED = shader/transSimple.frag \ shader/simple.frag \ shader/simpleColor.frag \ shader/simpleAlpha.frag \ + shader/flashMap.frag \ shader/simple.vert \ shader/simpleColor.vert \ shader/sprite.vert \ diff --git a/shader/flashMap.frag b/shader/flashMap.frag new file mode 100644 index 0000000..9663c9e --- /dev/null +++ b/shader/flashMap.frag @@ -0,0 +1,13 @@ + +uniform float alpha; + +varying vec4 v_color; + +void main() +{ + vec4 frag = vec4(0, 0, 0, 1); + + frag.rgb = mix(vec3(0, 0, 0), v_color.rgb, alpha); + + gl_FragColor = frag; +} diff --git a/src/globalstate.cpp b/src/globalstate.cpp index 193b31f..76b3dbb 100644 --- a/src/globalstate.cpp +++ b/src/globalstate.cpp @@ -71,6 +71,7 @@ struct GlobalStatePrivate SimpleSpriteShader simpleSpriteShader; SpriteShader spriteShader; PlaneShader planeShader; + FlashMapShader flashMapShader; TransShader transShader; SimpleTransShader sTransShader; HueShader hueShader; @@ -187,6 +188,7 @@ GSATT(SimpleAlphaShader&, simpleAlphaShader) GSATT(SimpleSpriteShader&, simpleSpriteShader) GSATT(SpriteShader&, spriteShader) GSATT(PlaneShader&, planeShader) +GSATT(FlashMapShader&, flashMapShader) GSATT(TransShader&, transShader) GSATT(SimpleTransShader&, sTransShader) GSATT(HueShader&, hueShader) diff --git a/src/globalstate.h b/src/globalstate.h index 1bbeb90..f6f0966 100644 --- a/src/globalstate.h +++ b/src/globalstate.h @@ -48,6 +48,7 @@ class SimpleAlphaShader; class SimpleSpriteShader; class SpriteShader; class PlaneShader; +class FlashMapShader; class TransShader; class SimpleTransShader; class HueShader; @@ -87,6 +88,7 @@ struct GlobalState SimpleSpriteShader &simpleSpriteShader(); SpriteShader &spriteShader(); PlaneShader &planeShader(); + FlashMapShader &flashMapShader(); TransShader &transShader(); SimpleTransShader &sTransShader(); HueShader &hueShader(); diff --git a/src/shader.cpp b/src/shader.cpp index b5ce0bc..55ae1bb 100644 --- a/src/shader.cpp +++ b/src/shader.cpp @@ -36,6 +36,7 @@ #include "../simple.frag.xxd" #include "../simpleColor.frag.xxd" #include "../simpleAlpha.frag.xxd" +#include "../flashMap.frag.xxd" #include "../simple.vert.xxd" #include "../simpleColor.vert.xxd" #include "../sprite.vert.xxd" @@ -369,6 +370,21 @@ void PlaneShader::setOpacity(float value) } +FlashMapShader::FlashMapShader() +{ + INIT_SHADER(simpleColor, flashMap); + + ShaderBase::init(); + + GET_U(alpha); +} + +void FlashMapShader::setAlpha(float value) +{ + glUniform1f(u_alpha, value); +} + + HueShader::HueShader() { INIT_SHADER(simple, hue); diff --git a/src/shader.h b/src/shader.h index 8bb99b6..e259d8c 100644 --- a/src/shader.h +++ b/src/shader.h @@ -176,6 +176,17 @@ private: GLint u_tone, u_color, u_flash, u_opacity; }; +class FlashMapShader : public ShaderBase +{ +public: + FlashMapShader(); + + void setAlpha(float value); + +private: + GLint u_alpha; +}; + class HueShader : public ShaderBase { public: diff --git a/src/tilemap.cpp b/src/tilemap.cpp index 11d100b..2a58fd3 100644 --- a/src/tilemap.cpp +++ b/src/tilemap.cpp @@ -144,6 +144,18 @@ static const Position positions[] = static elementsN(positions); +static const uint8_t flashAlpha[] = +{ + /* Fade in */ + 0x3C, 0x3C, 0x3C, 0x3C, 0x4B, 0x4B, 0x4B, 0x4B, + 0x5A, 0x5A, 0x5A, 0x5A, 0x69, 0x69, 0x69, 0x69, + /* Fade out */ + 0x78, 0x78, 0x78, 0x78, 0x69, 0x69, 0x69, 0x69, + 0x5A, 0x5A, 0x5A, 0x5A, 0x4B, 0x4B, 0x4B, 0x4B +}; + +static elementsN(flashAlpha); + struct GroundLayer : public ViewportElement { GLsizei vboCount; @@ -233,6 +245,7 @@ struct TilemapPrivate VAO::ID vao; VBO::ID vbo; int quadCount; + uint8_t alphaIdx; } flash; /* Scene elements */ @@ -319,6 +332,7 @@ struct TilemapPrivate flash.vbo = VBO::gen(); flash.vao = VAO::gen(); flash.quadCount = 0; + flash.alphaIdx = 0; VAO::bind(flash.vao); @@ -751,12 +765,11 @@ struct TilemapPrivate if (packed == 0) return false; - const float max = 60.0 / 255.0; - const float step = max / 0xF; + const float max = 0xF; - float b = ((packed & 0x000F) >> 0) * step; - float g = ((packed & 0x00F0) >> 4) * step; - float r = ((packed & 0x0F00) >> 8) * step; + float b = ((packed & 0x000F) >> 0) / max; + float g = ((packed & 0x00F0) >> 4) / max; + float r = ((packed & 0x0F00) >> 8) / max; out = Vec4(r, g, b, 1); @@ -923,9 +936,10 @@ void GroundLayer::draw() glState.blendMode.pushSet(BlendAddition); glState.texture2D.pushSet(false); - SimpleColorShader &shader = gState->simpleColorShader(); + FlashMapShader &shader = gState->flashMapShader(); shader.bind(); shader.applyViewportProj(); + shader.setAlpha(flashAlpha[p->flash.alphaIdx] / 255.f); for (int i = 0; i < positionsN; ++i) { @@ -1062,6 +1076,11 @@ static const uchar atAnimation[16*4] = void Tilemap::update() { + /* Animate flash */ + if (++p->flash.alphaIdx > flashAlphaN-1) + p->flash.alphaIdx = 0; + + /* Animate autotiles */ if (!p->atlas.animated) return;