From 02049aeaa8806ef5d23fbf050be7e341e2d5bbde Mon Sep 17 00:00:00 2001 From: John Preston Date: Fri, 4 Jun 2021 16:56:49 +0400 Subject: [PATCH] Add FragmentGlobalOpacity shader part. --- ui/gl/gl_primitives.cpp | 42 +++++++++++++++++++++++++++++++++-------- ui/gl/gl_primitives.h | 22 +++++++++++++++++---- ui/gl/gl_shader.cpp | 11 +++++++++++ ui/gl/gl_shader.h | 1 + 4 files changed, 64 insertions(+), 12 deletions(-) diff --git a/ui/gl/gl_primitives.cpp b/ui/gl/gl_primitives.cpp index 036e4f3..599b9f9 100644 --- a/ui/gl/gl_primitives.cpp +++ b/ui/gl/gl_primitives.cpp @@ -15,7 +15,7 @@ namespace Ui::GL { static_assert(std::is_same_v); -void FillRectVertices(float *coords, Rect rect) { +void FillRectTriangleVertices(float *coords, Rect rect) { coords[0] = coords[10] = rect.left(); coords[1] = coords[11] = rect.top(); coords[2] = rect.right(); @@ -31,7 +31,6 @@ void FillTriangles( gsl::span coords, not_null buffer, not_null program, - QSize viewportWithFactor, const QColor &color, Fn additional) { Expects(coords.size() % 6 == 0); @@ -42,8 +41,6 @@ void FillTriangles( buffer->bind(); buffer->allocate(coords.data(), coords.size() * sizeof(GLfloat)); - f.glUseProgram(program->programId()); - program->setUniformValue("viewport", QSizeF(viewportWithFactor)); program->setUniformValue("s_color", Uniform(color)); GLint position = program->attributeLocation("position"); @@ -65,6 +62,32 @@ void FillTriangles( f.glDisableVertexAttribArray(position); } +void FillRectangle( + QOpenGLFunctions &f, + not_null program, + int skipVertices, + const QColor &color) { + const auto shift = [&](int elements) { + return reinterpret_cast( + (skipVertices * 4 + elements) * sizeof(GLfloat)); + }; + program->setUniformValue("s_color", Uniform(color)); + + GLint position = program->attributeLocation("position"); + f.glVertexAttribPointer( + position, + 2, + GL_FLOAT, + GL_FALSE, + 2 * sizeof(GLfloat), + shift(0)); + f.glEnableVertexAttribArray(position); + + f.glDrawArrays(GL_TRIANGLE_FAN, 0, 4); + + f.glDisableVertexAttribArray(position); +} + void FillTexturedRectangle( QOpenGLFunctions &f, not_null program, @@ -120,8 +143,8 @@ void BackgroundFiller::fill( const QRegion ®ion, QSize viewport, float factor, - const style::color &color) { - const auto &rgb = color->c.toRgb(); + const QColor &color) { + const auto rgb = color.toRgb(); if (region.isEmpty()) { return; } else if (region.end() - region.begin() == 1 @@ -133,15 +156,18 @@ void BackgroundFiller::fill( _bgTriangles.resize((region.end() - region.begin()) * 12); auto coords = _bgTriangles.data(); for (const auto rect : region) { - FillRectVertices(coords, TransformRect(rect, viewport, factor)); + FillRectTriangleVertices( + coords, + TransformRect(rect, viewport, factor)); coords += 12; } + f.glUseProgram(_bgProgram->programId()); + _bgProgram->setUniformValue("viewport", QSizeF(viewport * factor)); FillTriangles( f, _bgTriangles, &*_bgBuffer, &*_bgProgram, - viewport * factor, rgb); } diff --git a/ui/gl/gl_primitives.h b/ui/gl/gl_primitives.h index 3ec0755..444b6ba 100644 --- a/ui/gl/gl_primitives.h +++ b/ui/gl/gl_primitives.h @@ -16,17 +16,22 @@ class QOpenGLFunctions; namespace Ui::GL { -void FillRectVertices(float *coords, Rect rect); - +void FillRectTriangleVertices(float *coords, Rect rect); void FillTriangles( QOpenGLFunctions &f, gsl::span coords, not_null buffer, not_null program, - QSize viewportWithFactor, const QColor &color, Fn additional = nullptr); + +void FillRectangle( + QOpenGLFunctions &f, + not_null program, + int skipVertices, + const QColor &color); + void FillTexturedRectangle( QOpenGLFunctions &f, not_null program, @@ -42,7 +47,16 @@ public: const QRegion ®ion, QSize viewport, float factor, - const style::color &color); + const QColor &color); + + void fill( + QOpenGLFunctions &f, + const QRegion ®ion, + QSize viewport, + float factor, + const style::color &color) { + return fill(f, region, viewport, factor, color->c); + } private: std::optional _bgBuffer; diff --git a/ui/gl/gl_shader.cpp b/ui/gl/gl_shader.cpp index 5e5d7f1..7a04d1e 100644 --- a/ui/gl/gl_shader.cpp +++ b/ui/gl/gl_shader.cpp @@ -88,6 +88,17 @@ uniform sampler2D v_texture; }; } +ShaderPart FragmentGlobalOpacity() { + return { + .header = R"( +uniform float g_opacity; +)", + .body = R"( + result *= g_opacity; +)", + }; +} + ShaderPart VertexViewportTransform() { return { .header = R"( diff --git a/ui/gl/gl_shader.h b/ui/gl/gl_shader.h index 3ce7aa6..0a4e22e 100644 --- a/ui/gl/gl_shader.h +++ b/ui/gl/gl_shader.h @@ -24,6 +24,7 @@ struct ShaderPart { [[nodiscard]] ShaderPart VertexPassTextureCoord(char prefix = 'v'); [[nodiscard]] ShaderPart FragmentSampleARGB32Texture(); [[nodiscard]] ShaderPart FragmentSampleYUV420Texture(); +[[nodiscard]] ShaderPart FragmentGlobalOpacity(); [[nodiscard]] ShaderPart VertexViewportTransform(); [[nodiscard]] ShaderPart FragmentRoundCorners(); [[nodiscard]] ShaderPart FragmentStaticColor();