GCC Code Coverage Report


./
Coverage:
low: ≥ 0%
medium: ≥ 75.0%
high: ≥ 90.0%
Lines:
0 of 3, 0 excluded
0.0%
Functions:
0 of 2, 0 excluded
0.0%
Branches:
0 of 0, 0 excluded
-%

libs/render/src/eu/render/postproc.internal.h
Line Branch Exec Source
1 #pragma once
2
3 #include <memory>
4
5 #include "eu/render/postproc.h"
6
7 #include "eu/render/renderer.h"
8 #include "eu/render/shader.h"
9 #include "eu/render/shader_resource.h"
10
11 namespace eu::imgui
12 {
13 struct ImguiShaderCache;
14 }
15
16 namespace eu::render
17 {
18
19 /** \addtogroup postproc Post Processing
20 * @{
21 */
22
23 struct BloomRender
24 {
25 ExtractShader* extract_shader;
26 std::shared_ptr<FrameBuffer> bloom_buffer;
27
28 PingPongBlurShader* ping_pong_shader;
29 std::array<std::shared_ptr<FrameBuffer>, 2> ping_pong_buffer;
30 };
31
32 /// @brief A source that "just" renders the world.
33 struct RenderWorld : RenderSource
34 {
35 Size window_size;
36
37 bool* use_hdr;
38 float* exposure;
39
40 std::shared_ptr<FrameBuffer> msaa_buffer;
41 std::shared_ptr<FrameBuffer> realized_buffer;
42 std::shared_ptr<FrameBuffer> shadow_buffer;
43 RealizeShader* realize_shader = nullptr;
44 std::optional<BloomRender> bloom_render;
45 std::size_t last_bloom_blur_index = 0;
46
47 RenderWorld(const Size& size, RealizeShader* re_sh, ExtractShader* ex_sh, PingPongBlurShader* ping_sh, int msaa_samples, bool* h, float* e);
48
49 void update(const PostProcArg& arg);
50
51 void render(const PostProcArg& arg) override;
52
53 void gui(imgui::ImguiShaderCache* cache);
54 };
55
56
57 /// A tweakable shader property.
58 struct ShaderProp
59 {
60 ShaderProp() = default;
61 ShaderProp(const ShaderProp&) = delete;
62 ShaderProp(ShaderProp&&) = delete;
63 void operator=(const ShaderProp&) = delete;
64 void operator=(ShaderProp&&) = delete;
65
66 virtual ~ShaderProp() = default;
67
68 virtual void use(const PostProcArg& a, ShaderProgram& shader) = 0;
69 virtual void gui() = 0;
70 };
71
72 /// A float shader property that is dragged with the mouse.
73 struct FloatDragShaderProp : ShaderProp
74 {
75 Uniform uniform;
76 std::string name;
77 float value;
78 float speed;
79
80 FloatDragShaderProp(const LoadedPostProcShader& shader, const std::string& n, float v, float s);
81
82 void use(const PostProcArg&, ShaderProgram& shader) override;
83
84 void gui() override;
85 };
86
87 /// A float shader property that is a slider.
88 struct FloatSliderShaderProp : ShaderProp
89 {
90 Uniform uniform;
91 std::string name;
92 float value;
93 float min;
94 float max;
95
96 FloatSliderShaderProp(
97 const LoadedPostProcShader& shader, const std::string& n, float v, float mi, float ma
98 );
99
100 void use(const PostProcArg&, ShaderProgram& shader) override;
101
102 void gui() override;
103 };
104
105 /// A effect that only performs a single step.
106 /// Most effects are simple, like invert, grayscale, etc. but some are more complex like blur.
107 struct SimpleEffect
108 : FactorEffect
109 , ShaderPropertyProvider
110 {
111 std::string name;
112 std::shared_ptr<LoadedPostProcShader> shader;
113 std::vector<std::shared_ptr<ShaderProp>> properties;
114 float time = 0.0f;
115
116 SimpleEffect(std::string n, std::shared_ptr<LoadedPostProcShader> s);
117
118 void add_float_drag_prop(const std::string& prop_name, float value, float speed);
119
120 void add_float_slider_prop(const std::string& prop_name, float value, float min, float max);
121
122 void gui() override;
123
124 void update(float dt) override;
125
126 void use_shader(const PostProcArg& a, const FrameBuffer& t) override;
127
128 void build(const BuildArg& arg) override;
129 };
130
131 struct BlurEffect;
132
133 /// A shader property for the vertical blur step.
134 struct BlurVerticalProvider : ShaderPropertyProvider
135 {
136 explicit BlurVerticalProvider(BlurEffect* b);
137
138 BlurEffect* blur;
139 void use_shader(const PostProcArg& a, const FrameBuffer& t) override;
140 };
141
142 /// A shader property for the horizontal blur step.
143 struct BurHorizontalProvider : ShaderPropertyProvider
144 {
145 explicit BurHorizontalProvider(BlurEffect* b);
146
147 BlurEffect* blur;
148 void use_shader(const PostProcArg& a, const FrameBuffer& t) override;
149 };
150
151 /// A blur effect split into a vertical and horizontal blur step.
152 struct BlurEffect : FactorEffect
153 {
154 std::string name;
155 BlurVerticalProvider vert_p;
156 BurHorizontalProvider hori_p;
157 std::shared_ptr<LoadedPostProcShader> vert;
158 std::shared_ptr<LoadedPostProcShader> hori;
159
160 Uniform blur_size_v;
161 Uniform blur_size_h;
162
163 #if FF_HAS(BLUR_USE_GAUSS)
164 Uniform std_dev_v;
165 Uniform std_dev_h;
166 #endif
167
168 float blur_size = 0.02f;
169 #if FF_HAS(BLUR_USE_GAUSS)
170 float std_dev = 0.02f;
171 #endif
172
173 BlurEffect(std::string n, std::shared_ptr<LoadedPostProcShader> v, std::shared_ptr<LoadedPostProcShader> h);
174
175 void gui() override;
176
177 void update(float) override;
178
179 void use_vert_shader(const PostProcArg& a, const FrameBuffer& t) const;
180
181 void use_hori_shader(const PostProcArg& a, const FrameBuffer& t);
182
183 void build(const BuildArg& arg) override;
184 };
185
186 /**
187 * @}
188 */
189
190 }
191