summaryrefslogtreecommitdiff
path: root/src/render
diff options
context:
space:
mode:
authorvaxerski <43317083+vaxerski@users.noreply.github.com>2022-04-05 15:50:47 +0200
committervaxerski <43317083+vaxerski@users.noreply.github.com>2022-04-05 15:50:47 +0200
commit27c06758e4e2fb9cc06233ec967bde62f447de0f (patch)
treea623a30e6b562146f5086e3262666f2e439457f8 /src/render
parent2313de589ecfb6664fea79c1e2f7aa991cf477cb (diff)
basic window rounded corners
Diffstat (limited to 'src/render')
-rw-r--r--src/render/OpenGL.cpp19
-rw-r--r--src/render/OpenGL.hpp4
-rw-r--r--src/render/Renderer.cpp6
-rw-r--r--src/render/Shaders.hpp45
4 files changed, 66 insertions, 8 deletions
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