summaryrefslogtreecommitdiff
path: root/src/render/OpenGL.cpp
diff options
context:
space:
mode:
authorvaxerski <vaxry@vaxry.net>2022-10-07 10:35:17 +0100
committervaxerski <vaxry@vaxry.net>2022-10-07 10:43:51 +0100
commit7faa3c367d22a44417a984d9cb50b3eb82258c63 (patch)
treee526a1be2b274034e30125cac584bb4e373293d7 /src/render/OpenGL.cpp
parentfd379db8466985edb9ed43823f05372f8b81f058 (diff)
Added clipping support, clip windows on slide anim
Diffstat (limited to 'src/render/OpenGL.cpp')
-rw-r--r--src/render/OpenGL.cpp104
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);
+ }
}
}