#pragma once

class RTT
{
    bool bound = false;
    GLint oldRFboID = 0;
    GLint oldDFboID = 0;
    GLuint fboID = 0;
    GLuint rboID = 0;
    GLuint texID = 0;
    GLint int_fmt = 0;
    int w = 0;
    int h = 0;

public:
    RTT(const RTT&) = delete;
    RTT(RTT&& other);
    RTT();
    ~RTT();

    void destroy();
    void copy(const RTT& source);
    void resize(int width, int height);
    bool create(int width, int height, int tex = -1, GLint internal_format = GL_RGBA8);
    bool recreate() { return create(w, h); }
    void clear(glm::vec4 color = glm::vec4(0));
    glm::ivec4 calc_bounds();
    uint8_t* readTextureData(uint8_t* buffer = nullptr);
    float* readTextureDataFloat(float* buffer = nullptr);
    uint8_t* createBuffer();
    float* createBufferFloat();
    void bindFramebuffer();
    void unbindFramebuffer();
    void bindTexture();
    void unbindTexture();
    GLuint getTextureID() const { return texID; }
    int getWidth() const { return w; }
    int getHeight() const { return h; }
    int bytes() const { return w * h * 4; }
    int stride() const { return w * 4; }
    GLuint getFBO() const { return fboID; }
};
