aboutsummaryrefslogtreecommitdiff
path: root/src/client/shadows/dynamicshadows.h
diff options
context:
space:
mode:
authorx2048 <codeforsmile@gmail.com>2021-07-25 12:36:23 +0200
committerGitHub <noreply@github.com>2021-07-25 12:36:23 +0200
commitbf3acbf388406f736286d990adb5f35a9023c390 (patch)
tree9fdff755e37253580c222ff768802a6b0170be10 /src/client/shadows/dynamicshadows.h
parentff2d2a6e93d75d24b3f69f2b3690bcac6440961e (diff)
downloadminetest-bf3acbf388406f736286d990adb5f35a9023c390.tar.gz
minetest-bf3acbf388406f736286d990adb5f35a9023c390.tar.bz2
minetest-bf3acbf388406f736286d990adb5f35a9023c390.zip
Distribute shadow map update over multiple frames to reduce stutter (#11422)
Reduces stutter and freezes when playing. * Maintains double SM and SM Color textures * Light frustum update triggers incremental generation of shadow map into secondary 'future' textures. * Every incremental update renders a portion of the shadow draw list (split equally). * After defined number of frames (currently, 4), 'future' and 'current' textures are swapped, and DirectionalLight 'commits' the new frustum to use when rendering shadows on screen. Co-authored-by: sfan5 <sfan5@live.de>
Diffstat (limited to 'src/client/shadows/dynamicshadows.h')
-rw-r--r--src/client/shadows/dynamicshadows.h9
1 files changed, 8 insertions, 1 deletions
diff --git a/src/client/shadows/dynamicshadows.h b/src/client/shadows/dynamicshadows.h
index a53612f7c..d8be66be8 100644
--- a/src/client/shadows/dynamicshadows.h
+++ b/src/client/shadows/dynamicshadows.h
@@ -34,6 +34,7 @@ struct shadowFrustum
core::matrix4 ProjOrthMat;
core::matrix4 ViewMat;
v3f position;
+ v3s16 camera_offset;
};
class DirectionalLight
@@ -47,7 +48,7 @@ public:
//DISABLE_CLASS_COPY(DirectionalLight)
- void update_frustum(const Camera *cam, Client *client);
+ void update_frustum(const Camera *cam, Client *client, bool force = false);
// when set direction is updated to negative normalized(direction)
void setDirection(v3f dir);
@@ -59,6 +60,8 @@ public:
/// Gets the light's matrices.
const core::matrix4 &getViewMatrix() const;
const core::matrix4 &getProjectionMatrix() const;
+ const core::matrix4 &getFutureViewMatrix() const;
+ const core::matrix4 &getFutureProjectionMatrix() const;
core::matrix4 getViewProjMatrix();
/// Gets the light's far value.
@@ -88,6 +91,8 @@ public:
bool should_update_map_shadow{true};
+ void commitFrustum();
+
private:
void createSplitMatrices(const Camera *cam);
@@ -99,4 +104,6 @@ private:
v3f pos;
v3f direction{0};
shadowFrustum shadow_frustum;
+ shadowFrustum future_frustum;
+ bool dirty{false};
};