mirror of
https://github.com/ZDoom/gzdoom.git
synced 2024-11-28 23:02:07 +00:00
- added map option to disable shadowmaps.
Prompted by 'Hurt' which has > 4000 lights and runs into both performance issues and unpredictable light selection for the limited amount of shadowmap slots. # Conflicts: # src/gamedata/g_mapinfo.h
This commit is contained in:
parent
15dfe31166
commit
bfd4f7cbbb
5 changed files with 15 additions and 7 deletions
|
@ -85,7 +85,7 @@ CUSTOM_CVAR(Int, gl_shadowmap_quality, 512, CVAR_ARCHIVE | CVAR_GLOBALCONFIG)
|
||||||
|
|
||||||
bool IShadowMap::ShadowTest(const DVector3 &lpos, const DVector3 &pos)
|
bool IShadowMap::ShadowTest(const DVector3 &lpos, const DVector3 &pos)
|
||||||
{
|
{
|
||||||
if (mAABBTree && gl_light_shadowmap)
|
if (mAABBTree)
|
||||||
return mAABBTree->RayTest(lpos, pos) >= 1.0f;
|
return mAABBTree->RayTest(lpos, pos) >= 1.0f;
|
||||||
else
|
else
|
||||||
return true;
|
return true;
|
||||||
|
@ -98,7 +98,7 @@ bool IShadowMap::PerformUpdate()
|
||||||
LightsProcessed = 0;
|
LightsProcessed = 0;
|
||||||
LightsShadowmapped = 0;
|
LightsShadowmapped = 0;
|
||||||
|
|
||||||
if (gl_light_shadowmap && (screen->hwcaps & RFL_SHADER_STORAGE_BUFFER) && CollectLights != nullptr)
|
if (CollectLights != nullptr)
|
||||||
{
|
{
|
||||||
UpdateCycles.Clock();
|
UpdateCycles.Clock();
|
||||||
UploadAABBTree();
|
UploadAABBTree();
|
||||||
|
|
|
@ -1652,8 +1652,10 @@ MapFlagHandlers[] =
|
||||||
{ "nolightfade", MITYPE_SETFLAG3, LEVEL3_NOLIGHTFADE, 0 },
|
{ "nolightfade", MITYPE_SETFLAG3, LEVEL3_NOLIGHTFADE, 0 },
|
||||||
{ "nocoloredspritelighting", MITYPE_SETFLAG3, LEVEL3_NOCOLOREDSPRITELIGHTING, 0 },
|
{ "nocoloredspritelighting", MITYPE_SETFLAG3, LEVEL3_NOCOLOREDSPRITELIGHTING, 0 },
|
||||||
{ "forceworldpanning", MITYPE_SETFLAG3, LEVEL3_FORCEWORLDPANNING, 0 },
|
{ "forceworldpanning", MITYPE_SETFLAG3, LEVEL3_FORCEWORLDPANNING, 0 },
|
||||||
{ "propermonsterfallingdamage", MITYPE_SETFLAG3, LEVEL3_PROPERMONSTERFALLINGDAMAGE, 0 },
|
{ "propermonsterfallingdamage", MITYPE_SETFLAG3, LEVEL3_PROPERMONSTERFALLINGDAMAGE, 0 },
|
||||||
{ "enableskyboxao", MITYPE_SETFLAG3, LEVEL3_SKYBOXAO, 0 },
|
{ "disableshadowmap", MITYPE_SETFLAG3, LEVEL3_NOSHADOWMAP, 0 },
|
||||||
|
{ "enableshadowmap", MITYPE_CLRFLAG3, LEVEL3_NOSHADOWMAP, 0 },
|
||||||
|
{ "enableskyboxao", MITYPE_SETFLAG3, LEVEL3_SKYBOXAO, 0 },
|
||||||
{ "disableskyboxao", MITYPE_CLRFLAG3, LEVEL3_SKYBOXAO, 0 },
|
{ "disableskyboxao", MITYPE_CLRFLAG3, LEVEL3_SKYBOXAO, 0 },
|
||||||
{ "nobotnodes", MITYPE_IGNORE, 0, 0 }, // Skulltag option: nobotnodes
|
{ "nobotnodes", MITYPE_IGNORE, 0, 0 }, // Skulltag option: nobotnodes
|
||||||
{ "compat_shorttex", MITYPE_COMPATFLAG, COMPATF_SHORTTEX, 0 },
|
{ "compat_shorttex", MITYPE_COMPATFLAG, COMPATF_SHORTTEX, 0 },
|
||||||
|
|
|
@ -252,6 +252,7 @@ enum ELevelFlags : unsigned int
|
||||||
LEVEL3_HIDEAUTHORNAME = 0x00000100,
|
LEVEL3_HIDEAUTHORNAME = 0x00000100,
|
||||||
LEVEL3_PROPERMONSTERFALLINGDAMAGE = 0x00000200, // Properly apply falling damage to the monsters
|
LEVEL3_PROPERMONSTERFALLINGDAMAGE = 0x00000200, // Properly apply falling damage to the monsters
|
||||||
LEVEL3_SKYBOXAO = 0x00000400, // Apply SSAO to sector skies
|
LEVEL3_SKYBOXAO = 0x00000400, // Apply SSAO to sector skies
|
||||||
|
LEVEL3_NOSHADOWMAP = 0x00010000, // disables shadowmaps for a given level.
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -107,10 +107,9 @@ void AddLightToList(FDynLightData &dld, int group, FDynamicLight * light, bool f
|
||||||
}
|
}
|
||||||
|
|
||||||
float shadowIndex;
|
float shadowIndex;
|
||||||
if (gl_light_shadowmap)
|
if (gl_light_shadowmap) // note: with gl_light_shadowmap switched off, we cannot rely on properly set indices anymore.
|
||||||
{
|
{
|
||||||
shadowIndex = light->mShadowmapIndex + 1.0f;
|
shadowIndex = light->mShadowmapIndex + 1.0f;
|
||||||
|
|
||||||
}
|
}
|
||||||
else shadowIndex = 1025.f;
|
else shadowIndex = 1025.f;
|
||||||
// Store attenuate flag in the sign bit of the float.
|
// Store attenuate flag in the sign bit of the float.
|
||||||
|
|
|
@ -107,7 +107,7 @@ sector_t* RenderViewpoint(FRenderViewpoint& mainvp, AActor* camera, IntRect* bou
|
||||||
|
|
||||||
R_SetupFrame(mainvp, r_viewwindow, camera);
|
R_SetupFrame(mainvp, r_viewwindow, camera);
|
||||||
|
|
||||||
if (mainview && toscreen)
|
if (mainview && toscreen && !(camera->Level->flags3 & LEVEL3_NOSHADOWMAP) && gl_light_shadowmap && (screen->hwcaps & RFL_SHADER_STORAGE_BUFFER))
|
||||||
{
|
{
|
||||||
screen->SetAABBTree(camera->Level->aabbTree);
|
screen->SetAABBTree(camera->Level->aabbTree);
|
||||||
screen->mShadowMap.SetCollectLights([=] {
|
screen->mShadowMap.SetCollectLights([=] {
|
||||||
|
@ -115,6 +115,12 @@ sector_t* RenderViewpoint(FRenderViewpoint& mainvp, AActor* camera, IntRect* bou
|
||||||
});
|
});
|
||||||
screen->UpdateShadowMap();
|
screen->UpdateShadowMap();
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// null all references to the level if we do not need a shadowmap. This will shortcut all internal calculations without further checks.
|
||||||
|
screen->SetAABBTree(nullptr);
|
||||||
|
screen->mShadowMap.SetCollectLights(nullptr);
|
||||||
|
}
|
||||||
|
|
||||||
// Update the attenuation flag of all light defaults for each viewpoint.
|
// Update the attenuation flag of all light defaults for each viewpoint.
|
||||||
// This function will only do something if the setting differs.
|
// This function will only do something if the setting differs.
|
||||||
|
|
Loading…
Reference in a new issue