From ef41e8e54eb61272a565be80dcd6ecc2ee630ebf Mon Sep 17 00:00:00 2001 From: Magnus Norddahl Date: Thu, 23 Feb 2017 06:01:01 +0100 Subject: [PATCH] Add dynamic light to sprites --- src/swrenderer/drawers/r_draw_sprite32.h | 408 +++++++++++++++++++++ src/swrenderer/drawers/r_draw_sprite32.php | 15 +- src/swrenderer/things/r_sprite.cpp | 37 +- 3 files changed, 445 insertions(+), 15 deletions(-) diff --git a/src/swrenderer/drawers/r_draw_sprite32.h b/src/swrenderer/drawers/r_draw_sprite32.h index e3baa6c08..0bd83936d 100644 --- a/src/swrenderer/drawers/r_draw_sprite32.h +++ b/src/swrenderer/drawers/r_draw_sprite32.h @@ -56,6 +56,10 @@ namespace swrenderer int light = 256 - (args.Light() >> (FRACBITS - 8)); __m128i mlight = _mm_set_epi16(256, light, light, light, 256, light, light, light); __m128i inv_light = _mm_set_epi16(0, 256 - light, 256 - light, 256 - light, 0, 256 - light, 256 - light, 256 - light); + + __m128i dynlight = _mm_cvtsi32_si128(args.DynamicLight()); + dynlight = _mm_unpacklo_epi8(dynlight, _mm_setzero_si128()); + dynlight = _mm_shuffle_epi32(dynlight, _MM_SHUFFLE(1,0,1,0)); int count = args.Count(); int pitch = RenderViewport::Instance()->RenderTarget->GetPitch(); @@ -149,6 +153,10 @@ namespace swrenderer int light = 256 - (args.Light() >> (FRACBITS - 8)); __m128i mlight = _mm_set_epi16(256, light, light, light, 256, light, light, light); __m128i inv_light = _mm_set_epi16(0, 256 - light, 256 - light, 256 - light, 0, 256 - light, 256 - light, 256 - light); + + __m128i dynlight = _mm_cvtsi32_si128(args.DynamicLight()); + dynlight = _mm_unpacklo_epi8(dynlight, _mm_setzero_si128()); + dynlight = _mm_shuffle_epi32(dynlight, _MM_SHUFFLE(1,0,1,0)); int count = args.Count(); int pitch = RenderViewport::Instance()->RenderTarget->GetPitch(); @@ -314,6 +322,10 @@ namespace swrenderer shade_fade = _mm_mullo_epi16(shade_fade, inv_light); __m128i shade_light = _mm_set_epi16(shade_constants.light_alpha, shade_constants.light_red, shade_constants.light_green, shade_constants.light_blue, shade_constants.light_alpha, shade_constants.light_red, shade_constants.light_green, shade_constants.light_blue); int desaturate = shade_constants.desaturate; + + __m128i dynlight = _mm_cvtsi32_si128(args.DynamicLight()); + dynlight = _mm_unpacklo_epi8(dynlight, _mm_setzero_si128()); + dynlight = _mm_shuffle_epi32(dynlight, _MM_SHUFFLE(1,0,1,0)); int count = args.Count(); int pitch = RenderViewport::Instance()->RenderTarget->GetPitch(); @@ -412,6 +424,10 @@ namespace swrenderer shade_fade = _mm_mullo_epi16(shade_fade, inv_light); __m128i shade_light = _mm_set_epi16(shade_constants.light_alpha, shade_constants.light_red, shade_constants.light_green, shade_constants.light_blue, shade_constants.light_alpha, shade_constants.light_red, shade_constants.light_green, shade_constants.light_blue); int desaturate = shade_constants.desaturate; + + __m128i dynlight = _mm_cvtsi32_si128(args.DynamicLight()); + dynlight = _mm_unpacklo_epi8(dynlight, _mm_setzero_si128()); + dynlight = _mm_shuffle_epi32(dynlight, _MM_SHUFFLE(1,0,1,0)); int count = args.Count(); int pitch = RenderViewport::Instance()->RenderTarget->GetPitch(); @@ -588,6 +604,10 @@ namespace swrenderer int light = 256 - (args.Light() >> (FRACBITS - 8)); __m128i mlight = _mm_set_epi16(256, light, light, light, 256, light, light, light); __m128i inv_light = _mm_set_epi16(0, 256 - light, 256 - light, 256 - light, 0, 256 - light, 256 - light, 256 - light); + + __m128i dynlight = _mm_cvtsi32_si128(args.DynamicLight()); + dynlight = _mm_unpacklo_epi8(dynlight, _mm_setzero_si128()); + dynlight = _mm_shuffle_epi32(dynlight, _MM_SHUFFLE(1,0,1,0)); int count = args.Count(); int pitch = RenderViewport::Instance()->RenderTarget->GetPitch(); @@ -637,8 +657,12 @@ namespace swrenderer __m128i fgcolor = _mm_unpacklo_epi8(_mm_loadl_epi64((__m128i*)ifgcolor), _mm_setzero_si128()); // Shade + __m128i material = fgcolor; fgcolor = _mm_srli_epi16(_mm_mullo_epi16(fgcolor, mlight), 8); + fgcolor = _mm_add_epi16(fgcolor, _mm_srli_epi16(_mm_mullo_epi16(material, dynlight), 8)); + fgcolor = _mm_min_epi16(fgcolor, _mm_set1_epi16(255)); + // Blend __m128i outcolor = fgcolor; outcolor = _mm_packus_epi16(outcolor, _mm_setzero_si128()); @@ -665,8 +689,12 @@ namespace swrenderer __m128i fgcolor = _mm_unpacklo_epi8(_mm_loadl_epi64((__m128i*)ifgcolor), _mm_setzero_si128()); // Shade + __m128i material = fgcolor; fgcolor = _mm_srli_epi16(_mm_mullo_epi16(fgcolor, mlight), 8); + fgcolor = _mm_add_epi16(fgcolor, _mm_srli_epi16(_mm_mullo_epi16(material, dynlight), 8)); + fgcolor = _mm_min_epi16(fgcolor, _mm_set1_epi16(255)); + // Blend __m128i outcolor = fgcolor; outcolor = _mm_packus_epi16(outcolor, _mm_setzero_si128()); @@ -683,6 +711,10 @@ namespace swrenderer int light = 256 - (args.Light() >> (FRACBITS - 8)); __m128i mlight = _mm_set_epi16(256, light, light, light, 256, light, light, light); __m128i inv_light = _mm_set_epi16(0, 256 - light, 256 - light, 256 - light, 0, 256 - light, 256 - light, 256 - light); + + __m128i dynlight = _mm_cvtsi32_si128(args.DynamicLight()); + dynlight = _mm_unpacklo_epi8(dynlight, _mm_setzero_si128()); + dynlight = _mm_shuffle_epi32(dynlight, _MM_SHUFFLE(1,0,1,0)); int count = args.Count(); int pitch = RenderViewport::Instance()->RenderTarget->GetPitch(); @@ -773,8 +805,12 @@ namespace swrenderer __m128i fgcolor = _mm_unpacklo_epi8(_mm_loadl_epi64((__m128i*)ifgcolor), _mm_setzero_si128()); // Shade + __m128i material = fgcolor; fgcolor = _mm_srli_epi16(_mm_mullo_epi16(fgcolor, mlight), 8); + fgcolor = _mm_add_epi16(fgcolor, _mm_srli_epi16(_mm_mullo_epi16(material, dynlight), 8)); + fgcolor = _mm_min_epi16(fgcolor, _mm_set1_epi16(255)); + // Blend __m128i outcolor = fgcolor; outcolor = _mm_packus_epi16(outcolor, _mm_setzero_si128()); @@ -821,8 +857,12 @@ namespace swrenderer __m128i fgcolor = _mm_unpacklo_epi8(_mm_loadl_epi64((__m128i*)ifgcolor), _mm_setzero_si128()); // Shade + __m128i material = fgcolor; fgcolor = _mm_srli_epi16(_mm_mullo_epi16(fgcolor, mlight), 8); + fgcolor = _mm_add_epi16(fgcolor, _mm_srli_epi16(_mm_mullo_epi16(material, dynlight), 8)); + fgcolor = _mm_min_epi16(fgcolor, _mm_set1_epi16(255)); + // Blend __m128i outcolor = fgcolor; outcolor = _mm_packus_epi16(outcolor, _mm_setzero_si128()); @@ -850,6 +890,10 @@ namespace swrenderer shade_fade = _mm_mullo_epi16(shade_fade, inv_light); __m128i shade_light = _mm_set_epi16(shade_constants.light_alpha, shade_constants.light_red, shade_constants.light_green, shade_constants.light_blue, shade_constants.light_alpha, shade_constants.light_red, shade_constants.light_green, shade_constants.light_blue); int desaturate = shade_constants.desaturate; + + __m128i dynlight = _mm_cvtsi32_si128(args.DynamicLight()); + dynlight = _mm_unpacklo_epi8(dynlight, _mm_setzero_si128()); + dynlight = _mm_shuffle_epi32(dynlight, _MM_SHUFFLE(1,0,1,0)); int count = args.Count(); int pitch = RenderViewport::Instance()->RenderTarget->GetPitch(); @@ -899,6 +943,7 @@ namespace swrenderer __m128i fgcolor = _mm_unpacklo_epi8(_mm_loadl_epi64((__m128i*)ifgcolor), _mm_setzero_si128()); // Shade + __m128i material = fgcolor; int blue0 = BPART(ifgcolor[0]); int green0 = GPART(ifgcolor[0]); int red0 = RPART(ifgcolor[0]); @@ -916,6 +961,9 @@ namespace swrenderer fgcolor = _mm_srli_epi16(_mm_add_epi16(shade_fade, fgcolor), 8); fgcolor = _mm_srli_epi16(_mm_mullo_epi16(fgcolor, shade_light), 8); + fgcolor = _mm_add_epi16(fgcolor, _mm_srli_epi16(_mm_mullo_epi16(material, dynlight), 8)); + fgcolor = _mm_min_epi16(fgcolor, _mm_set1_epi16(255)); + // Blend __m128i outcolor = fgcolor; outcolor = _mm_packus_epi16(outcolor, _mm_setzero_si128()); @@ -942,6 +990,7 @@ namespace swrenderer __m128i fgcolor = _mm_unpacklo_epi8(_mm_loadl_epi64((__m128i*)ifgcolor), _mm_setzero_si128()); // Shade + __m128i material = fgcolor; int blue0 = BPART(ifgcolor[0]); int green0 = GPART(ifgcolor[0]); int red0 = RPART(ifgcolor[0]); @@ -959,6 +1008,9 @@ namespace swrenderer fgcolor = _mm_srli_epi16(_mm_add_epi16(shade_fade, fgcolor), 8); fgcolor = _mm_srli_epi16(_mm_mullo_epi16(fgcolor, shade_light), 8); + fgcolor = _mm_add_epi16(fgcolor, _mm_srli_epi16(_mm_mullo_epi16(material, dynlight), 8)); + fgcolor = _mm_min_epi16(fgcolor, _mm_set1_epi16(255)); + // Blend __m128i outcolor = fgcolor; outcolor = _mm_packus_epi16(outcolor, _mm_setzero_si128()); @@ -980,6 +1032,10 @@ namespace swrenderer shade_fade = _mm_mullo_epi16(shade_fade, inv_light); __m128i shade_light = _mm_set_epi16(shade_constants.light_alpha, shade_constants.light_red, shade_constants.light_green, shade_constants.light_blue, shade_constants.light_alpha, shade_constants.light_red, shade_constants.light_green, shade_constants.light_blue); int desaturate = shade_constants.desaturate; + + __m128i dynlight = _mm_cvtsi32_si128(args.DynamicLight()); + dynlight = _mm_unpacklo_epi8(dynlight, _mm_setzero_si128()); + dynlight = _mm_shuffle_epi32(dynlight, _MM_SHUFFLE(1,0,1,0)); int count = args.Count(); int pitch = RenderViewport::Instance()->RenderTarget->GetPitch(); @@ -1070,6 +1126,7 @@ namespace swrenderer __m128i fgcolor = _mm_unpacklo_epi8(_mm_loadl_epi64((__m128i*)ifgcolor), _mm_setzero_si128()); // Shade + __m128i material = fgcolor; int blue0 = BPART(ifgcolor[0]); int green0 = GPART(ifgcolor[0]); int red0 = RPART(ifgcolor[0]); @@ -1087,6 +1144,9 @@ namespace swrenderer fgcolor = _mm_srli_epi16(_mm_add_epi16(shade_fade, fgcolor), 8); fgcolor = _mm_srli_epi16(_mm_mullo_epi16(fgcolor, shade_light), 8); + fgcolor = _mm_add_epi16(fgcolor, _mm_srli_epi16(_mm_mullo_epi16(material, dynlight), 8)); + fgcolor = _mm_min_epi16(fgcolor, _mm_set1_epi16(255)); + // Blend __m128i outcolor = fgcolor; outcolor = _mm_packus_epi16(outcolor, _mm_setzero_si128()); @@ -1133,6 +1193,7 @@ namespace swrenderer __m128i fgcolor = _mm_unpacklo_epi8(_mm_loadl_epi64((__m128i*)ifgcolor), _mm_setzero_si128()); // Shade + __m128i material = fgcolor; int blue0 = BPART(ifgcolor[0]); int green0 = GPART(ifgcolor[0]); int red0 = RPART(ifgcolor[0]); @@ -1150,6 +1211,9 @@ namespace swrenderer fgcolor = _mm_srli_epi16(_mm_add_epi16(shade_fade, fgcolor), 8); fgcolor = _mm_srli_epi16(_mm_mullo_epi16(fgcolor, shade_light), 8); + fgcolor = _mm_add_epi16(fgcolor, _mm_srli_epi16(_mm_mullo_epi16(material, dynlight), 8)); + fgcolor = _mm_min_epi16(fgcolor, _mm_set1_epi16(255)); + // Blend __m128i outcolor = fgcolor; outcolor = _mm_packus_epi16(outcolor, _mm_setzero_si128()); @@ -1188,6 +1252,10 @@ namespace swrenderer int light = 256 - (args.Light() >> (FRACBITS - 8)); __m128i mlight = _mm_set_epi16(256, light, light, light, 256, light, light, light); __m128i inv_light = _mm_set_epi16(0, 256 - light, 256 - light, 256 - light, 0, 256 - light, 256 - light, 256 - light); + + __m128i dynlight = _mm_cvtsi32_si128(args.DynamicLight()); + dynlight = _mm_unpacklo_epi8(dynlight, _mm_setzero_si128()); + dynlight = _mm_shuffle_epi32(dynlight, _MM_SHUFFLE(1,0,1,0)); int count = args.Count(); int pitch = RenderViewport::Instance()->RenderTarget->GetPitch(); @@ -1238,8 +1306,12 @@ namespace swrenderer __m128i fgcolor = _mm_unpacklo_epi8(_mm_loadl_epi64((__m128i*)ifgcolor), _mm_setzero_si128()); // Shade + __m128i material = fgcolor; fgcolor = _mm_srli_epi16(_mm_mullo_epi16(fgcolor, mlight), 8); + fgcolor = _mm_add_epi16(fgcolor, _mm_srli_epi16(_mm_mullo_epi16(material, dynlight), 8)); + fgcolor = _mm_min_epi16(fgcolor, _mm_set1_epi16(255)); + // Blend uint32_t alpha0 = APART(ifgcolor[0]); uint32_t alpha1 = APART(ifgcolor[1]); @@ -1296,8 +1368,12 @@ namespace swrenderer __m128i fgcolor = _mm_unpacklo_epi8(_mm_loadl_epi64((__m128i*)ifgcolor), _mm_setzero_si128()); // Shade + __m128i material = fgcolor; fgcolor = _mm_srli_epi16(_mm_mullo_epi16(fgcolor, mlight), 8); + fgcolor = _mm_add_epi16(fgcolor, _mm_srli_epi16(_mm_mullo_epi16(material, dynlight), 8)); + fgcolor = _mm_min_epi16(fgcolor, _mm_set1_epi16(255)); + // Blend uint32_t alpha0 = APART(ifgcolor[0]); uint32_t alpha1 = APART(ifgcolor[1]); @@ -1343,6 +1419,10 @@ namespace swrenderer int light = 256 - (args.Light() >> (FRACBITS - 8)); __m128i mlight = _mm_set_epi16(256, light, light, light, 256, light, light, light); __m128i inv_light = _mm_set_epi16(0, 256 - light, 256 - light, 256 - light, 0, 256 - light, 256 - light, 256 - light); + + __m128i dynlight = _mm_cvtsi32_si128(args.DynamicLight()); + dynlight = _mm_unpacklo_epi8(dynlight, _mm_setzero_si128()); + dynlight = _mm_shuffle_epi32(dynlight, _MM_SHUFFLE(1,0,1,0)); int count = args.Count(); int pitch = RenderViewport::Instance()->RenderTarget->GetPitch(); @@ -1434,8 +1514,12 @@ namespace swrenderer __m128i fgcolor = _mm_unpacklo_epi8(_mm_loadl_epi64((__m128i*)ifgcolor), _mm_setzero_si128()); // Shade + __m128i material = fgcolor; fgcolor = _mm_srli_epi16(_mm_mullo_epi16(fgcolor, mlight), 8); + fgcolor = _mm_add_epi16(fgcolor, _mm_srli_epi16(_mm_mullo_epi16(material, dynlight), 8)); + fgcolor = _mm_min_epi16(fgcolor, _mm_set1_epi16(255)); + // Blend uint32_t alpha0 = APART(ifgcolor[0]); uint32_t alpha1 = APART(ifgcolor[1]); @@ -1512,8 +1596,12 @@ namespace swrenderer __m128i fgcolor = _mm_unpacklo_epi8(_mm_loadl_epi64((__m128i*)ifgcolor), _mm_setzero_si128()); // Shade + __m128i material = fgcolor; fgcolor = _mm_srli_epi16(_mm_mullo_epi16(fgcolor, mlight), 8); + fgcolor = _mm_add_epi16(fgcolor, _mm_srli_epi16(_mm_mullo_epi16(material, dynlight), 8)); + fgcolor = _mm_min_epi16(fgcolor, _mm_set1_epi16(255)); + // Blend uint32_t alpha0 = APART(ifgcolor[0]); uint32_t alpha1 = APART(ifgcolor[1]); @@ -1570,6 +1658,10 @@ namespace swrenderer shade_fade = _mm_mullo_epi16(shade_fade, inv_light); __m128i shade_light = _mm_set_epi16(shade_constants.light_alpha, shade_constants.light_red, shade_constants.light_green, shade_constants.light_blue, shade_constants.light_alpha, shade_constants.light_red, shade_constants.light_green, shade_constants.light_blue); int desaturate = shade_constants.desaturate; + + __m128i dynlight = _mm_cvtsi32_si128(args.DynamicLight()); + dynlight = _mm_unpacklo_epi8(dynlight, _mm_setzero_si128()); + dynlight = _mm_shuffle_epi32(dynlight, _MM_SHUFFLE(1,0,1,0)); int count = args.Count(); int pitch = RenderViewport::Instance()->RenderTarget->GetPitch(); @@ -1620,6 +1712,7 @@ namespace swrenderer __m128i fgcolor = _mm_unpacklo_epi8(_mm_loadl_epi64((__m128i*)ifgcolor), _mm_setzero_si128()); // Shade + __m128i material = fgcolor; int blue0 = BPART(ifgcolor[0]); int green0 = GPART(ifgcolor[0]); int red0 = RPART(ifgcolor[0]); @@ -1637,6 +1730,9 @@ namespace swrenderer fgcolor = _mm_srli_epi16(_mm_add_epi16(shade_fade, fgcolor), 8); fgcolor = _mm_srli_epi16(_mm_mullo_epi16(fgcolor, shade_light), 8); + fgcolor = _mm_add_epi16(fgcolor, _mm_srli_epi16(_mm_mullo_epi16(material, dynlight), 8)); + fgcolor = _mm_min_epi16(fgcolor, _mm_set1_epi16(255)); + // Blend uint32_t alpha0 = APART(ifgcolor[0]); uint32_t alpha1 = APART(ifgcolor[1]); @@ -1693,6 +1789,7 @@ namespace swrenderer __m128i fgcolor = _mm_unpacklo_epi8(_mm_loadl_epi64((__m128i*)ifgcolor), _mm_setzero_si128()); // Shade + __m128i material = fgcolor; int blue0 = BPART(ifgcolor[0]); int green0 = GPART(ifgcolor[0]); int red0 = RPART(ifgcolor[0]); @@ -1710,6 +1807,9 @@ namespace swrenderer fgcolor = _mm_srli_epi16(_mm_add_epi16(shade_fade, fgcolor), 8); fgcolor = _mm_srli_epi16(_mm_mullo_epi16(fgcolor, shade_light), 8); + fgcolor = _mm_add_epi16(fgcolor, _mm_srli_epi16(_mm_mullo_epi16(material, dynlight), 8)); + fgcolor = _mm_min_epi16(fgcolor, _mm_set1_epi16(255)); + // Blend uint32_t alpha0 = APART(ifgcolor[0]); uint32_t alpha1 = APART(ifgcolor[1]); @@ -1760,6 +1860,10 @@ namespace swrenderer shade_fade = _mm_mullo_epi16(shade_fade, inv_light); __m128i shade_light = _mm_set_epi16(shade_constants.light_alpha, shade_constants.light_red, shade_constants.light_green, shade_constants.light_blue, shade_constants.light_alpha, shade_constants.light_red, shade_constants.light_green, shade_constants.light_blue); int desaturate = shade_constants.desaturate; + + __m128i dynlight = _mm_cvtsi32_si128(args.DynamicLight()); + dynlight = _mm_unpacklo_epi8(dynlight, _mm_setzero_si128()); + dynlight = _mm_shuffle_epi32(dynlight, _MM_SHUFFLE(1,0,1,0)); int count = args.Count(); int pitch = RenderViewport::Instance()->RenderTarget->GetPitch(); @@ -1851,6 +1955,7 @@ namespace swrenderer __m128i fgcolor = _mm_unpacklo_epi8(_mm_loadl_epi64((__m128i*)ifgcolor), _mm_setzero_si128()); // Shade + __m128i material = fgcolor; int blue0 = BPART(ifgcolor[0]); int green0 = GPART(ifgcolor[0]); int red0 = RPART(ifgcolor[0]); @@ -1868,6 +1973,9 @@ namespace swrenderer fgcolor = _mm_srli_epi16(_mm_add_epi16(shade_fade, fgcolor), 8); fgcolor = _mm_srli_epi16(_mm_mullo_epi16(fgcolor, shade_light), 8); + fgcolor = _mm_add_epi16(fgcolor, _mm_srli_epi16(_mm_mullo_epi16(material, dynlight), 8)); + fgcolor = _mm_min_epi16(fgcolor, _mm_set1_epi16(255)); + // Blend uint32_t alpha0 = APART(ifgcolor[0]); uint32_t alpha1 = APART(ifgcolor[1]); @@ -1944,6 +2052,7 @@ namespace swrenderer __m128i fgcolor = _mm_unpacklo_epi8(_mm_loadl_epi64((__m128i*)ifgcolor), _mm_setzero_si128()); // Shade + __m128i material = fgcolor; int blue0 = BPART(ifgcolor[0]); int green0 = GPART(ifgcolor[0]); int red0 = RPART(ifgcolor[0]); @@ -1961,6 +2070,9 @@ namespace swrenderer fgcolor = _mm_srli_epi16(_mm_add_epi16(shade_fade, fgcolor), 8); fgcolor = _mm_srli_epi16(_mm_mullo_epi16(fgcolor, shade_light), 8); + fgcolor = _mm_add_epi16(fgcolor, _mm_srli_epi16(_mm_mullo_epi16(material, dynlight), 8)); + fgcolor = _mm_min_epi16(fgcolor, _mm_set1_epi16(255)); + // Blend uint32_t alpha0 = APART(ifgcolor[0]); uint32_t alpha1 = APART(ifgcolor[1]); @@ -2028,6 +2140,10 @@ namespace swrenderer int light = 256 - (args.Light() >> (FRACBITS - 8)); __m128i mlight = _mm_set_epi16(256, light, light, light, 256, light, light, light); __m128i inv_light = _mm_set_epi16(0, 256 - light, 256 - light, 256 - light, 0, 256 - light, 256 - light, 256 - light); + + __m128i dynlight = _mm_cvtsi32_si128(args.DynamicLight()); + dynlight = _mm_unpacklo_epi8(dynlight, _mm_setzero_si128()); + dynlight = _mm_shuffle_epi32(dynlight, _MM_SHUFFLE(1,0,1,0)); int count = args.Count(); int pitch = RenderViewport::Instance()->RenderTarget->GetPitch(); @@ -2078,8 +2194,12 @@ namespace swrenderer __m128i fgcolor = _mm_unpacklo_epi8(_mm_loadl_epi64((__m128i*)ifgcolor), _mm_setzero_si128()); // Shade + __m128i material = fgcolor; fgcolor = _mm_srli_epi16(_mm_mullo_epi16(fgcolor, mlight), 8); + fgcolor = _mm_add_epi16(fgcolor, _mm_srli_epi16(_mm_mullo_epi16(material, dynlight), 8)); + fgcolor = _mm_min_epi16(fgcolor, _mm_set1_epi16(255)); + // Blend uint32_t alpha0 = APART(ifgcolor[0]); uint32_t alpha1 = APART(ifgcolor[1]); @@ -2136,8 +2256,12 @@ namespace swrenderer __m128i fgcolor = _mm_unpacklo_epi8(_mm_loadl_epi64((__m128i*)ifgcolor), _mm_setzero_si128()); // Shade + __m128i material = fgcolor; fgcolor = _mm_srli_epi16(_mm_mullo_epi16(fgcolor, mlight), 8); + fgcolor = _mm_add_epi16(fgcolor, _mm_srli_epi16(_mm_mullo_epi16(material, dynlight), 8)); + fgcolor = _mm_min_epi16(fgcolor, _mm_set1_epi16(255)); + // Blend uint32_t alpha0 = APART(ifgcolor[0]); uint32_t alpha1 = APART(ifgcolor[1]); @@ -2183,6 +2307,10 @@ namespace swrenderer int light = 256 - (args.Light() >> (FRACBITS - 8)); __m128i mlight = _mm_set_epi16(256, light, light, light, 256, light, light, light); __m128i inv_light = _mm_set_epi16(0, 256 - light, 256 - light, 256 - light, 0, 256 - light, 256 - light, 256 - light); + + __m128i dynlight = _mm_cvtsi32_si128(args.DynamicLight()); + dynlight = _mm_unpacklo_epi8(dynlight, _mm_setzero_si128()); + dynlight = _mm_shuffle_epi32(dynlight, _MM_SHUFFLE(1,0,1,0)); int count = args.Count(); int pitch = RenderViewport::Instance()->RenderTarget->GetPitch(); @@ -2274,8 +2402,12 @@ namespace swrenderer __m128i fgcolor = _mm_unpacklo_epi8(_mm_loadl_epi64((__m128i*)ifgcolor), _mm_setzero_si128()); // Shade + __m128i material = fgcolor; fgcolor = _mm_srli_epi16(_mm_mullo_epi16(fgcolor, mlight), 8); + fgcolor = _mm_add_epi16(fgcolor, _mm_srli_epi16(_mm_mullo_epi16(material, dynlight), 8)); + fgcolor = _mm_min_epi16(fgcolor, _mm_set1_epi16(255)); + // Blend uint32_t alpha0 = APART(ifgcolor[0]); uint32_t alpha1 = APART(ifgcolor[1]); @@ -2352,8 +2484,12 @@ namespace swrenderer __m128i fgcolor = _mm_unpacklo_epi8(_mm_loadl_epi64((__m128i*)ifgcolor), _mm_setzero_si128()); // Shade + __m128i material = fgcolor; fgcolor = _mm_srli_epi16(_mm_mullo_epi16(fgcolor, mlight), 8); + fgcolor = _mm_add_epi16(fgcolor, _mm_srli_epi16(_mm_mullo_epi16(material, dynlight), 8)); + fgcolor = _mm_min_epi16(fgcolor, _mm_set1_epi16(255)); + // Blend uint32_t alpha0 = APART(ifgcolor[0]); uint32_t alpha1 = APART(ifgcolor[1]); @@ -2410,6 +2546,10 @@ namespace swrenderer shade_fade = _mm_mullo_epi16(shade_fade, inv_light); __m128i shade_light = _mm_set_epi16(shade_constants.light_alpha, shade_constants.light_red, shade_constants.light_green, shade_constants.light_blue, shade_constants.light_alpha, shade_constants.light_red, shade_constants.light_green, shade_constants.light_blue); int desaturate = shade_constants.desaturate; + + __m128i dynlight = _mm_cvtsi32_si128(args.DynamicLight()); + dynlight = _mm_unpacklo_epi8(dynlight, _mm_setzero_si128()); + dynlight = _mm_shuffle_epi32(dynlight, _MM_SHUFFLE(1,0,1,0)); int count = args.Count(); int pitch = RenderViewport::Instance()->RenderTarget->GetPitch(); @@ -2460,6 +2600,7 @@ namespace swrenderer __m128i fgcolor = _mm_unpacklo_epi8(_mm_loadl_epi64((__m128i*)ifgcolor), _mm_setzero_si128()); // Shade + __m128i material = fgcolor; int blue0 = BPART(ifgcolor[0]); int green0 = GPART(ifgcolor[0]); int red0 = RPART(ifgcolor[0]); @@ -2477,6 +2618,9 @@ namespace swrenderer fgcolor = _mm_srli_epi16(_mm_add_epi16(shade_fade, fgcolor), 8); fgcolor = _mm_srli_epi16(_mm_mullo_epi16(fgcolor, shade_light), 8); + fgcolor = _mm_add_epi16(fgcolor, _mm_srli_epi16(_mm_mullo_epi16(material, dynlight), 8)); + fgcolor = _mm_min_epi16(fgcolor, _mm_set1_epi16(255)); + // Blend uint32_t alpha0 = APART(ifgcolor[0]); uint32_t alpha1 = APART(ifgcolor[1]); @@ -2533,6 +2677,7 @@ namespace swrenderer __m128i fgcolor = _mm_unpacklo_epi8(_mm_loadl_epi64((__m128i*)ifgcolor), _mm_setzero_si128()); // Shade + __m128i material = fgcolor; int blue0 = BPART(ifgcolor[0]); int green0 = GPART(ifgcolor[0]); int red0 = RPART(ifgcolor[0]); @@ -2550,6 +2695,9 @@ namespace swrenderer fgcolor = _mm_srli_epi16(_mm_add_epi16(shade_fade, fgcolor), 8); fgcolor = _mm_srli_epi16(_mm_mullo_epi16(fgcolor, shade_light), 8); + fgcolor = _mm_add_epi16(fgcolor, _mm_srli_epi16(_mm_mullo_epi16(material, dynlight), 8)); + fgcolor = _mm_min_epi16(fgcolor, _mm_set1_epi16(255)); + // Blend uint32_t alpha0 = APART(ifgcolor[0]); uint32_t alpha1 = APART(ifgcolor[1]); @@ -2600,6 +2748,10 @@ namespace swrenderer shade_fade = _mm_mullo_epi16(shade_fade, inv_light); __m128i shade_light = _mm_set_epi16(shade_constants.light_alpha, shade_constants.light_red, shade_constants.light_green, shade_constants.light_blue, shade_constants.light_alpha, shade_constants.light_red, shade_constants.light_green, shade_constants.light_blue); int desaturate = shade_constants.desaturate; + + __m128i dynlight = _mm_cvtsi32_si128(args.DynamicLight()); + dynlight = _mm_unpacklo_epi8(dynlight, _mm_setzero_si128()); + dynlight = _mm_shuffle_epi32(dynlight, _MM_SHUFFLE(1,0,1,0)); int count = args.Count(); int pitch = RenderViewport::Instance()->RenderTarget->GetPitch(); @@ -2691,6 +2843,7 @@ namespace swrenderer __m128i fgcolor = _mm_unpacklo_epi8(_mm_loadl_epi64((__m128i*)ifgcolor), _mm_setzero_si128()); // Shade + __m128i material = fgcolor; int blue0 = BPART(ifgcolor[0]); int green0 = GPART(ifgcolor[0]); int red0 = RPART(ifgcolor[0]); @@ -2708,6 +2861,9 @@ namespace swrenderer fgcolor = _mm_srli_epi16(_mm_add_epi16(shade_fade, fgcolor), 8); fgcolor = _mm_srli_epi16(_mm_mullo_epi16(fgcolor, shade_light), 8); + fgcolor = _mm_add_epi16(fgcolor, _mm_srli_epi16(_mm_mullo_epi16(material, dynlight), 8)); + fgcolor = _mm_min_epi16(fgcolor, _mm_set1_epi16(255)); + // Blend uint32_t alpha0 = APART(ifgcolor[0]); uint32_t alpha1 = APART(ifgcolor[1]); @@ -2784,6 +2940,7 @@ namespace swrenderer __m128i fgcolor = _mm_unpacklo_epi8(_mm_loadl_epi64((__m128i*)ifgcolor), _mm_setzero_si128()); // Shade + __m128i material = fgcolor; int blue0 = BPART(ifgcolor[0]); int green0 = GPART(ifgcolor[0]); int red0 = RPART(ifgcolor[0]); @@ -2801,6 +2958,9 @@ namespace swrenderer fgcolor = _mm_srli_epi16(_mm_add_epi16(shade_fade, fgcolor), 8); fgcolor = _mm_srli_epi16(_mm_mullo_epi16(fgcolor, shade_light), 8); + fgcolor = _mm_add_epi16(fgcolor, _mm_srli_epi16(_mm_mullo_epi16(material, dynlight), 8)); + fgcolor = _mm_min_epi16(fgcolor, _mm_set1_epi16(255)); + // Blend uint32_t alpha0 = APART(ifgcolor[0]); uint32_t alpha1 = APART(ifgcolor[1]); @@ -2868,6 +3028,10 @@ namespace swrenderer int light = 256 - (args.Light() >> (FRACBITS - 8)); __m128i mlight = _mm_set_epi16(256, light, light, light, 256, light, light, light); __m128i inv_light = _mm_set_epi16(0, 256 - light, 256 - light, 256 - light, 0, 256 - light, 256 - light, 256 - light); + + __m128i dynlight = _mm_cvtsi32_si128(args.DynamicLight()); + dynlight = _mm_unpacklo_epi8(dynlight, _mm_setzero_si128()); + dynlight = _mm_shuffle_epi32(dynlight, _MM_SHUFFLE(1,0,1,0)); int count = args.Count(); int pitch = RenderViewport::Instance()->RenderTarget->GetPitch(); @@ -2918,8 +3082,12 @@ namespace swrenderer __m128i fgcolor = _mm_unpacklo_epi8(_mm_loadl_epi64((__m128i*)ifgcolor), _mm_setzero_si128()); // Shade + __m128i material = fgcolor; fgcolor = _mm_srli_epi16(_mm_mullo_epi16(fgcolor, mlight), 8); + fgcolor = _mm_add_epi16(fgcolor, _mm_srli_epi16(_mm_mullo_epi16(material, dynlight), 8)); + fgcolor = _mm_min_epi16(fgcolor, _mm_set1_epi16(255)); + // Blend uint32_t alpha0 = APART(ifgcolor[0]); uint32_t alpha1 = APART(ifgcolor[1]); @@ -2976,8 +3144,12 @@ namespace swrenderer __m128i fgcolor = _mm_unpacklo_epi8(_mm_loadl_epi64((__m128i*)ifgcolor), _mm_setzero_si128()); // Shade + __m128i material = fgcolor; fgcolor = _mm_srli_epi16(_mm_mullo_epi16(fgcolor, mlight), 8); + fgcolor = _mm_add_epi16(fgcolor, _mm_srli_epi16(_mm_mullo_epi16(material, dynlight), 8)); + fgcolor = _mm_min_epi16(fgcolor, _mm_set1_epi16(255)); + // Blend uint32_t alpha0 = APART(ifgcolor[0]); uint32_t alpha1 = APART(ifgcolor[1]); @@ -3023,6 +3195,10 @@ namespace swrenderer int light = 256 - (args.Light() >> (FRACBITS - 8)); __m128i mlight = _mm_set_epi16(256, light, light, light, 256, light, light, light); __m128i inv_light = _mm_set_epi16(0, 256 - light, 256 - light, 256 - light, 0, 256 - light, 256 - light, 256 - light); + + __m128i dynlight = _mm_cvtsi32_si128(args.DynamicLight()); + dynlight = _mm_unpacklo_epi8(dynlight, _mm_setzero_si128()); + dynlight = _mm_shuffle_epi32(dynlight, _MM_SHUFFLE(1,0,1,0)); int count = args.Count(); int pitch = RenderViewport::Instance()->RenderTarget->GetPitch(); @@ -3114,8 +3290,12 @@ namespace swrenderer __m128i fgcolor = _mm_unpacklo_epi8(_mm_loadl_epi64((__m128i*)ifgcolor), _mm_setzero_si128()); // Shade + __m128i material = fgcolor; fgcolor = _mm_srli_epi16(_mm_mullo_epi16(fgcolor, mlight), 8); + fgcolor = _mm_add_epi16(fgcolor, _mm_srli_epi16(_mm_mullo_epi16(material, dynlight), 8)); + fgcolor = _mm_min_epi16(fgcolor, _mm_set1_epi16(255)); + // Blend uint32_t alpha0 = APART(ifgcolor[0]); uint32_t alpha1 = APART(ifgcolor[1]); @@ -3192,8 +3372,12 @@ namespace swrenderer __m128i fgcolor = _mm_unpacklo_epi8(_mm_loadl_epi64((__m128i*)ifgcolor), _mm_setzero_si128()); // Shade + __m128i material = fgcolor; fgcolor = _mm_srli_epi16(_mm_mullo_epi16(fgcolor, mlight), 8); + fgcolor = _mm_add_epi16(fgcolor, _mm_srli_epi16(_mm_mullo_epi16(material, dynlight), 8)); + fgcolor = _mm_min_epi16(fgcolor, _mm_set1_epi16(255)); + // Blend uint32_t alpha0 = APART(ifgcolor[0]); uint32_t alpha1 = APART(ifgcolor[1]); @@ -3250,6 +3434,10 @@ namespace swrenderer shade_fade = _mm_mullo_epi16(shade_fade, inv_light); __m128i shade_light = _mm_set_epi16(shade_constants.light_alpha, shade_constants.light_red, shade_constants.light_green, shade_constants.light_blue, shade_constants.light_alpha, shade_constants.light_red, shade_constants.light_green, shade_constants.light_blue); int desaturate = shade_constants.desaturate; + + __m128i dynlight = _mm_cvtsi32_si128(args.DynamicLight()); + dynlight = _mm_unpacklo_epi8(dynlight, _mm_setzero_si128()); + dynlight = _mm_shuffle_epi32(dynlight, _MM_SHUFFLE(1,0,1,0)); int count = args.Count(); int pitch = RenderViewport::Instance()->RenderTarget->GetPitch(); @@ -3300,6 +3488,7 @@ namespace swrenderer __m128i fgcolor = _mm_unpacklo_epi8(_mm_loadl_epi64((__m128i*)ifgcolor), _mm_setzero_si128()); // Shade + __m128i material = fgcolor; int blue0 = BPART(ifgcolor[0]); int green0 = GPART(ifgcolor[0]); int red0 = RPART(ifgcolor[0]); @@ -3317,6 +3506,9 @@ namespace swrenderer fgcolor = _mm_srli_epi16(_mm_add_epi16(shade_fade, fgcolor), 8); fgcolor = _mm_srli_epi16(_mm_mullo_epi16(fgcolor, shade_light), 8); + fgcolor = _mm_add_epi16(fgcolor, _mm_srli_epi16(_mm_mullo_epi16(material, dynlight), 8)); + fgcolor = _mm_min_epi16(fgcolor, _mm_set1_epi16(255)); + // Blend uint32_t alpha0 = APART(ifgcolor[0]); uint32_t alpha1 = APART(ifgcolor[1]); @@ -3373,6 +3565,7 @@ namespace swrenderer __m128i fgcolor = _mm_unpacklo_epi8(_mm_loadl_epi64((__m128i*)ifgcolor), _mm_setzero_si128()); // Shade + __m128i material = fgcolor; int blue0 = BPART(ifgcolor[0]); int green0 = GPART(ifgcolor[0]); int red0 = RPART(ifgcolor[0]); @@ -3390,6 +3583,9 @@ namespace swrenderer fgcolor = _mm_srli_epi16(_mm_add_epi16(shade_fade, fgcolor), 8); fgcolor = _mm_srli_epi16(_mm_mullo_epi16(fgcolor, shade_light), 8); + fgcolor = _mm_add_epi16(fgcolor, _mm_srli_epi16(_mm_mullo_epi16(material, dynlight), 8)); + fgcolor = _mm_min_epi16(fgcolor, _mm_set1_epi16(255)); + // Blend uint32_t alpha0 = APART(ifgcolor[0]); uint32_t alpha1 = APART(ifgcolor[1]); @@ -3440,6 +3636,10 @@ namespace swrenderer shade_fade = _mm_mullo_epi16(shade_fade, inv_light); __m128i shade_light = _mm_set_epi16(shade_constants.light_alpha, shade_constants.light_red, shade_constants.light_green, shade_constants.light_blue, shade_constants.light_alpha, shade_constants.light_red, shade_constants.light_green, shade_constants.light_blue); int desaturate = shade_constants.desaturate; + + __m128i dynlight = _mm_cvtsi32_si128(args.DynamicLight()); + dynlight = _mm_unpacklo_epi8(dynlight, _mm_setzero_si128()); + dynlight = _mm_shuffle_epi32(dynlight, _MM_SHUFFLE(1,0,1,0)); int count = args.Count(); int pitch = RenderViewport::Instance()->RenderTarget->GetPitch(); @@ -3531,6 +3731,7 @@ namespace swrenderer __m128i fgcolor = _mm_unpacklo_epi8(_mm_loadl_epi64((__m128i*)ifgcolor), _mm_setzero_si128()); // Shade + __m128i material = fgcolor; int blue0 = BPART(ifgcolor[0]); int green0 = GPART(ifgcolor[0]); int red0 = RPART(ifgcolor[0]); @@ -3548,6 +3749,9 @@ namespace swrenderer fgcolor = _mm_srli_epi16(_mm_add_epi16(shade_fade, fgcolor), 8); fgcolor = _mm_srli_epi16(_mm_mullo_epi16(fgcolor, shade_light), 8); + fgcolor = _mm_add_epi16(fgcolor, _mm_srli_epi16(_mm_mullo_epi16(material, dynlight), 8)); + fgcolor = _mm_min_epi16(fgcolor, _mm_set1_epi16(255)); + // Blend uint32_t alpha0 = APART(ifgcolor[0]); uint32_t alpha1 = APART(ifgcolor[1]); @@ -3624,6 +3828,7 @@ namespace swrenderer __m128i fgcolor = _mm_unpacklo_epi8(_mm_loadl_epi64((__m128i*)ifgcolor), _mm_setzero_si128()); // Shade + __m128i material = fgcolor; int blue0 = BPART(ifgcolor[0]); int green0 = GPART(ifgcolor[0]); int red0 = RPART(ifgcolor[0]); @@ -3641,6 +3846,9 @@ namespace swrenderer fgcolor = _mm_srli_epi16(_mm_add_epi16(shade_fade, fgcolor), 8); fgcolor = _mm_srli_epi16(_mm_mullo_epi16(fgcolor, shade_light), 8); + fgcolor = _mm_add_epi16(fgcolor, _mm_srli_epi16(_mm_mullo_epi16(material, dynlight), 8)); + fgcolor = _mm_min_epi16(fgcolor, _mm_set1_epi16(255)); + // Blend uint32_t alpha0 = APART(ifgcolor[0]); uint32_t alpha1 = APART(ifgcolor[1]); @@ -3705,6 +3913,10 @@ namespace swrenderer int light = 256 - (args.Light() >> (FRACBITS - 8)); __m128i mlight = _mm_set_epi16(256, light, light, light, 256, light, light, light); __m128i inv_light = _mm_set_epi16(0, 256 - light, 256 - light, 256 - light, 0, 256 - light, 256 - light, 256 - light); + + __m128i dynlight = _mm_cvtsi32_si128(args.DynamicLight()); + dynlight = _mm_unpacklo_epi8(dynlight, _mm_setzero_si128()); + dynlight = _mm_shuffle_epi32(dynlight, _MM_SHUFFLE(1,0,1,0)); int count = args.Count(); int pitch = RenderViewport::Instance()->RenderTarget->GetPitch(); @@ -3752,8 +3964,12 @@ namespace swrenderer __m128i fgcolor = _mm_unpacklo_epi8(_mm_loadl_epi64((__m128i*)ifgcolor), _mm_setzero_si128()); // Shade + __m128i material = fgcolor; fgcolor = _mm_srli_epi16(_mm_mullo_epi16(fgcolor, mlight), 8); + fgcolor = _mm_add_epi16(fgcolor, _mm_srli_epi16(_mm_mullo_epi16(material, dynlight), 8)); + fgcolor = _mm_min_epi16(fgcolor, _mm_set1_epi16(255)); + // Blend __m128i outcolor = fgcolor; outcolor = _mm_packus_epi16(outcolor, _mm_setzero_si128()); @@ -3779,8 +3995,12 @@ namespace swrenderer __m128i fgcolor = _mm_unpacklo_epi8(_mm_loadl_epi64((__m128i*)ifgcolor), _mm_setzero_si128()); // Shade + __m128i material = fgcolor; fgcolor = _mm_srli_epi16(_mm_mullo_epi16(fgcolor, mlight), 8); + fgcolor = _mm_add_epi16(fgcolor, _mm_srli_epi16(_mm_mullo_epi16(material, dynlight), 8)); + fgcolor = _mm_min_epi16(fgcolor, _mm_set1_epi16(255)); + // Blend __m128i outcolor = fgcolor; outcolor = _mm_packus_epi16(outcolor, _mm_setzero_si128()); @@ -3804,6 +4024,10 @@ namespace swrenderer shade_fade = _mm_mullo_epi16(shade_fade, inv_light); __m128i shade_light = _mm_set_epi16(shade_constants.light_alpha, shade_constants.light_red, shade_constants.light_green, shade_constants.light_blue, shade_constants.light_alpha, shade_constants.light_red, shade_constants.light_green, shade_constants.light_blue); int desaturate = shade_constants.desaturate; + + __m128i dynlight = _mm_cvtsi32_si128(args.DynamicLight()); + dynlight = _mm_unpacklo_epi8(dynlight, _mm_setzero_si128()); + dynlight = _mm_shuffle_epi32(dynlight, _MM_SHUFFLE(1,0,1,0)); int count = args.Count(); int pitch = RenderViewport::Instance()->RenderTarget->GetPitch(); @@ -3851,6 +4075,7 @@ namespace swrenderer __m128i fgcolor = _mm_unpacklo_epi8(_mm_loadl_epi64((__m128i*)ifgcolor), _mm_setzero_si128()); // Shade + __m128i material = fgcolor; int blue0 = BPART(ifgcolor[0]); int green0 = GPART(ifgcolor[0]); int red0 = RPART(ifgcolor[0]); @@ -3868,6 +4093,9 @@ namespace swrenderer fgcolor = _mm_srli_epi16(_mm_add_epi16(shade_fade, fgcolor), 8); fgcolor = _mm_srli_epi16(_mm_mullo_epi16(fgcolor, shade_light), 8); + fgcolor = _mm_add_epi16(fgcolor, _mm_srli_epi16(_mm_mullo_epi16(material, dynlight), 8)); + fgcolor = _mm_min_epi16(fgcolor, _mm_set1_epi16(255)); + // Blend __m128i outcolor = fgcolor; outcolor = _mm_packus_epi16(outcolor, _mm_setzero_si128()); @@ -3893,6 +4121,7 @@ namespace swrenderer __m128i fgcolor = _mm_unpacklo_epi8(_mm_loadl_epi64((__m128i*)ifgcolor), _mm_setzero_si128()); // Shade + __m128i material = fgcolor; int blue0 = BPART(ifgcolor[0]); int green0 = GPART(ifgcolor[0]); int red0 = RPART(ifgcolor[0]); @@ -3910,6 +4139,9 @@ namespace swrenderer fgcolor = _mm_srli_epi16(_mm_add_epi16(shade_fade, fgcolor), 8); fgcolor = _mm_srli_epi16(_mm_mullo_epi16(fgcolor, shade_light), 8); + fgcolor = _mm_add_epi16(fgcolor, _mm_srli_epi16(_mm_mullo_epi16(material, dynlight), 8)); + fgcolor = _mm_min_epi16(fgcolor, _mm_set1_epi16(255)); + // Blend __m128i outcolor = fgcolor; outcolor = _mm_packus_epi16(outcolor, _mm_setzero_si128()); @@ -3944,6 +4176,10 @@ namespace swrenderer int light = 256 - (args.Light() >> (FRACBITS - 8)); __m128i mlight = _mm_set_epi16(256, light, light, light, 256, light, light, light); __m128i inv_light = _mm_set_epi16(0, 256 - light, 256 - light, 256 - light, 0, 256 - light, 256 - light, 256 - light); + + __m128i dynlight = _mm_cvtsi32_si128(args.DynamicLight()); + dynlight = _mm_unpacklo_epi8(dynlight, _mm_setzero_si128()); + dynlight = _mm_shuffle_epi32(dynlight, _MM_SHUFFLE(1,0,1,0)); int count = args.Count(); int pitch = RenderViewport::Instance()->RenderTarget->GetPitch(); @@ -3992,8 +4228,12 @@ namespace swrenderer __m128i fgcolor = _mm_unpacklo_epi8(_mm_loadl_epi64((__m128i*)ifgcolor), _mm_setzero_si128()); // Shade + __m128i material = fgcolor; fgcolor = _mm_srli_epi16(_mm_mullo_epi16(fgcolor, mlight), 8); + fgcolor = _mm_add_epi16(fgcolor, _mm_srli_epi16(_mm_mullo_epi16(material, dynlight), 8)); + fgcolor = _mm_min_epi16(fgcolor, _mm_set1_epi16(255)); + // Blend uint32_t alpha0 = APART(ifgcolor[0]); uint32_t alpha1 = APART(ifgcolor[1]); @@ -4049,8 +4289,12 @@ namespace swrenderer __m128i fgcolor = _mm_unpacklo_epi8(_mm_loadl_epi64((__m128i*)ifgcolor), _mm_setzero_si128()); // Shade + __m128i material = fgcolor; fgcolor = _mm_srli_epi16(_mm_mullo_epi16(fgcolor, mlight), 8); + fgcolor = _mm_add_epi16(fgcolor, _mm_srli_epi16(_mm_mullo_epi16(material, dynlight), 8)); + fgcolor = _mm_min_epi16(fgcolor, _mm_set1_epi16(255)); + // Blend uint32_t alpha0 = APART(ifgcolor[0]); uint32_t alpha1 = APART(ifgcolor[1]); @@ -4103,6 +4347,10 @@ namespace swrenderer shade_fade = _mm_mullo_epi16(shade_fade, inv_light); __m128i shade_light = _mm_set_epi16(shade_constants.light_alpha, shade_constants.light_red, shade_constants.light_green, shade_constants.light_blue, shade_constants.light_alpha, shade_constants.light_red, shade_constants.light_green, shade_constants.light_blue); int desaturate = shade_constants.desaturate; + + __m128i dynlight = _mm_cvtsi32_si128(args.DynamicLight()); + dynlight = _mm_unpacklo_epi8(dynlight, _mm_setzero_si128()); + dynlight = _mm_shuffle_epi32(dynlight, _MM_SHUFFLE(1,0,1,0)); int count = args.Count(); int pitch = RenderViewport::Instance()->RenderTarget->GetPitch(); @@ -4151,6 +4399,7 @@ namespace swrenderer __m128i fgcolor = _mm_unpacklo_epi8(_mm_loadl_epi64((__m128i*)ifgcolor), _mm_setzero_si128()); // Shade + __m128i material = fgcolor; int blue0 = BPART(ifgcolor[0]); int green0 = GPART(ifgcolor[0]); int red0 = RPART(ifgcolor[0]); @@ -4168,6 +4417,9 @@ namespace swrenderer fgcolor = _mm_srli_epi16(_mm_add_epi16(shade_fade, fgcolor), 8); fgcolor = _mm_srli_epi16(_mm_mullo_epi16(fgcolor, shade_light), 8); + fgcolor = _mm_add_epi16(fgcolor, _mm_srli_epi16(_mm_mullo_epi16(material, dynlight), 8)); + fgcolor = _mm_min_epi16(fgcolor, _mm_set1_epi16(255)); + // Blend uint32_t alpha0 = APART(ifgcolor[0]); uint32_t alpha1 = APART(ifgcolor[1]); @@ -4223,6 +4475,7 @@ namespace swrenderer __m128i fgcolor = _mm_unpacklo_epi8(_mm_loadl_epi64((__m128i*)ifgcolor), _mm_setzero_si128()); // Shade + __m128i material = fgcolor; int blue0 = BPART(ifgcolor[0]); int green0 = GPART(ifgcolor[0]); int red0 = RPART(ifgcolor[0]); @@ -4240,6 +4493,9 @@ namespace swrenderer fgcolor = _mm_srli_epi16(_mm_add_epi16(shade_fade, fgcolor), 8); fgcolor = _mm_srli_epi16(_mm_mullo_epi16(fgcolor, shade_light), 8); + fgcolor = _mm_add_epi16(fgcolor, _mm_srli_epi16(_mm_mullo_epi16(material, dynlight), 8)); + fgcolor = _mm_min_epi16(fgcolor, _mm_set1_epi16(255)); + // Blend uint32_t alpha0 = APART(ifgcolor[0]); uint32_t alpha1 = APART(ifgcolor[1]); @@ -4303,6 +4559,10 @@ namespace swrenderer int light = 256 - (args.Light() >> (FRACBITS - 8)); __m128i mlight = _mm_set_epi16(256, light, light, light, 256, light, light, light); __m128i inv_light = _mm_set_epi16(0, 256 - light, 256 - light, 256 - light, 0, 256 - light, 256 - light, 256 - light); + + __m128i dynlight = _mm_cvtsi32_si128(args.DynamicLight()); + dynlight = _mm_unpacklo_epi8(dynlight, _mm_setzero_si128()); + dynlight = _mm_shuffle_epi32(dynlight, _MM_SHUFFLE(1,0,1,0)); int count = args.Count(); int pitch = RenderViewport::Instance()->RenderTarget->GetPitch(); @@ -4351,8 +4611,12 @@ namespace swrenderer __m128i fgcolor = _mm_unpacklo_epi8(_mm_loadl_epi64((__m128i*)ifgcolor), _mm_setzero_si128()); // Shade + __m128i material = fgcolor; fgcolor = _mm_srli_epi16(_mm_mullo_epi16(fgcolor, mlight), 8); + fgcolor = _mm_add_epi16(fgcolor, _mm_srli_epi16(_mm_mullo_epi16(material, dynlight), 8)); + fgcolor = _mm_min_epi16(fgcolor, _mm_set1_epi16(255)); + // Blend uint32_t alpha0 = APART(ifgcolor[0]); uint32_t alpha1 = APART(ifgcolor[1]); @@ -4408,8 +4672,12 @@ namespace swrenderer __m128i fgcolor = _mm_unpacklo_epi8(_mm_loadl_epi64((__m128i*)ifgcolor), _mm_setzero_si128()); // Shade + __m128i material = fgcolor; fgcolor = _mm_srli_epi16(_mm_mullo_epi16(fgcolor, mlight), 8); + fgcolor = _mm_add_epi16(fgcolor, _mm_srli_epi16(_mm_mullo_epi16(material, dynlight), 8)); + fgcolor = _mm_min_epi16(fgcolor, _mm_set1_epi16(255)); + // Blend uint32_t alpha0 = APART(ifgcolor[0]); uint32_t alpha1 = APART(ifgcolor[1]); @@ -4462,6 +4730,10 @@ namespace swrenderer shade_fade = _mm_mullo_epi16(shade_fade, inv_light); __m128i shade_light = _mm_set_epi16(shade_constants.light_alpha, shade_constants.light_red, shade_constants.light_green, shade_constants.light_blue, shade_constants.light_alpha, shade_constants.light_red, shade_constants.light_green, shade_constants.light_blue); int desaturate = shade_constants.desaturate; + + __m128i dynlight = _mm_cvtsi32_si128(args.DynamicLight()); + dynlight = _mm_unpacklo_epi8(dynlight, _mm_setzero_si128()); + dynlight = _mm_shuffle_epi32(dynlight, _MM_SHUFFLE(1,0,1,0)); int count = args.Count(); int pitch = RenderViewport::Instance()->RenderTarget->GetPitch(); @@ -4510,6 +4782,7 @@ namespace swrenderer __m128i fgcolor = _mm_unpacklo_epi8(_mm_loadl_epi64((__m128i*)ifgcolor), _mm_setzero_si128()); // Shade + __m128i material = fgcolor; int blue0 = BPART(ifgcolor[0]); int green0 = GPART(ifgcolor[0]); int red0 = RPART(ifgcolor[0]); @@ -4527,6 +4800,9 @@ namespace swrenderer fgcolor = _mm_srli_epi16(_mm_add_epi16(shade_fade, fgcolor), 8); fgcolor = _mm_srli_epi16(_mm_mullo_epi16(fgcolor, shade_light), 8); + fgcolor = _mm_add_epi16(fgcolor, _mm_srli_epi16(_mm_mullo_epi16(material, dynlight), 8)); + fgcolor = _mm_min_epi16(fgcolor, _mm_set1_epi16(255)); + // Blend uint32_t alpha0 = APART(ifgcolor[0]); uint32_t alpha1 = APART(ifgcolor[1]); @@ -4582,6 +4858,7 @@ namespace swrenderer __m128i fgcolor = _mm_unpacklo_epi8(_mm_loadl_epi64((__m128i*)ifgcolor), _mm_setzero_si128()); // Shade + __m128i material = fgcolor; int blue0 = BPART(ifgcolor[0]); int green0 = GPART(ifgcolor[0]); int red0 = RPART(ifgcolor[0]); @@ -4599,6 +4876,9 @@ namespace swrenderer fgcolor = _mm_srli_epi16(_mm_add_epi16(shade_fade, fgcolor), 8); fgcolor = _mm_srli_epi16(_mm_mullo_epi16(fgcolor, shade_light), 8); + fgcolor = _mm_add_epi16(fgcolor, _mm_srli_epi16(_mm_mullo_epi16(material, dynlight), 8)); + fgcolor = _mm_min_epi16(fgcolor, _mm_set1_epi16(255)); + // Blend uint32_t alpha0 = APART(ifgcolor[0]); uint32_t alpha1 = APART(ifgcolor[1]); @@ -4662,6 +4942,10 @@ namespace swrenderer int light = 256 - (args.Light() >> (FRACBITS - 8)); __m128i mlight = _mm_set_epi16(256, light, light, light, 256, light, light, light); __m128i inv_light = _mm_set_epi16(0, 256 - light, 256 - light, 256 - light, 0, 256 - light, 256 - light, 256 - light); + + __m128i dynlight = _mm_cvtsi32_si128(args.DynamicLight()); + dynlight = _mm_unpacklo_epi8(dynlight, _mm_setzero_si128()); + dynlight = _mm_shuffle_epi32(dynlight, _MM_SHUFFLE(1,0,1,0)); int count = args.Count(); int pitch = RenderViewport::Instance()->RenderTarget->GetPitch(); @@ -4710,8 +4994,12 @@ namespace swrenderer __m128i fgcolor = _mm_unpacklo_epi8(_mm_loadl_epi64((__m128i*)ifgcolor), _mm_setzero_si128()); // Shade + __m128i material = fgcolor; fgcolor = _mm_srli_epi16(_mm_mullo_epi16(fgcolor, mlight), 8); + fgcolor = _mm_add_epi16(fgcolor, _mm_srli_epi16(_mm_mullo_epi16(material, dynlight), 8)); + fgcolor = _mm_min_epi16(fgcolor, _mm_set1_epi16(255)); + // Blend uint32_t alpha0 = APART(ifgcolor[0]); uint32_t alpha1 = APART(ifgcolor[1]); @@ -4767,8 +5055,12 @@ namespace swrenderer __m128i fgcolor = _mm_unpacklo_epi8(_mm_loadl_epi64((__m128i*)ifgcolor), _mm_setzero_si128()); // Shade + __m128i material = fgcolor; fgcolor = _mm_srli_epi16(_mm_mullo_epi16(fgcolor, mlight), 8); + fgcolor = _mm_add_epi16(fgcolor, _mm_srli_epi16(_mm_mullo_epi16(material, dynlight), 8)); + fgcolor = _mm_min_epi16(fgcolor, _mm_set1_epi16(255)); + // Blend uint32_t alpha0 = APART(ifgcolor[0]); uint32_t alpha1 = APART(ifgcolor[1]); @@ -4821,6 +5113,10 @@ namespace swrenderer shade_fade = _mm_mullo_epi16(shade_fade, inv_light); __m128i shade_light = _mm_set_epi16(shade_constants.light_alpha, shade_constants.light_red, shade_constants.light_green, shade_constants.light_blue, shade_constants.light_alpha, shade_constants.light_red, shade_constants.light_green, shade_constants.light_blue); int desaturate = shade_constants.desaturate; + + __m128i dynlight = _mm_cvtsi32_si128(args.DynamicLight()); + dynlight = _mm_unpacklo_epi8(dynlight, _mm_setzero_si128()); + dynlight = _mm_shuffle_epi32(dynlight, _MM_SHUFFLE(1,0,1,0)); int count = args.Count(); int pitch = RenderViewport::Instance()->RenderTarget->GetPitch(); @@ -4869,6 +5165,7 @@ namespace swrenderer __m128i fgcolor = _mm_unpacklo_epi8(_mm_loadl_epi64((__m128i*)ifgcolor), _mm_setzero_si128()); // Shade + __m128i material = fgcolor; int blue0 = BPART(ifgcolor[0]); int green0 = GPART(ifgcolor[0]); int red0 = RPART(ifgcolor[0]); @@ -4886,6 +5183,9 @@ namespace swrenderer fgcolor = _mm_srli_epi16(_mm_add_epi16(shade_fade, fgcolor), 8); fgcolor = _mm_srli_epi16(_mm_mullo_epi16(fgcolor, shade_light), 8); + fgcolor = _mm_add_epi16(fgcolor, _mm_srli_epi16(_mm_mullo_epi16(material, dynlight), 8)); + fgcolor = _mm_min_epi16(fgcolor, _mm_set1_epi16(255)); + // Blend uint32_t alpha0 = APART(ifgcolor[0]); uint32_t alpha1 = APART(ifgcolor[1]); @@ -4941,6 +5241,7 @@ namespace swrenderer __m128i fgcolor = _mm_unpacklo_epi8(_mm_loadl_epi64((__m128i*)ifgcolor), _mm_setzero_si128()); // Shade + __m128i material = fgcolor; int blue0 = BPART(ifgcolor[0]); int green0 = GPART(ifgcolor[0]); int red0 = RPART(ifgcolor[0]); @@ -4958,6 +5259,9 @@ namespace swrenderer fgcolor = _mm_srli_epi16(_mm_add_epi16(shade_fade, fgcolor), 8); fgcolor = _mm_srli_epi16(_mm_mullo_epi16(fgcolor, shade_light), 8); + fgcolor = _mm_add_epi16(fgcolor, _mm_srli_epi16(_mm_mullo_epi16(material, dynlight), 8)); + fgcolor = _mm_min_epi16(fgcolor, _mm_set1_epi16(255)); + // Blend uint32_t alpha0 = APART(ifgcolor[0]); uint32_t alpha1 = APART(ifgcolor[1]); @@ -5022,6 +5326,10 @@ namespace swrenderer int light = 256 - (args.Light() >> (FRACBITS - 8)); __m128i mlight = _mm_set_epi16(256, light, light, light, 256, light, light, light); __m128i inv_light = _mm_set_epi16(0, 256 - light, 256 - light, 256 - light, 0, 256 - light, 256 - light, 256 - light); + + __m128i dynlight = _mm_cvtsi32_si128(args.DynamicLight()); + dynlight = _mm_unpacklo_epi8(dynlight, _mm_setzero_si128()); + dynlight = _mm_shuffle_epi32(dynlight, _MM_SHUFFLE(1,0,1,0)); int count = args.Count(); int pitch = RenderViewport::Instance()->RenderTarget->GetPitch(); @@ -5137,6 +5445,10 @@ namespace swrenderer shade_fade = _mm_mullo_epi16(shade_fade, inv_light); __m128i shade_light = _mm_set_epi16(shade_constants.light_alpha, shade_constants.light_red, shade_constants.light_green, shade_constants.light_blue, shade_constants.light_alpha, shade_constants.light_red, shade_constants.light_green, shade_constants.light_blue); int desaturate = shade_constants.desaturate; + + __m128i dynlight = _mm_cvtsi32_si128(args.DynamicLight()); + dynlight = _mm_unpacklo_epi8(dynlight, _mm_setzero_si128()); + dynlight = _mm_shuffle_epi32(dynlight, _MM_SHUFFLE(1,0,1,0)); int count = args.Count(); int pitch = RenderViewport::Instance()->RenderTarget->GetPitch(); @@ -5263,6 +5575,10 @@ namespace swrenderer int light = 256 - (args.Light() >> (FRACBITS - 8)); __m128i mlight = _mm_set_epi16(256, light, light, light, 256, light, light, light); __m128i inv_light = _mm_set_epi16(0, 256 - light, 256 - light, 256 - light, 0, 256 - light, 256 - light, 256 - light); + + __m128i dynlight = _mm_cvtsi32_si128(args.DynamicLight()); + dynlight = _mm_unpacklo_epi8(dynlight, _mm_setzero_si128()); + dynlight = _mm_shuffle_epi32(dynlight, _MM_SHUFFLE(1,0,1,0)); int count = args.Count(); int pitch = RenderViewport::Instance()->RenderTarget->GetPitch(); @@ -5310,8 +5626,12 @@ namespace swrenderer __m128i fgcolor = _mm_unpacklo_epi8(_mm_loadl_epi64((__m128i*)ifgcolor), _mm_setzero_si128()); // Shade + __m128i material = fgcolor; fgcolor = _mm_srli_epi16(_mm_mullo_epi16(fgcolor, mlight), 8); + fgcolor = _mm_add_epi16(fgcolor, _mm_srli_epi16(_mm_mullo_epi16(material, dynlight), 8)); + fgcolor = _mm_min_epi16(fgcolor, _mm_set1_epi16(255)); + // Blend __m128i outcolor = fgcolor; outcolor = _mm_packus_epi16(outcolor, _mm_setzero_si128()); @@ -5337,8 +5657,12 @@ namespace swrenderer __m128i fgcolor = _mm_unpacklo_epi8(_mm_loadl_epi64((__m128i*)ifgcolor), _mm_setzero_si128()); // Shade + __m128i material = fgcolor; fgcolor = _mm_srli_epi16(_mm_mullo_epi16(fgcolor, mlight), 8); + fgcolor = _mm_add_epi16(fgcolor, _mm_srli_epi16(_mm_mullo_epi16(material, dynlight), 8)); + fgcolor = _mm_min_epi16(fgcolor, _mm_set1_epi16(255)); + // Blend __m128i outcolor = fgcolor; outcolor = _mm_packus_epi16(outcolor, _mm_setzero_si128()); @@ -5363,6 +5687,10 @@ namespace swrenderer shade_fade = _mm_mullo_epi16(shade_fade, inv_light); __m128i shade_light = _mm_set_epi16(shade_constants.light_alpha, shade_constants.light_red, shade_constants.light_green, shade_constants.light_blue, shade_constants.light_alpha, shade_constants.light_red, shade_constants.light_green, shade_constants.light_blue); int desaturate = shade_constants.desaturate; + + __m128i dynlight = _mm_cvtsi32_si128(args.DynamicLight()); + dynlight = _mm_unpacklo_epi8(dynlight, _mm_setzero_si128()); + dynlight = _mm_shuffle_epi32(dynlight, _MM_SHUFFLE(1,0,1,0)); int count = args.Count(); int pitch = RenderViewport::Instance()->RenderTarget->GetPitch(); @@ -5410,6 +5738,7 @@ namespace swrenderer __m128i fgcolor = _mm_unpacklo_epi8(_mm_loadl_epi64((__m128i*)ifgcolor), _mm_setzero_si128()); // Shade + __m128i material = fgcolor; int blue0 = BPART(ifgcolor[0]); int green0 = GPART(ifgcolor[0]); int red0 = RPART(ifgcolor[0]); @@ -5427,6 +5756,9 @@ namespace swrenderer fgcolor = _mm_srli_epi16(_mm_add_epi16(shade_fade, fgcolor), 8); fgcolor = _mm_srli_epi16(_mm_mullo_epi16(fgcolor, shade_light), 8); + fgcolor = _mm_add_epi16(fgcolor, _mm_srli_epi16(_mm_mullo_epi16(material, dynlight), 8)); + fgcolor = _mm_min_epi16(fgcolor, _mm_set1_epi16(255)); + // Blend __m128i outcolor = fgcolor; outcolor = _mm_packus_epi16(outcolor, _mm_setzero_si128()); @@ -5452,6 +5784,7 @@ namespace swrenderer __m128i fgcolor = _mm_unpacklo_epi8(_mm_loadl_epi64((__m128i*)ifgcolor), _mm_setzero_si128()); // Shade + __m128i material = fgcolor; int blue0 = BPART(ifgcolor[0]); int green0 = GPART(ifgcolor[0]); int red0 = RPART(ifgcolor[0]); @@ -5469,6 +5802,9 @@ namespace swrenderer fgcolor = _mm_srli_epi16(_mm_add_epi16(shade_fade, fgcolor), 8); fgcolor = _mm_srli_epi16(_mm_mullo_epi16(fgcolor, shade_light), 8); + fgcolor = _mm_add_epi16(fgcolor, _mm_srli_epi16(_mm_mullo_epi16(material, dynlight), 8)); + fgcolor = _mm_min_epi16(fgcolor, _mm_set1_epi16(255)); + // Blend __m128i outcolor = fgcolor; outcolor = _mm_packus_epi16(outcolor, _mm_setzero_si128()); @@ -5504,6 +5840,10 @@ namespace swrenderer int light = 256 - (args.Light() >> (FRACBITS - 8)); __m128i mlight = _mm_set_epi16(256, light, light, light, 256, light, light, light); __m128i inv_light = _mm_set_epi16(0, 256 - light, 256 - light, 256 - light, 0, 256 - light, 256 - light, 256 - light); + + __m128i dynlight = _mm_cvtsi32_si128(args.DynamicLight()); + dynlight = _mm_unpacklo_epi8(dynlight, _mm_setzero_si128()); + dynlight = _mm_shuffle_epi32(dynlight, _MM_SHUFFLE(1,0,1,0)); int count = args.Count(); int pitch = RenderViewport::Instance()->RenderTarget->GetPitch(); @@ -5552,8 +5892,12 @@ namespace swrenderer __m128i fgcolor = _mm_unpacklo_epi8(_mm_loadl_epi64((__m128i*)ifgcolor), _mm_setzero_si128()); // Shade + __m128i material = fgcolor; fgcolor = _mm_srli_epi16(_mm_mullo_epi16(fgcolor, mlight), 8); + fgcolor = _mm_add_epi16(fgcolor, _mm_srli_epi16(_mm_mullo_epi16(material, dynlight), 8)); + fgcolor = _mm_min_epi16(fgcolor, _mm_set1_epi16(255)); + // Blend uint32_t alpha0 = APART(ifgcolor[0]); uint32_t alpha1 = APART(ifgcolor[1]); @@ -5609,8 +5953,12 @@ namespace swrenderer __m128i fgcolor = _mm_unpacklo_epi8(_mm_loadl_epi64((__m128i*)ifgcolor), _mm_setzero_si128()); // Shade + __m128i material = fgcolor; fgcolor = _mm_srli_epi16(_mm_mullo_epi16(fgcolor, mlight), 8); + fgcolor = _mm_add_epi16(fgcolor, _mm_srli_epi16(_mm_mullo_epi16(material, dynlight), 8)); + fgcolor = _mm_min_epi16(fgcolor, _mm_set1_epi16(255)); + // Blend uint32_t alpha0 = APART(ifgcolor[0]); uint32_t alpha1 = APART(ifgcolor[1]); @@ -5664,6 +6012,10 @@ namespace swrenderer shade_fade = _mm_mullo_epi16(shade_fade, inv_light); __m128i shade_light = _mm_set_epi16(shade_constants.light_alpha, shade_constants.light_red, shade_constants.light_green, shade_constants.light_blue, shade_constants.light_alpha, shade_constants.light_red, shade_constants.light_green, shade_constants.light_blue); int desaturate = shade_constants.desaturate; + + __m128i dynlight = _mm_cvtsi32_si128(args.DynamicLight()); + dynlight = _mm_unpacklo_epi8(dynlight, _mm_setzero_si128()); + dynlight = _mm_shuffle_epi32(dynlight, _MM_SHUFFLE(1,0,1,0)); int count = args.Count(); int pitch = RenderViewport::Instance()->RenderTarget->GetPitch(); @@ -5712,6 +6064,7 @@ namespace swrenderer __m128i fgcolor = _mm_unpacklo_epi8(_mm_loadl_epi64((__m128i*)ifgcolor), _mm_setzero_si128()); // Shade + __m128i material = fgcolor; int blue0 = BPART(ifgcolor[0]); int green0 = GPART(ifgcolor[0]); int red0 = RPART(ifgcolor[0]); @@ -5729,6 +6082,9 @@ namespace swrenderer fgcolor = _mm_srli_epi16(_mm_add_epi16(shade_fade, fgcolor), 8); fgcolor = _mm_srli_epi16(_mm_mullo_epi16(fgcolor, shade_light), 8); + fgcolor = _mm_add_epi16(fgcolor, _mm_srli_epi16(_mm_mullo_epi16(material, dynlight), 8)); + fgcolor = _mm_min_epi16(fgcolor, _mm_set1_epi16(255)); + // Blend uint32_t alpha0 = APART(ifgcolor[0]); uint32_t alpha1 = APART(ifgcolor[1]); @@ -5784,6 +6140,7 @@ namespace swrenderer __m128i fgcolor = _mm_unpacklo_epi8(_mm_loadl_epi64((__m128i*)ifgcolor), _mm_setzero_si128()); // Shade + __m128i material = fgcolor; int blue0 = BPART(ifgcolor[0]); int green0 = GPART(ifgcolor[0]); int red0 = RPART(ifgcolor[0]); @@ -5801,6 +6158,9 @@ namespace swrenderer fgcolor = _mm_srli_epi16(_mm_add_epi16(shade_fade, fgcolor), 8); fgcolor = _mm_srli_epi16(_mm_mullo_epi16(fgcolor, shade_light), 8); + fgcolor = _mm_add_epi16(fgcolor, _mm_srli_epi16(_mm_mullo_epi16(material, dynlight), 8)); + fgcolor = _mm_min_epi16(fgcolor, _mm_set1_epi16(255)); + // Blend uint32_t alpha0 = APART(ifgcolor[0]); uint32_t alpha1 = APART(ifgcolor[1]); @@ -5865,6 +6225,10 @@ namespace swrenderer int light = 256 - (args.Light() >> (FRACBITS - 8)); __m128i mlight = _mm_set_epi16(256, light, light, light, 256, light, light, light); __m128i inv_light = _mm_set_epi16(0, 256 - light, 256 - light, 256 - light, 0, 256 - light, 256 - light, 256 - light); + + __m128i dynlight = _mm_cvtsi32_si128(args.DynamicLight()); + dynlight = _mm_unpacklo_epi8(dynlight, _mm_setzero_si128()); + dynlight = _mm_shuffle_epi32(dynlight, _MM_SHUFFLE(1,0,1,0)); int count = args.Count(); int pitch = RenderViewport::Instance()->RenderTarget->GetPitch(); @@ -5913,8 +6277,12 @@ namespace swrenderer __m128i fgcolor = _mm_unpacklo_epi8(_mm_loadl_epi64((__m128i*)ifgcolor), _mm_setzero_si128()); // Shade + __m128i material = fgcolor; fgcolor = _mm_srli_epi16(_mm_mullo_epi16(fgcolor, mlight), 8); + fgcolor = _mm_add_epi16(fgcolor, _mm_srli_epi16(_mm_mullo_epi16(material, dynlight), 8)); + fgcolor = _mm_min_epi16(fgcolor, _mm_set1_epi16(255)); + // Blend uint32_t alpha0 = APART(ifgcolor[0]); uint32_t alpha1 = APART(ifgcolor[1]); @@ -5970,8 +6338,12 @@ namespace swrenderer __m128i fgcolor = _mm_unpacklo_epi8(_mm_loadl_epi64((__m128i*)ifgcolor), _mm_setzero_si128()); // Shade + __m128i material = fgcolor; fgcolor = _mm_srli_epi16(_mm_mullo_epi16(fgcolor, mlight), 8); + fgcolor = _mm_add_epi16(fgcolor, _mm_srli_epi16(_mm_mullo_epi16(material, dynlight), 8)); + fgcolor = _mm_min_epi16(fgcolor, _mm_set1_epi16(255)); + // Blend uint32_t alpha0 = APART(ifgcolor[0]); uint32_t alpha1 = APART(ifgcolor[1]); @@ -6025,6 +6397,10 @@ namespace swrenderer shade_fade = _mm_mullo_epi16(shade_fade, inv_light); __m128i shade_light = _mm_set_epi16(shade_constants.light_alpha, shade_constants.light_red, shade_constants.light_green, shade_constants.light_blue, shade_constants.light_alpha, shade_constants.light_red, shade_constants.light_green, shade_constants.light_blue); int desaturate = shade_constants.desaturate; + + __m128i dynlight = _mm_cvtsi32_si128(args.DynamicLight()); + dynlight = _mm_unpacklo_epi8(dynlight, _mm_setzero_si128()); + dynlight = _mm_shuffle_epi32(dynlight, _MM_SHUFFLE(1,0,1,0)); int count = args.Count(); int pitch = RenderViewport::Instance()->RenderTarget->GetPitch(); @@ -6073,6 +6449,7 @@ namespace swrenderer __m128i fgcolor = _mm_unpacklo_epi8(_mm_loadl_epi64((__m128i*)ifgcolor), _mm_setzero_si128()); // Shade + __m128i material = fgcolor; int blue0 = BPART(ifgcolor[0]); int green0 = GPART(ifgcolor[0]); int red0 = RPART(ifgcolor[0]); @@ -6090,6 +6467,9 @@ namespace swrenderer fgcolor = _mm_srli_epi16(_mm_add_epi16(shade_fade, fgcolor), 8); fgcolor = _mm_srli_epi16(_mm_mullo_epi16(fgcolor, shade_light), 8); + fgcolor = _mm_add_epi16(fgcolor, _mm_srli_epi16(_mm_mullo_epi16(material, dynlight), 8)); + fgcolor = _mm_min_epi16(fgcolor, _mm_set1_epi16(255)); + // Blend uint32_t alpha0 = APART(ifgcolor[0]); uint32_t alpha1 = APART(ifgcolor[1]); @@ -6145,6 +6525,7 @@ namespace swrenderer __m128i fgcolor = _mm_unpacklo_epi8(_mm_loadl_epi64((__m128i*)ifgcolor), _mm_setzero_si128()); // Shade + __m128i material = fgcolor; int blue0 = BPART(ifgcolor[0]); int green0 = GPART(ifgcolor[0]); int red0 = RPART(ifgcolor[0]); @@ -6162,6 +6543,9 @@ namespace swrenderer fgcolor = _mm_srli_epi16(_mm_add_epi16(shade_fade, fgcolor), 8); fgcolor = _mm_srli_epi16(_mm_mullo_epi16(fgcolor, shade_light), 8); + fgcolor = _mm_add_epi16(fgcolor, _mm_srli_epi16(_mm_mullo_epi16(material, dynlight), 8)); + fgcolor = _mm_min_epi16(fgcolor, _mm_set1_epi16(255)); + // Blend uint32_t alpha0 = APART(ifgcolor[0]); uint32_t alpha1 = APART(ifgcolor[1]); @@ -6226,6 +6610,10 @@ namespace swrenderer int light = 256 - (args.Light() >> (FRACBITS - 8)); __m128i mlight = _mm_set_epi16(256, light, light, light, 256, light, light, light); __m128i inv_light = _mm_set_epi16(0, 256 - light, 256 - light, 256 - light, 0, 256 - light, 256 - light, 256 - light); + + __m128i dynlight = _mm_cvtsi32_si128(args.DynamicLight()); + dynlight = _mm_unpacklo_epi8(dynlight, _mm_setzero_si128()); + dynlight = _mm_shuffle_epi32(dynlight, _MM_SHUFFLE(1,0,1,0)); int count = args.Count(); int pitch = RenderViewport::Instance()->RenderTarget->GetPitch(); @@ -6274,8 +6662,12 @@ namespace swrenderer __m128i fgcolor = _mm_unpacklo_epi8(_mm_loadl_epi64((__m128i*)ifgcolor), _mm_setzero_si128()); // Shade + __m128i material = fgcolor; fgcolor = _mm_srli_epi16(_mm_mullo_epi16(fgcolor, mlight), 8); + fgcolor = _mm_add_epi16(fgcolor, _mm_srli_epi16(_mm_mullo_epi16(material, dynlight), 8)); + fgcolor = _mm_min_epi16(fgcolor, _mm_set1_epi16(255)); + // Blend uint32_t alpha0 = APART(ifgcolor[0]); uint32_t alpha1 = APART(ifgcolor[1]); @@ -6331,8 +6723,12 @@ namespace swrenderer __m128i fgcolor = _mm_unpacklo_epi8(_mm_loadl_epi64((__m128i*)ifgcolor), _mm_setzero_si128()); // Shade + __m128i material = fgcolor; fgcolor = _mm_srli_epi16(_mm_mullo_epi16(fgcolor, mlight), 8); + fgcolor = _mm_add_epi16(fgcolor, _mm_srli_epi16(_mm_mullo_epi16(material, dynlight), 8)); + fgcolor = _mm_min_epi16(fgcolor, _mm_set1_epi16(255)); + // Blend uint32_t alpha0 = APART(ifgcolor[0]); uint32_t alpha1 = APART(ifgcolor[1]); @@ -6386,6 +6782,10 @@ namespace swrenderer shade_fade = _mm_mullo_epi16(shade_fade, inv_light); __m128i shade_light = _mm_set_epi16(shade_constants.light_alpha, shade_constants.light_red, shade_constants.light_green, shade_constants.light_blue, shade_constants.light_alpha, shade_constants.light_red, shade_constants.light_green, shade_constants.light_blue); int desaturate = shade_constants.desaturate; + + __m128i dynlight = _mm_cvtsi32_si128(args.DynamicLight()); + dynlight = _mm_unpacklo_epi8(dynlight, _mm_setzero_si128()); + dynlight = _mm_shuffle_epi32(dynlight, _MM_SHUFFLE(1,0,1,0)); int count = args.Count(); int pitch = RenderViewport::Instance()->RenderTarget->GetPitch(); @@ -6434,6 +6834,7 @@ namespace swrenderer __m128i fgcolor = _mm_unpacklo_epi8(_mm_loadl_epi64((__m128i*)ifgcolor), _mm_setzero_si128()); // Shade + __m128i material = fgcolor; int blue0 = BPART(ifgcolor[0]); int green0 = GPART(ifgcolor[0]); int red0 = RPART(ifgcolor[0]); @@ -6451,6 +6852,9 @@ namespace swrenderer fgcolor = _mm_srli_epi16(_mm_add_epi16(shade_fade, fgcolor), 8); fgcolor = _mm_srli_epi16(_mm_mullo_epi16(fgcolor, shade_light), 8); + fgcolor = _mm_add_epi16(fgcolor, _mm_srli_epi16(_mm_mullo_epi16(material, dynlight), 8)); + fgcolor = _mm_min_epi16(fgcolor, _mm_set1_epi16(255)); + // Blend uint32_t alpha0 = APART(ifgcolor[0]); uint32_t alpha1 = APART(ifgcolor[1]); @@ -6506,6 +6910,7 @@ namespace swrenderer __m128i fgcolor = _mm_unpacklo_epi8(_mm_loadl_epi64((__m128i*)ifgcolor), _mm_setzero_si128()); // Shade + __m128i material = fgcolor; int blue0 = BPART(ifgcolor[0]); int green0 = GPART(ifgcolor[0]); int red0 = RPART(ifgcolor[0]); @@ -6523,6 +6928,9 @@ namespace swrenderer fgcolor = _mm_srli_epi16(_mm_add_epi16(shade_fade, fgcolor), 8); fgcolor = _mm_srli_epi16(_mm_mullo_epi16(fgcolor, shade_light), 8); + fgcolor = _mm_add_epi16(fgcolor, _mm_srli_epi16(_mm_mullo_epi16(material, dynlight), 8)); + fgcolor = _mm_min_epi16(fgcolor, _mm_set1_epi16(255)); + // Blend uint32_t alpha0 = APART(ifgcolor[0]); uint32_t alpha1 = APART(ifgcolor[1]); diff --git a/src/swrenderer/drawers/r_draw_sprite32.php b/src/swrenderer/drawers/r_draw_sprite32.php index 483c86762..9fd67b001 100644 --- a/src/swrenderer/drawers/r_draw_sprite32.php +++ b/src/swrenderer/drawers/r_draw_sprite32.php @@ -130,6 +130,10 @@ namespace swrenderer __m128i shade_light = _mm_set_epi16(shade_constants.light_alpha, shade_constants.light_red, shade_constants.light_green, shade_constants.light_blue, shade_constants.light_alpha, shade_constants.light_red, shade_constants.light_green, shade_constants.light_blue); int desaturate = shade_constants.desaturate; + + __m128i dynlight = _mm_cvtsi32_si128(args.DynamicLight()); + dynlight = _mm_unpacklo_epi8(dynlight, _mm_setzero_si128()); + dynlight = _mm_shuffle_epi32(dynlight, _MM_SHUFFLE(1,0,1,0)); int count = args.Count(); int pitch = RenderViewport::Instance()->RenderTarget->GetPitch(); @@ -274,7 +278,9 @@ namespace swrenderer function Shade($blendVariant, $isSimpleShade) { if ($blendVariant == "copy" || $blendVariant == "shaded") return; - +?> + __m128i material = fgcolor; + fgcolor = _mm_srli_epi16(_mm_mullo_epi16(fgcolor, mlight), 8); @@ -297,8 +303,11 @@ namespace swrenderer fgcolor = _mm_mullo_epi16(fgcolor, mlight); fgcolor = _mm_srli_epi16(_mm_add_epi16(shade_fade, fgcolor), 8); fgcolor = _mm_srli_epi16(_mm_mullo_epi16(fgcolor, shade_light), 8); - + + fgcolor = _mm_add_epi16(fgcolor, _mm_srli_epi16(_mm_mullo_epi16(material, dynlight), 8)); + fgcolor = _mm_min_epi16(fgcolor, _mm_set1_epi16(255)); +lightsource->flags4 & MF4_ATTENUATE) != 0; + // Attenuated lights disabled for sprites for now to keep consistency with the GL renderer + //bool is_point_light = (node->lightsource->flags4 & MF4_ATTENUATE) != 0; float LdotL = lx * lx + ly * ly + lz * lz; - float NdotL = is_point_light ? -ly : 0.0f; + float NdotL = 1.0f;//is_point_light ? -ly : 1.0f; float radius = node->lightsource->GetRadius(); if (radius * radius >= LdotL && NdotL > 0.0f) { - uint32_t red = light->GetRed(); - uint32_t green = light->GetGreen(); - uint32_t blue = light->GetBlue(); float distance = sqrt(LdotL); - float attenuation = distance / radius * NdotL; - lit_red += red * attenuation; - lit_red += green * attenuation; - lit_red += blue * attenuation; + float attenuation = (1.0f - distance / radius) * NdotL; + if (attenuation > 0.0f) + { + float red = light->GetRed() * (1.0f / 255.0f); + float green = light->GetGreen() * (1.0f / 255.0f); + float blue = light->GetBlue() * (1.0f / 255.0f); + /*if (light->IsSubtractive()) + { + float bright = FVector3(lr, lg, lb).Length(); + FVector3 lightColor(lr, lg, lb); + red = (bright - lr) * -1; + green = (bright - lg) * -1; + blue = (bright - lb) * -1; + }*/ + + lit_red += red * attenuation; + lit_green += green * attenuation; + lit_blue += blue * attenuation; + } } } node = node->nextLight; } - lit_red = MIN(lit_red, 255.0f); - lit_green = MIN(lit_green, 255.0f); - lit_blue = MIN(lit_blue, 255.0f); + lit_red = clamp(lit_red * 255.0f, 0.0f, 255.0f); + lit_green = clamp(lit_green * 255.0f, 0.0f, 255.0f); + lit_blue = clamp(lit_blue * 255.0f, 0.0f, 255.0f); vis->dynlightcolor = (((uint32_t)lit_red) << 16) | (((uint32_t)lit_green) << 8) | ((uint32_t)lit_blue); } else