aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorx2048 <codeforsmile@gmail.com>2021-08-12 20:07:09 +0200
committerGitHub <noreply@github.com>2021-08-12 20:07:09 +0200
commit442e48b84fea511badf108cedc2a6b43d79fd852 (patch)
treed4ba62bd7398f4e1f820dd19425344588a1fe9db
parent0709946c75ae6f2257d368714185bed7bee538ba (diff)
downloadminetest-442e48b84fea511badf108cedc2a6b43d79fd852.tar.gz
minetest-442e48b84fea511badf108cedc2a6b43d79fd852.tar.bz2
minetest-442e48b84fea511badf108cedc2a6b43d79fd852.zip
Move updating shadows outside of RenderingCore::drawAll. (#11491)
Fixes indirect rendering modes such as some 3D modes mentioned in #11437 and undersampled rendering. Does not fully fix anaglyph 3d mode.
-rw-r--r--src/client/render/core.cpp13
-rw-r--r--src/client/shadows/dynamicshadowsrender.cpp61
-rw-r--r--src/client/shadows/dynamicshadowsrender.h4
-rw-r--r--src/client/shadows/shadowsScreenQuad.cpp12
-rw-r--r--src/client/shadows/shadowsScreenQuad.h11
-rw-r--r--src/client/shadows/shadowsshadercallbacks.cpp16
-rw-r--r--src/client/shadows/shadowsshadercallbacks.h14
7 files changed, 65 insertions, 66 deletions
diff --git a/src/client/render/core.cpp b/src/client/render/core.cpp
index 4a820f583..f151832f3 100644
--- a/src/client/render/core.cpp
+++ b/src/client/render/core.cpp
@@ -76,19 +76,18 @@ void RenderingCore::draw(video::SColor _skycolor, bool _show_hud, bool _show_min
draw_wield_tool = _draw_wield_tool;
draw_crosshair = _draw_crosshair;
+ if (shadow_renderer)
+ shadow_renderer->update();
+
beforeDraw();
drawAll();
}
void RenderingCore::draw3D()
{
- if (shadow_renderer) {
- // Shadow renderer will handle the draw stage
- shadow_renderer->setClearColor(skycolor);
- shadow_renderer->update();
- } else {
- smgr->drawAll();
- }
+ smgr->drawAll();
+ if (shadow_renderer)
+ shadow_renderer->drawDebug();
driver->setTransform(video::ETS_WORLD, core::IdentityMatrix);
if (!show_hud)
diff --git a/src/client/shadows/dynamicshadowsrender.cpp b/src/client/shadows/dynamicshadowsrender.cpp
index 350586225..a913a9290 100644
--- a/src/client/shadows/dynamicshadowsrender.cpp
+++ b/src/client/shadows/dynamicshadowsrender.cpp
@@ -146,11 +146,6 @@ void ShadowRenderer::removeNodeFromShadowList(scene::ISceneNode *node)
}
}
-void ShadowRenderer::setClearColor(video::SColor ClearColor)
-{
- m_clear_color = ClearColor;
-}
-
void ShadowRenderer::updateSMTextures()
{
if (!m_shadows_enabled || m_smgr->getActiveCamera() == nullptr) {
@@ -242,6 +237,7 @@ void ShadowRenderer::updateSMTextures()
// This is also handled in ClientMap.
if (m_current_frame == m_map_shadow_update_frames - 1) {
if (m_shadow_map_colored) {
+ m_driver->setRenderTarget(0, false, false);
m_driver->setRenderTarget(shadowMapTextureColors,
true, false, video::SColor(255, 255, 255, 255));
}
@@ -273,7 +269,6 @@ void ShadowRenderer::updateSMTextures()
void ShadowRenderer::update(video::ITexture *outputTarget)
{
if (!m_shadows_enabled || m_smgr->getActiveCamera() == nullptr) {
- m_smgr->drawAll();
return;
}
@@ -308,36 +303,34 @@ void ShadowRenderer::update(video::ITexture *outputTarget)
m_driver->setRenderTarget(0, false, false);
} // end for lights
+ }
+}
- // now render the actual MT render pass
- m_driver->setRenderTarget(outputTarget, true, true, m_clear_color);
- m_smgr->drawAll();
-
- /* this code just shows shadows textures in screen and in ONLY for debugging*/
- #if 0
- // this is debug, ignore for now.
- m_driver->draw2DImage(shadowMapTextureFinal,
- core::rect<s32>(0, 50, 128, 128 + 50),
- core::rect<s32>({0, 0}, shadowMapTextureFinal->getSize()));
-
- m_driver->draw2DImage(shadowMapClientMap,
- core::rect<s32>(0, 50 + 128, 128, 128 + 50 + 128),
- core::rect<s32>({0, 0}, shadowMapTextureFinal->getSize()));
- m_driver->draw2DImage(shadowMapTextureDynamicObjects,
- core::rect<s32>(0, 128 + 50 + 128, 128,
- 128 + 50 + 128 + 128),
- core::rect<s32>({0, 0}, shadowMapTextureDynamicObjects->getSize()));
-
- if (m_shadow_map_colored) {
-
- m_driver->draw2DImage(shadowMapTextureColors,
- core::rect<s32>(128,128 + 50 + 128 + 128,
- 128 + 128, 128 + 50 + 128 + 128 + 128),
- core::rect<s32>({0, 0}, shadowMapTextureColors->getSize()));
- }
- #endif
- m_driver->setRenderTarget(0, false, false);
+void ShadowRenderer::drawDebug()
+{
+ /* this code just shows shadows textures in screen and in ONLY for debugging*/
+ #if 0
+ // this is debug, ignore for now.
+ m_driver->draw2DImage(shadowMapTextureFinal,
+ core::rect<s32>(0, 50, 128, 128 + 50),
+ core::rect<s32>({0, 0}, shadowMapTextureFinal->getSize()));
+
+ m_driver->draw2DImage(shadowMapClientMap,
+ core::rect<s32>(0, 50 + 128, 128, 128 + 50 + 128),
+ core::rect<s32>({0, 0}, shadowMapTextureFinal->getSize()));
+ m_driver->draw2DImage(shadowMapTextureDynamicObjects,
+ core::rect<s32>(0, 128 + 50 + 128, 128,
+ 128 + 50 + 128 + 128),
+ core::rect<s32>({0, 0}, shadowMapTextureDynamicObjects->getSize()));
+
+ if (m_shadow_map_colored) {
+
+ m_driver->draw2DImage(shadowMapTextureColors,
+ core::rect<s32>(128,128 + 50 + 128 + 128,
+ 128 + 128, 128 + 50 + 128 + 128 + 128),
+ core::rect<s32>({0, 0}, shadowMapTextureColors->getSize()));
}
+ #endif
}
diff --git a/src/client/shadows/dynamicshadowsrender.h b/src/client/shadows/dynamicshadowsrender.h
index 52b24a18f..e4b3c3e22 100644
--- a/src/client/shadows/dynamicshadowsrender.h
+++ b/src/client/shadows/dynamicshadowsrender.h
@@ -73,9 +73,8 @@ public:
E_SHADOW_MODE shadowMode = ESM_BOTH);
void removeNodeFromShadowList(scene::ISceneNode *node);
- void setClearColor(video::SColor ClearColor);
-
void update(video::ITexture *outputTarget = nullptr);
+ void drawDebug();
video::ITexture *get_texture()
{
@@ -112,7 +111,6 @@ private:
video::ITexture *shadowMapTextureFinal{nullptr};
video::ITexture *shadowMapTextureDynamicObjects{nullptr};
video::ITexture *shadowMapTextureColors{nullptr};
- video::SColor m_clear_color{0x0};
std::vector<DirectionalLight> m_light_list;
std::vector<NodeToApply> m_shadow_node_array;
diff --git a/src/client/shadows/shadowsScreenQuad.cpp b/src/client/shadows/shadowsScreenQuad.cpp
index c36ee0d60..5f6d38157 100644
--- a/src/client/shadows/shadowsScreenQuad.cpp
+++ b/src/client/shadows/shadowsScreenQuad.cpp
@@ -51,17 +51,11 @@ void shadowScreenQuadCB::OnSetConstants(
video::IMaterialRendererServices *services, s32 userData)
{
s32 TextureId = 0;
- services->setPixelShaderConstant(
- services->getPixelShaderConstantID("ShadowMapClientMap"),
- &TextureId, 1);
+ m_sm_client_map_setting.set(&TextureId, services);
TextureId = 1;
- services->setPixelShaderConstant(
- services->getPixelShaderConstantID("ShadowMapClientMapTraslucent"),
- &TextureId, 1);
+ m_sm_client_map_trans_setting.set(&TextureId, services);
TextureId = 2;
- services->setPixelShaderConstant(
- services->getPixelShaderConstantID("ShadowMapSamplerdynamic"),
- &TextureId, 1);
+ m_sm_dynamic_sampler_setting.set(&TextureId, services);
}
diff --git a/src/client/shadows/shadowsScreenQuad.h b/src/client/shadows/shadowsScreenQuad.h
index e6cc95957..c18be9a2b 100644
--- a/src/client/shadows/shadowsScreenQuad.h
+++ b/src/client/shadows/shadowsScreenQuad.h
@@ -21,6 +21,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "irrlichttypes_extrabloated.h"
#include <IMaterialRendererServices.h>
#include <IShaderConstantSetCallBack.h>
+#include "client/shader.h"
class shadowScreenQuad
{
@@ -38,8 +39,16 @@ private:
class shadowScreenQuadCB : public video::IShaderConstantSetCallBack
{
public:
- shadowScreenQuadCB(){};
+ shadowScreenQuadCB() :
+ m_sm_client_map_setting("ShadowMapClientMap"),
+ m_sm_client_map_trans_setting("ShadowMapClientMapTraslucent"),
+ m_sm_dynamic_sampler_setting("ShadowMapSamplerdynamic")
+ {}
virtual void OnSetConstants(video::IMaterialRendererServices *services,
s32 userData);
+private:
+ CachedPixelShaderSetting<s32> m_sm_client_map_setting;
+ CachedPixelShaderSetting<s32> m_sm_client_map_trans_setting;
+ CachedPixelShaderSetting<s32> m_sm_dynamic_sampler_setting;
};
diff --git a/src/client/shadows/shadowsshadercallbacks.cpp b/src/client/shadows/shadowsshadercallbacks.cpp
index 2f5797084..65a63f49c 100644
--- a/src/client/shadows/shadowsshadercallbacks.cpp
+++ b/src/client/shadows/shadowsshadercallbacks.cpp
@@ -28,17 +28,9 @@ void ShadowDepthShaderCB::OnSetConstants(
lightMVP *= driver->getTransform(video::ETS_VIEW);
lightMVP *= driver->getTransform(video::ETS_WORLD);
- services->setVertexShaderConstant(
- services->getPixelShaderConstantID("LightMVP"),
- lightMVP.pointer(), 16);
-
- services->setVertexShaderConstant(
- services->getPixelShaderConstantID("MapResolution"), &MapRes, 1);
- services->setVertexShaderConstant(
- services->getPixelShaderConstantID("MaxFar"), &MaxFar, 1);
-
+ m_light_mvp_setting.set(lightMVP.pointer(), services);
+ m_map_resolution_setting.set(&MapRes, services);
+ m_max_far_setting.set(&MaxFar, services);
s32 TextureId = 0;
- services->setPixelShaderConstant(
- services->getPixelShaderConstantID("ColorMapSampler"), &TextureId,
- 1);
+ m_color_map_sampler_setting.set(&TextureId, services);
}
diff --git a/src/client/shadows/shadowsshadercallbacks.h b/src/client/shadows/shadowsshadercallbacks.h
index 43ad489f2..3549567c3 100644
--- a/src/client/shadows/shadowsshadercallbacks.h
+++ b/src/client/shadows/shadowsshadercallbacks.h
@@ -21,14 +21,28 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "irrlichttypes_extrabloated.h"
#include <IMaterialRendererServices.h>
#include <IShaderConstantSetCallBack.h>
+#include "client/shader.h"
class ShadowDepthShaderCB : public video::IShaderConstantSetCallBack
{
public:
+ ShadowDepthShaderCB() :
+ m_light_mvp_setting("LightMVP"),
+ m_map_resolution_setting("MapResolution"),
+ m_max_far_setting("MaxFar"),
+ m_color_map_sampler_setting("ColorMapSampler")
+ {}
+
void OnSetMaterial(const video::SMaterial &material) override {}
void OnSetConstants(video::IMaterialRendererServices *services,
s32 userData) override;
f32 MaxFar{2048.0f}, MapRes{1024.0f};
+
+private:
+ CachedVertexShaderSetting<f32, 16> m_light_mvp_setting;
+ CachedVertexShaderSetting<f32> m_map_resolution_setting;
+ CachedVertexShaderSetting<f32> m_max_far_setting;
+ CachedPixelShaderSetting<s32> m_color_map_sampler_setting;
};