From 27c06758e4e2fb9cc06233ec967bde62f447de0f Mon Sep 17 00:00:00 2001 From: vaxerski <43317083+vaxerski@users.noreply.github.com> Date: Tue, 5 Apr 2022 15:50:47 +0200 Subject: [PATCH] basic window rounded corners --- src/config/ConfigManager.cpp | 2 ++ src/render/OpenGL.cpp | 19 ++++++++++++--- src/render/OpenGL.hpp | 4 ++-- src/render/Renderer.cpp | 6 ++++- src/render/Shaders.hpp | 45 ++++++++++++++++++++++++++++++++++-- 5 files changed, 68 insertions(+), 8 deletions(-) diff --git a/src/config/ConfigManager.cpp b/src/config/ConfigManager.cpp index 52b2ef90..e32709ba 100644 --- a/src/config/ConfigManager.cpp +++ b/src/config/ConfigManager.cpp @@ -22,6 +22,8 @@ CConfigManager::CConfigManager() { configValues["general:col.active_border"].intValue = 0xffffffff; configValues["general:col.inactive_border"].intValue = 0xff444444; + configValues["decoration:rounding"].intValue = 1; + configValues["dwindle:pseudotile"].intValue = 0; configValues["animations:enabled"].intValue = 1; diff --git a/src/render/OpenGL.cpp b/src/render/OpenGL.cpp index b86a69d7..330b2578 100644 --- a/src/render/OpenGL.cpp +++ b/src/render/OpenGL.cpp @@ -163,13 +163,13 @@ void CHyprOpenGLImpl::renderRect(wlr_box* box, const CColor& col) { glDisableVertexAttribArray(m_shQUAD.posAttrib); } -void CHyprOpenGLImpl::renderTexture(wlr_texture* tex,float matrix[9], float alpha) { +void CHyprOpenGLImpl::renderTexture(wlr_texture* tex,float matrix[9], float alpha, int round) { RASSERT(m_RenderData.pMonitor, "Tried to render texture without begin()!"); - renderTexture(CTexture(tex), matrix, alpha); + renderTexture(CTexture(tex), matrix, alpha, round); } -void CHyprOpenGLImpl::renderTexture(const CTexture& tex, float matrix[9], float alpha) { +void CHyprOpenGLImpl::renderTexture(const CTexture& tex, float matrix[9], float alpha, int round) { RASSERT(m_RenderData.pMonitor, "Tried to render texture without begin()!"); RASSERT((tex.m_iTexID > 0), "Attempted to draw NULL texture!"); @@ -210,6 +210,19 @@ void CHyprOpenGLImpl::renderTexture(const CTexture& tex, float matrix[9], float glUniform1i(shader->tex, 0); glUniform1f(shader->alpha, alpha / 255.f); + // round is in px + // so we need to do some maf + + const auto TOPLEFT = Vector2D(round, round); + const auto BOTTOMRIGHT = Vector2D(tex.m_vSize.x - round, tex.m_vSize.y - round); + const auto FULLSIZE = tex.m_vSize; + + // Rounded corners + glUniform2f(glGetUniformLocation(shader->program, "topLeft"), (float)TOPLEFT.x, (float)TOPLEFT.y); + glUniform2f(glGetUniformLocation(shader->program, "bottomRight"), (float)BOTTOMRIGHT.x, (float)BOTTOMRIGHT.y); + glUniform2f(glGetUniformLocation(shader->program, "fullSize"), (float)FULLSIZE.x, (float)FULLSIZE.y); + glUniform1f(glGetUniformLocation(shader->program, "radius"), round); + glVertexAttribPointer(shader->posAttrib, 2, GL_FLOAT, GL_FALSE, 0, fullVerts); glVertexAttribPointer(shader->texAttrib, 2, GL_FLOAT, GL_FALSE, 0, fullVerts); diff --git a/src/render/OpenGL.hpp b/src/render/OpenGL.hpp index c3e1b987..7aa74e6c 100644 --- a/src/render/OpenGL.hpp +++ b/src/render/OpenGL.hpp @@ -36,8 +36,8 @@ public: void end(); void renderRect(wlr_box*, const CColor&); - void renderTexture(wlr_texture*, float matrix[9], float a); - void renderTexture(const CTexture&, float matrix[9], float a); + void renderTexture(wlr_texture*, float matrix[9], float a, int round = 0); + void renderTexture(const CTexture&, float matrix[9], float a, int round = 0); void clear(const CColor&); void scissor(const wlr_box*); diff --git a/src/render/Renderer.cpp b/src/render/Renderer.cpp index 864a678e..f128b955 100644 --- a/src/render/Renderer.cpp +++ b/src/render/Renderer.cpp @@ -31,7 +31,7 @@ void renderSurface(struct wlr_surface* surface, int x, int y, void* data) { float matrix[9]; wlr_matrix_project_box(matrix, &windowBox, TRANSFORM, 0, RDATA->output->transform_matrix); - g_pHyprOpenGL->renderTexture(TEXTURE, matrix, 255.f); // TODO: fadeinout + g_pHyprOpenGL->renderTexture(TEXTURE, matrix, 255.f, g_pConfigManager->getInt("decoration:rounding")); // TODO: fadeinout wlr_surface_send_frame_done(surface, RDATA->when); @@ -395,6 +395,10 @@ void CHyprRenderer::arrangeLayersForMonitor(const int& monitor) { void CHyprRenderer::drawBorderForWindow(CWindow* pWindow, SMonitor* pMonitor) { const auto BORDERSIZE = g_pConfigManager->getInt("general:border_size"); + + if (BORDERSIZE < 1) + return; + const auto BORDERCOL = pWindow->m_cRealBorderColor; Vector2D correctPos = pWindow->m_vRealPosition - pMonitor->vecPosition; diff --git a/src/render/Shaders.hpp b/src/render/Shaders.hpp index a9140aca..78892d5f 100644 --- a/src/render/Shaders.hpp +++ b/src/render/Shaders.hpp @@ -38,11 +38,52 @@ void main() { inline const std::string TEXFRAGSRCRGBA = R"#( precision mediump float; -varying vec2 v_texcoord; +varying vec2 v_texcoord; // is in 0-1 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 = texture2D(tex, v_texcoord) * alpha; })#"; @@ -66,4 +107,4 @@ uniform float alpha; void main() { gl_FragColor = texture2D(texture0, v_texcoord) * alpha; -})#"; +})#"; \ No newline at end of file