2019-09-22 21:15:46 +00:00
|
|
|
char const *polymost1Frag = R"shader(
|
2019-07-12 08:44:36 +00:00
|
|
|
#version 110
|
|
|
|
|
|
|
|
//include an additional space here so that we can programmatically search for and disable this preprocessor definition easily
|
|
|
|
#define POLYMOST1_EXTENDED
|
|
|
|
|
|
|
|
//s_texture points to an indexed color texture
|
|
|
|
uniform sampler2D s_texture;
|
|
|
|
//s_palswap is the palette swap texture where u is the color index and v is the shade
|
|
|
|
uniform sampler2D s_palswap;
|
|
|
|
//s_palette is the base palette texture where u is the color index
|
|
|
|
uniform sampler2D s_palette;
|
|
|
|
|
|
|
|
#ifdef POLYMOST1_EXTENDED
|
|
|
|
uniform sampler2D s_detail;
|
|
|
|
uniform sampler2D s_glow;
|
|
|
|
#endif
|
|
|
|
|
|
|
|
//u_texturePosSize is the texture position & size packaged into a single vec4 as {pos.x, pos.y, size.x, size.y}
|
|
|
|
uniform vec4 u_texturePosSize;
|
|
|
|
uniform vec2 u_halfTexelSize;
|
|
|
|
uniform vec2 u_palswapPos;
|
|
|
|
uniform vec2 u_palswapSize;
|
|
|
|
|
2019-09-03 04:09:25 +00:00
|
|
|
uniform vec2 u_clamp;
|
2019-07-12 08:44:40 +00:00
|
|
|
|
2019-07-12 08:44:36 +00:00
|
|
|
uniform float u_shade;
|
|
|
|
uniform float u_numShades;
|
|
|
|
uniform float u_visFactor;
|
|
|
|
uniform float u_fogEnabled;
|
|
|
|
|
|
|
|
uniform float u_useColorOnly;
|
|
|
|
uniform float u_usePalette;
|
|
|
|
uniform float u_npotEmulation;
|
|
|
|
uniform float u_npotEmulationFactor;
|
|
|
|
uniform float u_npotEmulationXOffset;
|
|
|
|
uniform float u_shadeInterpolate;
|
2019-09-20 13:02:49 +00:00
|
|
|
uniform float u_brightness;
|
2019-07-12 08:44:36 +00:00
|
|
|
|
|
|
|
#ifdef POLYMOST1_EXTENDED
|
|
|
|
uniform float u_useDetailMapping;
|
|
|
|
uniform float u_useGlowMapping;
|
|
|
|
#endif
|
|
|
|
|
|
|
|
varying vec4 v_color;
|
|
|
|
varying float v_distance;
|
|
|
|
|
|
|
|
const float c_basepalScale = 255.0/256.0;
|
|
|
|
const float c_basepalOffset = 0.5/256.0;
|
|
|
|
|
|
|
|
const float c_zero = 0.0;
|
|
|
|
const float c_one = 1.0;
|
|
|
|
const float c_two = 2.0;
|
|
|
|
const vec4 c_vec4_one = vec4(c_one);
|
|
|
|
const float c_wrapThreshold = 0.9;
|
|
|
|
|
|
|
|
void main()
|
|
|
|
{
|
|
|
|
float coordY = mix(gl_TexCoord[0].y,gl_TexCoord[0].x,u_usePalette);
|
|
|
|
float coordX = mix(gl_TexCoord[0].x,gl_TexCoord[0].y,u_usePalette);
|
|
|
|
float period = floor(coordY/u_npotEmulationFactor);
|
|
|
|
coordX += u_npotEmulationXOffset*floor(mod(coordY,u_npotEmulationFactor));
|
|
|
|
coordY = period+mod(coordY,u_npotEmulationFactor);
|
|
|
|
vec2 newCoord = mix(gl_TexCoord[0].xy,mix(vec2(coordX,coordY),vec2(coordY,coordX),u_usePalette),u_npotEmulation);
|
|
|
|
vec2 transitionBlend = fwidth(floor(newCoord.xy));
|
|
|
|
transitionBlend = fwidth(transitionBlend)+transitionBlend;
|
2019-07-12 08:44:40 +00:00
|
|
|
vec2 texCoord = mix(mix(fract(newCoord.xy), abs(c_one-mod(newCoord.xy+c_one, c_two)), transitionBlend), clamp(newCoord.xy, c_zero, c_one), u_clamp);
|
2019-07-12 08:44:36 +00:00
|
|
|
texCoord = clamp(u_texturePosSize.zw*texCoord, u_halfTexelSize, u_texturePosSize.zw-u_halfTexelSize);
|
|
|
|
vec4 color = texture2D(s_texture, u_texturePosSize.xy+texCoord);
|
|
|
|
|
|
|
|
float shade = clamp((u_shade+max(u_visFactor*v_distance-0.5*u_shadeInterpolate,c_zero)), c_zero, u_numShades-c_one);
|
|
|
|
float shadeFrac = mod(shade, c_one);
|
|
|
|
float colorIndex = texture2D(s_palswap, u_palswapPos+u_palswapSize*vec2(color.r, floor(shade)/u_numShades)).r;
|
|
|
|
colorIndex = c_basepalOffset + c_basepalScale*colorIndex;
|
|
|
|
vec4 palettedColor = texture2D(s_palette, vec2(colorIndex, c_zero));
|
|
|
|
colorIndex = texture2D(s_palswap, u_palswapPos+u_palswapSize*vec2(color.r, (floor(shade)+c_one)/u_numShades)).r;
|
|
|
|
colorIndex = c_basepalOffset + c_basepalScale*colorIndex;
|
|
|
|
vec4 palettedColorNext = texture2D(s_palette, vec2(colorIndex, c_zero));
|
|
|
|
palettedColor.rgb = mix(palettedColor.rgb, palettedColorNext.rgb, shadeFrac*u_shadeInterpolate);
|
|
|
|
float fullbright = mix(u_usePalette*palettedColor.a, c_zero, u_useColorOnly);
|
|
|
|
palettedColor.a = c_one-floor(color.r);
|
|
|
|
color = mix(color, palettedColor, u_usePalette);
|
|
|
|
|
|
|
|
#ifdef POLYMOST1_EXTENDED
|
|
|
|
vec4 detailColor = texture2D(s_detail, gl_TexCoord[3].xy);
|
|
|
|
detailColor = mix(c_vec4_one, 2.0*detailColor, u_useDetailMapping*detailColor.a);
|
|
|
|
color.rgb *= detailColor.rgb;
|
|
|
|
#endif
|
|
|
|
|
|
|
|
color = mix(color, c_vec4_one, u_useColorOnly);
|
|
|
|
|
|
|
|
// DEBUG
|
|
|
|
//color = texture2D(s_palswap, gl_TexCoord[0].xy);
|
|
|
|
//color = texture2D(s_palette, gl_TexCoord[0].xy);
|
|
|
|
//color = texture2D(s_texture, gl_TexCoord[0].yx);
|
|
|
|
|
|
|
|
color.rgb = mix(v_color.rgb*color.rgb, color.rgb, fullbright);
|
|
|
|
|
|
|
|
float fogEnabled = mix(u_fogEnabled, c_zero, u_usePalette);
|
|
|
|
fullbright = max(c_one-fogEnabled, fullbright);
|
|
|
|
float fogFactor = clamp((gl_Fog.end-gl_FogFragCoord)*gl_Fog.scale, fullbright, c_one);
|
|
|
|
//float fogFactor = clamp(gl_FogFragCoord, fullbright, c_one);
|
|
|
|
color.rgb = mix(gl_Fog.color.rgb, color.rgb, fogFactor);
|
|
|
|
|
|
|
|
#ifdef POLYMOST1_EXTENDED
|
|
|
|
vec4 glowColor = texture2D(s_glow, gl_TexCoord[4].xy);
|
|
|
|
color.rgb = mix(color.rgb, glowColor.rgb, u_useGlowMapping*glowColor.a*(c_one-u_useColorOnly));
|
|
|
|
#endif
|
|
|
|
|
|
|
|
color.a *= v_color.a;
|
2019-09-20 13:02:49 +00:00
|
|
|
color.rgb = pow(color.rgb, vec3(u_brightness));
|
2019-07-12 08:44:36 +00:00
|
|
|
|
|
|
|
gl_FragData[0] = color;
|
|
|
|
}
|
2019-09-22 21:15:46 +00:00
|
|
|
)shader";
|