From 1ce3b4c79cadc95fcc8a4cd64131d56768725d0f Mon Sep 17 00:00:00 2001
From: Magnus Norddahl <dpjudas@users.noreply.github.com>
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<uint32_t>(lit.r, 256);
+			lit.g = MIN<uint32_t>(lit.g, 256);
+			lit.b = MIN<uint32_t>(lit.b, 256);
+
 			fgcolor.r = MIN<uint32_t>(fgcolor.r + ((material.r * lit.r) >> 8), 255);
 			fgcolor.g = MIN<uint32_t>(fgcolor.g + ((material.g * lit.g) >> 8), 255);
 			fgcolor.b = MIN<uint32_t>(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<uint32_t>(lit.r, 256);
+			lit.g = MIN<uint32_t>(lit.g, 256);
+			lit.b = MIN<uint32_t>(lit.b, 256);
+
 			fgcolor.r = MIN<uint32_t>(fgcolor.r + ((material.r * lit.r) >> 8), 255);
 			fgcolor.g = MIN<uint32_t>(fgcolor.g + ((material.g * lit.g) >> 8), 255);
 			fgcolor.b = MIN<uint32_t>(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;