diff options
| author | vaxerski <43317083+vaxerski@users.noreply.github.com> | 2022-03-17 20:22:29 +0100 |
|---|---|---|
| committer | vaxerski <43317083+vaxerski@users.noreply.github.com> | 2022-03-17 20:22:29 +0100 |
| commit | bc937e3e711e53774e2c9fa26d13125427f6378b (patch) | |
| tree | bf2c3bf70de21158d5d965ad186699a753290f8a /src/render/Renderer.cpp | |
| parent | ab7d727532cb409c980bb849507984d634611235 (diff) | |
Renderer
Diffstat (limited to 'src/render/Renderer.cpp')
| -rw-r--r-- | src/render/Renderer.cpp | 57 |
1 files changed, 57 insertions, 0 deletions
diff --git a/src/render/Renderer.cpp b/src/render/Renderer.cpp new file mode 100644 index 00000000..623b9c07 --- /dev/null +++ b/src/render/Renderer.cpp @@ -0,0 +1,57 @@ +#include "Renderer.hpp" +#include "../Compositor.hpp" + +void scaleBox(wlr_box* box, float scale) { + box->width = std::round((box->x + box->width) * scale) - std::round(box->x * scale); + box->height = std::round((box->y + box->height) * scale) - std::round(box->y * scale); + box->x = std::round(box->x * scale); + box->y = std::round(box->y * scale); +} + +void renderSurface(struct wlr_surface* surface, int x, int y, void* data) { + const auto TEXTURE = wlr_surface_get_texture(surface); + const auto RDATA = (SRenderData*)data; + + if (!TEXTURE) + return; + + double outputX = 0, outputY = 0; + wlr_output_layout_output_coords(g_pCompositor->m_sWLROutputLayout, RDATA->output, &outputX, &outputY); + + wlr_box windowBox = {outputX + RDATA->x + x, outputY + RDATA->y + y, surface->current.width, surface->current.height}; + scaleBox(&windowBox, RDATA->output->scale); + + const auto TRANSFORM = wlr_output_transform_invert(surface->current.transform); + float matrix[9]; + wlr_matrix_project_box(matrix, &windowBox, TRANSFORM, 0, RDATA->output->transform_matrix); + + wlr_render_texture_with_matrix(g_pCompositor->m_sWLRRenderer, TEXTURE, matrix, 1); // TODO: fadein/out + + wlr_surface_send_frame_done(surface, RDATA->when); + + wlr_presentation_surface_sampled_on_output(g_pCompositor->m_sWLRPresentation, surface, RDATA->output); +} + +void CHyprRenderer::renderAllClientsForMonitor(const int& ID, timespec* time) { + const auto PMONITOR = g_pCompositor->getMonitorFromID(ID); + + if (!PMONITOR) + return; + + for (auto& w : g_pCompositor->m_vWindows) { + + const wlr_box geom = { w.m_vPosition.x, w.m_vPosition.y, w.m_vSize.x, w.m_vSize.y }; + + if (!wlr_output_layout_intersects(g_pCompositor->m_sWLROutputLayout, PMONITOR->output, &geom)) + continue; + + // render the bad boy + + wlr_output_layout_output_coords(g_pCompositor->m_sWLROutputLayout, PMONITOR->output, &w.m_vPosition.x, &w.m_vPosition.y); + + SRenderData renderdata = {PMONITOR->output, time, w.m_vSize.x, w.m_vSize.y}; + + wlr_surface_for_each_surface(w.m_uSurface.xdg->surface, renderSurface, &renderdata); + wlr_xdg_surface_for_each_popup_surface(w.m_uSurface.xdg, renderSurface, &renderdata); + } +} |
