QmlMaterial 0.1.0
Loading...
Searching...
No Matches
blur_mask_material.h
1#pragma once
2
3#include <QSGMaterial>
4#include <QVector2D>
5#include <QVector4D>
6
7namespace qml_material::sg
8{
9
10enum class BlurStyle : int {
11 Normal = 0,
12 Solid = 1,
13 Outer = 2,
14 Inner = 3,
15};
16
24class BlurMaskMaterial : public QSGMaterial {
25public:
27 ~BlurMaskMaterial() = default;
28
29 QSGMaterialShader* createShader(QSGRendererInterface::RenderMode) const override;
30 QSGMaterialType* type() const override;
31 int compare(const QSGMaterial* other) const override;
32
34 void init_profile_texture(QQuickWindow* win);
35 auto profile_texture() -> QSGTexture*;
36
39 void init_corner_texture(QQuickWindow* win, float sigma, float radius);
40 auto corner_texture() -> QSGTexture*;
41
42 // Uniform state (populated by the owning node each frame).
43 float sigma { 0.0f };
44 QVector2D rect_size { 0.0f, 0.0f };
45 QVector4D radius { 0.0f, 0.0f, 0.0f, 0.0f }; // TL, TR, BL, BR
46 BlurStyle style { BlurStyle::Normal };
47
49 [[nodiscard]] float effective_radius() const;
50
51private:
52 // Not owned — both pointers come from the per-window texture cache.
53 QSGTexture* m_profile_texture { nullptr };
54 QSGTexture* m_corner_texture { nullptr };
55};
56
57class BlurMaskShader : public QSGMaterialShader {
58public:
59 BlurMaskShader();
60
61 bool updateUniformData(QSGMaterialShader::RenderState& state, QSGMaterial* newMaterial,
62 QSGMaterial* oldMaterial) override;
63
64 void updateSampledImage(RenderState&, int binding, QSGTexture** texture,
65 QSGMaterial* newMaterial, QSGMaterial*) override;
66};
67
68} // namespace qml_material::sg
Definition blur_mask_material.h:24
float effective_radius() const
Effective uniform radius used by the shader (= max of the 4 radii).
Definition blur_mask_material.cpp:26
void init_corner_texture(QQuickWindow *win, float sigma, float radius)
Definition blur_mask_material.cpp:67
void init_profile_texture(QQuickWindow *win)
Bind the per-window shared 1D unit-CDF profile texture. Cheap.
Definition blur_mask_material.cpp:63