From e22c5db68a96d7219e9ba1d7e21771f18b0d72b6 Mon Sep 17 00:00:00 2001 From: Matias Date: Thu, 17 Jul 2025 15:35:23 +0200 Subject: [PATCH] chore: use own shader, commit missing getBox fn --- include/renderpasses.h | 6 +++--- include/wobblywindow.h | 1 + src/renderpasses.cpp | 44 ++++++++++++++++++++++++++++-------------- src/wobblywindow.cpp | 38 +++++++++++++++++++++++++++++++++--- 4 files changed, 69 insertions(+), 20 deletions(-) diff --git a/include/renderpasses.h b/include/renderpasses.h index e2ac0d2..0e5a5b6 100644 --- a/include/renderpasses.h +++ b/include/renderpasses.h @@ -2,10 +2,11 @@ #define WW_RENDERPASSES_H #include +#include #include +#include class CFramebuffer; -class SShader; class CBindOwnFramebufferPassElement final: public IPassElement { public: @@ -39,7 +40,6 @@ class CBindOwnFramebufferPassElement final: public IPassElement { }; class CRenderWobblyWindowPassElement final: public IPassElement { - static inline SShader* s_shader {}; static inline constexpr unsigned int s_SUBDIVS = 8; static_assert(s_SUBDIVS > 0); @@ -79,7 +79,7 @@ class CRenderWobblyWindowPassElement final: public IPassElement { CFramebuffer* m_pOldFramebuffer; PHLWINDOWREF m_pWindow; - static inline SShader* s_pShader = nullptr; + static inline SShader s_shader; }; #endif diff --git a/include/wobblywindow.h b/include/wobblywindow.h index 702d3f6..8176996 100644 --- a/include/wobblywindow.h +++ b/include/wobblywindow.h @@ -27,6 +27,7 @@ class CWobblyWindow { CWobblyWindow(); bool step(Time::steady_tp time); + CBox getBox() const; void applyMovement(const Vector2D& movement); }; diff --git a/src/renderpasses.cpp b/src/renderpasses.cpp index bb3f03a..79f95fc 100644 --- a/src/renderpasses.cpp +++ b/src/renderpasses.cpp @@ -6,17 +6,37 @@ #include #include #include +#include void CBindOwnFramebufferPassElement::draw(const CRegion& damage) { + g_pHyprOpenGL->scissor(nullptr); + m_pFramebuffer->bind(); g_pHyprOpenGL->m_renderData.currentFB = m_pFramebuffer; GLCALL(glClearColor(0, 0, 0, 0)); - GLCALL(glClear(GL_COLOR_BUFFER_BIT)); + GLCALL(glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)); } void CRenderWobblyWindowPassElement::initGPUObjects() { - s_pShader = &g_pHyprOpenGL->m_shaders->m_shRGBA; + constexpr const char* FRAGSRC = R"glsl(#version 300 es + +precision highp float; +in vec2 v_texcoord; // is in 0-1 +uniform sampler2D tex; + +layout(location = 0) out vec4 fragColor; +void main() { + fragColor = texture(tex, v_texcoord); +} +)glsl"; + + s_shader.program = g_pHyprOpenGL->createProgram(g_pHyprOpenGL->m_shaders->TEXVERTSRC, FRAGSRC); + s_shader.uniformLocations[SHADER_PROJ] = glGetUniformLocation(s_shader.program, "proj"); + s_shader.uniformLocations[SHADER_TEX] = glGetUniformLocation(s_shader.program, "tex"); + s_shader.uniformLocations[SHADER_TEX_ATTRIB] = + glGetAttribLocation(s_shader.program, "texcoord"); + s_shader.uniformLocations[SHADER_POS_ATTRIB] = glGetAttribLocation(s_shader.program, "pos"); const unsigned int vertsPerRow = s_SUBDIVS + 1; s_baseVerts.reserve(vertsPerRow * vertsPerRow * 2); @@ -68,9 +88,9 @@ void CRenderWobblyWindowPassElement::initGPUObjects() { GL_DYNAMIC_DRAW )); - GLCALL(glEnableVertexAttribArray(s_pShader->uniformLocations[SHADER_POS_ATTRIB])); + GLCALL(glEnableVertexAttribArray(s_shader.uniformLocations[SHADER_POS_ATTRIB])); GLCALL(glVertexAttribPointer( - s_pShader->uniformLocations[SHADER_POS_ATTRIB], + s_shader.uniformLocations[SHADER_POS_ATTRIB], 2, GL_FLOAT, GL_FALSE, @@ -87,9 +107,9 @@ void CRenderWobblyWindowPassElement::initGPUObjects() { s_baseVerts.data(), GL_DYNAMIC_DRAW )); // Initial dummy UVs - GLCALL(glEnableVertexAttribArray(s_pShader->uniformLocations[SHADER_TEX_ATTRIB])); + GLCALL(glEnableVertexAttribArray(s_shader.uniformLocations[SHADER_TEX_ATTRIB])); GLCALL(glVertexAttribPointer( - s_pShader->uniformLocations[SHADER_TEX_ATTRIB], + s_shader.uniformLocations[SHADER_TEX_ATTRIB], 2, GL_FLOAT, GL_FALSE, @@ -110,6 +130,7 @@ void CRenderWobblyWindowPassElement::deinitGPUObjects() { } void CRenderWobblyWindowPassElement::draw(const CRegion& damage) { + g_pHyprOpenGL->scissor(nullptr); auto* const pWindowFB = g_pHyprOpenGL->m_renderData.currentFB; m_pOldFramebuffer->bind(); @@ -131,12 +152,11 @@ void CRenderWobblyWindowPassElement::draw(const CRegion& damage) { GLCALL(glActiveTexture(GL_TEXTURE0)); pWindowFB->getTexture()->bind(); - g_pHyprOpenGL->useProgram(s_pShader->program); - s_pShader->setUniformMatrix3fv(SHADER_PROJ, 1, GL_TRUE, glMatrix.getMatrix()); - s_pShader->setUniformInt(SHADER_TEX, 0); + g_pHyprOpenGL->useProgram(s_shader.program); + s_shader.setUniformMatrix3fv(SHADER_PROJ, 1, GL_TRUE, glMatrix.getMatrix()); + s_shader.setUniformInt(SHADER_TEX, 0); GLCALL(glBindVertexArray(s_VAO)); - GLCALL(glBindBuffer(GL_ARRAY_BUFFER, s_VBO)); const Vector2D UVSize = Vector2D {windowBox.width, windowBox.height} / pWindowFB->m_size; @@ -162,9 +182,6 @@ void CRenderWobblyWindowPassElement::draw(const CRegion& damage) { if (g_wobblyWindows.contains(m_pWindow)) { auto&& wobble = g_wobblyWindows[m_pWindow]; - // TODO: these should never be nan - // if (not std::isnan(wobble.m_particles[0].position.x)) { - GLCALL(glBindBuffer(GL_ARRAY_BUFFER, s_VBO)); GLCALL(glBufferSubData( GL_ARRAY_BUFFER, @@ -172,7 +189,6 @@ void CRenderWobblyWindowPassElement::draw(const CRegion& damage) { wobble.m_particlePositions.size() * sizeof(float), wobble.m_particlePositions.data() )); - // } } else { // restore default verts GLCALL(glBindBuffer(GL_ARRAY_BUFFER, s_VBO)); diff --git a/src/wobblywindow.cpp b/src/wobblywindow.cpp index cd6fe1f..8aa332c 100644 --- a/src/wobblywindow.cpp +++ b/src/wobblywindow.cpp @@ -65,10 +65,20 @@ bool CWobblyWindow::step(Time::steady_tp time) { const bool shouldEnd = m_windowMovement.size() == 0 and totalVel.size() / (m_particlePositions.size() / 2.f) < .001f; + // HACK: why is it ever nan?? + if (std::isnan(m_particlePositions[0])) { + // reset + m_particlePositions = CRenderWobblyWindowPassElement::s_baseVerts; + + m_particleVelocities.clear(); + m_particleVelocities.resize(m_particlePositions.size()); + } + // // std::println( - // "Top left: {}, totalVel: {}", - // m_particles[0].position, - // totalVel.size() / m_particles.size() + // "Top left: ({}, {}), totalVel: {}", + // m_particlePositions[0], + // m_particlePositions[1], + // totalVel.size() / m_particlePositions.size() * 2 // ); m_windowMovement = Vector2D {}; @@ -83,3 +93,25 @@ void CWobblyWindow::applyMovement(const Vector2D& movement) { m_particlePositions[i * 2 + 1] -= movement.y; } } + +Hyprutils::Math::CBox CWobblyWindow::getBox() const { + Vector2D min {}; + Vector2D max {}; + + for (unsigned int i = 0; i < m_particlePositions.size() / 2; i++) { + auto&& x = m_particlePositions[i * 2]; + auto&& y = m_particlePositions[i * 2 + 1]; + + if (x > max.x) + max.x = x; + if (x < min.x) + min.x = x; + + if (y > max.y) + max.y = y; + if (y < min.y) + min.y = y; + } + + return CBox(min, max - min); +}