mirror of
https://github.com/minetest/minetest.git
synced 2024-11-23 16:13:46 +01:00
Force-update shadows when the world is changed (#12364)
This commit is contained in:
parent
8b74257bf3
commit
ef22c0206f
@ -530,6 +530,7 @@ void Client::step(float dtime)
|
|||||||
{
|
{
|
||||||
int num_processed_meshes = 0;
|
int num_processed_meshes = 0;
|
||||||
std::vector<v3s16> blocks_to_ack;
|
std::vector<v3s16> blocks_to_ack;
|
||||||
|
bool force_update_shadows = false;
|
||||||
while (!m_mesh_update_thread.m_queue_out.empty())
|
while (!m_mesh_update_thread.m_queue_out.empty())
|
||||||
{
|
{
|
||||||
num_processed_meshes++;
|
num_processed_meshes++;
|
||||||
@ -556,9 +557,11 @@ void Client::step(float dtime)
|
|||||||
|
|
||||||
if (is_empty)
|
if (is_empty)
|
||||||
delete r.mesh;
|
delete r.mesh;
|
||||||
else
|
else {
|
||||||
// Replace with the new mesh
|
// Replace with the new mesh
|
||||||
block->mesh = r.mesh;
|
block->mesh = r.mesh;
|
||||||
|
force_update_shadows = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
delete r.mesh;
|
delete r.mesh;
|
||||||
@ -583,6 +586,10 @@ void Client::step(float dtime)
|
|||||||
|
|
||||||
if (num_processed_meshes > 0)
|
if (num_processed_meshes > 0)
|
||||||
g_profiler->graphAdd("num_processed_meshes", num_processed_meshes);
|
g_profiler->graphAdd("num_processed_meshes", num_processed_meshes);
|
||||||
|
|
||||||
|
auto shadow_renderer = RenderingEngine::get_shadow_renderer();
|
||||||
|
if (shadow_renderer && force_update_shadows)
|
||||||
|
shadow_renderer->setForceUpdateShadowMap();
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -242,7 +242,7 @@ void ShadowRenderer::updateSMTextures()
|
|||||||
|
|
||||||
// detect if SM should be regenerated
|
// detect if SM should be regenerated
|
||||||
for (DirectionalLight &light : m_light_list) {
|
for (DirectionalLight &light : m_light_list) {
|
||||||
if (light.should_update_map_shadow) {
|
if (light.should_update_map_shadow || m_force_update_shadow_map) {
|
||||||
light.should_update_map_shadow = false;
|
light.should_update_map_shadow = false;
|
||||||
m_current_frame = 0;
|
m_current_frame = 0;
|
||||||
reset_sm_texture = true;
|
reset_sm_texture = true;
|
||||||
@ -271,14 +271,14 @@ void ShadowRenderer::updateSMTextures()
|
|||||||
// should put some gl* fn here
|
// should put some gl* fn here
|
||||||
|
|
||||||
|
|
||||||
if (m_current_frame < m_map_shadow_update_frames) {
|
if (m_current_frame < m_map_shadow_update_frames || m_force_update_shadow_map) {
|
||||||
m_driver->setRenderTarget(shadowMapTargetTexture, reset_sm_texture, true,
|
m_driver->setRenderTarget(shadowMapTargetTexture, reset_sm_texture, true,
|
||||||
video::SColor(255, 255, 255, 255));
|
video::SColor(255, 255, 255, 255));
|
||||||
renderShadowMap(shadowMapTargetTexture, light);
|
renderShadowMap(shadowMapTargetTexture, light);
|
||||||
|
|
||||||
// Render transparent part in one pass.
|
// Render transparent part in one pass.
|
||||||
// This is also handled in ClientMap.
|
// This is also handled in ClientMap.
|
||||||
if (m_current_frame == m_map_shadow_update_frames - 1) {
|
if (m_current_frame == m_map_shadow_update_frames - 1 || m_force_update_shadow_map) {
|
||||||
if (m_shadow_map_colored) {
|
if (m_shadow_map_colored) {
|
||||||
m_driver->setRenderTarget(0, false, false);
|
m_driver->setRenderTarget(0, false, false);
|
||||||
m_driver->setRenderTarget(shadowMapTextureColors,
|
m_driver->setRenderTarget(shadowMapTextureColors,
|
||||||
@ -298,7 +298,7 @@ void ShadowRenderer::updateSMTextures()
|
|||||||
++m_current_frame;
|
++m_current_frame;
|
||||||
|
|
||||||
// pass finished, swap textures and commit light changes
|
// pass finished, swap textures and commit light changes
|
||||||
if (m_current_frame == m_map_shadow_update_frames) {
|
if (m_current_frame == m_map_shadow_update_frames || m_force_update_shadow_map) {
|
||||||
if (shadowMapClientMapFuture != nullptr)
|
if (shadowMapClientMapFuture != nullptr)
|
||||||
std::swap(shadowMapClientMapFuture, shadowMapClientMap);
|
std::swap(shadowMapClientMapFuture, shadowMapClientMap);
|
||||||
|
|
||||||
@ -306,6 +306,7 @@ void ShadowRenderer::updateSMTextures()
|
|||||||
for (DirectionalLight &light : m_light_list)
|
for (DirectionalLight &light : m_light_list)
|
||||||
light.commitFrustum();
|
light.commitFrustum();
|
||||||
}
|
}
|
||||||
|
m_force_update_shadow_map = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -432,7 +433,10 @@ void ShadowRenderer::renderShadowMap(video::ITexture *target,
|
|||||||
m_driver->setTransform(video::ETS_WORLD,
|
m_driver->setTransform(video::ETS_WORLD,
|
||||||
map_node->getAbsoluteTransformation());
|
map_node->getAbsoluteTransformation());
|
||||||
|
|
||||||
map_node->renderMapShadows(m_driver, material, pass, m_current_frame, m_map_shadow_update_frames);
|
int frame = m_force_update_shadow_map ? 0 : m_current_frame;
|
||||||
|
int total_frames = m_force_update_shadow_map ? 1 : m_map_shadow_update_frames;
|
||||||
|
|
||||||
|
map_node->renderMapShadows(m_driver, material, pass, frame, total_frames);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -74,6 +74,7 @@ public:
|
|||||||
void removeNodeFromShadowList(scene::ISceneNode *node);
|
void removeNodeFromShadowList(scene::ISceneNode *node);
|
||||||
|
|
||||||
void update(video::ITexture *outputTarget = nullptr);
|
void update(video::ITexture *outputTarget = nullptr);
|
||||||
|
void setForceUpdateShadowMap() { m_force_update_shadow_map = true; }
|
||||||
void drawDebug();
|
void drawDebug();
|
||||||
|
|
||||||
video::ITexture *get_texture()
|
video::ITexture *get_texture()
|
||||||
@ -131,6 +132,7 @@ private:
|
|||||||
bool m_shadows_enabled;
|
bool m_shadows_enabled;
|
||||||
bool m_shadows_supported;
|
bool m_shadows_supported;
|
||||||
bool m_shadow_map_colored;
|
bool m_shadow_map_colored;
|
||||||
|
bool m_force_update_shadow_map;
|
||||||
u8 m_map_shadow_update_frames; /* Use this number of frames to update map shaodw */
|
u8 m_map_shadow_update_frames; /* Use this number of frames to update map shaodw */
|
||||||
u8 m_current_frame{0}; /* Current frame */
|
u8 m_current_frame{0}; /* Current frame */
|
||||||
f32 m_perspective_bias_xy;
|
f32 m_perspective_bias_xy;
|
||||||
|
Loading…
Reference in New Issue
Block a user