From dcb6fc269a1360f6d46836d34db4964779ce5879 Mon Sep 17 00:00:00 2001 From: vaxerski <43317083+vaxerski@users.noreply.github.com> Date: Tue, 5 Apr 2022 17:01:44 +0200 Subject: [PATCH] support all shaders rounded and fix RGBX borders --- src/render/OpenGL.cpp | 6 +-- src/render/Renderer.cpp | 8 ++-- src/render/Shaders.hpp | 82 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 88 insertions(+), 8 deletions(-) diff --git a/src/render/OpenGL.cpp b/src/render/OpenGL.cpp index 335e9f9a..1e5ec07d 100644 --- a/src/render/OpenGL.cpp +++ b/src/render/OpenGL.cpp @@ -181,19 +181,17 @@ void CHyprOpenGLImpl::renderTexture(const CTexture& tex, float matrix[9], float CShader* shader = nullptr; + glEnable(GL_BLEND); + switch (tex.m_iType) { case TEXTURE_RGBA: shader = &m_shRGBA; - glEnable(GL_BLEND); break; case TEXTURE_RGBX: shader = &m_shRGBX; - if (alpha == 255.f) - glDisable(GL_BLEND); break; case TEXTURE_EXTERNAL: shader = &m_shEXT; - glEnable(GL_BLEND); break; default: RASSERT(false, "tex.m_iTarget unsupported!"); diff --git a/src/render/Renderer.cpp b/src/render/Renderer.cpp index c3ec7994..8ba7a933 100644 --- a/src/render/Renderer.cpp +++ b/src/render/Renderer.cpp @@ -82,10 +82,6 @@ void CHyprRenderer::renderWorkspaceWithFullscreenWindow(SMonitor* pMonitor, SWor } void CHyprRenderer::renderWindow(CWindow* pWindow, SMonitor* pMonitor, timespec* time, bool decorate) { - // border - if (decorate && !pWindow->m_bX11DoesntWantBorders) - drawBorderForWindow(pWindow, pMonitor); - const auto REALPOS = pWindow->m_vRealPosition; SRenderData renderdata = {pMonitor->output, time, REALPOS.x, REALPOS.y}; renderdata.surface = g_pXWaylandManager->getWindowSurface(pWindow); @@ -94,6 +90,10 @@ void CHyprRenderer::renderWindow(CWindow* pWindow, SMonitor* pMonitor, timespec* wlr_surface_for_each_surface(g_pXWaylandManager->getWindowSurface(pWindow), renderSurface, &renderdata); + // border + if (decorate && !pWindow->m_bX11DoesntWantBorders) + drawBorderForWindow(pWindow, pMonitor); + if (pWindow->m_bIsX11) { if (pWindow->m_uSurface.xwayland->surface) { wlr_surface_for_each_surface(pWindow->m_uSurface.xwayland->surface, renderSurface, &renderdata); diff --git a/src/render/Shaders.hpp b/src/render/Shaders.hpp index 78892d5f..b8239c57 100644 --- a/src/render/Shaders.hpp +++ b/src/render/Shaders.hpp @@ -93,7 +93,48 @@ varying vec2 v_texcoord; uniform sampler2D tex; uniform float alpha; +uniform vec2 topLeft; +uniform vec2 bottomRight; +uniform vec2 fullSize; +uniform float radius; + void main() { + + vec2 pixCoord = fullSize * v_texcoord; + + if (pixCoord[0] < topLeft[0]) { + // we're close left + if (pixCoord[1] < topLeft[1]) { + // top + if (distance(topLeft, pixCoord) > radius) { + gl_FragColor = vec4(0,0,0,0); + return; + } + } else if (pixCoord[1] > bottomRight[1]) { + // bottom + if (distance(vec2(topLeft[0], bottomRight[1]), pixCoord) > radius) { + gl_FragColor = vec4(0,0,0,0); + return; + } + } + } + else if (pixCoord[0] > bottomRight[0]) { + // we're close right + if (pixCoord[1] < topLeft[1]) { + // top + if (distance(vec2(bottomRight[0], topLeft[1]), pixCoord) > radius) { + gl_FragColor = vec4(0,0,0,0); + return; + } + } else if (pixCoord[1] > bottomRight[1]) { + // bottom + if (distance(bottomRight, pixCoord) > radius) { + gl_FragColor = vec4(0,0,0,0); + return; + } + } + } + gl_FragColor = vec4(texture2D(tex, v_texcoord).rgb, 1.0) * alpha; })#"; @@ -105,6 +146,47 @@ varying vec2 v_texcoord; uniform samplerExternalOES texture0; uniform float alpha; +uniform vec2 topLeft; +uniform vec2 bottomRight; +uniform vec2 fullSize; +uniform float radius; + void main() { + + vec2 pixCoord = fullSize * v_texcoord; + + if (pixCoord[0] < topLeft[0]) { + // we're close left + if (pixCoord[1] < topLeft[1]) { + // top + if (distance(topLeft, pixCoord) > radius) { + gl_FragColor = vec4(0,0,0,0); + return; + } + } else if (pixCoord[1] > bottomRight[1]) { + // bottom + if (distance(vec2(topLeft[0], bottomRight[1]), pixCoord) > radius) { + gl_FragColor = vec4(0,0,0,0); + return; + } + } + } + else if (pixCoord[0] > bottomRight[0]) { + // we're close right + if (pixCoord[1] < topLeft[1]) { + // top + if (distance(vec2(bottomRight[0], topLeft[1]), pixCoord) > radius) { + gl_FragColor = vec4(0,0,0,0); + return; + } + } else if (pixCoord[1] > bottomRight[1]) { + // bottom + if (distance(bottomRight, pixCoord) > radius) { + gl_FragColor = vec4(0,0,0,0); + return; + } + } + } + gl_FragColor = texture2D(texture0, v_texcoord) * alpha; })#"; \ No newline at end of file