add shadowMinQuality property and gl_light_shadow_max_quality CVar

This commit is contained in:
Ricardo Luís Vaz Silva 2025-01-02 12:26:49 -03:00 committed by Magnus Norddahl
commit 9073fb8501
14 changed files with 61 additions and 2 deletions

View file

@ -139,6 +139,11 @@ CUSTOM_CVAR(Int, gl_light_shadow_filter, 1, CVAR_ARCHIVE | CVAR_GLOBALCONFIG)
if (self < 0 || self > 8) self = 1;
}
CUSTOM_CVAR(Int, gl_light_shadow_max_quality, 1, CVAR_ARCHIVE | CVAR_GLOBALCONFIG)
{
if (self < 0 || self > 4) self = 1; // default medium, 0 = low, 1 = medium, 2 = high, 3 = ultra
}
CUSTOM_CVAR(Int, gl_shadowmap_quality, 512, CVAR_ARCHIVE | CVAR_GLOBALCONFIG)
{
switch (self)

View file

@ -16,6 +16,7 @@ EXTERN_CVAR (Bool, gl_light_sprites);
EXTERN_CVAR (Bool, gl_light_particles);
EXTERN_CVAR (Int, gl_light_shadows);
EXTERN_CVAR (Int, gl_light_shadow_filter);
EXTERN_CVAR (Int, gl_light_shadow_max_quality);
EXTERN_CVAR (Int, gl_shadowmap_quality);
EXTERN_CVAR(Int, gl_fogmode)

View file

@ -388,6 +388,8 @@ struct FMapThing
bool LightNoShadowMap;
bool LightDontLightActors;
bool LightDontLightMap;
bool LightHasShadowMinQuality;
int LightShadowMinQuality;
};

View file

@ -519,6 +519,7 @@ public:
th->Health = 1;
th->FloatbobPhase = -1;
th->SoftShadowRadius = -1.0;
th->LightShadowMinQuality = 1; // default medium, 0 = low, 1 = medium, 2 = high, 3 = ultra
sc.MustGetToken('{');
while (!sc.CheckToken('}'))
{
@ -812,6 +813,11 @@ public:
th->LightDontLightMap = CheckBool(key);
break;
case NAME_light_shadowminquality:
th->LightHasShadowMinQuality = true;
th->LightShadowMinQuality = std::clamp(CheckInt(key), 0, 4);
break;
case NAME_lm_suncolor:
CHECK_N(Zd | Zdt)
if (CheckInt(key) < 0 || CheckInt(key) > 0xFFFFFF)

View file

@ -324,6 +324,7 @@ xx(SoftShadowRadius)
xx(LightLinearity)
xx(lightflags)
xx(lighttype)
xx(shadowMinQuality)
xx(InternalDynamicLight)
xx(_a_chase_default)
xx(MapMarker)
@ -876,6 +877,7 @@ xx(light_linearity)
xx(light_noshadowmap)
xx(light_dontlightactors)
xx(light_dontlightmap)
xx(light_shadowminquality)
xx(skew_bottom_type)
xx(skew_middle_type)

View file

@ -160,6 +160,7 @@ void AttachLight(AActor *self)
light->pSpotOuterAngle = &self->AngleVar(NAME_SpotOuterAngle);
light->pPitch = &self->Angles.Pitch;
light->pLightFlags = (LightFlags*)&self->IntVar(NAME_lightflags);
light->shadowMinQuality = std::clamp(self->IntVar(NAME_shadowMinQuality), 0, 4);
light->pArgs = self->args;
light->pSoftShadowRadius = &self->FloatVar(NAME_SoftShadowRadius);
light->pLinearity = &self->FloatVar(NAME_LightLinearity);
@ -778,7 +779,7 @@ void FDynamicLight::CollectWithinRadius(const DVector3 &opos, FSection *section,
}
}
}
shadowmapped = hitonesidedback && !DontShadowmap();
shadowmapped = hitonesidedback && !DontShadowmap() && shadowMinQuality <= gl_light_shadow_max_quality;
}
//==========================================================================

View file

@ -80,6 +80,10 @@ public:
void SetDontLightMap(bool on) { if (on) m_lightFlags |= LF_DONTLIGHTMAP; else m_lightFlags &= ~LF_DONTLIGHTMAP; }
void SetTrace(bool on) { if (on) m_lightFlags |= LF_TRACE; else m_lightFlags &= ~LF_TRACE; }
void SetNoShadowmap(bool on) { if (on) m_lightFlags |= LF_NOSHADOWMAP; else m_lightFlags &= ~LF_NOSHADOWMAP; }
void SetShadowMinQuality(int quality)
{
shadowMinQuality = quality;
}
void SetSpot(bool spot) { if (spot) m_lightFlags |= LF_SPOT; else m_lightFlags &= ~LF_SPOT; }
void SetSpotInnerAngle(double angle) { m_spotInnerAngle = DAngle::fromDeg(angle); }
void SetSpotOuterAngle(double angle) { m_spotOuterAngle = DAngle::fromDeg(angle); }
@ -133,6 +137,7 @@ protected:
DAngle m_pitch = nullAngle;
double SoftShadowRadius = 5.0;
double Linearity = 0.0;
int shadowMinQuality = 1; // default medium, 0 = low, 1 = medium, 2 = high, 3 = ultra
friend FSerializer &Serialize(FSerializer &arc, const char *key, FLightDefaults &value, FLightDefaults *def);
};
@ -291,6 +296,7 @@ public:
int m_tickCount;
int m_lastUpdate;
int mShadowmapIndex;
int shadowMinQuality;
bool m_active;
bool wasactive;
bool visibletoplayer;

View file

