From 29b5bd78e4da3f99fe7323e5c10e3e1280dc615d Mon Sep 17 00:00:00 2001 From: Matias Date: Thu, 10 Jul 2025 23:57:30 +0200 Subject: [PATCH] feat: it does something to the windows! but it's wrong :) --- src/main.cpp | 111 +++++++++++++++++++++++++++++++++------------------ 1 file changed, 73 insertions(+), 38 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 1945181..1baabd9 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,16 +1,15 @@ -#include "src/helpers/math/Math.hpp" -#include -#define WLR_USE_UNSTABLE - #include "globals.hpp" +#include "src/helpers/math/Math.hpp" + +#include // version.hpp will be generated by meson +#include "src/render/Shader.hpp" #include "version.hpp" #include +#include #include #include -#include - #include // Do NOT change this function. @@ -18,25 +17,30 @@ APICALL EXPORT std::string PLUGIN_API_VERSION() { return HYPRLAND_API_VERSION; } -class CWindowTransformer : public IWindowTransformer { - public: +class CWindowTransformer: public IWindowTransformer { + public: virtual CFramebuffer* transform(CFramebuffer* in); virtual void preWindowRender(CSurfacePassElement::SRenderData* pRenderData); - private: + private: float rot = 0; + Vector2D m_prevPos; }; std::vector ptrs; -Vector2D oldPos, newPos; void renderTex(CBox monbox, CTexture& tex, float rot) { - if (g_pHyprOpenGL->m_renderData.damage.empty()) return; + if (g_pHyprOpenGL->m_renderData.damage.empty()) + return; CBox newBox = monbox.scale(g_pHyprOpenGL->m_renderData.renderModif.combinedScale()); g_pHyprOpenGL->m_renderData.renderModif.applyToBox(newBox); - Mat3x3 matrix = g_pHyprOpenGL->m_renderData.monitorProjection.projectBox(monbox, wlTransformToHyprutils(invertTransform(WL_OUTPUT_TRANSFORM_NORMAL)), monbox.rot); + Mat3x3 matrix = g_pHyprOpenGL->m_renderData.monitorProjection.projectBox( + monbox, + wlTransformToHyprutils(invertTransform(WL_OUTPUT_TRANSFORM_NORMAL)), + rot + ); Mat3x3 glMatrix = g_pHyprOpenGL->m_renderData.projection.copy().multiply(matrix); SShader* shader = &g_pHyprOpenGL->m_shaders->m_shPASSTHRURGBA; @@ -47,30 +51,49 @@ void renderTex(CBox monbox, CTexture& tex, float rot) { glUseProgram(shader->program); #ifndef GLES2 - glUniformMatrix3fv(shader->proj, 1, GL_TRUE, glMatrix.getMatrix().data()); + glUniformMatrix3fv( + shader->uniformLocations[SHADER_PROJ], + 1, + GL_TRUE, + glMatrix.getMatrix().data() + ); #else glMatrix.transpose(); glUniformMatrix3fv(shader->proj, 1, GL_FALSE, glMatrix.getMatrix().data()); #endif - glUniform1i(shader->tex, 0); + glUniform1i(shader->uniformLocations[SHADER_TEX], 0); const auto TOPLEFT = Vector2D(newBox.x, newBox.y); const auto FULLSIZE = Vector2D(newBox.width, newBox.height); - glUniform2f(shader->topLeft, TOPLEFT.x, TOPLEFT.y); - glUniform2f(shader->fullSize, FULLSIZE.x, FULLSIZE.y); - glUniform1f(shader->radius, 0); + glUniform2f(shader->uniformLocations[SHADER_TOP_LEFT], TOPLEFT.x, TOPLEFT.y); + glUniform2f(shader->uniformLocations[SHADER_FULL_SIZE], FULLSIZE.x, FULLSIZE.y); + glUniform1f(shader->uniformLocations[SHADER_RADIUS], 0); - glUniform1i(shader->discardOpaque, 0); - glUniform1i(shader->discardAlpha, 0); + glUniform1i(shader->uniformLocations[SHADER_DISCARD_OPAQUE], 0); + glUniform1i(shader->uniformLocations[SHADER_DISCARD_ALPHA], 0); - glUniform1f(shader->alpha, 1); + glUniform1f(shader->uniformLocations[SHADER_ALPHA], 1); - glVertexAttribPointer(shader->posAttrib, 2, GL_FLOAT, GL_FALSE, 0, fullVerts); - glVertexAttribPointer(shader->texAttrib, 2, GL_FLOAT, GL_FALSE, 0, fullVerts); + glVertexAttribPointer( + shader->uniformLocations[SHADER_POS_ATTRIB], + 2, + GL_FLOAT, + GL_FALSE, + 0, + fullVerts + ); + glVertexAttribPointer( + shader->uniformLocations[SHADER_TEX_ATTRIB], + 2, + GL_FLOAT, + GL_FALSE, + 0, + fullVerts + ); - glEnableVertexAttribArray(shader->posAttrib); - glEnableVertexAttribArray(shader->texAttrib); + glEnableVertexAttribArray(shader->uniformLocations[SHADER_POS_ATTRIB]); + glEnableVertexAttribArray(shader->uniformLocations[SHADER_TEX_ATTRIB]); for (auto& RECT : g_pHyprOpenGL->m_renderData.damage.getRects()) { g_pHyprOpenGL->scissor(&RECT); @@ -79,19 +102,26 @@ void renderTex(CBox monbox, CTexture& tex, float rot) { g_pHyprOpenGL->scissor(nullptr); - glDisableVertexAttribArray(shader->posAttrib); - glDisableVertexAttribArray(shader->texAttrib); + glDisableVertexAttribArray(shader->uniformLocations[SHADER_POS_ATTRIB]); + glDisableVertexAttribArray(shader->uniformLocations[SHADER_TEX_ATTRIB]); glBindTexture(tex.m_target, 0); } void CWindowTransformer::preWindowRender(CSurfacePassElement::SRenderData* pRenderData) { - oldPos = pRenderData->pos; + auto&& newPos = pRenderData->pos; - pRenderData->pos.x = pRenderData->pMonitor->m_size.x / 2.f - pRenderData->w / 2.f; - pRenderData->pos.y = pRenderData->pMonitor->m_size.y / 2.f - pRenderData->h / 2.f; + auto delta = newPos - m_prevPos; - newPos = {(double)pRenderData->pos.x, (double)pRenderData->pos.y}; + rot = delta.x * 9999; + rot = 30; + std::println("{}", rot); + + pRenderData->pos.x += 50; + pRenderData->rounding = 5; + pRenderData->alpha = 0.9; + + m_prevPos = newPos; } CFramebuffer* CWindowTransformer::transform(CFramebuffer* in) { @@ -103,10 +133,14 @@ CFramebuffer* CWindowTransformer::transform(CFramebuffer* in) { } off.bind(); - g_pHyprOpenGL->clear(CHyprColor{0,0,0,0}); + g_pHyprOpenGL->clear(CHyprColor {0, 0, 0, 0}); - CBox monbox = {oldPos.x - newPos.x, oldPos.y - newPos.y, g_pHyprOpenGL->m_renderData.pMonitor->m_transformedSize.x, - g_pHyprOpenGL->m_renderData.pMonitor->m_transformedSize.y}; + CBox monbox = { + m_prevPos.x, + m_prevPos.y, + g_pHyprOpenGL->m_renderData.pMonitor->m_transformedSize.x, + g_pHyprOpenGL->m_renderData.pMonitor->m_transformedSize.y + }; renderTex(monbox, *in->getTexture(), rot); @@ -118,11 +152,13 @@ CFramebuffer* CWindowTransformer::transform(CFramebuffer* in) { void onNewWindow(std::any data) { // data is guaranteed auto PWINDOW = std::any_cast(data); - ptrs.push_back(static_cast(PWINDOW->m_transformers.emplace_back(new CWindowTransformer{}).get())); - - HyprlandAPI::addNotification(PHANDLE, "onnewwindow", CHyprColor{0.f, 1.f, 1.f, 1.f}, 5000); + ptrs.push_back(static_cast( + PWINDOW->m_transformers.emplace_back(new CWindowTransformer {}).get() + )); + + HyprlandAPI::addNotification(PHANDLE, "onnewwindow", CHyprColor {0.f, 1.f, 1.f, 1.f}, 5000); std::println("onnewwindow"); - Debug::log(ERR,"Hit the function."); + Debug::log(ERR, "Hit the function."); } static SP g_p = nullptr; @@ -165,4 +201,3 @@ APICALL EXPORT PLUGIN_DESCRIPTION_INFO PLUGIN_INIT(HANDLE handle) { APICALL EXPORT void PLUGIN_EXIT() { g_p = nullptr; } -