summaryrefslogtreecommitdiff
path: root/render/fx_renderer/fx_renderer.c
diff options
context:
space:
mode:
authorErik Reider <[email protected]>2024-01-02 01:19:48 +0100
committerErik Reider <[email protected]>2024-01-04 02:11:25 +0100
commitc15af4a182314d8384fc6b28e7c3fc58c0352b83 (patch)
tree841c17acede5ead7b8c08c9668d0b148ad5c26e4 /render/fx_renderer/fx_renderer.c
parent1a6918f948be034e65c50af8969d090b5e762dc1 (diff)
Added back shadow effect
Diffstat (limited to 'render/fx_renderer/fx_renderer.c')
-rw-r--r--render/fx_renderer/fx_renderer.c134
1 files changed, 0 insertions, 134 deletions
diff --git a/render/fx_renderer/fx_renderer.c b/render/fx_renderer/fx_renderer.c
index d00b088..da9437c 100644
--- a/render/fx_renderer/fx_renderer.c
+++ b/render/fx_renderer/fx_renderer.c
@@ -183,43 +183,6 @@ static void fx_renderer_scissor(struct wlr_renderer *wlr_renderer,
pop_fx_debug(renderer);
}
-void fx_renderer_stencil_mask_init(void) {
- glClearStencil(0);
- glClear(GL_STENCIL_BUFFER_BIT);
- glEnable(GL_STENCIL_TEST);
-
- glStencilFunc(GL_ALWAYS, 1, 0xFF);
- glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE);
- // Disable writing to color buffer
- glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
-}
-
-void fx_renderer_stencil_mask_close(bool draw_inside_mask) {
- // Reenable writing to color buffer
- glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
- if (draw_inside_mask) {
- glStencilFunc(GL_EQUAL, 1, 0xFF);
- glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE);
- return;
- }
- glStencilFunc(GL_NOTEQUAL, 1, 0xFF);
- glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
-}
-
-void fx_renderer_stencil_mask_fini(void) {
- glClearStencil(0);
- glClear(GL_STENCIL_BUFFER_BIT);
- glDisable(GL_STENCIL_TEST);
-}
-
-void fx_renderer_stencil_enable(void) {
- glEnable(GL_STENCIL_TEST);
-}
-
-void fx_renderer_stencil_disable(void) {
- glDisable(GL_STENCIL_TEST);
-}
-
static bool fx_render_subtexture_with_matrix(
struct wlr_renderer *wlr_renderer, struct wlr_texture *wlr_texture,
const struct wlr_fbox *box, const float matrix[static 9],
@@ -330,103 +293,6 @@ static void fx_render_quad_with_matrix(struct wlr_renderer *wlr_renderer,
pop_fx_debug(renderer);
}
-static void fx_render_stencil_mask(struct fx_renderer *renderer,
- const struct wlr_box *box, const float matrix[static 9],
- int corner_radius) {
- if (box->width == 0 || box->height == 0) {
- return;
- }
- assert(box->width > 0 && box->height > 0);
-
- // TODO: just pass gl_matrix?
- float gl_matrix[9];
- wlr_matrix_multiply(gl_matrix, renderer->projection, matrix);
-
- // TODO: investigate why matrix is flipped prior to this cmd
- // wlr_matrix_multiply(gl_matrix, flip_180, gl_matrix);
-
- wlr_matrix_transpose(gl_matrix, gl_matrix);
-
- glEnable(GL_BLEND);
-
- struct stencil_mask_shader shader = renderer->shaders.stencil_mask;
-
- glUseProgram(shader.program);
-
- glUniformMatrix3fv(shader.proj, 1, GL_FALSE, gl_matrix);
-
- glUniform2f(shader.half_size, box->width * 0.5, box->height * 0.5);
- glUniform2f(shader.position, box->x, box->y);
- glUniform1f(shader.radius, corner_radius);
-
- glVertexAttribPointer(shader.pos_attrib, 2, GL_FLOAT, GL_FALSE,
- 0, verts);
-
- glEnableVertexAttribArray(shader.pos_attrib);
-
- glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
-
- glDisableVertexAttribArray(shader.pos_attrib);
-}
-
-static 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) {
- if (box->width == 0 || box->height == 0) {
- return;
- }
- assert(box->width > 0 && box->height > 0);
-
- float *color = shadow_data->color;
- float blur_sigma = shadow_data->blur_sigma;
-
- float gl_matrix[9];
- wlr_matrix_multiply(gl_matrix, renderer->projection, matrix);
-
- // TODO: investigate why matrix is flipped prior to this cmd
- // wlr_matrix_multiply(gl_matrix, flip_180, gl_matrix);
-
- wlr_matrix_transpose(gl_matrix, gl_matrix);
-
- // Init stencil work
- fx_renderer_stencil_mask_init();
- // Draw the rounded rect as a mask
- fx_render_stencil_mask(renderer, stencil_box, matrix, corner_radius);
- fx_renderer_stencil_mask_close(false);
-
- // blending will practically always be needed (unless we have a madman
- // who uses opaque shadows with zero sigma), so just enable it
- glEnable(GL_BLEND);
-
- glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
-
- struct box_shadow_shader shader = renderer->shaders.box_shadow;
-
- glUseProgram(shader.program);
-
- glUniformMatrix3fv(shader.proj, 1, GL_FALSE, gl_matrix);
- glUniform4f(shader.color, color[0], color[1], color[2], color[3]);
- glUniform1f(shader.blur_sigma, blur_sigma);
- glUniform1f(shader.corner_radius, corner_radius);
-
- glUniform2f(shader.size, box->width, box->height);
- glUniform2f(shader.position, box->x, box->y);
-
- glVertexAttribPointer(shader.pos_attrib, 2, GL_FLOAT, GL_FALSE,
- 0, verts);
-
- glEnableVertexAttribArray(shader.pos_attrib);
-
- glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
-
- glDisableVertexAttribArray(shader.pos_attrib);
-
- glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
-
- fx_renderer_stencil_mask_fini();
-}
-
static const uint32_t *fx_get_shm_texture_formats(
struct wlr_renderer *wlr_renderer, size_t *len) {
struct fx_renderer *renderer = fx_get_renderer(wlr_renderer);