forked from yayuuu/hyprland-scroll-overview
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathOverviewRender.cpp
More file actions
75 lines (60 loc) · 3.5 KB
/
Copy pathOverviewRender.cpp
File metadata and controls
75 lines (60 loc) · 3.5 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
#include "OverviewRender.hpp"
#include <chrono>
#include <cmath>
#include <sstream>
#define private public
#include <hyprland/src/render/Renderer.hpp>
#include <hyprland/src/render/OpenGL.hpp>
#include <hyprland/src/helpers/math/Math.hpp>
#undef private
namespace OverviewRender {
void flushPass(PHLMONITOR monitor) {
if (!monitor || g_pHyprRenderer->m_renderPass.empty())
return;
g_pHyprRenderer->m_renderPass.render(CRegion{CBox{{}, monitor->m_transformedSize}});
g_pHyprRenderer->m_renderPass.clear();
}
void renderBlur(PHLMONITOR monitor, const CBox& windowBox, int rounding, float roundingPower, float alpha, bool usePrecomputedBlur) {
if (!monitor || alpha <= 0.F)
return;
CRegion blurDamage{windowBox};
if (blurDamage.empty())
return;
CRegion drawDamage{CBox{{}, monitor->m_transformedSize}};
auto* const SAVEDFB = g_pHyprOpenGL->m_renderData.currentFB;
CFramebuffer* const BLURREDFB = usePrecomputedBlur && g_pHyprOpenGL->m_renderData.pCurrentMonData ? &g_pHyprOpenGL->m_renderData.pCurrentMonData->blurFB :
g_pHyprOpenGL->blurMainFramebufferWithDamage(alpha, &blurDamage);
if (SAVEDFB)
SAVEDFB->bind();
if (!BLURREDFB)
return;
const auto BLURREDTEXTURE = BLURREDFB->getTexture();
if (!BLURREDTEXTURE)
return;
CBox transformedBox = windowBox;
transformedBox.transform(Math::wlTransformToHyprutils(Math::invertTransform(monitor->m_transform)), monitor->m_transformedSize.x, monitor->m_transformedSize.y);
const CBox monitorSpaceBox = {transformedBox.pos().x / monitor->m_pixelSize.x * monitor->m_transformedSize.x,
transformedBox.pos().y / monitor->m_pixelSize.y * monitor->m_transformedSize.y,
transformedBox.width / monitor->m_pixelSize.x * monitor->m_transformedSize.x,
transformedBox.height / monitor->m_pixelSize.y * monitor->m_transformedSize.y};
CHyprOpenGLImpl::STextureRenderData renderData;
renderData.damage = &drawDamage;
renderData.a = alpha;
renderData.round = rounding;
renderData.roundingPower = roundingPower;
renderData.allowCustomUV = true;
renderData.allowDim = false;
g_pHyprOpenGL->pushMonitorTransformEnabled(true);
const auto SAVEDRENDERMODIF = g_pHyprOpenGL->m_renderData.renderModif;
const auto SAVEDUVTOPLEFT = g_pHyprOpenGL->m_renderData.primarySurfaceUVTopLeft;
const auto SAVEDUVBOTTOMRIGHT = g_pHyprOpenGL->m_renderData.primarySurfaceUVBottomRight;
g_pHyprOpenGL->m_renderData.renderModif = {};
g_pHyprOpenGL->m_renderData.primarySurfaceUVTopLeft = monitorSpaceBox.pos() / monitor->m_transformedSize;
g_pHyprOpenGL->m_renderData.primarySurfaceUVBottomRight = (monitorSpaceBox.pos() + monitorSpaceBox.size()) / monitor->m_transformedSize;
g_pHyprOpenGL->renderTexture(BLURREDTEXTURE, windowBox, renderData);
g_pHyprOpenGL->m_renderData.primarySurfaceUVTopLeft = SAVEDUVTOPLEFT;
g_pHyprOpenGL->m_renderData.primarySurfaceUVBottomRight = SAVEDUVBOTTOMRIGHT;
g_pHyprOpenGL->m_renderData.renderModif = SAVEDRENDERMODIF;
g_pHyprOpenGL->popMonitorTransformEnabled();
}
}