#pragma once #include "commons.hpp" #include "typedefs.hpp" #include "presets/WeatherPreset.hpp" #include "world/Weather.hpp" #include "window/Camera.hpp" #include #include #include #include class Assets; class Batch3D; class BlockWrapsRenderer; class ChunksRenderer; class DebugLinesRenderer; class DrawContext; class Engine; class Frustum; class HandsRenderer; class Level; class LevelFrontend; class LineBatch; class ModelBatch; class NamedSkeletons; class ParticlesRenderer; class Player; class PostProcessing; class PrecipitationRenderer; class Shader; class Shadows; class Skybox; class TextsRenderer; class CloudsRenderer; struct EngineSettings; struct CompileTimeShaderSettings { bool advancedRender = false; bool shadows = false; bool ssao = false; }; class WorldRenderer { Engine& engine; const Level& level; Player& player; const Assets& assets; std::unique_ptr frustumCulling; std::unique_ptr lineBatch; std::unique_ptr batch3d; std::unique_ptr modelBatch; std::unique_ptr chunksRenderer; std::unique_ptr hands; std::unique_ptr skybox; std::unique_ptr shadowMapping; std::unique_ptr debugLines; std::unique_ptr precipitation; std::unique_ptr cloudsRenderer; Weather weather {}; float timer = 0.0f; bool debug = false; bool lightsDebug = false; bool gbufferPipeline = false; CompileTimeShaderSettings prevCTShaderSettings {}; /// @brief Render block selection lines void renderBlockSelection(); /// @brief Render lines (selection and debug) /// @param camera active camera /// @param linesShader shader used void renderLines( const Camera& camera, Shader& linesShader, const DrawContext& pctx ); void renderBlockOverlay(const DrawContext& context); void setupWorldShader( Shader& shader, const Camera& camera, const EngineSettings& settings, float fogFactor ); /// @brief Render opaque pass /// @param context graphics context /// @param camera active camera /// @param settings engine settings void renderOpaque( const DrawContext& context, const Camera& camera, const EngineSettings& settings, bool hudVisible ); void refreshSettings(Shader** shaders); public: std::unique_ptr particles; std::unique_ptr texts; std::unique_ptr blockWraps; std::unique_ptr skeletons; static bool showChunkBorders; static bool showEntitiesDebug; WorldRenderer(Engine& engine, LevelFrontend& frontend, Player& player); ~WorldRenderer(); void update(const Camera& camera, float delta); void renderFrame( const DrawContext& context, Camera& camera, bool hudVisible, PostProcessing& postProcessing ); void clear(); void setDebug(bool flag); void toggleLightsDebug(); Weather& getWeather(); };