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
					
				
					 7 changed files with 70 additions and 6 deletions
				
			
		
							
								
								
									
										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 \
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										13
									
								
								shader/flashMap.frag
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								shader/flashMap.frag
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -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…
	
	Add table
		Add a link
		
	
		Reference in a new issue