add shadowMinQuality property and gl_light_shadow_max_quality CVar
This commit is contained in:
parent
e75d8d35eb
commit
9073fb8501
14 changed files with 61 additions and 2 deletions
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -388,6 +388,8 @@ struct FMapThing
|
|||
bool LightNoShadowMap;
|
||||
bool LightDontLightActors;
|
||||
bool LightDontLightMap;
|
||||
bool LightHasShadowMinQuality;
|
||||
int LightShadowMinQuality;
|
||||
};
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
//==========================================================================
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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 ();
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -90,7 +90,7 @@ void CollectLights(FLevelLocals* Level)
|
|||
}
|
||||
else
|
||||
{
|
||||
light->mShadowmapIndex = 1024;
|
||||
light->mShadowmapIndex = 16000000;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue