#pragma once #include "gfx/gl/program.h" #include "gfx/models/mesh.h" #include "gfx/models/texture.h" #include "glArrays.h" class LightDirection; class ShadowStenciller { public: template static constexpr T STENCIL_ANGLES = 8; ShadowStenciller(); static void configureStencilTexture(glTexture &, GLsizei width, GLsizei height); void setLightDirection(const LightDirection & lightDir); [[nodiscard]] Direction2D getLightDirection() const; void renderStencil(const glTexture &, const MeshBase &, Texture::AnyPtr texture) const; private: glFrameBuffer fbo; Program shadowCaster; Program::RequiredUniformLocation viewProjectionLoc {shadowCaster, "viewProjection"}; Direction2D lightDir; std::array> viewProjections; };