mirror of
https://github.com/DrBeef/Raze.git
synced 2024-12-14 22:51:42 +00:00
2cbe211e7c
The EDuke32 and RedNukem frontends are working, Blood isn't yet. Notes: many of the CMake variables and its output still refer to zdoom. Before changing that I wanted to make sure to be able to commit something that works. support code for Windows XP has been entirely removed. On Windows this will only target Vista and up. the crc32.h header had to be renamed to deconflict from zlib. several Windows API calls were changed to call the A-versions directly. Weirdly enough there were places that defined their parameters as T types but in a non-working way. removed some remaining editor files and support for the native software rendering only Windows backend. in a few simple cases, replaced 'char' with 'uint8_t'. The code as-is depends on chars being unsigned which is non-portable. This needs to be carefully reviewed.
115 lines
4.5 KiB
C++
115 lines
4.5 KiB
C++
char const *polymost1Frag = R"shader(
|
|
#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;
|
|
|
|
uniform vec2 u_clamp;
|
|
|
|
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;
|
|
uniform float u_brightness;
|
|
|
|
#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;
|
|
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);
|
|
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;
|
|
color.rgb = pow(color.rgb, vec3(u_brightness));
|
|
|
|
gl_FragData[0] = color;
|
|
}
|
|
)shader";
|