Implement animated flash tiles in Tilemap
Flash tiles start with an alpha of 60, which ramps up to 120 in 16 frames and 4 steps, then ramps down again over the same period.
This commit is contained in:
parent
9e63fb6b64
commit
7a6c05bba0
1
mkxp.pro
1
mkxp.pro
|
@ -96,6 +96,7 @@ EMBED = shader/transSimple.frag \
|
||||||
shader/simple.frag \
|
shader/simple.frag \
|
||||||
shader/simpleColor.frag \
|
shader/simpleColor.frag \
|
||||||
shader/simpleAlpha.frag \
|
shader/simpleAlpha.frag \
|
||||||
|
shader/flashMap.frag \
|
||||||
shader/simple.vert \
|
shader/simple.vert \
|
||||||
shader/simpleColor.vert \
|
shader/simpleColor.vert \
|
||||||
shader/sprite.vert \
|
shader/sprite.vert \
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
|
@ -71,6 +71,7 @@ struct GlobalStatePrivate
|
||||||
SimpleSpriteShader simpleSpriteShader;
|
SimpleSpriteShader simpleSpriteShader;
|
||||||
SpriteShader spriteShader;
|
SpriteShader spriteShader;
|
||||||
PlaneShader planeShader;
|
PlaneShader planeShader;
|
||||||
|
FlashMapShader flashMapShader;
|
||||||
TransShader transShader;
|
TransShader transShader;
|
||||||
SimpleTransShader sTransShader;
|
SimpleTransShader sTransShader;
|
||||||
HueShader hueShader;
|
HueShader hueShader;
|
||||||
|
@ -187,6 +188,7 @@ GSATT(SimpleAlphaShader&, simpleAlphaShader)
|
||||||
GSATT(SimpleSpriteShader&, simpleSpriteShader)
|
GSATT(SimpleSpriteShader&, simpleSpriteShader)
|
||||||
GSATT(SpriteShader&, spriteShader)
|
GSATT(SpriteShader&, spriteShader)
|
||||||
GSATT(PlaneShader&, planeShader)
|
GSATT(PlaneShader&, planeShader)
|
||||||
|
GSATT(FlashMapShader&, flashMapShader)
|
||||||
GSATT(TransShader&, transShader)
|
GSATT(TransShader&, transShader)
|
||||||
GSATT(SimpleTransShader&, sTransShader)
|
GSATT(SimpleTransShader&, sTransShader)
|
||||||
GSATT(HueShader&, hueShader)
|
GSATT(HueShader&, hueShader)
|
||||||
|
|
|
@ -48,6 +48,7 @@ class SimpleAlphaShader;
|
||||||
class SimpleSpriteShader;
|
class SimpleSpriteShader;
|
||||||
class SpriteShader;
|
class SpriteShader;
|
||||||
class PlaneShader;
|
class PlaneShader;
|
||||||
|
class FlashMapShader;
|
||||||
class TransShader;
|
class TransShader;
|
||||||
class SimpleTransShader;
|
class SimpleTransShader;
|
||||||
class HueShader;
|
class HueShader;
|
||||||
|
@ -87,6 +88,7 @@ struct GlobalState
|
||||||
SimpleSpriteShader &simpleSpriteShader();
|
SimpleSpriteShader &simpleSpriteShader();
|
||||||
SpriteShader &spriteShader();
|
SpriteShader &spriteShader();
|
||||||
PlaneShader &planeShader();
|
PlaneShader &planeShader();
|
||||||
|
FlashMapShader &flashMapShader();
|
||||||
TransShader &transShader();
|
TransShader &transShader();
|
||||||
SimpleTransShader &sTransShader();
|
SimpleTransShader &sTransShader();
|
||||||
HueShader &hueShader();
|
HueShader &hueShader();
|
||||||
|
|
|
@ -36,6 +36,7 @@
|
||||||
#include "../simple.frag.xxd"
|
#include "../simple.frag.xxd"
|
||||||
#include "../simpleColor.frag.xxd"
|
#include "../simpleColor.frag.xxd"
|
||||||
#include "../simpleAlpha.frag.xxd"
|
#include "../simpleAlpha.frag.xxd"
|
||||||
|
#include "../flashMap.frag.xxd"
|
||||||
#include "../simple.vert.xxd"
|
#include "../simple.vert.xxd"
|
||||||
#include "../simpleColor.vert.xxd"
|
#include "../simpleColor.vert.xxd"
|
||||||
#include "../sprite.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()
|
HueShader::HueShader()
|
||||||
{
|
{
|
||||||
INIT_SHADER(simple, hue);
|
INIT_SHADER(simple, hue);
|
||||||
|
|
11
src/shader.h
11
src/shader.h
|
@ -176,6 +176,17 @@ private:
|
||||||
GLint u_tone, u_color, u_flash, u_opacity;
|
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
|
class HueShader : public ShaderBase
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|
|
@ -144,6 +144,18 @@ static const Position positions[] =
|
||||||
|
|
||||||
static elementsN(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
|
struct GroundLayer : public ViewportElement
|
||||||
{
|
{
|
||||||
GLsizei vboCount;
|
GLsizei vboCount;
|
||||||
|
@ -233,6 +245,7 @@ struct TilemapPrivate
|
||||||
VAO::ID vao;
|
VAO::ID vao;
|
||||||
VBO::ID vbo;
|
VBO::ID vbo;
|
||||||
int quadCount;
|
int quadCount;
|
||||||
|
uint8_t alphaIdx;
|
||||||
} flash;
|
} flash;
|
||||||
|
|
||||||
/* Scene elements */
|
/* Scene elements */
|
||||||
|
@ -319,6 +332,7 @@ struct TilemapPrivate
|
||||||
flash.vbo = VBO::gen();
|
flash.vbo = VBO::gen();
|
||||||
flash.vao = VAO::gen();
|
flash.vao = VAO::gen();
|
||||||
flash.quadCount = 0;
|
flash.quadCount = 0;
|
||||||
|
flash.alphaIdx = 0;
|
||||||
|
|
||||||
VAO::bind(flash.vao);
|
VAO::bind(flash.vao);
|
||||||
|
|
||||||
|
@ -751,12 +765,11 @@ struct TilemapPrivate
|
||||||
if (packed == 0)
|
if (packed == 0)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
const float max = 60.0 / 255.0;
|
const float max = 0xF;
|
||||||
const float step = max / 0xF;
|
|
||||||
|
|
||||||
float b = ((packed & 0x000F) >> 0) * step;
|
float b = ((packed & 0x000F) >> 0) / max;
|
||||||
float g = ((packed & 0x00F0) >> 4) * step;
|
float g = ((packed & 0x00F0) >> 4) / max;
|
||||||
float r = ((packed & 0x0F00) >> 8) * step;
|
float r = ((packed & 0x0F00) >> 8) / max;
|
||||||
|
|
||||||
out = Vec4(r, g, b, 1);
|
out = Vec4(r, g, b, 1);
|
||||||
|
|
||||||
|
@ -923,9 +936,10 @@ void GroundLayer::draw()
|
||||||
glState.blendMode.pushSet(BlendAddition);
|
glState.blendMode.pushSet(BlendAddition);
|
||||||
glState.texture2D.pushSet(false);
|
glState.texture2D.pushSet(false);
|
||||||
|
|
||||||
SimpleColorShader &shader = gState->simpleColorShader();
|
FlashMapShader &shader = gState->flashMapShader();
|
||||||
shader.bind();
|
shader.bind();
|
||||||
shader.applyViewportProj();
|
shader.applyViewportProj();
|
||||||
|
shader.setAlpha(flashAlpha[p->flash.alphaIdx] / 255.f);
|
||||||
|
|
||||||
for (int i = 0; i < positionsN; ++i)
|
for (int i = 0; i < positionsN; ++i)
|
||||||
{
|
{
|
||||||
|
@ -1062,6 +1076,11 @@ static const uchar atAnimation[16*4] =
|
||||||
|
|
||||||
void Tilemap::update()
|
void Tilemap::update()
|
||||||
{
|
{
|
||||||
|
/* Animate flash */
|
||||||
|
if (++p->flash.alphaIdx > flashAlphaN-1)
|
||||||
|
p->flash.alphaIdx = 0;
|
||||||
|
|
||||||
|
/* Animate autotiles */
|
||||||
if (!p->atlas.animated)
|
if (!p->atlas.animated)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue