1
0
mirror of synced 2024-12-13 00:01:13 +01:00
Switch-Toolbox/Toolbox/Shader/Layout/Legacy/Bflyt.frag
KillzXGaming 644d94090f A big layout editor update.
Added support for previewing layout animations.
This includes pane SRT, tex SRT, material color (white/black blending), texture patterns, pane visibilty, and vertex colors.
Added textbox previewing.  The scaling will be off, and more features is planned (caching font data to disk for faster loading, improve rendering, etc).
Rotations now render correctly for X/Y axis.
Added game window preview. This removes any editor only drawn objects and also fits the layout to the screen (aka root pane) size.
Add support for rendering custom blending with layout materials.
Add support for loading character icons for mk8d. These are hardcoded and have been manually set. Note these will only load if within the menu.szs.
2019-09-28 17:27:48 -04:00

187 lines
4.9 KiB
GLSL

uniform vec4 blackColor;
uniform vec4 whiteColor;
uniform int debugShading;
uniform int numTextureMaps;
uniform sampler2D textures0;
uniform sampler2D textures1;
uniform sampler2D textures2;
uniform int hasTexture0;
uniform int hasTexture1;
uniform int hasTexture2;
uniform int tevStage0RGB;
uniform int tevStage1RGB;
uniform int tevStage2RGB;
uniform int tevStage3RGB;
uniform int tevStage4RGB;
uniform int tevStage5RGB;
uniform int tevStage0A;
uniform int tevStage1A;
uniform int tevStage2A;
uniform int tevStage3A;
uniform int tevStage4A;
uniform int tevStage5A;
uniform int ThresholdingAlphaInterpolation;
uniform int numTevStages;
uniform sampler2D uvTestPattern;
#define gamma 2.2
vec3 ColorOP(int type, vec4 color)
{
switch (type)
{
case 0: return color.rgb;
case 1: return vec3(1) - color.rgb;
case 2: return color.aaa;
case 3: return vec3(1) - color.aaa;
case 4: return color.rrr;
case 5: return vec3(1) - color.rrr;
case 6: return color.ggg;
case 7: return vec3(1) - color.ggg;
case 8: return color.bbb;
case 9: return vec3(1) - color.bbb;
default: return color.rgb;
}
}
float AlphaOP(int type, vec4 color)
{
switch (type)
{
case 0: return color.a;
case 1: return 1.0 - color.a;
case 2: return color.r;
case 3: return 1.0 - color.r;
case 4: return color.g;
case 5: return 1.0 - color.g;
case 6: return color.b;
case 7: return 1.0 - color.b;
default: return color.a;
}
}
vec3 ColorCombiner(int type, vec4 j1, vec4 j2, vec4 j3)
{
switch (type)
{
case 0: return j1.rgb; //Replace
case 1: return j1.rgb * j2.rgb; //Modulate
case 2: return j1.rgb + j2.rgb; //Add
case 3: return j1.rgb + j2.rgb - vec3(0.5); //AddSigned
case 4: return j1.rgb * j3.rgb + j2.rgb * (vec3(1.0) - j3.rgb); //Interpolate
case 5: return j1.rgb - j2.rgb; //Subtract
case 6: return clamp(j1.rgb + j2.rgb, 0.0, 1.0) * j3.rgb; //AddMultiplicate
case 7: return (j1.rgb * j2.rgb) + j3.rgb; //MultiplcateAdd
case 8: return j1.rgb; //Overlay
case 9: return j1.rgb; //Indirect
case 10: return j1.rgb; //BlendIndirect
case 11: return j1.rgb; //EachIndirect
default: return j1.rgb;
}
}
float AlphaCombiner(int type, vec4 j1, vec4 j2, vec4 j3)
{
switch (type)
{
case 0: return j1.a; //Replace
case 1: return j1.a * j2.a; //Modulate
case 2: return j1.a + j2.a; //Add
case 3: return j1.a + j2.a - 0.5; //AddSigned
case 4: return j3.a + j2.a * (1.0 - j3.a); //Interpolate
case 5: return j1.a - j2.a; //Subtract
case 6: return clamp(j1.a + j2.a, 0.0, 1.0) * j3.a; //AddMultiplicate
case 7: return (j1.a * j2.a) + j3.a; //MultiplcateAdd
case 8: return j1.a; //Overlay
case 9: return j1.a; //Indirect
case 10: return j1.a; //BlendIndirect
case 11: return j1.a; //EachIndirect
default: return j1.a;
}
}
void main()
{
vec4 textureMap0 = vec4(1);
vec4 textureMap1 = vec4(1);
vec4 textureMap2 = vec4(1);
if (numTextureMaps > 0)
{
if (hasTexture0 == 1)
textureMap0 = texture2D(textures0, gl_TexCoord[0].st);
if (hasTexture1 == 1)
textureMap1 = texture2D(textures1, gl_TexCoord[0].st);
if (hasTexture2 == 1)
textureMap2 = texture2D(textures1, gl_TexCoord[0].st);
}
if (debugShading == 0)
{
// Convert to sRGB.
vec3 whiteColorSRGB = pow(whiteColor.rgb, vec3(1.0 / gamma));
vec3 whiteInterpolation = whiteColorSRGB.rgb * textureMap0.rgb;
vec3 blackInterpolation = (vec3(1) - textureMap0.rgb) * blackColor.rgb;
//vec3 colorBlend = whiteInterpolation + blackInterpolation;
vec3 colorBlend = ColorCombiner(4, vec4(whiteColorSRGB.rgb, 1), blackColor, textureMap0);
float alpha = textureMap0.a * whiteColor.a;
//More that 1 texture uses texture combiners
vec4 j1;
vec4 j2;
vec4 j3;
vec4 fragOutput;
vec4 previousStage = vec4(1);
if (numTextureMaps > 1 && numTevStages > 4)
{
for (int i = 0; i < numTevStages; i++)
{
j1 = textureMap0;
j2 = textureMap1;
j3 = vec4(1);
if (numTextureMaps > 2)
j3 = textureMap2;
vec4 comb1 = vec4(ColorCombiner(tevStage0RGB, j1, j2, j3), AlphaCombiner(tevStage0A, j1,j2,j3));
previousStage = comb1;
}
fragOutput = previousStage;
}
else
{
if (ThresholdingAlphaInterpolation != 0)
{
//Todo these need to interpolate and be smoother
if (textureMap0.a >= whiteColor.a) alpha = 1.0;
if (textureMap0.a <= blackColor.a) alpha = 0.0;
// if (blackColor.a < alpha && alpha < whiteColor.a)
// alpha = mix(0.0, 1.0, textureMap0.a);
}
fragOutput = vec4(colorBlend,alpha);;
}
fragOutput *= gl_Color;
gl_FragColor = fragOutput;
}
else if (debugShading == 5)
gl_FragColor = vec4(textureMap0.rgb, 1);
else if (debugShading == 1)
gl_FragColor = gl_Color;
else if (debugShading == 2)
gl_FragColor = whiteColor;
else if (debugShading == 3)
gl_FragColor = blackColor;
else if (debugShading == 4)
gl_FragColor = texture2D(uvTestPattern, gl_TexCoord[0].st);
}