1
0
Fork 0
mirror of https://github.com/luanti-org/luanti.git synced 2025-06-27 16:36:03 +00:00

Release shadow mapping resources when not needed (#12497)

This commit is contained in:
x2048 2022-07-09 22:26:39 +02:00 committed by GitHub
parent b15393c2a5
commit 7c261118e0
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 47 additions and 33 deletions

View file

@ -70,21 +70,6 @@ ShadowRenderer::~ShadowRenderer()
delete m_shadow_mix_cb;
m_shadow_node_array.clear();
m_light_list.clear();
if (shadowMapTextureDynamicObjects)
m_driver->removeTexture(shadowMapTextureDynamicObjects);
if (shadowMapTextureFinal)
m_driver->removeTexture(shadowMapTextureFinal);
if (shadowMapTextureColors)
m_driver->removeTexture(shadowMapTextureColors);
if (shadowMapClientMap)
m_driver->removeTexture(shadowMapClientMap);
if (shadowMapClientMapFuture)
m_driver->removeTexture(shadowMapClientMapFuture);
}
void ShadowRenderer::disable()
@ -93,8 +78,37 @@ void ShadowRenderer::disable()
if (shadowMapTextureFinal) {
m_driver->setRenderTarget(shadowMapTextureFinal, true, true,
video::SColor(255, 255, 255, 255));
m_driver->setRenderTarget(0, true, true);
m_driver->setRenderTarget(0, false, false);
}
if (shadowMapTextureDynamicObjects) {
m_driver->removeTexture(shadowMapTextureDynamicObjects);
shadowMapTextureDynamicObjects = nullptr;
}
if (shadowMapTextureFinal) {
m_driver->removeTexture(shadowMapTextureFinal);
shadowMapTextureFinal = nullptr;
}
if (shadowMapTextureColors) {
m_driver->removeTexture(shadowMapTextureColors);
shadowMapTextureColors = nullptr;
}
if (shadowMapClientMap) {
m_driver->removeTexture(shadowMapClientMap);
shadowMapClientMap = nullptr;
}
if (shadowMapClientMapFuture) {
m_driver->removeTexture(shadowMapClientMapFuture);
shadowMapClientMapFuture = nullptr;
}
for (auto node : m_shadow_node_array)
if (node.shadowMode & E_SHADOW_MODE::ESM_RECEIVE)
node.node->setMaterialTexture(TEXTURE_LAYER_SHADOW, nullptr);
}
void ShadowRenderer::initialize()
@ -163,11 +177,18 @@ void ShadowRenderer::setShadowIntensity(float shadow_intensity)
void ShadowRenderer::addNodeToShadowList(
scene::ISceneNode *node, E_SHADOW_MODE shadowMode)
{
m_shadow_node_array.emplace_back(NodeToApply(node, shadowMode));
if (!node)
return;
m_shadow_node_array.emplace_back(node, shadowMode);
if (shadowMode == ESM_RECEIVE || shadowMode == ESM_BOTH)
node->setMaterialTexture(TEXTURE_LAYER_SHADOW, shadowMapTextureFinal);
}
void ShadowRenderer::removeNodeFromShadowList(scene::ISceneNode *node)
{
if (!node)
return;
node->setMaterialTexture(TEXTURE_LAYER_SHADOW, nullptr);
for (auto it = m_shadow_node_array.begin(); it != m_shadow_node_array.end();) {
if (it->node == node) {
it = m_shadow_node_array.erase(it);
@ -235,6 +256,10 @@ void ShadowRenderer::updateSMTextures()
std::string("shadowmap_final_") + itos(m_shadow_map_texture_size),
frt, true);
assert(shadowMapTextureFinal != nullptr);
for (auto &node : m_shadow_node_array)
if (node.shadowMode == ESM_RECEIVE || node.shadowMode == ESM_BOTH)
node.node->setMaterialTexture(TEXTURE_LAYER_SHADOW, shadowMapTextureFinal);
}
if (!m_shadow_node_array.empty() && !m_light_list.empty()) {
@ -322,6 +347,7 @@ void ShadowRenderer::update(video::ITexture *outputTarget)
return;
}
if (!m_shadow_node_array.empty() && !m_light_list.empty()) {
for (DirectionalLight &light : m_light_list) {