From d33801e2bff1e39cefc74f53ae2b5e532cc7d964 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Foucault?= Date: Sun, 1 May 2022 16:18:26 +0200 Subject: Overlay: Port image empty shader to use shaderCreateInfo This should have no functional changes. --- .../blender/draw/engines/overlay/overlay_shader.c | 14 +++-------- .../draw/engines/overlay/shaders/image_vert.glsl | 19 +++++++-------- .../engines/overlay/shaders/infos/extra_info.hh | 27 ++++++++++++++++++++++ .../intern/shaders/common_view_clipping_lib.glsl | 12 ++++++++++ 4 files changed, 52 insertions(+), 20 deletions(-) (limited to 'source') diff --git a/source/blender/draw/engines/overlay/overlay_shader.c b/source/blender/draw/engines/overlay/overlay_shader.c index 701b03bf8b1..22a10b9d6c4 100644 --- a/source/blender/draw/engines/overlay/overlay_shader.c +++ b/source/blender/draw/engines/overlay/overlay_shader.c @@ -745,19 +745,11 @@ GPUShader *OVERLAY_shader_edit_uv_mask_image(void) GPUShader *OVERLAY_shader_image(void) { const DRWContextState *draw_ctx = DRW_context_state_get(); - const GPUShaderConfigData *sh_cfg = &GPU_shader_cfg_data[draw_ctx->sh_cfg]; OVERLAY_Shaders *sh_data = &e_data.sh_data[draw_ctx->sh_cfg]; if (!sh_data->image) { - sh_data->image = GPU_shader_create_from_arrays({ - .vert = (const char *[]){sh_cfg->lib, - datatoc_common_view_lib_glsl, - datatoc_image_vert_glsl, - NULL}, - .frag = (const char *[]){datatoc_common_colormanagement_lib_glsl, - datatoc_image_frag_glsl, - NULL}, - .defs = (const char *[]){sh_cfg->def, NULL}, - }); + /* TODO(fclem): Do we want to allow clipping reference images? */ + sh_data->image = GPU_shader_create_from_info_name(0 ? "overlay_image_clipped" : + "overlay_image"); } return sh_data->image; } diff --git a/source/blender/draw/engines/overlay/shaders/image_vert.glsl b/source/blender/draw/engines/overlay/shaders/image_vert.glsl index a44ea7081ba..45cddb3610d 100644 --- a/source/blender/draw/engines/overlay/shaders/image_vert.glsl +++ b/source/blender/draw/engines/overlay/shaders/image_vert.glsl @@ -1,20 +1,20 @@ -uniform bool depthSet; -uniform bool isCameraBackground; - -in vec3 pos; - -out vec2 uvs; +#pragma BLENDER_REQUIRE(common_view_clipping_lib.glsl) +#pragma BLENDER_REQUIRE(common_view_lib.glsl) void main() { + vec3 world_pos = point_object_to_world(pos); if (isCameraBackground) { - vec3 vP = (ModelMatrix * vec4(pos, 1.0)).xyz; - gl_Position = point_view_to_ndc(vP); + /* Model matrix converts to view position to avoid jittering (see T91398). */ + gl_Position = point_view_to_ndc(world_pos); + /* Camera background images are not really part of the 3D space. + * It makes no sense to apply clipping on them. */ + view_clipping_distances_bypass(); } else { - vec3 world_pos = point_object_to_world(pos); gl_Position = point_world_to_ndc(world_pos); + view_clipping_distances(world_pos); } if (depthSet) { @@ -22,6 +22,7 @@ void main() * This mimics the effect of infinite projection matrix * (see http://www.terathon.com/gdc07_lengyel.pdf). */ gl_Position.z = gl_Position.w - 2.4e-7; + view_clipping_distances_bypass(); } uvs = pos.xy * 0.5 + 0.5; diff --git a/source/blender/draw/engines/overlay/shaders/infos/extra_info.hh b/source/blender/draw/engines/overlay/shaders/infos/extra_info.hh index e2ce4329bd7..2643f5cd806 100644 --- a/source/blender/draw/engines/overlay/shaders/infos/extra_info.hh +++ b/source/blender/draw/engines/overlay/shaders/infos/extra_info.hh @@ -224,3 +224,30 @@ GPU_SHADER_CREATE_INFO(overlay_motion_path_point_clipped) .additional_info("overlay_motion_path_point", "drw_clipped"); /** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Image Empty + * \{ */ + +GPU_SHADER_INTERFACE_INFO(overlay_image_iface, "").smooth(Type::VEC2, "uvs"); + +GPU_SHADER_CREATE_INFO(overlay_image) + .do_static_compilation(true) + .push_constant(Type::BOOL, "depthSet") + .push_constant(Type::BOOL, "isCameraBackground") + .push_constant(Type::BOOL, "imgPremultiplied") + .push_constant(Type::BOOL, "imgAlphaBlend") + .push_constant(Type::VEC4, "color") + .vertex_in(0, Type::VEC3, "pos") + .vertex_out(overlay_image_iface) + .sampler(0, ImageType::FLOAT_2D, "imgTexture") + .fragment_out(0, Type::VEC4, "fragColor") + .vertex_source("image_vert.glsl") + .fragment_source("image_frag.glsl") + .additional_info("draw_mesh"); + +GPU_SHADER_CREATE_INFO(overlay_image_clipped) + .do_static_compilation(true) + .additional_info("overlay_image", "drw_clipped"); + +/** \} */ diff --git a/source/blender/draw/intern/shaders/common_view_clipping_lib.glsl b/source/blender/draw/intern/shaders/common_view_clipping_lib.glsl index bae818cf9f3..d6dfa326511 100644 --- a/source/blender/draw/intern/shaders/common_view_clipping_lib.glsl +++ b/source/blender/draw/intern/shaders/common_view_clipping_lib.glsl @@ -16,6 +16,18 @@ void view_clipping_distances(vec3 wpos) # endif } +void view_clipping_distances_bypass() +{ +# ifdef USE_WORLD_CLIP_PLANES + gl_ClipDistance[0] = 1.0; + gl_ClipDistance[1] = 1.0; + gl_ClipDistance[2] = 1.0; + gl_ClipDistance[3] = 1.0; + gl_ClipDistance[4] = 1.0; + gl_ClipDistance[5] = 1.0; +# endif +} + /* Kept as define for compiler compatibility. */ # ifdef USE_WORLD_CLIP_PLANES # define view_clipping_distances_set(c) \ -- cgit v1.2.3