inverse square lights for sprites

had to add a minimum distance to make sure smaller lights don't completely blow out actors nearby
This commit is contained in:
Ricardo Luís Vaz Silva 2024-10-06 20:27:21 -03:00 committed by Magnus Norddahl
commit a79ea9414b

View file

@ -112,6 +112,15 @@ public:
//
//==========================================================================
float inverseSquareAttenuation(FVector3 lightpos, float dist, float radius)
{
float strength = 1500.0;
float a = dist / radius;
float b = clamp(1.0 - a * a * a * a, 0.0, 1.0);
return (b * b) / (dist * dist + 1.0) * strength;
}
void HWDrawInfo::GetDynSpriteLight(AActor *self, float x, float y, float z, FLightNode *node, int portalgroup, float *out)
{
FDynamicLight *light;
@ -167,7 +176,14 @@ void HWDrawInfo::GetDynSpriteLight(AActor *self, float x, float y, float z, FLig
if (staticLight.TraceLightVisbility(node, L, dist))
{
frac = 1.0f - (dist / radius);
if(level.info->lightattenuationmode == ELightAttenuationMode::INVERSE_SQUARE)
{
frac = (inverseSquareAttenuation(L, std::max(dist, sqrt(radius) * 2), radius));
}
else
{
frac = 1.0f - (dist / radius);
}
if (light->IsSpot())
{