mirror of
https://github.com/hyprwm/hyprland-plugins.git
synced 2026-08-18 11:14:01 +00:00
hyprtrails: move to gles3 and new uniform caching in hyprland (#406)
* hyprtrails: move to gles3 shadering now that we use gles3 in hyprland, move over the shader to gles3 in hyprtrails too. * hyprtrails: move shader usage to the new caching move the shader usage to the new caching functions and members.
This commit is contained in:
@ -85,14 +85,13 @@ int onTick(void* data) {
|
||||
void initGlobal() {
|
||||
g_pHyprRenderer->makeEGLCurrent();
|
||||
|
||||
GLuint prog = CreateProgram(QUADTRAIL, FRAGTRAIL);
|
||||
g_pGlobalState->trailShader.program = prog;
|
||||
g_pGlobalState->trailShader.proj = glGetUniformLocation(prog, "proj");
|
||||
g_pGlobalState->trailShader.tex = glGetUniformLocation(prog, "tex");
|
||||
g_pGlobalState->trailShader.color = glGetUniformLocation(prog, "color");
|
||||
g_pGlobalState->trailShader.texAttrib = glGetAttribLocation(prog, "colors");
|
||||
g_pGlobalState->trailShader.posAttrib = glGetAttribLocation(prog, "pos");
|
||||
g_pGlobalState->trailShader.gradient = glGetUniformLocation(prog, "snapshots");
|
||||
GLuint prog = CreateProgram(QUADTRAIL, FRAGTRAIL);
|
||||
g_pGlobalState->trailShader.program = prog;
|
||||
g_pGlobalState->trailShader.uniformLocations[SHADER_PROJ] = glGetUniformLocation(prog, "proj");
|
||||
g_pGlobalState->trailShader.uniformLocations[SHADER_TEX] = glGetUniformLocation(prog, "tex");
|
||||
g_pGlobalState->trailShader.uniformLocations[SHADER_COLOR] = glGetUniformLocation(prog, "color");
|
||||
g_pGlobalState->trailShader.uniformLocations[SHADER_POS_ATTRIB] = glGetAttribLocation(prog, "pos");
|
||||
g_pGlobalState->trailShader.uniformLocations[SHADER_GRADIENT] = glGetUniformLocation(prog, "snapshots");
|
||||
|
||||
g_pGlobalState->tick = wl_event_loop_add_timer(g_pCompositor->m_wlEventLoop, &onTick, nullptr);
|
||||
wl_event_source_timer_update(g_pGlobalState->tick, 1);
|
||||
|
||||
@ -3,13 +3,15 @@
|
||||
#include <string>
|
||||
|
||||
inline const std::string QUADTRAIL = R"#(
|
||||
#version 300 es
|
||||
precision mediump float;
|
||||
uniform mat3 proj;
|
||||
uniform vec4 color;
|
||||
attribute vec2 pos;
|
||||
attribute vec2 texcoord;
|
||||
attribute vec4 colors;
|
||||
varying vec4 v_color;
|
||||
varying vec2 v_texcoord;
|
||||
in vec2 pos;
|
||||
in vec2 texcoord;
|
||||
in vec4 colors;
|
||||
out vec4 v_color;
|
||||
out vec2 v_texcoord;
|
||||
|
||||
void main() {
|
||||
gl_Position = vec4(proj * vec3(pos, 1.0), 1.0);
|
||||
@ -18,12 +20,15 @@ void main() {
|
||||
})#";
|
||||
|
||||
inline const std::string FRAGTRAIL = R"#(
|
||||
#version 300 es
|
||||
precision mediump float;
|
||||
varying vec4 v_color;
|
||||
varying vec2 v_texcoord;
|
||||
in vec4 v_color;
|
||||
in vec2 v_texcoord;
|
||||
|
||||
uniform vec4 window;
|
||||
|
||||
layout(location = 0) out vec4 fragColor;
|
||||
|
||||
float distToRect(vec4 rect) {
|
||||
float dx = max(rect[0] - v_texcoord[0], max(0.0, v_texcoord[0] - rect[2]));
|
||||
float dy = max(rect[1] - v_texcoord[1], max(0.0, v_texcoord[1] - rect[3]));
|
||||
@ -45,10 +50,10 @@ float alphaForShot(vec4 shot, float threshold) {
|
||||
|
||||
void main() {
|
||||
|
||||
vec4 pixColor = v_color;
|
||||
vec4 pixColor = v_color;
|
||||
float a = v_color[3]; // clamp(alphaForShot(window, 0.5), 0.0, 1.0); // todo
|
||||
|
||||
pixColor.rgb *= a;
|
||||
|
||||
gl_FragColor = pixColor;
|
||||
fragColor = pixColor;
|
||||
})#";
|
||||
|
||||
@ -94,7 +94,7 @@ void CTrail::draw(PHLMONITOR pMonitor, const float& a) {
|
||||
}
|
||||
|
||||
void CTrail::renderPass(PHLMONITOR pMonitor, const float& a) {
|
||||
const auto PWINDOW = m_pWindow.lock();
|
||||
const auto PWINDOW = m_pWindow.lock();
|
||||
|
||||
static auto* const PBEZIERSTEP = (Hyprlang::FLOAT* const*)HyprlandAPI::getConfigValue(PHANDLE, "plugin:hyprtrails:bezier_step")->getDataStaticPtr();
|
||||
static auto* const PPOINTSPERSTEP = (Hyprlang::INT* const*)HyprlandAPI::getConfigValue(PHANDLE, "plugin:hyprtrails:points_per_step")->getDataStaticPtr();
|
||||
@ -114,7 +114,7 @@ void CTrail::renderPass(PHLMONITOR pMonitor, const float& a) {
|
||||
glClearStencil(0);
|
||||
glClear(GL_STENCIL_BUFFER_BIT);
|
||||
|
||||
glEnable(GL_STENCIL_TEST);
|
||||
g_pHyprOpenGL->setCapStatus(GL_STENCIL_TEST, true);
|
||||
|
||||
glStencilFunc(GL_ALWAYS, 1, -1);
|
||||
glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE);
|
||||
@ -135,12 +135,8 @@ void CTrail::renderPass(PHLMONITOR pMonitor, const float& a) {
|
||||
|
||||
glUseProgram(g_pGlobalState->trailShader.program);
|
||||
|
||||
#ifndef GLES2
|
||||
glUniformMatrix3fv(g_pGlobalState->trailShader.proj, 1, GL_TRUE, glMatrix.getMatrix().data());
|
||||
#else
|
||||
glMatrix.transpose();
|
||||
glUniformMatrix3fv(g_pGlobalState->trailShader.proj, 1, GL_FALSE, glMatrix.getMatrix().data());
|
||||
#endif
|
||||
g_pGlobalState->trailShader.setUniformMatrix3fv(SHADER_PROJ, 1, GL_FALSE, glMatrix.getMatrix());
|
||||
|
||||
std::vector<point2> points;
|
||||
std::vector<Vector2D> bezierPts;
|
||||
@ -193,7 +189,7 @@ void CTrail::renderPass(PHLMONITOR pMonitor, const float& a) {
|
||||
if (pointsForBezier.size() < 3) {
|
||||
glClearStencil(0);
|
||||
glClear(GL_STENCIL_BUFFER_BIT);
|
||||
glDisable(GL_STENCIL_TEST);
|
||||
g_pHyprOpenGL->setCapStatus(GL_STENCIL_TEST, false);
|
||||
|
||||
glStencilMask(-1);
|
||||
glStencilFunc(GL_ALWAYS, 1, 0xFF);
|
||||
@ -246,20 +242,20 @@ void CTrail::renderPass(PHLMONITOR pMonitor, const float& a) {
|
||||
}
|
||||
}
|
||||
|
||||
box thisboxopengl = box{(PWINDOW->m_realPosition->value().x - pMonitor->m_position.x) / pMonitor->m_size.x,
|
||||
(PWINDOW->m_realPosition->value().y - pMonitor->m_position.y) / pMonitor->m_size.y,
|
||||
(PWINDOW->m_realPosition->value().x + PWINDOW->m_realSize->value().x) / pMonitor->m_size.x,
|
||||
(PWINDOW->m_realPosition->value().y + PWINDOW->m_realSize->value().y) / pMonitor->m_size.y};
|
||||
glUniform4f(g_pGlobalState->trailShader.gradient, thisboxopengl.x, thisboxopengl.y, thisboxopengl.w, thisboxopengl.h);
|
||||
glUniform4f(g_pGlobalState->trailShader.color, COLOR.r, COLOR.g, COLOR.b, COLOR.a);
|
||||
box thisboxopengl =
|
||||
box{(PWINDOW->m_realPosition->value().x - pMonitor->m_position.x) / pMonitor->m_size.x, (PWINDOW->m_realPosition->value().y - pMonitor->m_position.y) / pMonitor->m_size.y,
|
||||
(PWINDOW->m_realPosition->value().x + PWINDOW->m_realSize->value().x) / pMonitor->m_size.x,
|
||||
(PWINDOW->m_realPosition->value().y + PWINDOW->m_realSize->value().y) / pMonitor->m_size.y};
|
||||
glUniform4f(g_pGlobalState->trailShader.uniformLocations[SHADER_GRADIENT], thisboxopengl.x, thisboxopengl.y, thisboxopengl.w, thisboxopengl.h);
|
||||
glUniform4f(g_pGlobalState->trailShader.uniformLocations[SHADER_COLOR], COLOR.r, COLOR.g, COLOR.b, COLOR.a);
|
||||
|
||||
CBox transformedBox = monbox;
|
||||
transformedBox.transform(wlTransformToHyprutils(invertTransform(g_pHyprOpenGL->m_renderData.pMonitor->m_transform)), g_pHyprOpenGL->m_renderData.pMonitor->m_transformedSize.x,
|
||||
g_pHyprOpenGL->m_renderData.pMonitor->m_transformedSize.y);
|
||||
|
||||
glVertexAttribPointer(g_pGlobalState->trailShader.posAttrib, 2, GL_FLOAT, GL_FALSE, 0, (float*)points.data());
|
||||
glVertexAttribPointer(g_pGlobalState->trailShader.uniformLocations[SHADER_POS_ATTRIB], 2, GL_FLOAT, GL_FALSE, 0, (float*)points.data());
|
||||
|
||||
glEnableVertexAttribArray(g_pGlobalState->trailShader.posAttrib);
|
||||
glEnableVertexAttribArray(g_pGlobalState->trailShader.uniformLocations[SHADER_POS_ATTRIB]);
|
||||
|
||||
if (g_pHyprOpenGL->m_renderData.clipBox.width != 0 && g_pHyprOpenGL->m_renderData.clipBox.height != 0) {
|
||||
CRegion damageClip{g_pHyprOpenGL->m_renderData.clipBox.x, g_pHyprOpenGL->m_renderData.clipBox.y, g_pHyprOpenGL->m_renderData.clipBox.width,
|
||||
@ -279,11 +275,11 @@ void CTrail::renderPass(PHLMONITOR pMonitor, const float& a) {
|
||||
}
|
||||
}
|
||||
|
||||
glDisableVertexAttribArray(g_pGlobalState->trailShader.posAttrib);
|
||||
glDisableVertexAttribArray(g_pGlobalState->trailShader.uniformLocations[SHADER_POS_ATTRIB]);
|
||||
|
||||
glClearStencil(0);
|
||||
glClear(GL_STENCIL_BUFFER_BIT);
|
||||
glDisable(GL_STENCIL_TEST);
|
||||
g_pHyprOpenGL->setCapStatus(GL_STENCIL_TEST, false);
|
||||
|
||||
glStencilMask(-1);
|
||||
glStencilFunc(GL_ALWAYS, 1, 0xFF);
|
||||
|
||||
Reference in New Issue
Block a user