From d1638a09bacd84b994de3f77746b74f427b9d41e Mon Sep 17 00:00:00 2001 From: Vaxry Date: Tue, 5 Nov 2024 15:44:40 +0000 Subject: [PATCH] shadow: add sharp and refactor options options moved to decoration:shadow: --- src/Compositor.cpp | 11 +++--- src/config/ConfigDescriptions.hpp | 24 ++++++++----- src/config/ConfigManager.cpp | 17 +++++----- src/managers/AnimationManager.cpp | 2 +- src/render/OpenGL.cpp | 6 ++-- .../decorations/CHyprDropShadowDecoration.cpp | 34 +++++++++++++------ .../decorations/CHyprDropShadowDecoration.hpp | 2 ++ 7 files changed, 58 insertions(+), 38 deletions(-) diff --git a/src/Compositor.cpp b/src/Compositor.cpp index 62612398..495a2d85 100644 --- a/src/Compositor.cpp +++ b/src/Compositor.cpp @@ -1893,8 +1893,8 @@ void CCompositor::updateWindowAnimatedDecorationValues(PHLWINDOW pWindow) { static auto PINACTIVEALPHA = CConfigValue("decoration:inactive_opacity"); static auto PACTIVEALPHA = CConfigValue("decoration:active_opacity"); static auto PFULLSCREENALPHA = CConfigValue("decoration:fullscreen_opacity"); - static auto PSHADOWCOL = CConfigValue("decoration:col.shadow"); - static auto PSHADOWCOLINACTIVE = CConfigValue("decoration:col.shadow_inactive"); + static auto PSHADOWCOL = CConfigValue("decoration:shadow:color"); + static auto PSHADOWCOLINACTIVE = CConfigValue("decoration:shadow:color_inactive"); static auto PDIMSTRENGTH = CConfigValue("decoration:dim_strength"); static auto PDIMENABLED = CConfigValue("decoration:dim_inactive"); @@ -1965,11 +1965,10 @@ void CCompositor::updateWindowAnimatedDecorationValues(PHLWINDOW pWindow) { // shadow if (!pWindow->isX11OverrideRedirect() && !pWindow->m_bX11DoesntWantBorders) { - if (pWindow == m_pLastWindow) { + if (pWindow == m_pLastWindow) pWindow->m_cRealShadowColor = CColor(*PSHADOWCOL); - } else { - pWindow->m_cRealShadowColor = CColor(*PSHADOWCOLINACTIVE != INT_MAX ? *PSHADOWCOLINACTIVE : *PSHADOWCOL); - } + else + pWindow->m_cRealShadowColor = CColor(*PSHADOWCOLINACTIVE != INT64_MAX ? *PSHADOWCOLINACTIVE : *PSHADOWCOL); } else { pWindow->m_cRealShadowColor.setValueAndWarp(CColor(0, 0, 0, 0)); // no shadow } diff --git a/src/config/ConfigDescriptions.hpp b/src/config/ConfigDescriptions.hpp index 07034e71..5327c599 100644 --- a/src/config/ConfigDescriptions.hpp +++ b/src/config/ConfigDescriptions.hpp @@ -158,49 +158,55 @@ inline static const std::vector CONFIG_OPTIONS = { .data = SConfigOptionDescription::SFloatData{1, 0, 1}, }, SConfigOptionDescription{ - .value = "decoration:drop_shadow", + .value = "decoration:shadow:enabled", .description = "enable drop shadows on windows", .type = CONFIG_OPTION_BOOL, .data = SConfigOptionDescription::SBoolData{true}, }, SConfigOptionDescription{ - .value = "decoration:shadow_range", + .value = "decoration:shadow:range", .description = "Shadow range (size) in layout px", .type = CONFIG_OPTION_INT, .data = SConfigOptionDescription::SRangeData{4, 0, 100}, }, SConfigOptionDescription{ - .value = "decoration:shadow_render_power", + .value = "decoration:shadow:render_power", .description = "in what power to render the falloff (more power, the faster the falloff) [1 - 4]", .type = CONFIG_OPTION_INT, .data = SConfigOptionDescription::SRangeData{3, 1, 4}, }, SConfigOptionDescription{ - .value = "decoration:shadow_ignore_window", + .value = "decoration:shadow:sharp", + .description = "whether the shadow should be sharp or not. Akin to an infinitely high render power.", + .type = CONFIG_OPTION_BOOL, + .data = SConfigOptionDescription::SBoolData{false}, + }, + SConfigOptionDescription{ + .value = "decoration:shadow:ignore_window", .description = "if true, the shadow will not be rendered behind the window itself, only around it.", .type = CONFIG_OPTION_BOOL, .data = SConfigOptionDescription::SBoolData{true}, }, SConfigOptionDescription{ - .value = "decoration:col.shadow", + .value = "decoration:shadow:color", .description = "shadow's color. Alpha dictates shadow's opacity.", .type = CONFIG_OPTION_COLOR, .data = SConfigOptionDescription::SColorData{0xee1a1a1a}, }, SConfigOptionDescription{ - .value = "decoration:col.shadow_inactive", + .value = "decoration:shadow:color_inactive", .description = "inactive shadow color. (if not set, will fall back to col.shadow)", .type = CONFIG_OPTION_COLOR, - .data = SConfigOptionDescription::SColorData{}, //##TODO UNSET? + .data = SConfigOptionDescription::SColorData{}, //TODO: UNSET? }, SConfigOptionDescription{ - .value = "decoration:shadow_offset", + .value = "decoration:shadow:offset", .description = "shadow's rendering offset.", .type = CONFIG_OPTION_VECTOR, .data = SConfigOptionDescription::SVectorData{{}, {-250, -250}, {250, 250}}, }, SConfigOptionDescription{ - .value = "decoration:shadow_scale", + .value = "decoration:shadow:scale", .description = "shadow's scale. [0.0 - 1.0]", .type = CONFIG_OPTION_FLOAT, .data = SConfigOptionDescription::SFloatData{1, 0, 1}, diff --git a/src/config/ConfigManager.cpp b/src/config/ConfigManager.cpp index c5d53e6a..eafe4cbb 100644 --- a/src/config/ConfigManager.cpp +++ b/src/config/ConfigManager.cpp @@ -431,14 +431,15 @@ CConfigManager::CConfigManager() { m_pConfig->addConfigValue("decoration:inactive_opacity", {1.F}); m_pConfig->addConfigValue("decoration:fullscreen_opacity", {1.F}); m_pConfig->addConfigValue("decoration:no_blur_on_oversized", Hyprlang::INT{0}); - m_pConfig->addConfigValue("decoration:drop_shadow", Hyprlang::INT{1}); - m_pConfig->addConfigValue("decoration:shadow_range", Hyprlang::INT{4}); - m_pConfig->addConfigValue("decoration:shadow_render_power", Hyprlang::INT{3}); - m_pConfig->addConfigValue("decoration:shadow_ignore_window", Hyprlang::INT{1}); - m_pConfig->addConfigValue("decoration:shadow_offset", Hyprlang::VEC2{0, 0}); - m_pConfig->addConfigValue("decoration:shadow_scale", {1.f}); - m_pConfig->addConfigValue("decoration:col.shadow", Hyprlang::INT{0xee1a1a1a}); - m_pConfig->addConfigValue("decoration:col.shadow_inactive", {(Hyprlang::INT)INT_MAX}); + m_pConfig->addConfigValue("decoration:shadow:enabled", Hyprlang::INT{1}); + m_pConfig->addConfigValue("decoration:shadow:range", Hyprlang::INT{4}); + m_pConfig->addConfigValue("decoration:shadow:render_power", Hyprlang::INT{3}); + m_pConfig->addConfigValue("decoration:shadow:ignore_window", Hyprlang::INT{1}); + m_pConfig->addConfigValue("decoration:shadow:offset", Hyprlang::VEC2{0, 0}); + m_pConfig->addConfigValue("decoration:shadow:scale", {1.f}); + m_pConfig->addConfigValue("decoration:shadow:sharp", Hyprlang::INT{0}); + m_pConfig->addConfigValue("decoration:shadow:color", Hyprlang::INT{0xee1a1a1a}); + m_pConfig->addConfigValue("decoration:shadow:color_inactive", {(Hyprlang::INT)INT64_MAX}); m_pConfig->addConfigValue("decoration:dim_inactive", Hyprlang::INT{0}); m_pConfig->addConfigValue("decoration:dim_strength", {0.5f}); m_pConfig->addConfigValue("decoration:dim_special", {0.2f}); diff --git a/src/managers/AnimationManager.cpp b/src/managers/AnimationManager.cpp index 0bdf5a7a..ceb594aa 100644 --- a/src/managers/AnimationManager.cpp +++ b/src/managers/AnimationManager.cpp @@ -64,7 +64,7 @@ void CAnimationManager::tick() { if (!*PANIMENABLED) animGlobalDisabled = true; - static auto* const PSHADOWSENABLED = (Hyprlang::INT* const*)g_pConfigManager->getConfigValuePtr("decoration:drop_shadow"); + static auto* const PSHADOWSENABLED = (Hyprlang::INT* const*)g_pConfigManager->getConfigValuePtr("decoration:shadow:enabled"); const auto DEFAULTBEZIER = m_mBezierCurves.find("default"); diff --git a/src/render/OpenGL.cpp b/src/render/OpenGL.cpp index 45837509..52392436 100644 --- a/src/render/OpenGL.cpp +++ b/src/render/OpenGL.cpp @@ -2465,7 +2465,7 @@ void CHyprOpenGLImpl::renderRoundedShadow(CBox* box, int round, int range, const box = &newBox; - static auto PSHADOWPOWER = CConfigValue("decoration:shadow_render_power"); + static auto PSHADOWPOWER = CConfigValue("decoration:shadow:render_power"); const auto SHADOWPOWER = std::clamp((int)*PSHADOWPOWER, 1, 4); @@ -2475,7 +2475,7 @@ void CHyprOpenGLImpl::renderRoundedShadow(CBox* box, int round, int range, const newBox, wlTransformToHyprutils(invertTransform(!m_bEndFrame ? WL_OUTPUT_TRANSFORM_NORMAL : m_RenderData.pMonitor->transform)), newBox.rot); Mat3x3 glMatrix = m_RenderData.projection.copy().multiply(matrix); - glEnable(GL_BLEND); + blend(true); glUseProgram(m_RenderData.pCurrentMonData->m_shSHADOW.program); @@ -2485,7 +2485,7 @@ void CHyprOpenGLImpl::renderRoundedShadow(CBox* box, int round, int range, const glMatrix.transpose(); glUniformMatrix3fv(m_RenderData.pCurrentMonData->m_shSHADOW.proj, 1, GL_FALSE, glMatrix.getMatrix().data()); #endif - glUniform4f(m_RenderData.pCurrentMonData->m_shSHADOW.color, col.r, col.g, col.b, col.a * a); + glUniform4f(m_RenderData.pCurrentMonData->m_shSHADOW.color, col.r * col.a * a, col.g * col.a * a, col.b * col.a * a, col.a * a); const auto TOPLEFT = Vector2D(range + round, range + round); const auto BOTTOMRIGHT = Vector2D(box->width - (range + round), box->height - (range + round)); diff --git a/src/render/decorations/CHyprDropShadowDecoration.cpp b/src/render/decorations/CHyprDropShadowDecoration.cpp index f146776f..893ad498 100644 --- a/src/render/decorations/CHyprDropShadowDecoration.cpp +++ b/src/render/decorations/CHyprDropShadowDecoration.cpp @@ -36,7 +36,7 @@ std::string CHyprDropShadowDecoration::getDisplayName() { } void CHyprDropShadowDecoration::damageEntire() { - static auto PSHADOWS = CConfigValue("decoration:drop_shadow"); + static auto PSHADOWS = CConfigValue("decoration:shadow:enabled"); if (*PSHADOWS != 1) return; // disabled @@ -52,7 +52,7 @@ void CHyprDropShadowDecoration::damageEntire() { shadowBox.translate(PWORKSPACE->m_vRenderOffset.value()); shadowBox.translate(PWINDOW->m_vFloatingOffset); - static auto PSHADOWIGNOREWINDOW = CConfigValue("decoration:shadow_ignore_window"); + static auto PSHADOWIGNOREWINDOW = CConfigValue("decoration:shadow:ignore_window"); const auto ROUNDING = PWINDOW->rounding(); const auto ROUNDINGSIZE = ROUNDING - M_SQRT1_2 * ROUNDING + 1; @@ -102,11 +102,11 @@ void CHyprDropShadowDecoration::draw(PHLMONITOR pMonitor, float const& a) { if (PWINDOW->m_sWindowData.noShadow.valueOrDefault()) return; - static auto PSHADOWS = CConfigValue("decoration:drop_shadow"); - static auto PSHADOWSIZE = CConfigValue("decoration:shadow_range"); - static auto PSHADOWIGNOREWINDOW = CConfigValue("decoration:shadow_ignore_window"); - static auto PSHADOWSCALE = CConfigValue("decoration:shadow_scale"); - static auto PSHADOWOFFSET = CConfigValue("decoration:shadow_offset"); + static auto PSHADOWS = CConfigValue("decoration:shadow:enabled"); + static auto PSHADOWSIZE = CConfigValue("decoration:shadow:range"); + static auto PSHADOWIGNOREWINDOW = CConfigValue("decoration:shadow:ignore_window"); + static auto PSHADOWSCALE = CConfigValue("decoration:shadow:scale"); + static auto PSHADOWOFFSET = CConfigValue("decoration:shadow:offset"); if (*PSHADOWS != 1) return; // disabled @@ -184,7 +184,7 @@ void CHyprDropShadowDecoration::draw(PHLMONITOR pMonitor, float const& a) { g_pHyprOpenGL->renderRect(&fullBox, CColor(0, 0, 0, 1), 0); // render white shadow with the alpha of the shadow color (otherwise we clear with alpha later and shit it to 2 bit) - g_pHyprOpenGL->renderRoundedShadow(&fullBox, ROUNDING * pMonitor->scale, *PSHADOWSIZE * pMonitor->scale, CColor(1, 1, 1, PWINDOW->m_cRealShadowColor.value().a), a); + drawShadowInternal(&fullBox, ROUNDING * pMonitor->scale, *PSHADOWSIZE * pMonitor->scale, CColor(1, 1, 1, PWINDOW->m_cRealShadowColor.value().a), a); // render black window box ("clip") g_pHyprOpenGL->renderRect(&windowBox, CColor(0, 0, 0, 1.0), (ROUNDING + 1 /* This fixes small pixel gaps. */) * pMonitor->scale); @@ -204,9 +204,8 @@ void CHyprDropShadowDecoration::draw(PHLMONITOR pMonitor, float const& a) { g_pHyprOpenGL->setMonitorTransformEnabled(false); g_pHyprOpenGL->m_RenderData.damage = saveDamage; - } else { - g_pHyprOpenGL->renderRoundedShadow(&fullBox, ROUNDING * pMonitor->scale, *PSHADOWSIZE * pMonitor->scale, PWINDOW->m_cRealShadowColor.value(), a); - } + } else + drawShadowInternal(&fullBox, ROUNDING * pMonitor->scale, *PSHADOWSIZE * pMonitor->scale, PWINDOW->m_cRealShadowColor.value(), a); if (m_seExtents != m_seReportedExtents) g_pDecorationPositioner->repositionDeco(this); @@ -215,3 +214,16 @@ void CHyprDropShadowDecoration::draw(PHLMONITOR pMonitor, float const& a) { eDecorationLayer CHyprDropShadowDecoration::getDecorationLayer() { return DECORATION_LAYER_BOTTOM; } + +void CHyprDropShadowDecoration::drawShadowInternal(CBox* box, int round, int range, CColor color, float a) { + static auto PSHADOWSHARP = CConfigValue("decoration:shadow:sharp"); + + g_pHyprOpenGL->blend(true); + + color.a *= a; + + if (*PSHADOWSHARP) + g_pHyprOpenGL->renderRect(box, color, round); + else + g_pHyprOpenGL->renderRoundedShadow(box, round, range, color, 1.F); +} diff --git a/src/render/decorations/CHyprDropShadowDecoration.hpp b/src/render/decorations/CHyprDropShadowDecoration.hpp index 8335cde9..933ee0ef 100644 --- a/src/render/decorations/CHyprDropShadowDecoration.hpp +++ b/src/render/decorations/CHyprDropShadowDecoration.hpp @@ -34,6 +34,8 @@ class CHyprDropShadowDecoration : public IHyprWindowDecoration { Vector2D m_vLastWindowPos; Vector2D m_vLastWindowSize; + void drawShadowInternal(CBox* box, int round, int range, CColor color, float a); + CBox m_bLastWindowBox = {0}; CBox m_bLastWindowBoxWithDecos = {0}; };