diff options
author | Erik Reider <[email protected]> | 2024-01-02 01:19:48 +0100 |
---|---|---|
committer | Erik Reider <[email protected]> | 2024-01-04 02:11:25 +0100 |
commit | c15af4a182314d8384fc6b28e7c3fc58c0352b83 (patch) | |
tree | 841c17acede5ead7b8c08c9668d0b148ad5c26e4 /render/fx_renderer/fx_renderer.c | |
parent | 1a6918f948be034e65c50af8969d090b5e762dc1 (diff) |
Added back shadow effect
Diffstat (limited to 'render/fx_renderer/fx_renderer.c')
-rw-r--r-- | render/fx_renderer/fx_renderer.c | 134 |
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); |