transformers: allow modifying renderdata pre-pass

This commit is contained in:
Vaxry 2023-10-21 19:25:44 +01:00
parent a61eb7694d
commit 95db9108e5
3 changed files with 18 additions and 2 deletions

View file

@ -412,9 +412,14 @@ void CHyprRenderer::renderWindow(CWindow* pWindow, CMonitor* pMonitor, timespec*
const bool TRANSFORMERSPRESENT = !pWindow->m_vTransformers.empty(); const bool TRANSFORMERSPRESENT = !pWindow->m_vTransformers.empty();
if (TRANSFORMERSPRESENT) if (TRANSFORMERSPRESENT) {
g_pHyprOpenGL->bindOffMain(); g_pHyprOpenGL->bindOffMain();
for (auto& t : pWindow->m_vTransformers) {
t->preWindowRender(&renderdata);
}
}
if (!pWindow->m_bIsFullscreen || PWORKSPACE->m_efFullscreenMode != FULLSCREEN_FULL) if (!pWindow->m_bIsFullscreen || PWORKSPACE->m_efFullscreenMode != FULLSCREEN_FULL)
for (auto& wd : pWindow->m_dWindowDecorations) for (auto& wd : pWindow->m_dWindowDecorations)
wd->draw(pMonitor, renderdata.alpha * renderdata.fadeAlpha, offset); wd->draw(pMonitor, renderdata.alpha * renderdata.fadeAlpha, offset);

View file

@ -1 +1,5 @@
#include "Transformer.hpp" #include "Transformer.hpp"
void IWindowTransformer::preWindowRender(SRenderData* pRenderData) {
;
}

View file

@ -2,12 +2,19 @@
#include "Framebuffer.hpp" #include "Framebuffer.hpp"
struct SRenderData;
// A window transformer can be attached to a window. // A window transformer can be attached to a window.
// If any is attached, Hyprland will render the window to a separate fb, then call the transform() func with it, // If any is attached, Hyprland will render the window to a separate fb, then call the transform() func with it,
// and finally render it back to the main fb after all transformers pass. // and finally render it back to the main fb after all transformers pass.
//
// Worth noting transformers for now only affect the main pass (not popups)
class IWindowTransformer { class IWindowTransformer {
public: public:
// called by Hyprland. For more data about what is being rendered, inspect render data. // called by Hyprland. For more data about what is being rendered, inspect render data.
// returns the out fb. // returns the out fb.
virtual CFramebuffer* transform(CFramebuffer* in) = 0; virtual CFramebuffer* transform(CFramebuffer* in) = 0;
// called by Hyprland before a window main pass is started.
virtual void preWindowRender(SRenderData* pRenderData);
}; };