mirror of
https://github.com/ZDoom/qzdoom-gpl.git
synced 2024-11-29 23:23:07 +00:00
Add dynamic light to sprites
This commit is contained in:
parent
c6235fb674
commit
ef41e8e54e
3 changed files with 445 additions and 15 deletions
File diff suppressed because it is too large
Load diff
|
@ -131,6 +131,10 @@ namespace swrenderer
|
||||||
int desaturate = shade_constants.desaturate;
|
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 count = args.Count();
|
||||||
int pitch = RenderViewport::Instance()->RenderTarget->GetPitch();
|
int pitch = RenderViewport::Instance()->RenderTarget->GetPitch();
|
||||||
uint32_t fracstep = args.TextureVStep();
|
uint32_t fracstep = args.TextureVStep();
|
||||||
|
@ -274,7 +278,9 @@ namespace swrenderer
|
||||||
function Shade($blendVariant, $isSimpleShade)
|
function Shade($blendVariant, $isSimpleShade)
|
||||||
{
|
{
|
||||||
if ($blendVariant == "copy" || $blendVariant == "shaded") return;
|
if ($blendVariant == "copy" || $blendVariant == "shaded") return;
|
||||||
|
?>
|
||||||
|
__m128i material = fgcolor;
|
||||||
|
<?
|
||||||
if ($isSimpleShade == true)
|
if ($isSimpleShade == true)
|
||||||
{ ?>
|
{ ?>
|
||||||
fgcolor = _mm_srli_epi16(_mm_mullo_epi16(fgcolor, mlight), 8);
|
fgcolor = _mm_srli_epi16(_mm_mullo_epi16(fgcolor, mlight), 8);
|
||||||
|
@ -297,8 +303,11 @@ namespace swrenderer
|
||||||
fgcolor = _mm_mullo_epi16(fgcolor, mlight);
|
fgcolor = _mm_mullo_epi16(fgcolor, mlight);
|
||||||
fgcolor = _mm_srli_epi16(_mm_add_epi16(shade_fade, fgcolor), 8);
|
fgcolor = _mm_srli_epi16(_mm_add_epi16(shade_fade, fgcolor), 8);
|
||||||
fgcolor = _mm_srli_epi16(_mm_mullo_epi16(fgcolor, shade_light), 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));
|
||||||
<? }
|
<? }
|
||||||
}
|
|
||||||
|
|
||||||
function Blend($blendVariant)
|
function Blend($blendVariant)
|
||||||
{
|
{
|
||||||
|
|
|
@ -246,28 +246,41 @@ namespace swrenderer
|
||||||
float ly = (float)(lightX * ViewTanCos + lightY * ViewTanSin - pos.Y);
|
float ly = (float)(lightX * ViewTanCos + lightY * ViewTanSin - pos.Y);
|
||||||
float lz = (float)(lightZ - pos.Z);
|
float lz = (float)(lightZ - pos.Z);
|
||||||
|
|
||||||
bool is_point_light = (node->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 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();
|
float radius = node->lightsource->GetRadius();
|
||||||
if (radius * radius >= LdotL && NdotL > 0.0f)
|
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 distance = sqrt(LdotL);
|
||||||
float attenuation = distance / radius * NdotL;
|
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_red += red * attenuation;
|
||||||
lit_red += green * attenuation;
|
lit_green += green * attenuation;
|
||||||
lit_red += blue * attenuation;
|
lit_blue += blue * attenuation;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
node = node->nextLight;
|
node = node->nextLight;
|
||||||
}
|
}
|
||||||
lit_red = MIN(lit_red, 255.0f);
|
lit_red = clamp(lit_red * 255.0f, 0.0f, 255.0f);
|
||||||
lit_green = MIN(lit_green, 255.0f);
|
lit_green = clamp(lit_green * 255.0f, 0.0f, 255.0f);
|
||||||
lit_blue = MIN(lit_blue, 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);
|
vis->dynlightcolor = (((uint32_t)lit_red) << 16) | (((uint32_t)lit_green) << 8) | ((uint32_t)lit_blue);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|
Loading…
Reference in a new issue