- fixed swapped color channels in the tinting part of the shader.

This commit is contained in:
Christoph Oelckers 2020-02-05 20:02:50 +01:00
parent f6d9b5602b
commit dbc958baeb
4 changed files with 20 additions and 19 deletions

View file

@ -1133,7 +1133,7 @@ extern int32_t r_rortexturerange;
extern int32_t r_rorphase; extern int32_t r_rorphase;
void hicinit(void); void hicinit(void);
void hicsetpalettetint(int32_t palnum, char r, char g, char b, char sr, char sg, char sb, polytintflags_t effect); void hicsetpalettetint(int32_t palnum, int r, int g, int b, int sr, int sg, int sb, polytintflags_t effect);
// flags bitset: 1 = don't compress // flags bitset: 1 = don't compress
int32_t Ptile2tile(int32_t tile, int32_t palette) ATTRIBUTE((pure)); int32_t Ptile2tile(int32_t tile, int32_t palette) ATTRIBUTE((pure));
int32_t md_loadmodel(const char *fn); int32_t md_loadmodel(const char *fn);

View file

@ -36,17 +36,17 @@ void hicinit(void)
// palette shifts on true-colour textures and only true-colour textures. // palette shifts on true-colour textures and only true-colour textures.
// effect bitset: 1 = greyscale, 2 = invert // effect bitset: 1 = greyscale, 2 = invert
// //
void hicsetpalettetint(int32_t palnum, char r, char g, char b, char sr, char sg, char sb, polytintflags_t effect) void hicsetpalettetint(int32_t palnum, int r, int g, int b, int sr, int sg, int sb, polytintflags_t effect)
{ {
if ((uint32_t)palnum >= (uint32_t)MAXPALOOKUPS) return; if ((uint32_t)palnum >= (uint32_t)MAXPALOOKUPS) return;
polytint_t & tint = hictinting[palnum]; polytint_t & tint = hictinting[palnum];
tint.tint.r = r; tint.tint.r = (uint8_t)r;
tint.tint.g = g; tint.tint.g = (uint8_t)g;
tint.tint.b = b; tint.tint.b = (uint8_t)b;
tint.shade.r = sr; tint.shade.r = (uint8_t)sr;
tint.shade.g = sg; tint.shade.g = (uint8_t)sg;
tint.shade.b = sb; tint.shade.b = (uint8_t)sb;
tint.f = effect; tint.f = effect;
} }

View file

@ -191,7 +191,8 @@ bool GLInstance::SetTextureInternal(int picnum, FTexture* tex, int palette, int
} }
// This is intentionally the same value for both parameters. The shader does not use the same uniform for modulation and overlay colors. // This is intentionally the same value for both parameters. The shader does not use the same uniform for modulation and overlay colors.
if (applytint && h.f) GLInterface.SetTinting(h.f, h.tint, h.tint); if (applytint && h.f)
GLInterface.SetTinting(h.f, h.tint, h.tint);
else GLInterface.SetTinting(-1, 0xffffff, 0xffffff); else GLInterface.SetTinting(-1, 0xffffff, 0xffffff);

View file

