diff --git a/src/rtt.cpp b/src/rtt.cpp index 0b91f31..6d6fbba 100644 --- a/src/rtt.cpp +++ b/src/rtt.cpp @@ -98,16 +98,18 @@ void RTT::copy(const RTT & source) { App::I->render_task([&] { - glGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &oldDFboID); - glGetIntegerv(GL_READ_FRAMEBUFFER_BINDING, &oldRFboID); + GLint old_draw = 0; + GLint old_read = 0; + glGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &old_draw); + glGetIntegerv(GL_READ_FRAMEBUFFER_BINDING, &old_read); glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fboID); glBindFramebuffer(GL_READ_FRAMEBUFFER, source.fboID); glBlitFramebuffer(0, 0, source.w, source.h, 0, 0, w, h, GL_COLOR_BUFFER_BIT, GL_LINEAR); - glBindFramebuffer(GL_DRAW_FRAMEBUFFER, oldDFboID); - glBindFramebuffer(GL_READ_FRAMEBUFFER, oldRFboID); + glBindFramebuffer(GL_DRAW_FRAMEBUFFER, old_draw); + glBindFramebuffer(GL_READ_FRAMEBUFFER, old_read); }); } @@ -117,16 +119,18 @@ void RTT::copy(const RTT& source, const glm::vec4& rect) { auto r = rect_intersection(rect, { 0, 0, w, h }); - glGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &oldDFboID); - glGetIntegerv(GL_READ_FRAMEBUFFER_BINDING, &oldRFboID); + GLint old_draw = 0; + GLint old_read = 0; + glGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &old_draw); + glGetIntegerv(GL_READ_FRAMEBUFFER_BINDING, &old_read); glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fboID); glBindFramebuffer(GL_READ_FRAMEBUFFER, source.fboID); glBlitFramebuffer(r.x, r.y, r.z, r.w, r.x, r.y, r.z, r.w, GL_COLOR_BUFFER_BIT, GL_NEAREST); - glBindFramebuffer(GL_DRAW_FRAMEBUFFER, oldDFboID); - glBindFramebuffer(GL_READ_FRAMEBUFFER, oldRFboID); + glBindFramebuffer(GL_DRAW_FRAMEBUFFER, old_draw); + glBindFramebuffer(GL_READ_FRAMEBUFFER, old_read); }); } @@ -251,6 +255,21 @@ void RTT::clear(glm::vec4 color) glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); } +void RTT::clear_mask(glm::bool4 mask, glm::vec4 color) +{ + // save old state + std::array old_mask; + glGetBooleanv(GL_COLOR_WRITEMASK, std::data(old_mask)); + + // clear with mask + glColorMask(mask.r, mask.g, mask.b, mask.a); + glClearColor(color.r, color.g, color.b, color.a); + glClear(GL_COLOR_BUFFER_BIT); + + // restore old state + glColorMask(old_mask[0], old_mask[1], old_mask[2], old_mask[3]); +} + glm::ivec4 RTT::calc_bounds() { auto data = std::unique_ptr(reinterpret_cast(readTextureData())); diff --git a/src/rtt.h b/src/rtt.h index 80cfcc0..e17405f 100644 --- a/src/rtt.h +++ b/src/rtt.h @@ -27,6 +27,7 @@ public: bool create(int width, int height, int tex = -1, GLint internal_format = GL_RGBA8, 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(); uint8_t* readTextureData(uint8_t* buffer = nullptr); float* readTextureDataFloat(float* buffer = nullptr);