- added an ATTENUATE flag to dynamic lights, this is set by default for attached lights. For placed lights this is off, because it'd interfere with many existing maps that depend on unattenuated lights.

This commit is contained in:
Christoph Oelckers 2016-10-23 20:42:48 +02:00
parent fbe2b76705
commit bea625a42c
4 changed files with 13 additions and 8 deletions

View file

@ -1082,6 +1082,7 @@ void gl_AttachLight(AActor *actor, unsigned int count, const FLightDefaults *lig
light->target = actor; light->target = actor;
light->owned = true; light->owned = true;
light->ObjectFlags |= OF_Transient; light->ObjectFlags |= OF_Transient;
light->flags4 |= MF4_ATTENUATE;
actor->dynamiclights.Push(light); actor->dynamiclights.Push(light);
} }
light->flags2&=~MF2_DORMANT; light->flags2&=~MF2_DORMANT;

View file

@ -50,6 +50,7 @@ enum
#define MF4_SUBTRACTIVE MF4_MISSILEEVENMORE #define MF4_SUBTRACTIVE MF4_MISSILEEVENMORE
#define MF4_ADDITIVE MF4_MISSILEMORE #define MF4_ADDITIVE MF4_MISSILEMORE
#define MF4_DONTLIGHTSELF MF4_SEESDAGGERS #define MF4_DONTLIGHTSELF MF4_SEESDAGGERS
#define MF4_ATTENUATE MF4_INCOMBAT
enum ELightType enum ELightType
{ {

View file

@ -116,7 +116,7 @@ bool gl_GetLight(int group, Plane & p, ADynamicLight * light, bool checkside, FD
data[4] = r; data[4] = r;
data[5] = g; data[5] = g;
data[6] = b; data[6] = b;
data[7] = 0; data[7] = !!(light->flags4 & MF4_ATTENUATE);
return true; return true;
} }

View file

@ -142,16 +142,19 @@ float diffuseContribution(vec3 lightDirection, vec3 normal)
// //
//=========================================================================== //===========================================================================
float pointLightAttenuation(vec4 lightpos) float pointLightAttenuation(vec4 lightpos, float attenuate)
{ {
float attenuation = max(lightpos.w - distance(pixelpos.xyz, lightpos.xyz),0.0) / lightpos.w; float attenuation = max(lightpos.w - distance(pixelpos.xyz, lightpos.xyz),0.0) / lightpos.w;
#if 0 if (attenuate == 0.0)
{
return attenuation; return attenuation;
#else }
else
{
vec3 lightDirection = normalize(lightpos.xyz - pixelpos.xyz); vec3 lightDirection = normalize(lightpos.xyz - pixelpos.xyz);
float diffuseAmount = diffuseContribution(lightDirection, normalize(vWorldNormal.xyz)); float diffuseAmount = diffuseContribution(lightDirection, normalize(vWorldNormal.xyz));
return attenuation * diffuseAmount; return attenuation * diffuseAmount;
#endif }
} }
//=========================================================================== //===========================================================================
@ -229,7 +232,7 @@ vec4 getLightColor(float fogdist, float fogfactor)
vec4 lightpos = lights[i]; vec4 lightpos = lights[i];
vec4 lightcolor = lights[i+1]; vec4 lightcolor = lights[i+1];
lightcolor.rgb *= pointLightAttenuation(lightpos); lightcolor.rgb *= pointLightAttenuation(lightpos, lightcolor.a);
dynlight.rgb += lightcolor.rgb; dynlight.rgb += lightcolor.rgb;
} }
// //
@ -240,7 +243,7 @@ vec4 getLightColor(float fogdist, float fogfactor)
vec4 lightpos = lights[i]; vec4 lightpos = lights[i];
vec4 lightcolor = lights[i+1]; vec4 lightcolor = lights[i+1];
lightcolor.rgb *= pointLightAttenuation(lightpos); lightcolor.rgb *= pointLightAttenuation(lightpos, lightcolor.a);
dynlight.rgb -= lightcolor.rgb; dynlight.rgb -= lightcolor.rgb;
} }
} }
@ -322,7 +325,7 @@ void main()
vec4 lightpos = lights[i]; vec4 lightpos = lights[i];
vec4 lightcolor = lights[i+1]; vec4 lightcolor = lights[i+1];
lightcolor.rgb *= pointLightAttenuation(lightpos); lightcolor.rgb *= pointLightAttenuation(lightpos, lightcolor.a);
addlight.rgb += lightcolor.rgb; addlight.rgb += lightcolor.rgb;
} }
frag.rgb = clamp(frag.rgb + desaturate(addlight).rgb, 0.0, 1.0); frag.rgb = clamp(frag.rgb + desaturate(addlight).rgb, 0.0, 1.0);