[Bf-blender-cvs] [d40579c62b4] master: Overlay Engine: Fix bone outline antialiasing
Clément Foucault
noreply at git.blender.org
Thu Dec 5 16:36:46 CET 2019
Commit: d40579c62b40e2ad7d30ae4196169c3328610d41
Author: Clément Foucault
Date: Thu Dec 5 16:08:52 2019 +0100
Branches: master
https://developer.blender.org/rBd40579c62b40e2ad7d30ae4196169c3328610d41
Overlay Engine: Fix bone outline antialiasing
===================================================================
M source/blender/draw/CMakeLists.txt
M source/blender/draw/engines/overlay/overlay_armature.c
M source/blender/draw/engines/overlay/overlay_shader.c
M source/blender/draw/engines/overlay/shaders/armature_dof_vert.glsl
M source/blender/draw/engines/overlay/shaders/armature_envelope_outline_vert.glsl
M source/blender/draw/engines/overlay/shaders/armature_shape_outline_geom.glsl
M source/blender/draw/engines/overlay/shaders/armature_sphere_outline_vert.glsl
A source/blender/draw/engines/overlay/shaders/armature_wire_frag.glsl
M source/blender/draw/engines/overlay/shaders/armature_wire_vert.glsl
M source/blender/draw/intern/draw_cache.c
===================================================================
diff --git a/source/blender/draw/CMakeLists.txt b/source/blender/draw/CMakeLists.txt
index 931d8c058ce..eea34f98189 100644
--- a/source/blender/draw/CMakeLists.txt
+++ b/source/blender/draw/CMakeLists.txt
@@ -322,6 +322,7 @@ data_to_c_simple(engines/overlay/shaders/armature_sphere_solid_frag.glsl SRC)
data_to_c_simple(engines/overlay/shaders/armature_sphere_solid_vert.glsl SRC)
data_to_c_simple(engines/overlay/shaders/armature_stick_frag.glsl SRC)
data_to_c_simple(engines/overlay/shaders/armature_stick_vert.glsl SRC)
+data_to_c_simple(engines/overlay/shaders/armature_wire_frag.glsl SRC)
data_to_c_simple(engines/overlay/shaders/armature_wire_vert.glsl SRC)
data_to_c_simple(engines/overlay/shaders/depth_only_vert.glsl SRC)
data_to_c_simple(engines/overlay/shaders/edit_curve_handle_geom.glsl SRC)
diff --git a/source/blender/draw/engines/overlay/overlay_armature.c b/source/blender/draw/engines/overlay/overlay_armature.c
index 556cab39b30..4749901470f 100644
--- a/source/blender/draw/engines/overlay/overlay_armature.c
+++ b/source/blender/draw/engines/overlay/overlay_armature.c
@@ -204,12 +204,6 @@ void OVERLAY_armature_cache_init(OVERLAY_Data *vedata)
DRW_shgroup_uniform_float_copy(grp, "alpha", pd->armature.transparent ? 0.4f : 1.0f);
cb->point_solid = BUF_INSTANCE(grp, format, DRW_cache_bone_point_get());
- sh = OVERLAY_shader_armature_sphere(true);
- grp = DRW_shgroup_create(sh, armature_ps);
- DRW_shgroup_state_disable(grp, DRW_STATE_CULL_BACK);
- DRW_shgroup_uniform_block_persistent(grp, "globalsBlock", G_draw.block_ubo);
- cb->point_outline = BUF_INSTANCE(grp, format, DRW_cache_bone_point_wire_outline_get());
-
sh = OVERLAY_shader_armature_shape(false);
cb->custom_solid = grp = DRW_shgroup_create(sh, armature_ps);
DRW_shgroup_uniform_block_persistent(grp, "globalsBlock", G_draw.block_ubo);
@@ -217,9 +211,15 @@ void OVERLAY_armature_cache_init(OVERLAY_Data *vedata)
cb->box_solid = BUF_INSTANCE(grp, format, DRW_cache_bone_box_get());
cb->octa_solid = BUF_INSTANCE(grp, format, DRW_cache_bone_octahedral_get());
+ sh = OVERLAY_shader_armature_sphere(true);
+ grp = DRW_shgroup_create(sh, armature_ps);
+ DRW_shgroup_state_disable(grp, DRW_STATE_BLEND_ALPHA);
+ DRW_shgroup_uniform_block_persistent(grp, "globalsBlock", G_draw.block_ubo);
+ cb->point_outline = BUF_INSTANCE(grp, format, DRW_cache_bone_point_wire_outline_get());
+
sh = OVERLAY_shader_armature_shape(true);
cb->custom_outline = grp = DRW_shgroup_create(sh, armature_ps);
- DRW_shgroup_state_disable(grp, DRW_STATE_CULL_BACK);
+ DRW_shgroup_state_disable(grp, DRW_STATE_BLEND_ALPHA);
DRW_shgroup_uniform_block_persistent(grp, "globalsBlock", G_draw.block_ubo);
cb->box_outline = BUF_INSTANCE(grp, format, DRW_cache_bone_box_wire_get());
cb->octa_outline = BUF_INSTANCE(grp, format, DRW_cache_bone_octahedral_wire_get());
@@ -230,6 +230,7 @@ void OVERLAY_armature_cache_init(OVERLAY_Data *vedata)
sh = OVERLAY_shader_armature_degrees_of_freedom();
grp = DRW_shgroup_create(sh, armature_ps);
DRW_shgroup_uniform_block_persistent(grp, "globalsBlock", G_draw.block_ubo);
+ DRW_shgroup_state_disable(grp, DRW_STATE_BLEND_ALPHA);
cb->dof_lines = BUF_INSTANCE(grp, format, DRW_cache_bone_dof_lines_get());
grp = DRW_shgroup_create(sh, psl->armature_transp_ps);
@@ -258,7 +259,7 @@ void OVERLAY_armature_cache_init(OVERLAY_Data *vedata)
sh = OVERLAY_shader_armature_envelope(true);
grp = DRW_shgroup_create(sh, armature_ps);
- DRW_shgroup_state_disable(grp, DRW_STATE_CULL_BACK);
+ DRW_shgroup_state_disable(grp, DRW_STATE_BLEND_ALPHA);
DRW_shgroup_uniform_block_persistent(grp, "globalsBlock", G_draw.block_ubo);
cb->envelope_outline = BUF_INSTANCE(grp, format, DRW_cache_bone_envelope_outline_get());
@@ -276,6 +277,8 @@ void OVERLAY_armature_cache_init(OVERLAY_Data *vedata)
sh = OVERLAY_shader_armature_wire();
grp = DRW_shgroup_create(sh, armature_ps);
+ DRW_shgroup_state_disable(grp, DRW_STATE_BLEND_ALPHA);
+ DRW_shgroup_uniform_block_persistent(grp, "globalsBlock", G_draw.block_ubo);
cb->wire = BUF_LINE(grp, format);
}
}
@@ -2341,12 +2344,9 @@ void OVERLAY_pose_draw(OVERLAY_Data *vedata)
DRW_draw_pass(psl->armature_bone_select_ps);
if (DRW_state_is_fbo()) {
- GPU_framebuffer_bind(fbl->overlay_line_in_front_fb);
- GPU_framebuffer_clear_depth(fbl->overlay_line_in_front_fb, 1.0f);
+ GPU_framebuffer_bind(fbl->overlay_line_fb);
}
- /* Selection still works because we are drawing only the pose bones in this case. */
-
DRW_draw_pass(psl->armature_ps[1]);
}
}
\ No newline at end of file
diff --git a/source/blender/draw/engines/overlay/overlay_shader.c b/source/blender/draw/engines/overlay/overlay_shader.c
index be55d6c07c7..7ef8ca88e19 100644
--- a/source/blender/draw/engines/overlay/overlay_shader.c
+++ b/source/blender/draw/engines/overlay/overlay_shader.c
@@ -44,6 +44,7 @@ extern char datatoc_armature_sphere_solid_frag_glsl[];
extern char datatoc_armature_sphere_solid_vert_glsl[];
extern char datatoc_armature_stick_frag_glsl[];
extern char datatoc_armature_stick_vert_glsl[];
+extern char datatoc_armature_wire_frag_glsl[];
extern char datatoc_armature_wire_vert_glsl[];
extern char datatoc_depth_only_vert_glsl[];
extern char datatoc_edit_curve_handle_geom_glsl[];
@@ -296,7 +297,7 @@ GPUShader *OVERLAY_shader_armature_sphere(bool use_outline)
NULL},
.frag = (const char *[]){extensions,
datatoc_common_view_lib_glsl,
- datatoc_gpu_shader_flat_color_frag_glsl,
+ datatoc_armature_wire_frag_glsl,
NULL},
.defs = (const char *[]){sh_cfg->def, NULL},
});
@@ -334,7 +335,8 @@ GPUShader *OVERLAY_shader_armature_shape(bool use_outline)
datatoc_common_view_lib_glsl,
datatoc_armature_shape_outline_geom_glsl,
NULL},
- .frag = (const char *[]){datatoc_gpu_shader_flat_color_frag_glsl, NULL},
+ .frag =
+ (const char *[]){datatoc_common_view_lib_glsl, datatoc_armature_wire_frag_glsl, NULL},
.defs = (const char *[]){sh_cfg->def, NULL},
});
}
@@ -363,7 +365,8 @@ GPUShader *OVERLAY_shader_armature_envelope(bool use_outline)
datatoc_common_view_lib_glsl,
datatoc_armature_envelope_outline_vert_glsl,
NULL},
- .frag = (const char *[]){datatoc_gpu_shader_flat_color_frag_glsl, NULL},
+ .frag =
+ (const char *[]){datatoc_common_view_lib_glsl, datatoc_armature_wire_frag_glsl, NULL},
.defs = (const char *[]){sh_cfg->def, NULL},
});
}
@@ -407,10 +410,12 @@ GPUShader *OVERLAY_shader_armature_degrees_of_freedom(void)
if (!sh_data->armature_dof) {
sh_data->armature_dof = 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_gpu_shader_flat_color_frag_glsl, NULL},
+ .frag =
+ (const char *[]){datatoc_common_view_lib_glsl, datatoc_armature_wire_frag_glsl, NULL},
.defs = (const char *[]){sh_cfg->def, NULL},
});
}
@@ -425,10 +430,12 @@ GPUShader *OVERLAY_shader_armature_wire(void)
if (!sh_data->armature_wire) {
sh_data->armature_wire = GPU_shader_create_from_arrays({
.vert = (const char *[]){sh_cfg->lib,
+ datatoc_common_globals_lib_glsl,
datatoc_common_view_lib_glsl,
datatoc_armature_wire_vert_glsl,
NULL},
- .frag = (const char *[]){datatoc_gpu_shader_flat_color_frag_glsl, NULL},
+ .frag =
+ (const char *[]){datatoc_common_view_lib_glsl, datatoc_armature_wire_frag_glsl, NULL},
.defs = (const char *[]){sh_cfg->def, NULL},
});
}
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 371229f23ab..b15554bbb6a 100644
--- a/source/blender/draw/engines/overlay/shaders/armature_dof_vert.glsl
+++ b/source/blender/draw/engines/overlay/shaders/armature_dof_vert.glsl
@@ -8,6 +8,8 @@ in vec4 color;
in mat4 inst_obmat;
flat out vec4 finalColor;
+flat out vec2 edgeStart;
+noperspective out vec2 edgePos;
vec3 sphere_project(float ax, float az)
{
@@ -28,6 +30,14 @@ void main()
vec3 final_pos = sphere_project(pos.x * abs((pos.x > 0.0) ? amax.x : amin.x),
pos.y * abs((pos.y > 0.0) ? amax.y : amin.y));
- gl_Position = ViewProjectionMatrix * (model_mat * vec4(final_pos, 1.0));
+
+ vec3 world_pos = (model_mat * vec4(final_pos, 1.0)).xyz;
+ gl_Position = point_world_to_ndc(world_pos);
finalColor = color;
+
+ edgeStart = edgePos = ((gl_Position.xy / gl_Position.w) * 0.5 + 0.5) * sizeViewport.xy;
+
+#ifdef USE_WORLD_CLIP_PLANES
+ world_clip_planes_calc_clip_distance(world_pos);
+#endif
}
diff --git a/source/blender/draw/engines/overlay/shaders/armature_envelope_outline_vert.glsl b/source/blender/draw/engines/overlay/shaders/armature_envelope_outline_vert.glsl
index e3cc8d582d8..2260b2d3fa6 100644
--- a/source/blender/draw/engines/overlay/shaders/armature_envelope_outline_vert.glsl
+++ b/source/blender/draw/engines/overlay/shaders/armature_envelope_outline_vert.glsl
@@ -12,6 +12,8 @@ in vec4 outlineColorSize;
in vec3 xAxis;
flat out vec4 finalColor;
+flat out vec2 edgeStart;
+noperspective out vec2 edgePos;
/* project to screen space */
vec2 proj(vec4 pos)
@@ -132,33 +134,27 @@ void main()
vec3 wpos2 =
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list