#ifndef ENGINE_H
#define ENGINE_H

#include "client/Game.h"
#include "client/rendering/Framebuffers.h"
#include "client/rendering/Mesh.h"
#include "client/rendering/NoiseTexture.h"
#include "client/rendering/RenderSettings.h"
#include "client/rendering/Renderer.h"
#include "client/rendering/Shaders.h"
#include "math/Frustum.h"

class Engine final {
    Shaders& shaders;
    Framebuffers& framebuffers;
    Size lastSize;
    const Size& size;
    RenderSettings& renderSettings;
    Game& game;

    Frustum frustum;
    MatrixStack<16> model;
    Renderer renderer;
    NoiseTexture ssaoNoise;
    Mesh rectangle;

    Matrix worldProj;
    Matrix worldView;
    Matrix worldShadowProj;
    Matrix worldShadowView;
    Matrix worldShadowProjView;

public:
    Engine(Shaders& shaders, Framebuffers& fb, const Size& size,
           RenderSettings& renderSettings, Game& game);
    void render(float lag);
    void tick();
    bool isRunning() const;

private:
    void renderShadow(float lag);
    void renderWorld(float lag);
    void renderSSAO();
    void renderPostWorld();
    void renderOverlay(float lag);
    void updateWorldProjection();
    void updateWorldView();
};

#endif