summaryrefslogtreecommitdiff
path: root/src/render
diff options
context:
space:
mode:
authorvaxerski <43317083+vaxerski@users.noreply.github.com>2022-08-30 12:46:17 +0200
committervaxerski <43317083+vaxerski@users.noreply.github.com>2022-08-30 12:46:17 +0200
commit48eb2e0d6fd756ec181b722c526f13453fa9c123 (patch)
tree67158a41ff97f28909adaa37e71d34865c817ed4 /src/render
parent179562b646851c06ee79fa4a5e2e7386885cee0e (diff)
Added window dimming
Diffstat (limited to 'src/render')
-rw-r--r--src/render/OpenGL.cpp22
-rw-r--r--src/render/OpenGL.hpp2
-rw-r--r--src/render/Shader.hpp3
-rw-r--r--src/render/shaders/Textures.hpp33
4 files changed, 54 insertions, 6 deletions
diff --git a/src/render/OpenGL.cpp b/src/render/OpenGL.cpp
index 1f4b42e2..ec6e87e2 100644
--- a/src/render/OpenGL.cpp
+++ b/src/render/OpenGL.cpp
@@ -165,6 +165,8 @@ void CHyprOpenGLImpl::initShaders() {
m_RenderData.pCurrentMonData->m_shRGBA.fullSize = glGetUniformLocation(prog, "fullSize");
m_RenderData.pCurrentMonData->m_shRGBA.radius = glGetUniformLocation(prog, "radius");
m_RenderData.pCurrentMonData->m_shRGBA.primitiveMultisample = glGetUniformLocation(prog, "primitiveMultisample");
+ m_RenderData.pCurrentMonData->m_shRGBA.applyTint = glGetUniformLocation(prog, "applyTint");
+ m_RenderData.pCurrentMonData->m_shRGBA.tint = glGetUniformLocation(prog, "tint");
prog = createProgram(TEXVERTSRC, TEXFRAGSRCRGBX);
m_RenderData.pCurrentMonData->m_shRGBX.program = prog;
@@ -179,6 +181,8 @@ void CHyprOpenGLImpl::initShaders() {
m_RenderData.pCurrentMonData->m_shRGBX.fullSize = glGetUniformLocation(prog, "fullSize");
m_RenderData.pCurrentMonData->m_shRGBX.radius = glGetUniformLocation(prog, "radius");
m_RenderData.pCurrentMonData->m_shRGBX.primitiveMultisample = glGetUniformLocation(prog, "primitiveMultisample");
+ m_RenderData.pCurrentMonData->m_shRGBX.applyTint = glGetUniformLocation(prog, "applyTint");
+ m_RenderData.pCurrentMonData->m_shRGBX.tint = glGetUniformLocation(prog, "tint");
prog = createProgram(TEXVERTSRC, TEXFRAGSRCEXT);
m_RenderData.pCurrentMonData->m_shEXT.program = prog;
@@ -193,6 +197,8 @@ void CHyprOpenGLImpl::initShaders() {
m_RenderData.pCurrentMonData->m_shEXT.fullSize = glGetUniformLocation(prog, "fullSize");
m_RenderData.pCurrentMonData->m_shEXT.radius = glGetUniformLocation(prog, "radius");
m_RenderData.pCurrentMonData->m_shEXT.primitiveMultisample = glGetUniformLocation(prog, "primitiveMultisample");
+ m_RenderData.pCurrentMonData->m_shEXT.applyTint = glGetUniformLocation(prog, "applyTint");
+ m_RenderData.pCurrentMonData->m_shEXT.tint = glGetUniformLocation(prog, "tint");
prog = createProgram(TEXVERTSRC, FRAGBLUR1);
m_RenderData.pCurrentMonData->m_shBLUR1.program = prog;
@@ -367,15 +373,17 @@ void CHyprOpenGLImpl::renderTexture(wlr_texture* tex, wlr_box* pBox, float alpha
void CHyprOpenGLImpl::renderTexture(const CTexture& tex, wlr_box* pBox, float alpha, int round, bool discardopaque, bool allowCustomUV) {
RASSERT(m_RenderData.pMonitor, "Tried to render texture without begin()!");
- renderTextureInternalWithDamage(tex, pBox, alpha, m_RenderData.pDamage, round, discardopaque, false, allowCustomUV);
+ renderTextureInternalWithDamage(tex, pBox, alpha, m_RenderData.pDamage, round, discardopaque, false, allowCustomUV, true);
scissor((wlr_box*)nullptr);
}
-void CHyprOpenGLImpl::renderTextureInternalWithDamage(const CTexture& tex, wlr_box* pBox, float alpha, pixman_region32_t* damage, int round, bool discardOpaque, bool noAA, bool allowCustomUV) {
+void CHyprOpenGLImpl::renderTextureInternalWithDamage(const CTexture& tex, wlr_box* pBox, float alpha, pixman_region32_t* damage, int round, bool discardOpaque, bool noAA, bool allowCustomUV, bool allowDim) {
RASSERT(m_RenderData.pMonitor, "Tried to render texture without begin()!");
RASSERT((tex.m_iTexID > 0), "Attempted to draw NULL texture!");
+ static auto *const PDIMINACTIVE = &g_pConfigManager->getConfigValuePtr("decoration:dim_inactive")->intValue;
+
// get transform
const auto TRANSFORM = wlr_output_transform_invert(!m_bEndFrame ? WL_OUTPUT_TRANSFORM_NORMAL : m_RenderData.pMonitor->transform);
float matrix[9];
@@ -433,6 +441,14 @@ void CHyprOpenGLImpl::renderTextureInternalWithDamage(const CTexture& tex, wlr_b
glUniform1f(shader->radius, round);
glUniform1i(shader->primitiveMultisample, (int)(*PMULTISAMPLEEDGES == 1 && round != 0 && !noAA));
+ if (allowDim && m_pCurrentWindow && *PDIMINACTIVE && m_pCurrentWindow != g_pCompositor->m_pLastWindow) {
+ glUniform1i(shader->applyTint, 1);
+ const auto DIM = m_pCurrentWindow->m_fDimPercent.fl();
+ glUniform3f(shader->tint, 1.f - DIM, 1.f - DIM, 1.f - DIM);
+ } else {
+ glUniform1i(shader->applyTint, 0);
+ }
+
glVertexAttribPointer(shader->posAttrib, 2, GL_FLOAT, GL_FALSE, 0, fullVerts);
const float verts[] = {
@@ -727,7 +743,7 @@ void CHyprOpenGLImpl::renderTextureWithBlur(const CTexture& tex, wlr_box* pBox,
// draw window
glDisable(GL_STENCIL_TEST);
- renderTextureInternalWithDamage(tex, pBox, a, &damage, round, false, false, true);
+ renderTextureInternalWithDamage(tex, pBox, a, &damage, round, false, false, true, true);
}
glStencilMask(-1);
diff --git a/src/render/OpenGL.hpp b/src/render/OpenGL.hpp
index 6575cf82..6eaa638c 100644
--- a/src/render/OpenGL.hpp
+++ b/src/render/OpenGL.hpp
@@ -134,7 +134,7 @@ private:
// returns the out FB, can be either Mirror or MirrorSwap
CFramebuffer* blurMainFramebufferWithDamage(float a, wlr_box* pBox, pixman_region32_t* damage);
- void renderTextureInternalWithDamage(const CTexture&, wlr_box* pBox, float a, pixman_region32_t* damage, int round = 0, bool discardOpaque = false, bool noAA = false, bool allowCustomUV = false);
+ void renderTextureInternalWithDamage(const CTexture&, wlr_box* pBox, float a, pixman_region32_t* damage, int round = 0, bool discardOpaque = false, bool noAA = false, bool allowCustomUV = false, bool allowDim = false);
void renderSplash(cairo_t *const, cairo_surface_t *const);
diff --git a/src/render/Shader.hpp b/src/render/Shader.hpp
index fc06d68b..cf31ed9c 100644
--- a/src/render/Shader.hpp
+++ b/src/render/Shader.hpp
@@ -29,6 +29,9 @@ public:
GLint range;
GLint shadowPower;
+ GLint applyTint;
+ GLint tint;
+
GLint getUniformLocation(const std::string&);
private:
diff --git a/src/render/shaders/Textures.hpp b/src/render/shaders/Textures.hpp
index 13cdc92a..da02e51f 100644
--- a/src/render/shaders/Textures.hpp
+++ b/src/render/shaders/Textures.hpp
@@ -205,6 +205,9 @@ uniform float radius;
uniform int discardOpaque;
+uniform int applyTint;
+uniform vec3 tint;
+
uniform int primitiveMultisample;
uniform int ignoreCorners;
@@ -217,6 +220,12 @@ void main() {
return;
}
+ if (applyTint == 1) {
+ pixColor[0] = pixColor[0] * tint[0];
+ pixColor[1] = pixColor[1] * tint[1];
+ pixColor[2] = pixColor[2] * tint[2];
+ }
+
vec2 pixCoord = fullSize * v_texcoord;
)#" + ROUNDED_SHADER_FUNC("pixColor") +
@@ -238,6 +247,9 @@ uniform float radius;
uniform int discardOpaque;
+uniform int applyTint;
+uniform vec3 tint;
+
uniform int primitiveMultisample;
uniform int ignoreCorners;
@@ -249,10 +261,17 @@ void main() {
}
vec4 pixColor = vec4(texture2D(tex, v_texcoord).rgb, 1.0);
+
+ if (applyTint == 1) {
+ pixColor[0] = pixColor[0] * tint[0];
+ pixColor[1] = pixColor[1] * tint[1];
+ pixColor[2] = pixColor[2] * tint[2];
+ }
vec2 pixCoord = fullSize * v_texcoord;
- )#" + ROUNDED_SHADER_FUNC("pixColor") + R"#(
+ )#" + ROUNDED_SHADER_FUNC("pixColor") +
+ R"#(
gl_FragColor = pixColor * alpha;
})#";
@@ -319,6 +338,9 @@ uniform float radius;
uniform int discardOpaque;
+uniform int applyTint;
+uniform vec3 tint;
+
uniform int primitiveMultisample;
uniform int ignoreCorners;
@@ -331,9 +353,16 @@ void main() {
return;
}
+ if (applyTint == 1) {
+ pixColor[0] = pixColor[0] * tint[0];
+ pixColor[1] = pixColor[1] * tint[1];
+ pixColor[2] = pixColor[2] * tint[2];
+ }
+
vec2 pixCoord = fullSize * v_texcoord;
- )#" + ROUNDED_SHADER_FUNC("pixColor") + R"#(
+ )#" + ROUNDED_SHADER_FUNC("pixColor") +
+ R"#(
gl_FragColor = pixColor * alpha;
})#";