mirror of
https://github.com/hyprwm/Hyprland
synced 2024-11-26 14:05:58 +01:00
support all shaders rounded and fix RGBX borders
This commit is contained in:
parent
3385269dca
commit
dcb6fc269a
3 changed files with 88 additions and 8 deletions
|
@ -181,19 +181,17 @@ void CHyprOpenGLImpl::renderTexture(const CTexture& tex, float matrix[9], float
|
||||||
|
|
||||||
CShader* shader = nullptr;
|
CShader* shader = nullptr;
|
||||||
|
|
||||||
|
glEnable(GL_BLEND);
|
||||||
|
|
||||||
switch (tex.m_iType) {
|
switch (tex.m_iType) {
|
||||||
case TEXTURE_RGBA:
|
case TEXTURE_RGBA:
|
||||||
shader = &m_shRGBA;
|
shader = &m_shRGBA;
|
||||||
glEnable(GL_BLEND);
|
|
||||||
break;
|
break;
|
||||||
case TEXTURE_RGBX:
|
case TEXTURE_RGBX:
|
||||||
shader = &m_shRGBX;
|
shader = &m_shRGBX;
|
||||||
if (alpha == 255.f)
|
|
||||||
glDisable(GL_BLEND);
|
|
||||||
break;
|
break;
|
||||||
case TEXTURE_EXTERNAL:
|
case TEXTURE_EXTERNAL:
|
||||||
shader = &m_shEXT;
|
shader = &m_shEXT;
|
||||||
glEnable(GL_BLEND);
|
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
RASSERT(false, "tex.m_iTarget unsupported!");
|
RASSERT(false, "tex.m_iTarget unsupported!");
|
||||||
|
|
|
@ -82,10 +82,6 @@ void CHyprRenderer::renderWorkspaceWithFullscreenWindow(SMonitor* pMonitor, SWor
|
||||||
}
|
}
|
||||||
|
|
||||||
void CHyprRenderer::renderWindow(CWindow* pWindow, SMonitor* pMonitor, timespec* time, bool decorate) {
|
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;
|
const auto REALPOS = pWindow->m_vRealPosition;
|
||||||
SRenderData renderdata = {pMonitor->output, time, REALPOS.x, REALPOS.y};
|
SRenderData renderdata = {pMonitor->output, time, REALPOS.x, REALPOS.y};
|
||||||
renderdata.surface = g_pXWaylandManager->getWindowSurface(pWindow);
|
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);
|
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_bIsX11) {
|
||||||
if (pWindow->m_uSurface.xwayland->surface) {
|
if (pWindow->m_uSurface.xwayland->surface) {
|
||||||
wlr_surface_for_each_surface(pWindow->m_uSurface.xwayland->surface, renderSurface, &renderdata);
|
wlr_surface_for_each_surface(pWindow->m_uSurface.xwayland->surface, renderSurface, &renderdata);
|
||||||
|
|
|
@ -93,7 +93,48 @@ varying vec2 v_texcoord;
|
||||||
uniform sampler2D tex;
|
uniform sampler2D tex;
|
||||||
uniform float alpha;
|
uniform float alpha;
|
||||||
|
|
||||||
|
uniform vec2 topLeft;
|
||||||
|
uniform vec2 bottomRight;
|
||||||
|
uniform vec2 fullSize;
|
||||||
|
uniform float radius;
|
||||||
|
|
||||||
void main() {
|
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;
|
gl_FragColor = vec4(texture2D(tex, v_texcoord).rgb, 1.0) * alpha;
|
||||||
})#";
|
})#";
|
||||||
|
|
||||||
|
@ -105,6 +146,47 @@ varying vec2 v_texcoord;
|
||||||
uniform samplerExternalOES texture0;
|
uniform samplerExternalOES texture0;
|
||||||
uniform float alpha;
|
uniform float alpha;
|
||||||
|
|
||||||
|
uniform vec2 topLeft;
|
||||||
|
uniform vec2 bottomRight;
|
||||||
|
uniform vec2 fullSize;
|
||||||
|
uniform float radius;
|
||||||
|
|
||||||
void main() {
|
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;
|
gl_FragColor = texture2D(texture0, v_texcoord) * alpha;
|
||||||
})#";
|
})#";
|
Loading…
Reference in a new issue