From 1ce3b4c79cadc95fcc8a4cd64131d56768725d0f Mon Sep 17 00:00:00 2001 From: Magnus Norddahl Date: Sun, 23 Jul 2017 23:45:43 +0200 Subject: [PATCH] - Fix dynamic light clamping issue in truecolor drawers --- src/swrenderer/drawers/r_draw_span32.h | 4 ++++ src/swrenderer/drawers/r_draw_span32_sse2.h | 2 ++ src/swrenderer/drawers/r_draw_wall32.h | 4 ++++ src/swrenderer/drawers/r_draw_wall32_sse2.h | 2 ++ 4 files changed, 12 insertions(+) diff --git a/src/swrenderer/drawers/r_draw_span32.h b/src/swrenderer/drawers/r_draw_span32.h index dfbfb813e..15f24ffcf 100644 --- a/src/swrenderer/drawers/r_draw_span32.h +++ b/src/swrenderer/drawers/r_draw_span32.h @@ -355,6 +355,10 @@ namespace swrenderer lit.b += (light_color.b * attenuation) >> 8; } + lit.r = MIN(lit.r, 256); + lit.g = MIN(lit.g, 256); + lit.b = MIN(lit.b, 256); + fgcolor.r = MIN(fgcolor.r + ((material.r * lit.r) >> 8), 255); fgcolor.g = MIN(fgcolor.g + ((material.g * lit.g) >> 8), 255); fgcolor.b = MIN(fgcolor.b + ((material.b * lit.b) >> 8), 255); diff --git a/src/swrenderer/drawers/r_draw_span32_sse2.h b/src/swrenderer/drawers/r_draw_span32_sse2.h index 8d7cc28c4..92a50f0ff 100644 --- a/src/swrenderer/drawers/r_draw_span32_sse2.h +++ b/src/swrenderer/drawers/r_draw_span32_sse2.h @@ -399,6 +399,8 @@ namespace swrenderer lit = _mm_add_epi16(lit, _mm_srli_epi16(_mm_mullo_epi16(light_color, attenuation), 8)); } + lit = _mm_min_epi16(lit, _mm_set1_epi16(256)); + fgcolor = _mm_add_epi16(fgcolor, _mm_srli_epi16(_mm_mullo_epi16(material, lit), 8)); fgcolor = _mm_min_epi16(fgcolor, _mm_set1_epi16(255)); return fgcolor; diff --git a/src/swrenderer/drawers/r_draw_wall32.h b/src/swrenderer/drawers/r_draw_wall32.h index b39379528..972d5c1da 100644 --- a/src/swrenderer/drawers/r_draw_wall32.h +++ b/src/swrenderer/drawers/r_draw_wall32.h @@ -269,6 +269,10 @@ namespace swrenderer lit.b += (light_color.b * attenuation) >> 8; } + lit.r = MIN(lit.r, 256); + lit.g = MIN(lit.g, 256); + lit.b = MIN(lit.b, 256); + fgcolor.r = MIN(fgcolor.r + ((material.r * lit.r) >> 8), 255); fgcolor.g = MIN(fgcolor.g + ((material.g * lit.g) >> 8), 255); fgcolor.b = MIN(fgcolor.b + ((material.b * lit.b) >> 8), 255); diff --git a/src/swrenderer/drawers/r_draw_wall32_sse2.h b/src/swrenderer/drawers/r_draw_wall32_sse2.h index 8ac116da4..e51c11165 100644 --- a/src/swrenderer/drawers/r_draw_wall32_sse2.h +++ b/src/swrenderer/drawers/r_draw_wall32_sse2.h @@ -315,6 +315,8 @@ namespace swrenderer lit = _mm_add_epi16(lit, _mm_srli_epi16(_mm_mullo_epi16(light_color, attenuation), 8)); } + lit = _mm_min_epi16(lit, _mm_set1_epi16(256)); + fgcolor = _mm_add_epi16(fgcolor, _mm_srli_epi16(_mm_mullo_epi16(material, lit), 8)); fgcolor = _mm_min_epi16(fgcolor, _mm_set1_epi16(255)); return fgcolor;