swwmgz_m/shaders/glsl/LogoAnimated.fp
Marisa Kirisame 4d7019ae86 Several changes from devel once more:
- Fuck it, Quadravol will be lever action.
 - Tiny cleanup.
 - Rewrite the weapon replacement system (less of a mess now maybe?).
 - Some menu fixes.
 - Minimap zoom increments like in the Common Library.
 - Add missing sound definition for Safety Tether.
   (This mostly went unnoticed because it's VERY rare to have it play)
 - Shift Sparkster x3 (DLC2) to slot 7.
   This way you can have both it and the Quadravol simultaneously.
   It would be unfair to not let you hold both "iconic" UnSX weapons at once.
 - Small lore tweak on Quadravol stance swap.
 - Fix off-by-one bug in looping palette lights.
 - Re-do logo shader. Use separate layer textures.
 - Fix Elemental Coating breaking "End Level" damage sectors.
(This will be the last batch of changes before I continue working on menus)
2021-12-08 18:17:41 +01:00

94 lines
2.5 KiB
GLSL

// animated SWWM GZ logo
#define overlay(a,b) (a<0.5)?(2.0*a*b):(1.0-(2.0*(1.0-a)*(1.0-b)))
const float pi = 3.14159265358979323846;
vec2 warpcoord( in vec2 uv )
{
vec2 offset;
offset.y = sin(pi*2.*(uv.x*8.+timer*.25))*.005;
offset.x = cos(pi*2.*(uv.y*4.+timer*.25))*.005;
return uv+offset;
}
// based on gimp color to alpha, but simplified
vec4 blacktoalpha( in vec4 src )
{
vec4 dst = src;
float alpha = 0.;
float a;
a = clamp(dst.r,0.,1.);
if ( a > alpha ) alpha = a;
a = clamp(dst.g,0.,1.);
if ( a > alpha ) alpha = a;
a = clamp(dst.b,0.,1.);
if ( a > alpha ) alpha = a;
if ( alpha > 0. )
{
float ainv = 1./alpha;
dst.rgb *= ainv;
}
dst.a *= alpha;
return dst;
}
#ifdef NO_BILINEAR
#define BilinearSample(x,y,z,w) texture(x,y)
#else
vec4 BilinearSample( in sampler2D tex, in vec2 pos, in vec2 size, in vec2 pxsize )
{
vec2 f = fract(pos*size);
pos += (.5-f)*pxsize;
vec4 p0q0 = texture(tex,pos);
vec4 p1q0 = texture(tex,pos+vec2(pxsize.x,0));
vec4 p0q1 = texture(tex,pos+vec2(0,pxsize.y));
vec4 p1q1 = texture(tex,pos+vec2(pxsize.x,pxsize.y));
vec4 pInterp_q0 = mix(p0q0,p1q0,f.x);
vec4 pInterp_q1 = mix(p0q1,p1q1,f.x);
return mix(pInterp_q0,pInterp_q1,f.y);
}
#endif
void SetupMaterial( inout Material mat )
{
// store these to save some time
vec2 size = vec2(textureSize(Layer1,0));
vec2 pxsize = 1./size;
// y'all ready for this multilayered madness?
vec2 uv = vTexCoord.st;
// base blank layer
vec4 base = vec4(0.,0.,0.,1.);
// first layer, blend
vec4 tmp = BilinearSample(Layer1,uv,size,pxsize);
base.rgb = mix(base.rgb,tmp.rgb,tmp.a);
// second layer, warp then add
tmp = BilinearSample(Layer2,warpcoord(uv),size,pxsize);
base.rgb += tmp.rgb;
// third layer, multiply
tmp = BilinearSample(Layer3,uv,size,pxsize);
base.rgb *= tmp.rgb;
// fourth layer, add
tmp = BilinearSample(Layer4,uv,size,pxsize);
base.rgb += tmp.rgb;
// fifth layer, add
tmp = BilinearSample(Layer5,uv,size,pxsize);
base.rgb += tmp.rgb;
// first layer again, overlay (w/ alpha blend)
tmp = BilinearSample(Layer1,uv,size,pxsize);
vec4 tmp2;
tmp2.r = overlay(base.r,tmp.r);
tmp2.g = overlay(base.g,tmp.g);
tmp2.b = overlay(base.b,tmp.b);
base.rgb = mix(base.rgb,tmp2.rgb,tmp.a);
// black to alpha
base = blacktoalpha(base);
// add alpha of first layer
base.a += BilinearSample(Layer1,uv,size,pxsize).a;
// clamp
base = clamp(base,vec4(0.),vec4(1.));
// sixth layer, alpha blend
tmp = BilinearSample(Layer6,uv,size,pxsize);
tmp2.a = tmp.a+base.a*(1-tmp.a);
tmp2.rgb = (tmp.rgb*tmp.a+base.rgb*base.a*(1-tmp.a))/tmp2.a;
// ding, logo's done
mat.Base = tmp2;
}