@ -6246,6 +6246,12 @@ AActor *FLevelLocals::SpawnMapThing (FMapThing *mthing, int position)
{
mobj->IntVar(NAME_lightflags) |= LF_DONTLIGHTMAP;
}
if (mthing->LightHasShadowMinQuality)
{
mobj->IntVar(NAME_shadowMinQuality) = mthing->LightShadowMinQuality;
}
}
mobj->CallBeginPlay ();

View file

@ -156,6 +156,7 @@ void FLightDefaults::ApplyProperties(FDynamicLight * light) const
light->swapped = m_swapped;
}
light->SetOffset(m_Pos); // this must be the last thing to do.
light->shadowMinQuality = shadowMinQuality;
}
void FLightDefaults::SetAttenuationForLevel(bool yes)

View file

@ -192,6 +192,7 @@ static const char *LightTags[]=
"dontlightothers",
"dontlightmap",
"trace",
"shadowminquality",
nullptr
};
@ -219,6 +220,7 @@ enum {
LIGHTTAG_DONTLIGHTOTHERS,
LIGHTTAG_DONTLIGHTMAP,
LIGHTTAG_TRACE,
LIGHTTAG_SHADOW_MINQUALITY,
};
//==========================================================================
@ -528,6 +530,9 @@ class GLDefsParser
case LIGHTTAG_TRACE:
defaults->SetTrace(ParseInt(sc) != 0);
break;
case LIGHTTAG_SHADOW_MINQUALITY:
defaults->SetShadowMinQuality(ParseInt(sc));
break;
case LIGHTTAG_SPOT:
{
float innerAngle = ParseFloat(sc);
@ -633,6 +638,9 @@ class GLDefsParser
case LIGHTTAG_TRACE:
defaults->SetTrace(ParseInt(sc) != 0);
break;
case LIGHTTAG_SHADOW_MINQUALITY:
defaults->SetShadowMinQuality(ParseInt(sc));
break;
case LIGHTTAG_SPOT:
{
float innerAngle = ParseFloat(sc);
@ -741,6 +749,9 @@ class GLDefsParser
case LIGHTTAG_TRACE:
defaults->SetTrace(ParseInt(sc) != 0);
break;
case LIGHTTAG_SHADOW_MINQUALITY:
defaults->SetShadowMinQuality(ParseInt(sc));
break;
case LIGHTTAG_SPOT:
{
float innerAngle = ParseFloat(sc);
@ -848,6 +859,9 @@ class GLDefsParser
case LIGHTTAG_TRACE:
defaults->SetTrace(ParseInt(sc) != 0);
break;
case LIGHTTAG_SHADOW_MINQUALITY:
defaults->SetShadowMinQuality(ParseInt(sc));
break;
case LIGHTTAG_SPOT:
{
float innerAngle = ParseFloat(sc);
@ -952,6 +966,9 @@ class GLDefsParser
case LIGHTTAG_TRACE:
defaults->SetTrace(ParseInt(sc) != 0);
break;
case LIGHTTAG_SHADOW_MINQUALITY:
defaults->SetShadowMinQuality(ParseInt(sc));
break;
case LIGHTTAG_SPOT:
{
float innerAngle = ParseFloat(sc);

View file

@ -90,7 +90,7 @@ void CollectLights(FLevelLocals* Level)
}
else
{
light->mShadowmapIndex = 1024;
light->mShadowmapIndex = 16000000;
}
}

View file

@ -84,6 +84,10 @@ float traceShadow(vec4 lightpos, float softShadowRadius)
float shadowAttenuation(vec4 lightpos, float lightcolorA, float softShadowRadius)
{
float shadowIndex = abs(lightcolorA) - 1.0;
if (shadowIndex >= 16000000.0)
return 1.0; // No shadowmap available for this light
if (lightpos.w > 1000000.0)
return 1.0; // Sunlight
return traceShadow(lightpos, softShadowRadius);

View file

@ -6,9 +6,11 @@ class DynamicLight : Actor
double LightLinearity; // used for Inverse-square falloff lights
private int lighttype;
private int lightflags;
int ShadowMinQuality;
property SpotInnerAngle: SpotInnerAngle;
property SpotOuterAngle: SpotOuterAngle;
property ShadowMinQuality: ShadowMinQuality;
flagdef subtractive: lightflags, 0;
flagdef additive: lightflags, 1;
@ -72,6 +74,7 @@ class DynamicLight : Actor
RenderRadius -1;
DynamicLight.SpotInnerAngle 10;
DynamicLight.SpotOuterAngle 25;
DynamicLight.ShadowMinQuality 1; // default medium, 0 = low, 1 = medium, 2 = high, 3 = ultra
+NOBLOCKMAP
+NOGRAVITY
+FIXMAPTHINGPOS

View file

@ -81,6 +81,7 @@ pointlight PLASMABALL
color 0.5 0.5 1.0
size 84
attenuate 1
shadowminquality 4
}
flickerlight PLASMA_X1
@ -90,6 +91,7 @@ flickerlight PLASMA_X1
secondarySize 108
chance 0.4
attenuate 1
shadowminquality 4
}
flickerlight PLASMA_X2
@ -99,6 +101,7 @@ flickerlight PLASMA_X2
secondarySize 132
chance 0.4
attenuate 1
shadowminquality 4
}
flickerlight PLASMA_X3
@ -108,6 +111,7 @@ flickerlight PLASMA_X3
secondarySize 108
chance 0.4
attenuate 1
shadowminquality 4
}
flickerlight PLASMA_X4
@ -117,6 +121,7 @@ flickerlight PLASMA_X4
secondarySize 24
chance 0.4
attenuate 1
shadowminquality 4
}
object PlasmaBall