]> git.lizzy.rs Git - dragonfireclient.git/blobdiff - src/client/shadows/dynamicshadowsrender.h
Force-update shadows when the world is changed (#12364)
[dragonfireclient.git] / src / client / shadows / dynamicshadowsrender.h
index e633bd4f7029dbd775a88c283b5d0e5fc81d8802..2e3b58f6f9e90d6fbd6e73caa7d6d584cd621c94 100644 (file)
@@ -64,7 +64,6 @@ class ShadowRenderer
        size_t getDirectionalLightCount() const;
        f32 getMaxShadowFar() const;
 
-       float getUpdateDelta() const;
        /// Adds a shadow to the scene node.
        /// The shadow mode can be ESM_BOTH, or ESM_RECEIVE.
        /// ESM_BOTH casts and receives shadows
@@ -74,9 +73,9 @@ class ShadowRenderer
                        E_SHADOW_MODE shadowMode = ESM_BOTH);
        void removeNodeFromShadowList(scene::ISceneNode *node);
 
-       void setClearColor(video::SColor ClearColor);
-
        void update(video::ITexture *outputTarget = nullptr);
+       void setForceUpdateShadowMap() { m_force_update_shadow_map = true; }
+       void drawDebug();
 
        video::ITexture *get_texture()
        {
@@ -84,13 +83,17 @@ class ShadowRenderer
        }
 
 
-       bool is_active() const { return m_shadows_enabled; }
+       bool is_active() const { return m_shadows_enabled && shadowMapTextureFinal != nullptr; }
        void setTimeOfDay(float isDay) { m_time_day = isDay; };
+       void setShadowIntensity(float shadow_intensity);
 
        s32 getShadowSamples() const { return m_shadow_samples; }
-       float getShadowStrength() const { return m_shadow_strength; }
+       float getShadowStrength() const { return m_shadows_enabled ? m_shadow_strength : 0.0f; }
        float getTimeOfDay() const { return m_time_day; }
 
+       f32 getPerspectiveBiasXY() { return m_perspective_bias_xy; }
+       f32 getPerspectiveBiasZ() { return m_perspective_bias_z; }
+
 private:
        video::ITexture *getSMTexture(const std::string &shadow_map_name,
                        video::ECOLOR_FORMAT texture_format,
@@ -101,30 +104,39 @@ class ShadowRenderer
                                        scene::ESNRP_SOLID);
        void renderShadowObjects(video::ITexture *target, DirectionalLight &light);
        void mixShadowsQuad();
+       void updateSMTextures();
+
+       void disable();
+       void enable() { m_shadows_enabled = m_shadows_supported; }
 
        // a bunch of variables
-       IrrlichtDevice *m_device{nullptr};
        scene::ISceneManager *m_smgr{nullptr};
        video::IVideoDriver *m_driver{nullptr};
        Client *m_client{nullptr};
        video::ITexture *shadowMapClientMap{nullptr};
+       video::ITexture *shadowMapClientMapFuture{nullptr};
        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;
 
        float m_shadow_strength;
+       float m_shadow_strength_gamma;
        float m_shadow_map_max_distance;
        float m_shadow_map_texture_size;
        float m_time_day{0.0f};
-       float m_update_delta;
        int m_shadow_samples;
        bool m_shadow_map_texture_32bit;
        bool m_shadows_enabled;
+       bool m_shadows_supported;
        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_current_frame{0}; /* Current frame */
+       f32 m_perspective_bias_xy;
+       f32 m_perspective_bias_z;
 
        video::ECOLOR_FORMAT m_texture_format{video::ECOLOR_FORMAT::ECF_R16F};
        video::ECOLOR_FORMAT m_texture_format_color{video::ECOLOR_FORMAT::ECF_R16G16};
@@ -135,10 +147,12 @@ class ShadowRenderer
        std::string readShaderFile(const std::string &path);
 
        s32 depth_shader{-1};
+       s32 depth_shader_entities{-1};
        s32 depth_shader_trans{-1};
        s32 mixcsm_shader{-1};
 
        ShadowDepthShaderCB *m_shadow_depth_cb{nullptr};
+       ShadowDepthShaderCB *m_shadow_depth_entity_cb{nullptr};
        ShadowDepthShaderCB *m_shadow_depth_trans_cb{nullptr};
 
        shadowScreenQuad *m_screen_quad{nullptr};