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