diff options
| author | vaxerski <43317083+vaxerski@users.noreply.github.com> | 2022-05-29 15:48:04 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-05-29 15:48:04 +0200 |
| commit | 15338fcf63a22ea45454606fcf580f2d2c4f50de (patch) | |
| tree | e7e8d4e410ce41f0c1af00372dc45d0fa5ea09d0 /src/render | |
| parent | 227cbb0464bbf211f9d5ec7f6fa8e1bba0aecd12 (diff) | |
| parent | 9842730f570b118275191fd2b3e8910648ab7b05 (diff) | |
Merge pull request #122 from vaxerski/transforms
Added monitor transforms
Diffstat (limited to 'src/render')
| -rw-r--r-- | src/render/OpenGL.cpp | 31 | ||||
| -rw-r--r-- | src/render/OpenGL.hpp | 1 | ||||
| -rw-r--r-- | src/render/Renderer.cpp | 11 |
3 files changed, 32 insertions, 11 deletions
diff --git a/src/render/OpenGL.cpp b/src/render/OpenGL.cpp index 78ffce14..118f902b 100644 --- a/src/render/OpenGL.cpp +++ b/src/render/OpenGL.cpp @@ -166,13 +166,17 @@ void CHyprOpenGLImpl::end() { // end the render, copy the data to the WLR framebuffer if (!m_bFakeFrame) { glBindFramebuffer(GL_FRAMEBUFFER, m_iWLROutputFb); - wlr_box monbox = {0, 0, m_RenderData.pMonitor->vecPixelSize.x, m_RenderData.pMonitor->vecPixelSize.y}; + wlr_box monbox = {0, 0, m_RenderData.pMonitor->vecTransformedSize.x, m_RenderData.pMonitor->vecTransformedSize.y}; pixman_region32_copy(m_RenderData.pDamage, &m_rOriginalDamageRegion); clear(CColor(11, 11, 11, 255)); + m_bEndFrame = true; + renderTexture(m_mMonitorRenderResources[m_RenderData.pMonitor].primaryFB.m_cTex, &monbox, 255.f, 0); + + m_bEndFrame = false; } // reset our data @@ -205,7 +209,15 @@ void CHyprOpenGLImpl::scissor(const wlr_box* pBox) { return; } - glScissor(pBox->x, pBox->y, pBox->width, pBox->height); + wlr_box newBox = *pBox; + + int w, h; + wlr_output_transformed_resolution(m_RenderData.pMonitor->output, &w, &h); + + const auto TR = wlr_output_transform_invert(m_RenderData.pMonitor->transform); + wlr_box_transform(&newBox, &newBox, TR, w, h); + + glScissor(newBox.x, newBox.y, newBox.width, newBox.height); glEnable(GL_SCISSOR_TEST); } @@ -217,8 +229,9 @@ void CHyprOpenGLImpl::scissor(const pixman_box32* pBox) { return; } - glScissor(pBox->x1, pBox->y1, pBox->x2 - pBox->x1, pBox->y2 - pBox->y1); - glEnable(GL_SCISSOR_TEST); + wlr_box newBox = {pBox->x1, pBox->y1, pBox->x2 - pBox->x1, pBox->y2 - pBox->y1}; + + scissor(&newBox); } void CHyprOpenGLImpl::scissor(const int x, const int y, const int w, const int h) { @@ -231,7 +244,7 @@ void CHyprOpenGLImpl::renderRect(wlr_box* box, const CColor& col, int round) { RASSERT(m_RenderData.pMonitor, "Tried to render rect without begin()!"); float matrix[9]; - wlr_matrix_project_box(matrix, box, WL_OUTPUT_TRANSFORM_NORMAL, 0, m_RenderData.pMonitor->output->transform_matrix); // TODO: write own, don't use WLR here + wlr_matrix_project_box(matrix, box, wlr_output_transform_invert(!m_bEndFrame ? WL_OUTPUT_TRANSFORM_NORMAL : m_RenderData.pMonitor->transform), 0, m_RenderData.pMonitor->output->transform_matrix); // TODO: write own, don't use WLR here float glMatrix[9]; wlr_matrix_multiply(glMatrix, m_RenderData.projection, matrix); @@ -296,7 +309,7 @@ void CHyprOpenGLImpl::renderTextureInternalWithDamage(const CTexture& tex, wlr_b RASSERT((tex.m_iTexID > 0), "Attempted to draw NULL texture!"); // get transform - const auto TRANSFORM = wlr_output_transform_invert(WL_OUTPUT_TRANSFORM_NORMAL); + const auto TRANSFORM = wlr_output_transform_invert(!m_bEndFrame ? WL_OUTPUT_TRANSFORM_NORMAL : m_RenderData.pMonitor->transform); float matrix[9]; wlr_matrix_project_box(matrix, pBox, TRANSFORM, 0, m_RenderData.pMonitor->output->transform_matrix); @@ -817,10 +830,10 @@ void CHyprOpenGLImpl::createBGTextureForMonitor(SMonitor* pMonitor) { // get the adequate tex std::string texPath = "/usr/share/hyprland/wall_"; Vector2D textureSize; - if (pMonitor->vecSize.x > 7000) { + if (pMonitor->vecTransformedSize.x > 7000) { textureSize = Vector2D(7680, 4320); texPath += "8K.png"; - } else if (pMonitor->vecSize.x > 3000) { + } else if (pMonitor->vecTransformedSize.x > 3000) { textureSize = Vector2D(3840, 2160); texPath += "4K.png"; } else { @@ -853,7 +866,7 @@ void CHyprOpenGLImpl::createBGTextureForMonitor(SMonitor* pMonitor) { void CHyprOpenGLImpl::clearWithTex() { RASSERT(m_RenderData.pMonitor, "Tried to render BGtex without begin()!"); - wlr_box box = {0, 0, m_RenderData.pMonitor->vecPixelSize.x, m_RenderData.pMonitor->vecPixelSize.y}; + wlr_box box = {0, 0, m_RenderData.pMonitor->vecTransformedSize.x, m_RenderData.pMonitor->vecTransformedSize.y}; renderTexture(m_mMonitorBGTextures[m_RenderData.pMonitor], &box, 255, 0); } diff --git a/src/render/OpenGL.hpp b/src/render/OpenGL.hpp index fa193057..34eef478 100644 --- a/src/render/OpenGL.hpp +++ b/src/render/OpenGL.hpp @@ -92,6 +92,7 @@ private: std::string m_szExtensions; bool m_bFakeFrame = false; + bool m_bEndFrame = false; // Shaders SQuad m_shQUAD; diff --git a/src/render/Renderer.cpp b/src/render/Renderer.cpp index 68282ae2..02824920 100644 --- a/src/render/Renderer.cpp +++ b/src/render/Renderer.cpp @@ -559,7 +559,7 @@ void CHyprRenderer::applyMonitorRule(SMonitor* pMonitor, SMonitorRule* pMonitorR Debug::log(LOG, "Applying monitor rule for %s", pMonitor->szName.c_str()); // Check if the rule isn't already applied - if (!force && DELTALESSTHAN(pMonitor->vecPixelSize.x, pMonitorRule->resolution.x, 1) && DELTALESSTHAN(pMonitor->vecPixelSize.y, pMonitorRule->resolution.y, 1) && DELTALESSTHAN(pMonitor->refreshRate, pMonitorRule->refreshRate, 1) && pMonitor->scale == pMonitorRule->scale && DELTALESSTHAN(pMonitor->vecPosition.x, pMonitorRule->offset.x, 1) && DELTALESSTHAN(pMonitor->vecPosition.y, pMonitorRule->offset.y, 1)) { + if (!force && DELTALESSTHAN(pMonitor->vecPixelSize.x, pMonitorRule->resolution.x, 1) && DELTALESSTHAN(pMonitor->vecPixelSize.y, pMonitorRule->resolution.y, 1) && DELTALESSTHAN(pMonitor->refreshRate, pMonitorRule->refreshRate, 1) && pMonitor->scale == pMonitorRule->scale && DELTALESSTHAN(pMonitor->vecPosition.x, pMonitorRule->offset.x, 1) && DELTALESSTHAN(pMonitor->vecPosition.y, pMonitorRule->offset.y, 1) && pMonitor->transform == pMonitorRule->transform) { Debug::log(LOG, "Not applying a new rule to %s because it's already applied!", pMonitor->szName.c_str()); return; } @@ -623,8 +623,10 @@ void CHyprRenderer::applyMonitorRule(SMonitor* pMonitor, SMonitorRule* pMonitorR pMonitor->vecSize = pMonitorRule->resolution; } + wlr_output_set_transform(pMonitor->output, pMonitorRule->transform); + pMonitor->transform = pMonitorRule->transform; + pMonitor->vecPixelSize = pMonitor->vecSize; - pMonitor->vecSize = (pMonitor->vecSize / pMonitor->scale).floor(); // update renderer g_pHyprOpenGL->destroyMonitorResources(pMonitor); @@ -634,6 +636,11 @@ void CHyprRenderer::applyMonitorRule(SMonitor* pMonitor, SMonitorRule* pMonitorR return; } + int x, y; + wlr_output_transformed_resolution(pMonitor->output, &x, &y); + pMonitor->vecSize = (Vector2D(x, y) / pMonitor->scale).floor(); + pMonitor->vecTransformedSize = Vector2D(x,y); + wlr_output_layout_add(g_pCompositor->m_sWLROutputLayout, pMonitor->output, (int)pMonitorRule->offset.x, (int)pMonitorRule->offset.y); //wlr_output_damage_add_whole(pMonitor->damage); |
