From 17ddb4c4ea0f68a7f4c38f54291ec641deb6f1f9 Mon Sep 17 00:00:00 2001 From: Jeroen Bakker Date: Tue, 16 Jun 2020 10:12:20 +0200 Subject: Fix T77803: IK Degrees of freedom drawing glitch MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit IK degrees of freedom is rendered using wires and a solid sphere. The solid used the wireframe drawing what resulted into drawing glitches. This patch adds a new shader to draw the solid shape. Reviewed By: Clément Foucault Differential Revision: https://developer.blender.org/D8044 --- .../draw/engines/overlay/overlay_armature.c | 3 +- .../blender/draw/engines/overlay/overlay_private.h | 3 +- .../blender/draw/engines/overlay/overlay_shader.c | 32 ++++++++++++++++++---- .../engines/overlay/shaders/armature_dof_vert.glsl | 4 +++ 4 files changed, 35 insertions(+), 7 deletions(-) (limited to 'source') diff --git a/source/blender/draw/engines/overlay/overlay_armature.c b/source/blender/draw/engines/overlay/overlay_armature.c index c65cdf48206..4bb9a74b2e2 100644 --- a/source/blender/draw/engines/overlay/overlay_armature.c +++ b/source/blender/draw/engines/overlay/overlay_armature.c @@ -228,11 +228,12 @@ void OVERLAY_armature_cache_init(OVERLAY_Data *vedata) { format = formats->instance_extra; - sh = OVERLAY_shader_armature_degrees_of_freedom(); + sh = OVERLAY_shader_armature_degrees_of_freedom_wire(); grp = DRW_shgroup_create(sh, armature_ps); DRW_shgroup_uniform_block_persistent(grp, "globalsBlock", G_draw.block_ubo); cb->dof_lines = BUF_INSTANCE(grp, format, DRW_cache_bone_dof_lines_get()); + sh = OVERLAY_shader_armature_degrees_of_freedom_solid(); grp = DRW_shgroup_create(sh, armature_transp_ps); DRW_shgroup_uniform_block_persistent(grp, "globalsBlock", G_draw.block_ubo); cb->dof_sphere = BUF_INSTANCE(grp, format, DRW_cache_bone_dof_sphere_get()); diff --git a/source/blender/draw/engines/overlay/overlay_private.h b/source/blender/draw/engines/overlay/overlay_private.h index fdc421b29fb..53692a34a55 100644 --- a/source/blender/draw/engines/overlay/overlay_private.h +++ b/source/blender/draw/engines/overlay/overlay_private.h @@ -562,7 +562,8 @@ void OVERLAY_wireframe_draw(OVERLAY_Data *vedata); void OVERLAY_wireframe_in_front_draw(OVERLAY_Data *vedata); GPUShader *OVERLAY_shader_antialiasing(void); -GPUShader *OVERLAY_shader_armature_degrees_of_freedom(void); +GPUShader *OVERLAY_shader_armature_degrees_of_freedom_wire(void); +GPUShader *OVERLAY_shader_armature_degrees_of_freedom_solid(void); GPUShader *OVERLAY_shader_armature_envelope(bool use_outline); GPUShader *OVERLAY_shader_armature_shape(bool use_outline); GPUShader *OVERLAY_shader_armature_shape_wire(void); diff --git a/source/blender/draw/engines/overlay/overlay_shader.c b/source/blender/draw/engines/overlay/overlay_shader.c index 0610b8397a1..ddb1a523140 100644 --- a/source/blender/draw/engines/overlay/overlay_shader.c +++ b/source/blender/draw/engines/overlay/overlay_shader.c @@ -130,7 +130,8 @@ extern char datatoc_common_view_lib_glsl[]; typedef struct OVERLAY_Shaders { GPUShader *antialiasing; - GPUShader *armature_dof; + GPUShader *armature_dof_wire; + GPUShader *armature_dof_solid; GPUShader *armature_envelope_outline; GPUShader *armature_envelope_solid; GPUShader *armature_shape_outline; @@ -473,13 +474,13 @@ GPUShader *OVERLAY_shader_armature_stick(void) return sh_data->armature_stick; } -GPUShader *OVERLAY_shader_armature_degrees_of_freedom(void) +GPUShader *OVERLAY_shader_armature_degrees_of_freedom_wire(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->armature_dof) { - sh_data->armature_dof = GPU_shader_create_from_arrays({ + if (!sh_data->armature_dof_wire) { + sh_data->armature_dof_wire = GPU_shader_create_from_arrays({ .vert = (const char *[]){sh_cfg->lib, datatoc_common_globals_lib_glsl, datatoc_common_view_lib_glsl, @@ -487,10 +488,31 @@ GPUShader *OVERLAY_shader_armature_degrees_of_freedom(void) NULL}, .frag = (const char *[]){datatoc_common_view_lib_glsl, datatoc_armature_wire_frag_glsl, NULL}, + .defs = (const char *[]){sh_cfg->def, "#define EDGE\n", NULL}, + }); + } + return sh_data->armature_dof_wire; +} + +GPUShader *OVERLAY_shader_armature_degrees_of_freedom_solid(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->armature_dof_solid) { + sh_data->armature_dof_solid = GPU_shader_create_from_arrays({ + .vert = (const char *[]){sh_cfg->lib, + datatoc_common_globals_lib_glsl, + datatoc_common_view_lib_glsl, + datatoc_armature_dof_vert_glsl, + NULL}, + .frag = (const char *[]){datatoc_common_view_lib_glsl, + datatoc_gpu_shader_flat_color_frag_glsl, + NULL}, .defs = (const char *[]){sh_cfg->def, NULL}, }); } - return sh_data->armature_dof; + return sh_data->armature_dof_solid; } GPUShader *OVERLAY_shader_armature_wire(void) diff --git a/source/blender/draw/engines/overlay/shaders/armature_dof_vert.glsl b/source/blender/draw/engines/overlay/shaders/armature_dof_vert.glsl index b15554bbb6a..18a80fc1fb4 100644 --- a/source/blender/draw/engines/overlay/shaders/armature_dof_vert.glsl +++ b/source/blender/draw/engines/overlay/shaders/armature_dof_vert.glsl @@ -8,8 +8,10 @@ in vec4 color; in mat4 inst_obmat; flat out vec4 finalColor; +#ifdef EDGE flat out vec2 edgeStart; noperspective out vec2 edgePos; +#endif vec3 sphere_project(float ax, float az) { @@ -35,7 +37,9 @@ void main() gl_Position = point_world_to_ndc(world_pos); finalColor = color; +#ifdef EDGE edgeStart = edgePos = ((gl_Position.xy / gl_Position.w) * 0.5 + 0.5) * sizeViewport.xy; +#endif #ifdef USE_WORLD_CLIP_PLANES world_clip_planes_calc_clip_distance(world_pos); -- cgit v1.2.3