From 3c8a381f335c7549bc5c57b2d3bb4a8f4af42a88 Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Thu, 12 Sep 2024 00:25:52 +0600 Subject: [PATCH] Truecolor sky: Draw opaque black background on transparent texels Fixes HOM effect --- src/common/textures/image.cpp | 3 ++- src/gamedata/textures/animations.cpp | 5 ++++- src/rendering/swrenderer/drawers/r_draw_sky32.h | 16 ++++++++++++++++ .../swrenderer/drawers/r_draw_sky32_sse2.h | 16 ++++++++++++++++ 4 files changed, 38 insertions(+), 2 deletions(-) diff --git a/src/common/textures/image.cpp b/src/common/textures/image.cpp index 83f7450ebec..95ee7d23cc4 100644 --- a/src/common/textures/image.cpp +++ b/src/common/textures/image.cpp @@ -306,7 +306,8 @@ void FImageSource::EndPrecaching() void FImageSource::RegisterForPrecache(FImageSource *img, bool requiretruecolor) { - img->CollectForPrecache(precacheInfo, requiretruecolor); + if (img) + img->CollectForPrecache(precacheInfo, requiretruecolor); } //========================================================================== diff --git a/src/gamedata/textures/animations.cpp b/src/gamedata/textures/animations.cpp index 6df6497895f..7b7a1049bb4 100644 --- a/src/gamedata/textures/animations.cpp +++ b/src/gamedata/textures/animations.cpp @@ -1146,7 +1146,10 @@ void FTextureAnimator::UpdateAnimations (uint64_t mstime) if (updated) { fire->texture->CleanHardwareData(); - delete fire->texture->GetSoftwareTexture(); + + if (fire->texture->GetSoftwareTexture()) + delete fire->texture->GetSoftwareTexture(); + fire->texture->SetSoftwareTexture(nullptr); } } diff --git a/src/rendering/swrenderer/drawers/r_draw_sky32.h b/src/rendering/swrenderer/drawers/r_draw_sky32.h index ea9dff4f724..ab11948bd67 100644 --- a/src/rendering/swrenderer/drawers/r_draw_sky32.h +++ b/src/rendering/swrenderer/drawers/r_draw_sky32.h @@ -64,6 +64,8 @@ namespace swrenderer { uint32_t sample_index = (((((uint32_t)frac) << 8) >> FRACBITS) * textureheight0) >> FRACBITS; *dest = source0[sample_index]; + if (*dest == 0) + *dest |= 0xff000000; dest += pitch; frac += fracstep; } @@ -90,6 +92,8 @@ namespace swrenderer { uint32_t sample_index = (((((uint32_t)frac) << 8) >> FRACBITS) * textureheight0) >> FRACBITS; uint32_t fg = source0[sample_index]; + if (fg == 0) + fg |= 0xff000000; uint32_t alpha = max(min(frac >> (16 - start_fade), 256), 0); uint32_t inv_alpha = 256 - alpha; @@ -110,6 +114,8 @@ namespace swrenderer { uint32_t sample_index = (((((uint32_t)frac) << 8) >> FRACBITS) * textureheight0) >> FRACBITS; *dest = source0[sample_index]; + if (*dest == 0) + *dest |= 0xff000000; frac += fracstep; dest += pitch; @@ -121,6 +127,8 @@ namespace swrenderer { uint32_t sample_index = (((((uint32_t)frac) << 8) >> FRACBITS) * textureheight0) >> FRACBITS; uint32_t fg = source0[sample_index]; + if (fg == 0) + fg |= 0xff000000; uint32_t alpha = max(min(((2 << 24) - frac) >> (16 - start_fade), 256), 0); uint32_t inv_alpha = 256 - alpha; @@ -189,6 +197,8 @@ namespace swrenderer { uint32_t sample_index2 = min(sample_index, maxtextureheight1); fg = source1[sample_index2]; + if (fg == 0) + fg |= 0xff000000; } *dest = fg; @@ -222,6 +232,8 @@ namespace swrenderer { uint32_t sample_index2 = min(sample_index, maxtextureheight1); fg = source1[sample_index2]; + if (fg == 0) + fg |= 0xff000000; } uint32_t alpha = max(min(frac >> (16 - start_fade), 256), 0); @@ -245,6 +257,8 @@ namespace swrenderer { uint32_t sample_index2 = min(sample_index, maxtextureheight1); fg = source1[sample_index2]; + if (fg == 0) + fg |= 0xff000000; } *dest = fg; @@ -262,6 +276,8 @@ namespace swrenderer { uint32_t sample_index2 = min(sample_index, maxtextureheight1); fg = source1[sample_index2]; + if (fg == 0) + fg |= 0xff000000; } uint32_t alpha = max(min(((2 << 24) - frac) >> (16 - start_fade), 256), 0); diff --git a/src/rendering/swrenderer/drawers/r_draw_sky32_sse2.h b/src/rendering/swrenderer/drawers/r_draw_sky32_sse2.h index bc2411b835c..739bf298e50 100644 --- a/src/rendering/swrenderer/drawers/r_draw_sky32_sse2.h +++ b/src/rendering/swrenderer/drawers/r_draw_sky32_sse2.h @@ -64,6 +64,8 @@ namespace swrenderer { uint32_t sample_index = (((((uint32_t)frac) << 8) >> FRACBITS) * textureheight0) >> FRACBITS; *dest = source0[sample_index]; + if (*dest == 0) + *dest |= 0xff000000; dest += pitch; frac += fracstep; } @@ -90,6 +92,8 @@ namespace swrenderer { uint32_t sample_index = (((((uint32_t)frac) << 8) >> FRACBITS) * textureheight0) >> FRACBITS; uint32_t fg = source0[sample_index]; + if (fg == 0) + fg |= 0xff000000; __m128i alpha = _mm_set1_epi16(max(min(frac >> (16 - start_fade), 256), 0)); __m128i inv_alpha = _mm_sub_epi16(_mm_set1_epi16(256), alpha); @@ -108,6 +112,8 @@ namespace swrenderer { uint32_t sample_index = (((((uint32_t)frac) << 8) >> FRACBITS) * textureheight0) >> FRACBITS; *dest = source0[sample_index]; + if (*dest == 0) + *dest |= 0xff000000; frac += fracstep; dest += pitch; @@ -119,6 +125,8 @@ namespace swrenderer { uint32_t sample_index = (((((uint32_t)frac) << 8) >> FRACBITS) * textureheight0) >> FRACBITS; uint32_t fg = source0[sample_index]; + if (fg == 0) + fg |= 0xff000000; __m128i alpha = _mm_set1_epi16(max(min(((2 << 24) - frac) >> (16 - start_fade), 256), 0)); __m128i inv_alpha = _mm_sub_epi16(_mm_set1_epi16(256), alpha); @@ -173,6 +181,8 @@ namespace swrenderer { uint32_t sample_index2 = min(sample_index, maxtextureheight1); fg = source1[sample_index2]; + if (fg == 0) + fg |= 0xff000000; } *dest = fg; @@ -218,6 +228,8 @@ namespace swrenderer { uint32_t sample_index2 = min(sample_index, maxtextureheight1); fg = source1[sample_index2]; + if (fg == 0) + fg |= 0xff000000; } __m128i alpha = _mm_set1_epi16(max(min(frac >> (16 - start_fade), 256), 0)); @@ -241,6 +253,8 @@ namespace swrenderer { uint32_t sample_index2 = min(sample_index, maxtextureheight1); fg = source1[sample_index2]; + if (fg == 0) + fg |= 0xff000000; } *dest = fg; @@ -258,6 +272,8 @@ namespace swrenderer { uint32_t sample_index2 = min(sample_index, maxtextureheight1); fg = source1[sample_index2]; + if (fg == 0) + fg |= 0xff000000; } __m128i alpha = _mm_set1_epi16(max(min(((2 << 24) - frac) >> (16 - start_fade), 256), 0));