#pragma once
#include "shader.hpp"
#include "common.hpp"
#include <map>


class DepthBlur: public ImageShader {
    private:
        const coord_t mind, maxd, diffd;

    public:
        DepthBlur(unsigned, unsigned);
        void get(const Scene*, ShaderInfo&, Img&) const;
};


class DepthFog: public PixelShader {
    private:
        const Img::rgb_t col;
        const coord_t start, sqstart;
        const float density; // per unit length

    public:
        DepthFog(const Img::rgb_t& c, coord_t s, unsigned d);
        void get(const Scene*, ShaderInfo::shader_info_t&, Img::rgb_t&) const;
};


class VolumetricLight: public PixelShader {
    private:
        const vertex_t pos;
        const float intensity;
        const unsigned maxlen, maxsqlen;
        static const coord_t stepsize;
        const int samples_max;

    public:
        VolumetricLight(const vertex_t p, unsigned brightness, unsigned len);
        void get(const Scene*, ShaderInfo::shader_info_t&, Img::rgb_t&) const;
};