Files
panopainter/src/rtt.h

89 lines
2.4 KiB
C++

#pragma once
#include "image.h"
struct PBO
{
// copy
PBO(const PBO&) = delete;
PBO& operator=(const PBO&) = delete;
// move
PBO(PBO&& other) noexcept;
PBO& operator=(PBO&&) noexcept;
// default
PBO() noexcept = default;
~PBO() noexcept;
GLuint buffer_id = 0;
GLenum bound_slot = 0;
GLubyte* mapped_ptr = nullptr;
int width = 0;
int height = 0;
bool create() noexcept;
bool create(class RTT& rtt) noexcept;
void destroy() noexcept;
/*
void bind_read() noexcept;
void unbind() noexcept;
*/
uint8_t* map() noexcept;
void unmap() noexcept;
};
class RTT
{
int w = 0;
int h = 0;
GLuint fboID = 0;
GLuint texID = 0;
GLuint rboID = 0;
GLint int_fmt = 0;
bool bound = false;
GLint oldRFboID = 0;
GLint oldDFboID = 0;
public:
// copy
RTT(const RTT&) = delete;
RTT& operator=(const RTT&) = delete;
// move
RTT(RTT&& other);
RTT& operator=(RTT&&);
// default
RTT();
~RTT();
void destroy();
// copy with interpolation
void copy(const RTT& source);
// copy a region
void copy(const RTT& source, const glm::vec4& rect);
RTT clone() const noexcept;
bool resize(int width, int height);
bool create(int width, int height);
bool create(int width, int height, int tex);
bool create(int width, int height, int tex, GLint internal_format, bool depth_buffer = false);
bool recreate() { return create(w, h); }
void clear(glm::vec4 color = glm::vec4(0));
void clear_mask(glm::bool4 mask, glm::vec4 color = glm::vec4(0));
glm::ivec4 calc_bounds() const noexcept;
uint8_t* readTextureData(uint8_t* buffer = nullptr) const noexcept;
float* readTextureDataFloat(float* buffer = nullptr) const noexcept;
uint8_t* createBuffer() const noexcept;
float* createBufferFloat() const noexcept;
void bindFramebuffer();
void unbindFramebuffer();
void bindTexture();
void unbindTexture();
GLuint getTextureID() const noexcept { return texID; }
int getWidth() const noexcept { return w; }
int getHeight() const noexcept { return h; }
glm::ivec2 getSize() const noexcept { return { w, h }; }
int bytes() const noexcept { return w * h * 4; }
int stride() const noexcept { return w * 4; }
GLuint getFBO() const noexcept { return fboID; }
Image get_image() const noexcept;
bool valid() const noexcept;
};