Fix T77803: IK Degrees of freedom drawing glitch
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
This commit is contained in:
parent
dceaef92d7
commit
17ddb4c4ea
Notes:
blender-bot
2023-02-14 08:33:26 +01:00
Referenced by issue #77803, The overlay for bone ik limits has visual artifacts Referenced by issue #77348, Blender LTS: Maintenance Task 2.83
|
@ -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());
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue