diff options
| author | vaxerski <vaxry@vaxry.net> | 2022-10-07 10:35:17 +0100 |
|---|---|---|
| committer | vaxerski <vaxry@vaxry.net> | 2022-10-07 10:43:51 +0100 |
| commit | 7faa3c367d22a44417a984d9cb50b3eb82258c63 (patch) | |
| tree | e526a1be2b274034e30125cac584bb4e373293d7 /src/render/OpenGL.cpp | |
| parent | fd379db8466985edb9ed43823f05372f8b81f058 (diff) | |
Added clipping support, clip windows on slide anim
Diffstat (limited to 'src/render/OpenGL.cpp')
| -rw-r--r-- | src/render/OpenGL.cpp | 104 |
1 files changed, 84 insertions, 20 deletions
diff --git a/src/render/OpenGL.cpp b/src/render/OpenGL.cpp index da146027..38672353 100644 --- a/src/render/OpenGL.cpp +++ b/src/render/OpenGL.cpp @@ -351,11 +351,27 @@ void CHyprOpenGLImpl::renderRectWithDamage(wlr_box* box, const CColor& col, pixm glEnableVertexAttribArray(m_RenderData.pCurrentMonData->m_shQUAD.posAttrib); glEnableVertexAttribArray(m_RenderData.pCurrentMonData->m_shQUAD.texAttrib); - if (pixman_region32_not_empty(damage)) { - PIXMAN_DAMAGE_FOREACH(damage) { - const auto RECT = RECTSARR[i]; - scissor(&RECT); - glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); + if (m_RenderData.clipBox.width != 0 && m_RenderData.clipBox.height != 0) { + pixman_region32_t damageClip; + pixman_region32_init(&damageClip); + pixman_region32_intersect_rect(&damageClip, damage, m_RenderData.clipBox.x, m_RenderData.clipBox.y, m_RenderData.clipBox.width, m_RenderData.clipBox.height); + + if (pixman_region32_not_empty(&damageClip)) { + PIXMAN_DAMAGE_FOREACH(&damageClip) { + const auto RECT = RECTSARR[i]; + scissor(&RECT); + glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); + } + } + + pixman_region32_fini(&damageClip); + } else { + if (pixman_region32_not_empty(damage)) { + PIXMAN_DAMAGE_FOREACH(damage) { + const auto RECT = RECTSARR[i]; + scissor(&RECT); + glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); + } } } @@ -467,11 +483,27 @@ void CHyprOpenGLImpl::renderTextureInternalWithDamage(const CTexture& tex, wlr_b glEnableVertexAttribArray(shader->posAttrib); glEnableVertexAttribArray(shader->texAttrib); - if (pixman_region32_not_empty(m_RenderData.pDamage)) { - PIXMAN_DAMAGE_FOREACH(m_RenderData.pDamage) { - const auto RECT = RECTSARR[i]; - scissor(&RECT); - glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); + if (m_RenderData.clipBox.width != 0 && m_RenderData.clipBox.height != 0) { + pixman_region32_t damageClip; + pixman_region32_init(&damageClip); + pixman_region32_intersect_rect(&damageClip, damage, m_RenderData.clipBox.x, m_RenderData.clipBox.y, m_RenderData.clipBox.width, m_RenderData.clipBox.height); + + if (pixman_region32_not_empty(&damageClip)) { + PIXMAN_DAMAGE_FOREACH(&damageClip) { + const auto RECT = RECTSARR[i]; + scissor(&RECT); + glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); + } + } + + pixman_region32_fini(&damageClip); + } else { + if (pixman_region32_not_empty(damage)) { + PIXMAN_DAMAGE_FOREACH(damage) { + const auto RECT = RECTSARR[i]; + scissor(&RECT); + glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); + } } } @@ -832,11 +864,27 @@ void CHyprOpenGLImpl::renderBorder(wlr_box* box, const CColor& col, int round) { glEnableVertexAttribArray(m_RenderData.pCurrentMonData->m_shBORDER1.posAttrib); glEnableVertexAttribArray(m_RenderData.pCurrentMonData->m_shBORDER1.texAttrib); - if (pixman_region32_not_empty(m_RenderData.pDamage)) { - PIXMAN_DAMAGE_FOREACH(m_RenderData.pDamage) { - const auto RECT = RECTSARR[i]; - scissor(&RECT); - glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); + if (m_RenderData.clipBox.width != 0 && m_RenderData.clipBox.height != 0) { + pixman_region32_t damageClip; + pixman_region32_init(&damageClip); + pixman_region32_intersect_rect(&damageClip, m_RenderData.pDamage, m_RenderData.clipBox.x, m_RenderData.clipBox.y, m_RenderData.clipBox.width, m_RenderData.clipBox.height); + + if (pixman_region32_not_empty(&damageClip)) { + PIXMAN_DAMAGE_FOREACH(&damageClip) { + const auto RECT = RECTSARR[i]; + scissor(&RECT); + glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); + } + } + + pixman_region32_fini(&damageClip); + } else { + if (pixman_region32_not_empty(m_RenderData.pDamage)) { + PIXMAN_DAMAGE_FOREACH(m_RenderData.pDamage) { + const auto RECT = RECTSARR[i]; + scissor(&RECT); + glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); + } } } @@ -1074,11 +1122,27 @@ void CHyprOpenGLImpl::renderRoundedShadow(wlr_box* box, int round, int range, fl glEnableVertexAttribArray(m_RenderData.pCurrentMonData->m_shSHADOW.posAttrib); glEnableVertexAttribArray(m_RenderData.pCurrentMonData->m_shSHADOW.texAttrib); - if (pixman_region32_not_empty(m_RenderData.pDamage)) { - PIXMAN_DAMAGE_FOREACH(m_RenderData.pDamage) { - const auto RECT = RECTSARR[i]; - scissor(&RECT); - glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); + if (m_RenderData.clipBox.width != 0 && m_RenderData.clipBox.height != 0) { + pixman_region32_t damageClip; + pixman_region32_init(&damageClip); + pixman_region32_intersect_rect(&damageClip, m_RenderData.pDamage, m_RenderData.clipBox.x, m_RenderData.clipBox.y, m_RenderData.clipBox.width, m_RenderData.clipBox.height); + + if (pixman_region32_not_empty(&damageClip)) { + PIXMAN_DAMAGE_FOREACH(&damageClip) { + const auto RECT = RECTSARR[i]; + scissor(&RECT); + glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); + } + } + + pixman_region32_fini(&damageClip); + } else { + if (pixman_region32_not_empty(m_RenderData.pDamage)) { + PIXMAN_DAMAGE_FOREACH(m_RenderData.pDamage) { + const auto RECT = RECTSARR[i]; + scissor(&RECT); + glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); + } } } |
