summaryrefslogtreecommitdiff
path: root/include/render/fx_renderer
diff options
context:
space:
mode:
authorErik Reider <[email protected]>2023-08-06 20:48:58 +0200
committerGitHub <[email protected]>2023-08-06 14:48:58 -0400
commitb929a2bbadf467864796ad4ec90882ce86cfebff (patch)
tree8229d63bfe8e1ba7908c5ca988c3bb774ea7990b /include/render/fx_renderer
parenta2b827ab71f51240a192fa20913f6e83d8528612 (diff)
feat: add box shadows (#16)
Diffstat (limited to 'include/render/fx_renderer')
-rw-r--r--include/render/fx_renderer/fx_renderer.h45
-rw-r--r--include/render/fx_renderer/fx_stencilbuffer.h20
2 files changed, 65 insertions, 0 deletions
diff --git a/include/render/fx_renderer/fx_renderer.h b/include/render/fx_renderer/fx_renderer.h
index 2067c04..f569aa9 100644
--- a/include/render/fx_renderer/fx_renderer.h
+++ b/include/render/fx_renderer/fx_renderer.h
@@ -8,6 +8,8 @@
#include <wlr/render/wlr_texture.h>
#include <wlr/util/addon.h>
#include <wlr/util/box.h>
+#include "render/fx_renderer/fx_stencilbuffer.h"
+#include "types/fx/shadow_data.h"
enum fx_tex_shader_source {
SHADER_SOURCE_TEXTURE_RGBA = 1,
@@ -34,9 +36,32 @@ struct tex_shader {
GLint radius;
};
+struct stencil_mask_shader {
+ GLuint program;
+ GLint proj;
+ GLint color;
+ GLint pos_attrib;
+ GLint half_size;
+ GLint position;
+ GLint radius;
+};
+
+struct box_shadow_shader {
+ GLuint program;
+ GLint proj;
+ GLint color;
+ GLint pos_attrib;
+ GLint position;
+ GLint size;
+ GLint blur_sigma;
+ GLint corner_radius;
+};
+
struct fx_renderer {
float projection[9];
+ struct fx_stencilbuffer stencil_buffer;
+
struct wlr_addon addon;
struct {
@@ -52,6 +77,8 @@ struct fx_renderer {
struct tex_shader tex_rgba;
struct tex_shader tex_rgbx;
struct tex_shader tex_ext;
+ struct box_shadow_shader box_shadow;
+ struct stencil_mask_shader stencil_mask;
} shaders;
};
@@ -71,6 +98,19 @@ void fx_renderer_clear(const float color[static 4]);
void fx_renderer_scissor(struct wlr_box *box);
+// Initialize the stenciling work
+void fx_renderer_stencil_mask_init(void);
+
+// Close the mask
+void fx_renderer_stencil_mask_close(bool draw_inside_mask);
+
+// Finish stenciling and clear the buffer
+void fx_renderer_stencil_mask_fini(void);
+
+void fx_renderer_stencil_enable(void);
+
+void fx_renderer_stencil_disable(void);
+
bool fx_render_subtexture_with_matrix(struct fx_renderer *renderer,
struct wlr_texture *wlr_texture, const struct wlr_fbox *src_box,
const struct wlr_box *dst_box, const float matrix[static 9],
@@ -79,4 +119,9 @@ bool fx_render_subtexture_with_matrix(struct fx_renderer *renderer,
void fx_render_rect(struct fx_renderer *renderer, const struct wlr_box *box,
const float color[static 4], const float projection[static 9]);
+void fx_render_box_shadow(struct fx_renderer *renderer,
+ const struct wlr_box *box, const struct wlr_box *stencil_box,
+ const float matrix[static 9], int corner_radius,
+ struct shadow_data *shadow_data);
+
#endif
diff --git a/include/render/fx_renderer/fx_stencilbuffer.h b/include/render/fx_renderer/fx_stencilbuffer.h
new file mode 100644
index 0000000..6909f96
--- /dev/null
+++ b/include/render/fx_renderer/fx_stencilbuffer.h
@@ -0,0 +1,20 @@
+#ifndef FX_STENCILBUFFER_H
+#define FX_STENCILBUFFER_H
+
+#include <GLES2/gl2.h>
+#include <stdbool.h>
+#include <wlr/render/wlr_texture.h>
+
+struct fx_stencilbuffer {
+ GLuint rb;
+ int width;
+ int height;
+};
+
+struct fx_stencilbuffer fx_stencilbuffer_create(void);
+
+void fx_stencilbuffer_init(struct fx_stencilbuffer *stencil_buffer, int width, int height);
+
+void fx_stencilbuffer_release(struct fx_stencilbuffer *stencil_buffer);
+
+#endif