@ -103,34 +103,34 @@ vec4 convertColor(vec4 color)
// Much of this looks quite broken by design. Why is this effectively multplied by 4 if the flag is set...? :( // Much of this looks quite broken by design. Why is this effectively multplied by 4 if the flag is set...? :(
if ((effect & RF_HICTINT_Colorize) != 0) if ((effect & RF_HICTINT_Colorize) != 0)
{ {
tcol.b = min(((tcol.b) * u_tintModulate.r)* 4, 255.0); tcol.r = min(((tcol.b) * u_tintModulate.r)* 4, 255.0);
tcol.g = min(((tcol.g) * u_tintModulate.g)* 4, 255.0); tcol.g = min(((tcol.g) * u_tintModulate.g)* 4, 255.0);
tcol.r = min(((tcol.r) * u_tintModulate.b)* 4, 255.0); tcol.b = min(((tcol.r) * u_tintModulate.b)* 4, 255.0);
} }
else else
{ {
tcol.b = min(((tcol.b) * u_tintModulate.r), 255.0); tcol.r = min(((tcol.b) * u_tintModulate.r), 255.0);
tcol.g = min(((tcol.g) * u_tintModulate.g), 255.0); tcol.g = min(((tcol.g) * u_tintModulate.g), 255.0);
tcol.r = min(((tcol.r) * u_tintModulate.b), 255.0); tcol.b = min(((tcol.r) * u_tintModulate.b), 255.0);
} }
vec4 ov = u_tintOverlay * 255.0; vec4 ov = u_tintOverlay * 255.0;
switch (effect & RF_HICTINT_BLENDMASK) switch (effect & RF_HICTINT_BLENDMASK)
{ {
case RF_HICTINT_BLEND_Screen: case RF_HICTINT_BLEND_Screen:
tcol.b = 255.0 - (((255.0 - tcol.b) * (255.0 - ov.r)) / 256.0); tcol.r = 255.0 - (((255.0 - tcol.r) * (255.0 - ov.r)) / 256.0);
tcol.g = 255.0 - (((255.0 - tcol.g) * (255.0 - ov.g)) / 256.0); tcol.g = 255.0 - (((255.0 - tcol.g) * (255.0 - ov.g)) / 256.0);
tcol.r = 255.0 - (((255.0 - tcol.r) * (255.0 - ov.b)) / 256.0); tcol.b = 255.0 - (((255.0 - tcol.b) * (255.0 - ov.b)) / 256.0);
break; break;
case RF_HICTINT_BLEND_Overlay: case RF_HICTINT_BLEND_Overlay:
tcol.b = tcol.b < 128.0? (tcol.b * ov.r) / 128.0 : 255.0 - (((255.0 - tcol.b) * (255.0 - ov.r)) / 128.0); tcol.r = tcol.b < 128.0? (tcol.r * ov.r) / 128.0 : 255.0 - (((255.0 - tcol.r) * (255.0 - ov.r)) / 128.0);
tcol.g = tcol.g < 128.0? (tcol.g * ov.g) / 128.0 : 255.0 - (((255.0 - tcol.g) * (255.0 - ov.g)) / 128.0); tcol.g = tcol.g < 128.0? (tcol.g * ov.g) / 128.0 : 255.0 - (((255.0 - tcol.g) * (255.0 - ov.g)) / 128.0);
tcol.r = tcol.r < 128.0? (tcol.r * ov.b) / 128.0 : 255.0 - (((255.0 - tcol.r) * (255.0 - ov.b)) / 128.0); tcol.b = tcol.r < 128.0? (tcol.b * ov.b) / 128.0 : 255.0 - (((255.0 - tcol.b) * (255.0 - ov.b)) / 128.0);
break; break;
case RF_HICTINT_BLEND_Hardlight: case RF_HICTINT_BLEND_Hardlight:
tcol.b = ov.r < 128.0 ? (tcol.b * ov.r) / 128.0 : 255.0 - (((255.0 - tcol.b) * (255.0 - ov.r)) / 128.0); tcol.r = ov.r < 128.0 ? (tcol.r * ov.r) / 128.0 : 255.0 - (((255.0 - tcol.r) * (255.0 - ov.r)) / 128.0);
tcol.g = ov.g < 128.0 ? (tcol.g * ov.g) / 128.0 : 255.0 - (((255.0 - tcol.g) * (255.0 - ov.g)) / 128.0); tcol.g = ov.g < 128.0 ? (tcol.g * ov.g) / 128.0 : 255.0 - (((255.0 - tcol.g) * (255.0 - ov.g)) / 128.0);
tcol.r = ov.b < 128.0 ? (tcol.r * ov.b) / 128.0 : 255.0 - (((255.0 - tcol.r) * (255.0 - ov.b)) / 128.0); tcol.b = ov.b < 128.0 ? (tcol.b * ov.b) / 128.0 : 255.0 - (((255.0 - tcol.b) * (255.0 - ov.b)) / 128.0);
break; break;
} }
color.rgb = tcol / 255.0; color.rgb = tcol / 255.0;