From 47f146af0c9233136021dc11199b4c55acc72bf0 Mon Sep 17 00:00:00 2001 From: bonj Date: Fri, 10 Feb 2023 23:48:24 +0100 Subject: [PATCH 01/22] Add theme color for retopology overlay I went with the blue from pose mode bones, with half the alpha of selected edit mode faces. --- release/datafiles/userdef/userdef_default_theme.c | 1 + source/blender/draw/intern/draw_common.c | 1 + source/blender/draw/intern/draw_common_shader_shared.h | 2 ++ source/blender/editors/include/UI_resources.h | 1 + source/blender/editors/interface/resources.cc | 3 +++ source/blender/makesdna/DNA_userdef_types.h | 3 +-- source/blender/makesrna/intern/rna_userdef.c | 5 +++++ 7 files changed, 14 insertions(+), 2 deletions(-) diff --git a/release/datafiles/userdef/userdef_default_theme.c b/release/datafiles/userdef/userdef_default_theme.c index bfc85d15946..c3fbf4c0a82 100644 --- a/release/datafiles/userdef/userdef_default_theme.c +++ b/release/datafiles/userdef/userdef_default_theme.c @@ -329,6 +329,7 @@ const bTheme U_theme_default = { .edge_bevel = RGBA(0x00a5ffff), .face = RGBA(0xffffff02), .face_select = RGBA(0xffa5522e), + .face_retopology = RGBA(0x50c8ff17), .face_back = RGBA(0xff0000b3), .face_front = RGBA(0x0000ffb3), .face_dot = RGBA(0xff8a00ff), diff --git a/source/blender/draw/intern/draw_common.c b/source/blender/draw/intern/draw_common.c index 1f2ac850e75..98eb01e3825 100644 --- a/source/blender/draw/intern/draw_common.c +++ b/source/blender/draw/intern/draw_common.c @@ -68,6 +68,7 @@ void DRW_globals_update(void) UI_GetThemeColor4fv(TH_EDGE_FACESEL, gb->color_edge_face_select); UI_GetThemeColor4fv(TH_FACE, gb->color_face); UI_GetThemeColor4fv(TH_FACE_SELECT, gb->color_face_select); + UI_GetThemeColor4fv(TH_FACE_RETOPOLOGY, gb->color_face_retopology); UI_GetThemeColor4fv(TH_FACE_BACK, gb->color_face_back); UI_GetThemeColor4fv(TH_FACE_FRONT, gb->color_face_front); UI_GetThemeColor4fv(TH_NORMAL, gb->color_normal); diff --git a/source/blender/draw/intern/draw_common_shader_shared.h b/source/blender/draw/intern/draw_common_shader_shared.h index 96503c5a847..cece50e3575 100644 --- a/source/blender/draw/intern/draw_common_shader_shared.h +++ b/source/blender/draw/intern/draw_common_shader_shared.h @@ -48,6 +48,7 @@ struct GlobalsUboStorage { float4 color_edge_freestyle; float4 color_face; float4 color_face_select; + float4 color_face_retopology; float4 color_face_freestyle; float4 color_gpencil_vertex; float4 color_gpencil_vertex_select; @@ -164,6 +165,7 @@ BLI_STATIC_ASSERT_ALIGN(GlobalsUboStorage, 16) # define colorEdgeFreestyle globalsBlock.color_edge_freestyle # define colorFace globalsBlock.color_face # define colorFaceSelect globalsBlock.color_face_select +# define colorFaceRetopology globalsBlock.color_face_retopology # define colorFaceFreestyle globalsBlock.color_face_freestyle # define colorGpencilVertex globalsBlock.color_gpencil_vertex # define colorGpencilVertexSelect globalsBlock.color_gpencil_vertex_select diff --git a/source/blender/editors/include/UI_resources.h b/source/blender/editors/include/UI_resources.h index 9023f1662ab..b8488b9ba2f 100644 --- a/source/blender/editors/include/UI_resources.h +++ b/source/blender/editors/include/UI_resources.h @@ -87,6 +87,7 @@ typedef enum ThemeColorID { TH_EDGE_FACESEL, TH_FACE, TH_FACE_SELECT, + TH_FACE_RETOPOLOGY, TH_FACE_BACK, TH_FACE_FRONT, TH_NORMAL, diff --git a/source/blender/editors/interface/resources.cc b/source/blender/editors/interface/resources.cc index 5982f8ad1c9..7f7067619c4 100644 --- a/source/blender/editors/interface/resources.cc +++ b/source/blender/editors/interface/resources.cc @@ -393,6 +393,9 @@ const uchar *UI_ThemeGetColorPtr(bTheme *btheme, int spacetype, int colorid) case TH_FACE_SELECT: cp = ts->face_select; break; + case TH_FACE_RETOPOLOGY: + cp = ts->face_retopology; + break; case TH_FACE_BACK: cp = ts->face_back; break; diff --git a/source/blender/makesdna/DNA_userdef_types.h b/source/blender/makesdna/DNA_userdef_types.h index 01b2c0464ce..baac8bc6ee7 100644 --- a/source/blender/makesdna/DNA_userdef_types.h +++ b/source/blender/makesdna/DNA_userdef_types.h @@ -272,7 +272,7 @@ typedef struct ThemeSpace { unsigned char edge[4], edge_select[4]; unsigned char edge_seam[4], edge_sharp[4], edge_facesel[4], edge_crease[4], edge_bevel[4]; /** Solid faces. */ - unsigned char face[4], face_select[4], face_back[4], face_front[4]; + unsigned char face[4], face_select[4], face_retopology[4], face_back[4], face_front[4]; /** Selected color. */ unsigned char face_dot[4]; unsigned char extra_edge_len[4], extra_edge_angle[4], extra_face_angle[4], extra_face_area[4]; @@ -355,7 +355,6 @@ typedef struct ThemeSpace { unsigned char path_keyframe_before[4], path_keyframe_after[4]; unsigned char camera_path[4]; unsigned char camera_passepartout[4]; - unsigned char _pad1[2]; unsigned char gp_vertex_size; unsigned char gp_vertex[4], gp_vertex_select[4]; diff --git a/source/blender/makesrna/intern/rna_userdef.c b/source/blender/makesrna/intern/rna_userdef.c index f9e10a4eaf1..c2659ff38da 100644 --- a/source/blender/makesrna/intern/rna_userdef.c +++ b/source/blender/makesrna/intern/rna_userdef.c @@ -1989,6 +1989,11 @@ static void rna_def_userdef_theme_spaces_face(StructRNA *srna) RNA_def_property_ui_text(prop, "Freestyle Face Mark", ""); RNA_def_property_update(prop, 0, "rna_userdef_theme_update"); + prop = RNA_def_property(srna, "face_retopology", PROP_FLOAT, PROP_COLOR_GAMMA); + RNA_def_property_array(prop, 4); + RNA_def_property_ui_text(prop, "Face Retopology", ""); + RNA_def_property_update(prop, 0, "rna_userdef_theme_update"); + prop = RNA_def_property(srna, "face_back", PROP_FLOAT, PROP_COLOR_GAMMA); RNA_def_property_array(prop, 4); RNA_def_property_ui_text(prop, "Face Orientation Back", ""); -- 2.30.2 From f9738791a42d2b447cae7fb400547b704571c9a8 Mon Sep 17 00:00:00 2001 From: bonj Date: Fri, 10 Feb 2023 23:51:19 +0100 Subject: [PATCH 02/22] Give overlay_uniform_color its own vertex shader This is necessary because I'm making changes to the overlay_depth_only shader, which don't need to propagate to this shader. --- source/blender/draw/CMakeLists.txt | 1 + .../overlay/shaders/infos/overlay_edit_mode_info.hh | 2 +- .../overlay/shaders/overlay_uniform_color_vert.glsl | 13 +++++++++++++ 3 files changed, 15 insertions(+), 1 deletion(-) create mode 100644 source/blender/draw/engines/overlay/shaders/overlay_uniform_color_vert.glsl diff --git a/source/blender/draw/CMakeLists.txt b/source/blender/draw/CMakeLists.txt index 3560a982b90..730433dab90 100644 --- a/source/blender/draw/CMakeLists.txt +++ b/source/blender/draw/CMakeLists.txt @@ -708,6 +708,7 @@ set(GLSL_SRC engines/overlay/shaders/overlay_sculpt_mask_frag.glsl engines/overlay/shaders/overlay_sculpt_mask_vert.glsl engines/overlay/shaders/overlay_uniform_color_frag.glsl + engines/overlay/shaders/overlay_uniform_color_vert.glsl engines/overlay/shaders/overlay_varying_color.glsl engines/overlay/shaders/overlay_viewer_attribute_curve_vert.glsl engines/overlay/shaders/overlay_viewer_attribute_curves_vert.glsl diff --git a/source/blender/draw/engines/overlay/shaders/infos/overlay_edit_mode_info.hh b/source/blender/draw/engines/overlay/shaders/infos/overlay_edit_mode_info.hh index 4404eef76e4..3e5710f76e5 100644 --- a/source/blender/draw/engines/overlay/shaders/infos/overlay_edit_mode_info.hh +++ b/source/blender/draw/engines/overlay/shaders/infos/overlay_edit_mode_info.hh @@ -616,7 +616,7 @@ GPU_SHADER_CREATE_INFO(overlay_uniform_color) .vertex_in(0, Type::VEC3, "pos") .push_constant(Type::VEC4, "ucolor") .fragment_out(0, Type::VEC4, "fragColor") - .vertex_source("overlay_depth_only_vert.glsl") + .vertex_source("overlay_uniform_color_vert.glsl") .fragment_source("overlay_uniform_color_frag.glsl") .additional_info("draw_mesh"); diff --git a/source/blender/draw/engines/overlay/shaders/overlay_uniform_color_vert.glsl b/source/blender/draw/engines/overlay/shaders/overlay_uniform_color_vert.glsl new file mode 100644 index 00000000000..d403890f44e --- /dev/null +++ b/source/blender/draw/engines/overlay/shaders/overlay_uniform_color_vert.glsl @@ -0,0 +1,13 @@ + +#pragma BLENDER_REQUIRE(common_view_clipping_lib.glsl) +#pragma BLENDER_REQUIRE(common_view_lib.glsl) + +void main() +{ + GPU_INTEL_VERTEX_SHADER_WORKAROUND + + vec3 world_pos = point_object_to_world(pos); + gl_Position = point_world_to_ndc(world_pos); + + view_clipping_distances(world_pos); +} -- 2.30.2 From db70eae118a055017c93a0a21c44da0a7eae017a Mon Sep 17 00:00:00 2001 From: bonj Date: Fri, 10 Feb 2023 23:53:41 +0100 Subject: [PATCH 03/22] Add retopology bias to shaders This value will be set in the next commits; when 0 it just does nothing. --- .../engines/overlay/shaders/infos/overlay_edit_mode_info.hh | 3 +++ .../draw/engines/overlay/shaders/overlay_depth_only_vert.glsl | 3 +++ .../engines/overlay/shaders/overlay_edit_mesh_common_lib.glsl | 1 + .../draw/engines/overlay/shaders/overlay_edit_mesh_vert.glsl | 3 +++ .../overlay/shaders/overlay_edit_mesh_vert_no_geom.glsl | 4 ++++ 5 files changed, 14 insertions(+) diff --git a/source/blender/draw/engines/overlay/shaders/infos/overlay_edit_mode_info.hh b/source/blender/draw/engines/overlay/shaders/infos/overlay_edit_mode_info.hh index 3e5710f76e5..7306b80205d 100644 --- a/source/blender/draw/engines/overlay/shaders/infos/overlay_edit_mode_info.hh +++ b/source/blender/draw/engines/overlay/shaders/infos/overlay_edit_mode_info.hh @@ -18,6 +18,7 @@ GPU_SHADER_CREATE_INFO(overlay_edit_mesh_common) .push_constant(Type::BOOL, "selectFaces") .push_constant(Type::BOOL, "selectEdges") .push_constant(Type::FLOAT, "alpha") + .push_constant(Type::FLOAT, "retopologyBias") .push_constant(Type::IVEC4, "dataMask") .vertex_source("overlay_edit_mesh_vert.glsl") .additional_info("draw_modelmat", "draw_globals"); @@ -31,6 +32,7 @@ GPU_SHADER_CREATE_INFO(overlay_edit_mesh_common_no_geom) .push_constant(Type::BOOL, "selectFaces") .push_constant(Type::BOOL, "selectEdges") .push_constant(Type::FLOAT, "alpha") + .push_constant(Type::FLOAT, "retopologyBias") .push_constant(Type::IVEC4, "dataMask") .vertex_source("overlay_edit_mesh_vert_no_geom.glsl") .additional_info("draw_modelmat", "draw_globals"); @@ -597,6 +599,7 @@ GPU_SHADER_CREATE_INFO(overlay_edit_gpencil_guide_point_clipped) GPU_SHADER_CREATE_INFO(overlay_depth_only) .do_static_compilation(true) .vertex_in(0, Type::VEC3, "pos") + .push_constant(Type::FLOAT, "retopologyBias") .vertex_source("overlay_depth_only_vert.glsl") .fragment_source("overlay_depth_only_frag.glsl") .additional_info("draw_mesh"); diff --git a/source/blender/draw/engines/overlay/shaders/overlay_depth_only_vert.glsl b/source/blender/draw/engines/overlay/shaders/overlay_depth_only_vert.glsl index d403890f44e..44c7040224c 100644 --- a/source/blender/draw/engines/overlay/shaders/overlay_depth_only_vert.glsl +++ b/source/blender/draw/engines/overlay/shaders/overlay_depth_only_vert.glsl @@ -9,5 +9,8 @@ void main() vec3 world_pos = point_object_to_world(pos); gl_Position = point_world_to_ndc(world_pos); + /* Offset Z position for retopology overlay. */ + gl_Position.z -= retopologyBias / gl_Position.z; + view_clipping_distances(world_pos); } diff --git a/source/blender/draw/engines/overlay/shaders/overlay_edit_mesh_common_lib.glsl b/source/blender/draw/engines/overlay/shaders/overlay_edit_mesh_common_lib.glsl index 358a18c88d0..f61b483138e 100644 --- a/source/blender/draw/engines/overlay/shaders/overlay_edit_mesh_common_lib.glsl +++ b/source/blender/draw/engines/overlay/shaders/overlay_edit_mesh_common_lib.glsl @@ -54,6 +54,7 @@ vec4 EDIT_MESH_face_color(uint face_flag) { vec4 color = colorFace; vec4 color_active = mix(colorFaceSelect, colorEditMeshActive, 0.5); + color = (retopologyBias != 0.0) ? colorFaceRetopology : color; color = ((face_flag & FACE_FREESTYLE) != 0u) ? colorFaceFreestyle : color; color = ((face_flag & FACE_SELECTED) != 0u) ? colorFaceSelect : color; color = ((face_flag & FACE_ACTIVE) != 0u) ? color_active : color; diff --git a/source/blender/draw/engines/overlay/shaders/overlay_edit_mesh_vert.glsl b/source/blender/draw/engines/overlay/shaders/overlay_edit_mesh_vert.glsl index 2aa9b4e3ac0..1da50908bae 100644 --- a/source/blender/draw/engines/overlay/shaders/overlay_edit_mesh_vert.glsl +++ b/source/blender/draw/engines/overlay/shaders/overlay_edit_mesh_vert.glsl @@ -95,5 +95,8 @@ void main() finalColor.rgb = non_linear_blend_color(colorEditMeshMiddle.rgb, finalColor.rgb, facing); #endif + /* Offset Z position for retopology overlay. */ + gl_Position.z -= retopologyBias / gl_Position.z; + view_clipping_distances(world_pos); } diff --git a/source/blender/draw/engines/overlay/shaders/overlay_edit_mesh_vert_no_geom.glsl b/source/blender/draw/engines/overlay/shaders/overlay_edit_mesh_vert_no_geom.glsl index 33217603b95..3a408af26cb 100644 --- a/source/blender/draw/engines/overlay/shaders/overlay_edit_mesh_vert_no_geom.glsl +++ b/source/blender/draw/engines/overlay/shaders/overlay_edit_mesh_vert_no_geom.glsl @@ -143,6 +143,10 @@ void main() colorEditMeshMiddle.rgb, out_finalColor[1].rgb, facing1); #endif + /* Offset Z position for retopology overlay. */ + out_pos0.z -= retopologyBias / out_pos0.z; + out_pos1.z -= retopologyBias / out_pos1.z; + // -------- GEOM SHADER ALTERNATIVE ----------- // vec2 ss_pos[2]; -- 2.30.2 From 63f58db6aeddec737cc26bd8121cd2ee44f94785 Mon Sep 17 00:00:00 2001 From: bonj Date: Sat, 11 Feb 2023 00:11:44 +0100 Subject: [PATCH 04/22] Replace Hidden Wire with Retopology These features are functionally the same. --- scripts/startup/bl_ui/space_view3d.py | 6 ++++- .../blenloader/intern/versioning_280.c | 2 +- .../blenloader/intern/versioning_300.cc | 14 ++++++++++++ .../draw/engines/overlay/overlay_edit_mesh.cc | 22 ++++++++++++++----- source/blender/draw/intern/draw_manager.c | 3 ++- source/blender/makesdna/DNA_view3d_defaults.h | 1 + source/blender/makesdna/DNA_view3d_types.h | 4 ++-- source/blender/makesrna/intern/rna_space.c | 16 +++++++++++--- 8 files changed, 55 insertions(+), 13 deletions(-) diff --git a/scripts/startup/bl_ui/space_view3d.py b/scripts/startup/bl_ui/space_view3d.py index 682eb16dbf9..061a0d73cd4 100644 --- a/scripts/startup/bl_ui/space_view3d.py +++ b/scripts/startup/bl_ui/space_view3d.py @@ -6550,7 +6550,11 @@ class VIEW3D_PT_overlay_edit_mesh_shading(Panel): col = layout.column() col.active = display_all - col.prop(overlay, "show_occlude_wire") + row = col.row(align=True) + row.prop(overlay, "show_retopology", text="") + sub = row.row() + sub.active = overlay.show_retopology + sub.prop(overlay, "retopology_bias", text="Retopology") col.prop(overlay, "show_weight", text="Vertex Group Weights") if overlay.show_weight: diff --git a/source/blender/blenloader/intern/versioning_280.c b/source/blender/blenloader/intern/versioning_280.c index ff860677663..7647dbffcf3 100644 --- a/source/blender/blenloader/intern/versioning_280.c +++ b/source/blender/blenloader/intern/versioning_280.c @@ -2981,7 +2981,7 @@ void blo_do_versions_280(FileData *fd, Library *UNUSED(lib), Main *bmain) enum { V3D_OCCLUDE_WIRE = (1 << 14) }; View3D *v3d = (View3D *)sl; if (v3d->flag2 & V3D_OCCLUDE_WIRE) { - v3d->overlay.edit_flag |= V3D_OVERLAY_EDIT_OCCLUDE_WIRE; + v3d->overlay.edit_flag |= V3D_OVERLAY_EDIT_RETOPOLOGY; v3d->flag2 &= ~V3D_OCCLUDE_WIRE; } } diff --git a/source/blender/blenloader/intern/versioning_300.cc b/source/blender/blenloader/intern/versioning_300.cc index 59e4be70989..8ea106bee85 100644 --- a/source/blender/blenloader/intern/versioning_300.cc +++ b/source/blender/blenloader/intern/versioning_300.cc @@ -4013,6 +4013,20 @@ void blo_do_versions_300(FileData *fd, Library * /*lib*/, Main *bmain) * \note Keep this message at the bottom of the function. */ { + /* Z bias for retopology overlay. */ + if (!DNA_struct_elem_find(fd->filesdna, "View3DOverlay", "float", "retopology_bias")) { + LISTBASE_FOREACH (bScreen *, screen, &bmain->screens) { + LISTBASE_FOREACH (ScrArea *, area, &screen->areabase) { + LISTBASE_FOREACH (SpaceLink *, sl, &area->spacedata) { + if (sl->spacetype == SPACE_VIEW3D) { + View3D *v3d = (View3D *)sl; + v3d->overlay.retopology_bias = 0.2f; + } + } + } + } + } + /* Keep this block, even when empty. */ } } diff --git a/source/blender/draw/engines/overlay/overlay_edit_mesh.cc b/source/blender/draw/engines/overlay/overlay_edit_mesh.cc index 256588e56f2..165766df5a7 100644 --- a/source/blender/draw/engines/overlay/overlay_edit_mesh.cc +++ b/source/blender/draw/engines/overlay/overlay_edit_mesh.cc @@ -58,10 +58,13 @@ void OVERLAY_edit_mesh_cache_init(OVERLAY_Data *vedata) bool select_face = pd->edit_mesh.select_face = (tsettings->selectmode & SCE_SELECT_FACE) != 0; bool select_edge = pd->edit_mesh.select_edge = (tsettings->selectmode & SCE_SELECT_EDGE) != 0; - bool do_occlude_wire = (v3d->overlay.edit_flag & V3D_OVERLAY_EDIT_OCCLUDE_WIRE) != 0; bool show_face_dots = (v3d->overlay.edit_flag & V3D_OVERLAY_EDIT_FACE_DOT) != 0 || pd->edit_mesh.do_zbufclip; + float retopology_bias = ((v3d->overlay.edit_flag & V3D_OVERLAY_EDIT_RETOPOLOGY) != 0) ? + (v3d->overlay.retopology_bias * v3d->clip_start) : + 0.0; + pd->edit_mesh.do_faces = true; pd->edit_mesh.do_edges = true; @@ -94,7 +97,7 @@ void OVERLAY_edit_mesh_cache_init(OVERLAY_Data *vedata) } float backwire_opacity = (pd->edit_mesh.do_zbufclip) ? v3d->overlay.backwire_opacity : 1.0f; - float face_alpha = (do_occlude_wire || !pd->edit_mesh.do_faces) ? 0.0f : 1.0f; + float face_alpha = (!pd->edit_mesh.do_faces) ? 0.0f : 1.0f; GPUTexture **depth_tex = (pd->edit_mesh.do_zbufclip) ? &dtxl->depth : &txl->dummy_depth_tx; /* Run Twice for in-front passes. */ @@ -104,7 +107,9 @@ void OVERLAY_edit_mesh_cache_init(OVERLAY_Data *vedata) DRW_PASS_CREATE(psl->edit_mesh_depth_ps[i], state | pd->clipping_state); sh = OVERLAY_shader_depth_only(); - pd->edit_mesh_depth_grp[i] = DRW_shgroup_create(sh, psl->edit_mesh_depth_ps[i]); + grp = pd->edit_mesh_depth_grp[i] = DRW_shgroup_create(sh, psl->edit_mesh_depth_ps[i]); + DRW_shgroup_uniform_block(grp, "globalsBlock", G_draw.block_ubo); + DRW_shgroup_uniform_float_copy(grp, "retopologyBias", retopology_bias); } { /* Normals */ @@ -123,6 +128,7 @@ void OVERLAY_edit_mesh_cache_init(OVERLAY_Data *vedata) (flag & V3D_OVERLAY_EDIT_CONSTANT_SCREEN_SIZE_NORMALS) != 0); DRW_shgroup_uniform_float_copy( grp, "normalScreenSize", v3d->overlay.normals_constant_screen_size); + DRW_shgroup_uniform_float_copy(grp, "retopologyBias", retopology_bias); } { /* Mesh Analysis Pass */ @@ -156,6 +162,7 @@ void OVERLAY_edit_mesh_cache_init(OVERLAY_Data *vedata) DRW_shgroup_uniform_ivec4(grp, "dataMask", mask, 1); DRW_shgroup_uniform_float_copy(grp, "alpha", face_alpha); DRW_shgroup_uniform_bool_copy(grp, "selectFaces", select_face); + DRW_shgroup_uniform_float_copy(grp, "retopologyBias", retopology_bias); } if (do_zbufclip) { @@ -175,6 +182,7 @@ void OVERLAY_edit_mesh_cache_init(OVERLAY_Data *vedata) DRW_shgroup_uniform_texture_ref(grp, "depthTex", depth_tex); DRW_shgroup_uniform_bool_copy(grp, "selectEdges", pd->edit_mesh.do_edges || select_edge); DRW_shgroup_uniform_bool_copy(grp, "do_smooth_wire", do_smooth_wire); + DRW_shgroup_uniform_float_copy(grp, "retopologyBias", retopology_bias); /* Verts */ state |= DRW_STATE_WRITE_DEPTH; @@ -188,10 +196,12 @@ void OVERLAY_edit_mesh_cache_init(OVERLAY_Data *vedata) DRW_shgroup_uniform_float_copy(grp, "alpha", backwire_opacity); DRW_shgroup_uniform_texture_ref(grp, "depthTex", depth_tex); DRW_shgroup_uniform_ivec4_copy(grp, "dataMask", vert_mask); + DRW_shgroup_uniform_float_copy(grp, "retopologyBias", retopology_bias); sh = OVERLAY_shader_edit_mesh_skin_root(); grp = pd->edit_mesh_skin_roots_grp[i] = DRW_shgroup_create(sh, psl->edit_mesh_verts_ps[i]); DRW_shgroup_uniform_block(grp, "globalsBlock", G_draw.block_ubo); + DRW_shgroup_uniform_float_copy(grp, "retopologyBias", retopology_bias); } /* Face-dots */ if (select_face && show_face_dots) { @@ -201,6 +211,7 @@ void OVERLAY_edit_mesh_cache_init(OVERLAY_Data *vedata) DRW_shgroup_uniform_float_copy(grp, "alpha", backwire_opacity); DRW_shgroup_uniform_texture_ref(grp, "depthTex", depth_tex); DRW_shgroup_uniform_ivec4_copy(grp, "dataMask", vert_mask); + DRW_shgroup_uniform_float_copy(grp, "retopologyBias", retopology_bias); DRW_shgroup_state_enable(grp, DRW_STATE_WRITE_DEPTH); } else { @@ -263,7 +274,8 @@ void OVERLAY_edit_mesh_cache_populate(OVERLAY_Data *vedata, Object *ob) bool draw_as_solid = (ob->dt > OB_WIRE); bool do_in_front = (ob->dtx & OB_DRAW_IN_FRONT) != 0; - bool do_occlude_wire = (pd->edit_mesh.flag & V3D_OVERLAY_EDIT_OCCLUDE_WIRE) != 0; + bool show_retopology = (pd->edit_mesh.flag & V3D_OVERLAY_EDIT_RETOPOLOGY) != 0 && + pd->overlay.retopology_bias != 0.0; bool do_show_mesh_analysis = (pd->edit_mesh.flag & V3D_OVERLAY_EDIT_STATVIS) != 0; bool fnormals_do = (pd->edit_mesh.flag & V3D_OVERLAY_EDIT_FACE_NORMALS) != 0; bool vnormals_do = (pd->edit_mesh.flag & V3D_OVERLAY_EDIT_VERT_NORMALS) != 0; @@ -276,7 +288,7 @@ void OVERLAY_edit_mesh_cache_populate(OVERLAY_Data *vedata, Object *ob) } } - if (do_occlude_wire || (do_in_front && draw_as_solid)) { + if (show_retopology || (do_in_front && draw_as_solid)) { geom = DRW_cache_mesh_surface_get(ob); DRW_shgroup_call_no_cull(pd->edit_mesh_depth_grp[do_in_front], geom, ob); } diff --git a/source/blender/draw/intern/draw_manager.c b/source/blender/draw/intern/draw_manager.c index 370d2cc42e8..e45a1696327 100644 --- a/source/blender/draw/intern/draw_manager.c +++ b/source/blender/draw/intern/draw_manager.c @@ -188,7 +188,8 @@ bool DRW_object_is_renderable(const Object *ob) if (ob->type == OB_MESH) { if ((ob == DST.draw_ctx.object_edit) || DRW_object_is_in_edit_mode(ob)) { View3D *v3d = DST.draw_ctx.v3d; - if (v3d && v3d->overlay.edit_flag & V3D_OVERLAY_EDIT_OCCLUDE_WIRE) { + if (v3d && (v3d->overlay.edit_flag & V3D_OVERLAY_EDIT_RETOPOLOGY) && + v3d->overlay.retopology_bias != 0.0) { return false; } } diff --git a/source/blender/makesdna/DNA_view3d_defaults.h b/source/blender/makesdna/DNA_view3d_defaults.h index 0c0ed210a2b..7a66e3cc44e 100644 --- a/source/blender/makesdna/DNA_view3d_defaults.h +++ b/source/blender/makesdna/DNA_view3d_defaults.h @@ -39,6 +39,7 @@ .flag = V3D_OVERLAY_VIEWER_ATTRIBUTE | V3D_OVERLAY_SCULPT_SHOW_MASK | V3D_OVERLAY_SCULPT_SHOW_FACE_SETS, \ .wireframe_threshold = 1.0f, \ .wireframe_opacity = 1.0f, \ + .retopology_bias = 0.2f, \ .viewer_attribute_opacity = 1.0f, \ .xray_alpha_bone = 0.5f, \ .bone_wire_alpha = 1.0f, \ diff --git a/source/blender/makesdna/DNA_view3d_types.h b/source/blender/makesdna/DNA_view3d_types.h index fb70fe982ba..e922eeccfa1 100644 --- a/source/blender/makesdna/DNA_view3d_types.h +++ b/source/blender/makesdna/DNA_view3d_types.h @@ -214,7 +214,6 @@ typedef struct View3DOverlay { /** Armature edit/pose mode settings. */ float xray_alpha_bone; float bone_wire_alpha; - char _pad1[4]; /** Darken Inactive. */ float fade_alpha; @@ -222,6 +221,7 @@ typedef struct View3DOverlay { /** Other settings. */ float wireframe_threshold; float wireframe_opacity; + float retopology_bias; /** Grease pencil settings. */ float gpencil_paper_opacity; @@ -560,7 +560,7 @@ enum { V3D_OVERLAY_EDIT_LOOP_NORMALS = (1 << 1), V3D_OVERLAY_EDIT_FACE_NORMALS = (1 << 2), - V3D_OVERLAY_EDIT_OCCLUDE_WIRE = (1 << 3), + V3D_OVERLAY_EDIT_RETOPOLOGY = (1 << 3), V3D_OVERLAY_EDIT_WEIGHT = (1 << 4), diff --git a/source/blender/makesrna/intern/rna_space.c b/source/blender/makesrna/intern/rna_space.c index 53e5f3a21aa..ea1336e8c35 100644 --- a/source/blender/makesrna/intern/rna_space.c +++ b/source/blender/makesrna/intern/rna_space.c @@ -4527,9 +4527,19 @@ static void rna_def_space_view3d_overlay(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Show Weights", "Display weights in editmode"); RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL); - prop = RNA_def_property(srna, "show_occlude_wire", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, NULL, "overlay.edit_flag", V3D_OVERLAY_EDIT_OCCLUDE_WIRE); - RNA_def_property_ui_text(prop, "Hidden Wire", "Use hidden wireframe display"); + prop = RNA_def_property(srna, "show_retopology", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "overlay.edit_flag", V3D_OVERLAY_EDIT_RETOPOLOGY); + RNA_def_property_ui_text(prop, "Retopology", "Use retopology display"); + RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D | NS_VIEW3D_SHADING, NULL); + + prop = RNA_def_property(srna, "retopology_bias", PROP_FLOAT, PROP_FACTOR); + RNA_def_property_float_sdna(prop, NULL, "overlay.retopology_bias"); + RNA_def_property_ui_text(prop, + "Retopology Bias", + "Z Bias used to draw edit mesh in front " + "(0.0 to disable)"); + RNA_def_property_range(prop, 0.0f, 1.0f); + RNA_def_property_clear_flag(prop, PROP_ANIMATABLE); RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D | NS_VIEW3D_SHADING, NULL); prop = RNA_def_property(srna, "show_face_normals", PROP_BOOLEAN, PROP_NONE); -- 2.30.2 From 8a13e2e9db1a0a37aeb04ac84999890252dd253b Mon Sep 17 00:00:00 2001 From: bonj Date: Sat, 11 Feb 2023 15:12:12 +0100 Subject: [PATCH 05/22] Fix retopology overlay in orthographic view After a few hours of trial and error, I managed to figure out the right way to calculate the bias value for orthographic view. Also it turns out bias should divided by W instead of Z in the shaders; this fixes orthographic view, and some minor artifacts in perspective view. --- source/blender/draw/engines/overlay/overlay_edit_mesh.cc | 7 +++++-- .../engines/overlay/shaders/overlay_depth_only_vert.glsl | 2 +- .../engines/overlay/shaders/overlay_edit_mesh_vert.glsl | 2 +- .../overlay/shaders/overlay_edit_mesh_vert_no_geom.glsl | 4 ++-- 4 files changed, 9 insertions(+), 6 deletions(-) diff --git a/source/blender/draw/engines/overlay/overlay_edit_mesh.cc b/source/blender/draw/engines/overlay/overlay_edit_mesh.cc index 165766df5a7..9033c247de6 100644 --- a/source/blender/draw/engines/overlay/overlay_edit_mesh.cc +++ b/source/blender/draw/engines/overlay/overlay_edit_mesh.cc @@ -61,9 +61,12 @@ void OVERLAY_edit_mesh_cache_init(OVERLAY_Data *vedata) bool show_face_dots = (v3d->overlay.edit_flag & V3D_OVERLAY_EDIT_FACE_DOT) != 0 || pd->edit_mesh.do_zbufclip; + RegionView3D *rv3d = draw_ctx->rv3d; float retopology_bias = ((v3d->overlay.edit_flag & V3D_OVERLAY_EDIT_RETOPOLOGY) != 0) ? - (v3d->overlay.retopology_bias * v3d->clip_start) : - 0.0; + ((rv3d->is_persp) ? + (v3d->overlay.retopology_bias * v3d->clip_start) : + (v3d->overlay.retopology_bias / v3d->clip_end)) : + 0.0f; pd->edit_mesh.do_faces = true; pd->edit_mesh.do_edges = true; diff --git a/source/blender/draw/engines/overlay/shaders/overlay_depth_only_vert.glsl b/source/blender/draw/engines/overlay/shaders/overlay_depth_only_vert.glsl index 44c7040224c..87f4b77069c 100644 --- a/source/blender/draw/engines/overlay/shaders/overlay_depth_only_vert.glsl +++ b/source/blender/draw/engines/overlay/shaders/overlay_depth_only_vert.glsl @@ -10,7 +10,7 @@ void main() gl_Position = point_world_to_ndc(world_pos); /* Offset Z position for retopology overlay. */ - gl_Position.z -= retopologyBias / gl_Position.z; + gl_Position.z -= retopologyBias / abs(gl_Position.w); view_clipping_distances(world_pos); } diff --git a/source/blender/draw/engines/overlay/shaders/overlay_edit_mesh_vert.glsl b/source/blender/draw/engines/overlay/shaders/overlay_edit_mesh_vert.glsl index 1da50908bae..ee20fa43e3a 100644 --- a/source/blender/draw/engines/overlay/shaders/overlay_edit_mesh_vert.glsl +++ b/source/blender/draw/engines/overlay/shaders/overlay_edit_mesh_vert.glsl @@ -96,7 +96,7 @@ void main() #endif /* Offset Z position for retopology overlay. */ - gl_Position.z -= retopologyBias / gl_Position.z; + gl_Position.z -= retopologyBias / abs(gl_Position.w); view_clipping_distances(world_pos); } diff --git a/source/blender/draw/engines/overlay/shaders/overlay_edit_mesh_vert_no_geom.glsl b/source/blender/draw/engines/overlay/shaders/overlay_edit_mesh_vert_no_geom.glsl index 3a408af26cb..c7e60062f50 100644 --- a/source/blender/draw/engines/overlay/shaders/overlay_edit_mesh_vert_no_geom.glsl +++ b/source/blender/draw/engines/overlay/shaders/overlay_edit_mesh_vert_no_geom.glsl @@ -144,8 +144,8 @@ void main() #endif /* Offset Z position for retopology overlay. */ - out_pos0.z -= retopologyBias / out_pos0.z; - out_pos1.z -= retopologyBias / out_pos1.z; + out_pos0.z -= retopologyBias / abs(out_pos0.w); + out_pos1.z -= retopologyBias / abs(out_pos1.w); // -------- GEOM SHADER ALTERNATIVE ----------- // vec2 ss_pos[2]; -- 2.30.2 From b20eae1d95380c5fd6f645fab4055feafe19f380 Mon Sep 17 00:00:00 2001 From: bonj Date: Sat, 11 Feb 2023 17:05:23 +0100 Subject: [PATCH 06/22] Allow retopology bias to be 0 A value of 0 no longer disables the effect, and the face color code now checks for a value of -1 instead. The shaders that use the bias for math have to clamp it to positive values. --- source/blender/draw/engines/overlay/overlay_edit_mesh.cc | 5 ++--- .../engines/overlay/shaders/overlay_depth_only_vert.glsl | 2 +- .../overlay/shaders/overlay_edit_mesh_common_lib.glsl | 2 +- .../draw/engines/overlay/shaders/overlay_edit_mesh_vert.glsl | 2 +- .../overlay/shaders/overlay_edit_mesh_vert_no_geom.glsl | 4 ++-- source/blender/draw/intern/draw_manager.c | 3 +-- 6 files changed, 8 insertions(+), 10 deletions(-) diff --git a/source/blender/draw/engines/overlay/overlay_edit_mesh.cc b/source/blender/draw/engines/overlay/overlay_edit_mesh.cc index 9033c247de6..726c8df913d 100644 --- a/source/blender/draw/engines/overlay/overlay_edit_mesh.cc +++ b/source/blender/draw/engines/overlay/overlay_edit_mesh.cc @@ -66,7 +66,7 @@ void OVERLAY_edit_mesh_cache_init(OVERLAY_Data *vedata) ((rv3d->is_persp) ? (v3d->overlay.retopology_bias * v3d->clip_start) : (v3d->overlay.retopology_bias / v3d->clip_end)) : - 0.0f; + -1.0f; /* Negative value disables the effect. */ pd->edit_mesh.do_faces = true; pd->edit_mesh.do_edges = true; @@ -277,8 +277,7 @@ void OVERLAY_edit_mesh_cache_populate(OVERLAY_Data *vedata, Object *ob) bool draw_as_solid = (ob->dt > OB_WIRE); bool do_in_front = (ob->dtx & OB_DRAW_IN_FRONT) != 0; - bool show_retopology = (pd->edit_mesh.flag & V3D_OVERLAY_EDIT_RETOPOLOGY) != 0 && - pd->overlay.retopology_bias != 0.0; + bool show_retopology = (pd->edit_mesh.flag & V3D_OVERLAY_EDIT_RETOPOLOGY) != 0; bool do_show_mesh_analysis = (pd->edit_mesh.flag & V3D_OVERLAY_EDIT_STATVIS) != 0; bool fnormals_do = (pd->edit_mesh.flag & V3D_OVERLAY_EDIT_FACE_NORMALS) != 0; bool vnormals_do = (pd->edit_mesh.flag & V3D_OVERLAY_EDIT_VERT_NORMALS) != 0; diff --git a/source/blender/draw/engines/overlay/shaders/overlay_depth_only_vert.glsl b/source/blender/draw/engines/overlay/shaders/overlay_depth_only_vert.glsl index 87f4b77069c..34421d6efe7 100644 --- a/source/blender/draw/engines/overlay/shaders/overlay_depth_only_vert.glsl +++ b/source/blender/draw/engines/overlay/shaders/overlay_depth_only_vert.glsl @@ -10,7 +10,7 @@ void main() gl_Position = point_world_to_ndc(world_pos); /* Offset Z position for retopology overlay. */ - gl_Position.z -= retopologyBias / abs(gl_Position.w); + gl_Position.z -= max(0.0, retopologyBias) / abs(gl_Position.w); view_clipping_distances(world_pos); } diff --git a/source/blender/draw/engines/overlay/shaders/overlay_edit_mesh_common_lib.glsl b/source/blender/draw/engines/overlay/shaders/overlay_edit_mesh_common_lib.glsl index f61b483138e..866f437a5bd 100644 --- a/source/blender/draw/engines/overlay/shaders/overlay_edit_mesh_common_lib.glsl +++ b/source/blender/draw/engines/overlay/shaders/overlay_edit_mesh_common_lib.glsl @@ -54,7 +54,7 @@ vec4 EDIT_MESH_face_color(uint face_flag) { vec4 color = colorFace; vec4 color_active = mix(colorFaceSelect, colorEditMeshActive, 0.5); - color = (retopologyBias != 0.0) ? colorFaceRetopology : color; + color = (retopologyBias != -1.0) ? colorFaceRetopology : color; color = ((face_flag & FACE_FREESTYLE) != 0u) ? colorFaceFreestyle : color; color = ((face_flag & FACE_SELECTED) != 0u) ? colorFaceSelect : color; color = ((face_flag & FACE_ACTIVE) != 0u) ? color_active : color; diff --git a/source/blender/draw/engines/overlay/shaders/overlay_edit_mesh_vert.glsl b/source/blender/draw/engines/overlay/shaders/overlay_edit_mesh_vert.glsl index ee20fa43e3a..c673d8cdb82 100644 --- a/source/blender/draw/engines/overlay/shaders/overlay_edit_mesh_vert.glsl +++ b/source/blender/draw/engines/overlay/shaders/overlay_edit_mesh_vert.glsl @@ -96,7 +96,7 @@ void main() #endif /* Offset Z position for retopology overlay. */ - gl_Position.z -= retopologyBias / abs(gl_Position.w); + gl_Position.z -= max(0.0, retopologyBias) / abs(gl_Position.w); view_clipping_distances(world_pos); } diff --git a/source/blender/draw/engines/overlay/shaders/overlay_edit_mesh_vert_no_geom.glsl b/source/blender/draw/engines/overlay/shaders/overlay_edit_mesh_vert_no_geom.glsl index c7e60062f50..50f10519fef 100644 --- a/source/blender/draw/engines/overlay/shaders/overlay_edit_mesh_vert_no_geom.glsl +++ b/source/blender/draw/engines/overlay/shaders/overlay_edit_mesh_vert_no_geom.glsl @@ -144,8 +144,8 @@ void main() #endif /* Offset Z position for retopology overlay. */ - out_pos0.z -= retopologyBias / abs(out_pos0.w); - out_pos1.z -= retopologyBias / abs(out_pos1.w); + out_pos0.z -= max(0.0, retopologyBias) / abs(out_pos0.w); + out_pos1.z -= max(0.0, retopologyBias) / abs(out_pos1.w); // -------- GEOM SHADER ALTERNATIVE ----------- // vec2 ss_pos[2]; diff --git a/source/blender/draw/intern/draw_manager.c b/source/blender/draw/intern/draw_manager.c index e45a1696327..0b4d3e2bf35 100644 --- a/source/blender/draw/intern/draw_manager.c +++ b/source/blender/draw/intern/draw_manager.c @@ -188,8 +188,7 @@ bool DRW_object_is_renderable(const Object *ob) if (ob->type == OB_MESH) { if ((ob == DST.draw_ctx.object_edit) || DRW_object_is_in_edit_mode(ob)) { View3D *v3d = DST.draw_ctx.v3d; - if (v3d && (v3d->overlay.edit_flag & V3D_OVERLAY_EDIT_RETOPOLOGY) && - v3d->overlay.retopology_bias != 0.0) { + if (v3d && v3d->overlay.edit_flag & V3D_OVERLAY_EDIT_RETOPOLOGY) { return false; } } -- 2.30.2 From fbc35f68c4fed2b6befae5b4b740e2479cfbf1de Mon Sep 17 00:00:00 2001 From: bonj Date: Mon, 13 Feb 2023 00:22:24 +0100 Subject: [PATCH 07/22] Fix depth pass for retopology overlay When in retopology mode, the depth pass now uses the edit cage mesh, and no longer does back face culling. I've also removed the unnecessary DRW_shgroup_uniform_block line, which I previously added via careless copy pasting. --- .../draw/engines/overlay/overlay_edit_mesh.cc | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/source/blender/draw/engines/overlay/overlay_edit_mesh.cc b/source/blender/draw/engines/overlay/overlay_edit_mesh.cc index 726c8df913d..a668b25e925 100644 --- a/source/blender/draw/engines/overlay/overlay_edit_mesh.cc +++ b/source/blender/draw/engines/overlay/overlay_edit_mesh.cc @@ -62,7 +62,8 @@ void OVERLAY_edit_mesh_cache_init(OVERLAY_Data *vedata) pd->edit_mesh.do_zbufclip; RegionView3D *rv3d = draw_ctx->rv3d; - float retopology_bias = ((v3d->overlay.edit_flag & V3D_OVERLAY_EDIT_RETOPOLOGY) != 0) ? + bool show_retopology = (v3d->overlay.edit_flag & V3D_OVERLAY_EDIT_RETOPOLOGY) != 0; + float retopology_bias = (show_retopology) ? ((rv3d->is_persp) ? (v3d->overlay.retopology_bias * v3d->clip_start) : (v3d->overlay.retopology_bias / v3d->clip_end)) : @@ -106,12 +107,12 @@ void OVERLAY_edit_mesh_cache_init(OVERLAY_Data *vedata) /* Run Twice for in-front passes. */ for (int i = 0; i < 2; i++) { /* Complementary Depth Pass */ - state = DRW_STATE_WRITE_DEPTH | DRW_STATE_DEPTH_LESS_EQUAL | DRW_STATE_CULL_BACK; + state = DRW_STATE_WRITE_DEPTH | DRW_STATE_DEPTH_LESS_EQUAL | + ((show_retopology) ? DRWState(0) : DRW_STATE_CULL_BACK); DRW_PASS_CREATE(psl->edit_mesh_depth_ps[i], state | pd->clipping_state); sh = OVERLAY_shader_depth_only(); grp = pd->edit_mesh_depth_grp[i] = DRW_shgroup_create(sh, psl->edit_mesh_depth_ps[i]); - DRW_shgroup_uniform_block(grp, "globalsBlock", G_draw.block_ubo); DRW_shgroup_uniform_float_copy(grp, "retopologyBias", retopology_bias); } { @@ -290,7 +291,12 @@ void OVERLAY_edit_mesh_cache_populate(OVERLAY_Data *vedata, Object *ob) } } - if (show_retopology || (do_in_front && draw_as_solid)) { + if (show_retopology) { + Mesh *me = (Mesh *)ob->data; + geom = DRW_mesh_batch_cache_get_edit_triangles(me); + DRW_shgroup_call_no_cull(pd->edit_mesh_depth_grp[do_in_front], geom, ob); + } + else if (do_in_front && draw_as_solid) { geom = DRW_cache_mesh_surface_get(ob); DRW_shgroup_call_no_cull(pd->edit_mesh_depth_grp[do_in_front], geom, ob); } -- 2.30.2 From 2ddb9b599f2b96d7f30b9aaca1c667e2d6f17d0f Mon Sep 17 00:00:00 2001 From: bonj Date: Mon, 13 Feb 2023 13:47:12 +0100 Subject: [PATCH 08/22] Fix ThemeSpace struct padding I messed this up while fixing merge conflicts. --- source/blender/makesdna/DNA_userdef_types.h | 1 + 1 file changed, 1 insertion(+) diff --git a/source/blender/makesdna/DNA_userdef_types.h b/source/blender/makesdna/DNA_userdef_types.h index baac8bc6ee7..bd93ec199b3 100644 --- a/source/blender/makesdna/DNA_userdef_types.h +++ b/source/blender/makesdna/DNA_userdef_types.h @@ -355,6 +355,7 @@ typedef struct ThemeSpace { unsigned char path_keyframe_before[4], path_keyframe_after[4]; unsigned char camera_path[4]; unsigned char camera_passepartout[4]; + unsigned char _pad1[6]; unsigned char gp_vertex_size; unsigned char gp_vertex[4], gp_vertex_select[4]; -- 2.30.2 From a9a8878767dcaa39d93bab6cf662451f49a929c0 Mon Sep 17 00:00:00 2001 From: bonj Date: Tue, 14 Feb 2023 00:10:23 +0100 Subject: [PATCH 09/22] Use back face culling for retopology overlay It's simple and gives you a decent way to check if your faces are the right way around. --- source/blender/draw/engines/overlay/overlay_edit_mesh.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/blender/draw/engines/overlay/overlay_edit_mesh.cc b/source/blender/draw/engines/overlay/overlay_edit_mesh.cc index a668b25e925..f6cb60a791e 100644 --- a/source/blender/draw/engines/overlay/overlay_edit_mesh.cc +++ b/source/blender/draw/engines/overlay/overlay_edit_mesh.cc @@ -158,7 +158,7 @@ void OVERLAY_edit_mesh_cache_init(OVERLAY_Data *vedata) &psl->edit_mesh_faces_cage_ps[i]; DRWShadingGroup **shgrp = (j == 0) ? &pd->edit_mesh_faces_grp[i] : &pd->edit_mesh_faces_cage_grp[i]; - state = state_common; + state = state_common | ((show_retopology) ? DRW_STATE_CULL_BACK : DRWState(0)); DRW_PASS_CREATE(*edit_face_ps, state | pd->clipping_state); grp = *shgrp = DRW_shgroup_create(face_sh, *edit_face_ps); -- 2.30.2 From 0e0bf18f4d8115418026fa11386e85d87b5a3843 Mon Sep 17 00:00:00 2001 From: bonj Date: Tue, 14 Feb 2023 00:11:20 +0100 Subject: [PATCH 10/22] Lower opacity of default retopology color Since we're not changing the opacity by selection mode, this value was too opaque compared to selected / active / freestyle faces when in vertex select mode. --- release/datafiles/userdef/userdef_default_theme.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/release/datafiles/userdef/userdef_default_theme.c b/release/datafiles/userdef/userdef_default_theme.c index c3fbf4c0a82..400b759989c 100644 --- a/release/datafiles/userdef/userdef_default_theme.c +++ b/release/datafiles/userdef/userdef_default_theme.c @@ -329,7 +329,7 @@ const bTheme U_theme_default = { .edge_bevel = RGBA(0x00a5ffff), .face = RGBA(0xffffff02), .face_select = RGBA(0xffa5522e), - .face_retopology = RGBA(0x50c8ff17), + .face_retopology = RGBA(0x50c8ff0f), .face_back = RGBA(0xff0000b3), .face_front = RGBA(0x0000ffb3), .face_dot = RGBA(0xff8a00ff), -- 2.30.2 From a4124b667e600fbcf3b30e0fe60a3d4fa05c1444 Mon Sep 17 00:00:00 2001 From: bonj Date: Tue, 14 Feb 2023 01:15:30 +0100 Subject: [PATCH 11/22] Adjust retopology bias property Setting the value to 0.0 no longer disables the effect, so I removed that part of the tooltip. Very large meshes require very large bias values, so I'm upping the hard maximum to 100000, and adding a soft maximum. --- source/blender/makesrna/intern/rna_space.c | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/source/blender/makesrna/intern/rna_space.c b/source/blender/makesrna/intern/rna_space.c index ea1336e8c35..58ab04a2b2e 100644 --- a/source/blender/makesrna/intern/rna_space.c +++ b/source/blender/makesrna/intern/rna_space.c @@ -4534,11 +4534,9 @@ static void rna_def_space_view3d_overlay(BlenderRNA *brna) prop = RNA_def_property(srna, "retopology_bias", PROP_FLOAT, PROP_FACTOR); RNA_def_property_float_sdna(prop, NULL, "overlay.retopology_bias"); - RNA_def_property_ui_text(prop, - "Retopology Bias", - "Z Bias used to draw edit mesh in front " - "(0.0 to disable)"); - RNA_def_property_range(prop, 0.0f, 1.0f); + RNA_def_property_ui_text(prop, "Retopology Bias", "Z Bias used to draw edit mesh in front"); + RNA_def_property_range(prop, 0.0f, 100000.0f); + RNA_def_property_ui_range(prop, 0.0f, 1.0f, 0.1f, 3); RNA_def_property_clear_flag(prop, PROP_ANIMATABLE); RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D | NS_VIEW3D_SHADING, NULL); -- 2.30.2 From ee3ed2c15a8bf7d5437ed2ef3fa683d3ce622414 Mon Sep 17 00:00:00 2001 From: bonj Date: Tue, 14 Feb 2023 01:16:50 +0100 Subject: [PATCH 12/22] Don't update View3D Shading on bias change Because setting the value to 0 no longer disables the effect, this is no longer, necessary. I forgot to do it in the last commit. --- source/blender/makesrna/intern/rna_space.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/blender/makesrna/intern/rna_space.c b/source/blender/makesrna/intern/rna_space.c index 58ab04a2b2e..390a17989cf 100644 --- a/source/blender/makesrna/intern/rna_space.c +++ b/source/blender/makesrna/intern/rna_space.c @@ -4538,7 +4538,7 @@ static void rna_def_space_view3d_overlay(BlenderRNA *brna) RNA_def_property_range(prop, 0.0f, 100000.0f); RNA_def_property_ui_range(prop, 0.0f, 1.0f, 0.1f, 3); RNA_def_property_clear_flag(prop, PROP_ANIMATABLE); - RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D | NS_VIEW3D_SHADING, NULL); + RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL); prop = RNA_def_property(srna, "show_face_normals", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "overlay.edit_flag", V3D_OVERLAY_EDIT_FACE_NORMALS); -- 2.30.2 From d08be75414f36657c3b56d2976c22d326ca65344 Mon Sep 17 00:00:00 2001 From: bonj Date: Tue, 14 Feb 2023 14:04:30 +0100 Subject: [PATCH 13/22] Use epsilon for retopology bias Now the shader can tell whether the effect is enabled or not by comparing against zero. No longer using negative values for that means that I can remove the max calls from vertex shaders. --- source/blender/draw/engines/overlay/overlay_edit_mesh.cc | 7 ++++--- .../engines/overlay/shaders/overlay_depth_only_vert.glsl | 2 +- .../overlay/shaders/overlay_edit_mesh_common_lib.glsl | 2 +- .../engines/overlay/shaders/overlay_edit_mesh_vert.glsl | 2 +- .../overlay/shaders/overlay_edit_mesh_vert_no_geom.glsl | 4 ++-- 5 files changed, 9 insertions(+), 8 deletions(-) diff --git a/source/blender/draw/engines/overlay/overlay_edit_mesh.cc b/source/blender/draw/engines/overlay/overlay_edit_mesh.cc index f6cb60a791e..9d278d8ec3d 100644 --- a/source/blender/draw/engines/overlay/overlay_edit_mesh.cc +++ b/source/blender/draw/engines/overlay/overlay_edit_mesh.cc @@ -63,11 +63,12 @@ void OVERLAY_edit_mesh_cache_init(OVERLAY_Data *vedata) RegionView3D *rv3d = draw_ctx->rv3d; bool show_retopology = (v3d->overlay.edit_flag & V3D_OVERLAY_EDIT_RETOPOLOGY) != 0; + /* Add epsilon to ensure the value is never zero when the effect is enabled. */ float retopology_bias = (show_retopology) ? ((rv3d->is_persp) ? - (v3d->overlay.retopology_bias * v3d->clip_start) : - (v3d->overlay.retopology_bias / v3d->clip_end)) : - -1.0f; /* Negative value disables the effect. */ + (v3d->overlay.retopology_bias * v3d->clip_start + FLT_EPSILON) : + (v3d->overlay.retopology_bias / v3d->clip_end + FLT_EPSILON)) : + 0.0f; pd->edit_mesh.do_faces = true; pd->edit_mesh.do_edges = true; diff --git a/source/blender/draw/engines/overlay/shaders/overlay_depth_only_vert.glsl b/source/blender/draw/engines/overlay/shaders/overlay_depth_only_vert.glsl index 34421d6efe7..87f4b77069c 100644 --- a/source/blender/draw/engines/overlay/shaders/overlay_depth_only_vert.glsl +++ b/source/blender/draw/engines/overlay/shaders/overlay_depth_only_vert.glsl @@ -10,7 +10,7 @@ void main() gl_Position = point_world_to_ndc(world_pos); /* Offset Z position for retopology overlay. */ - gl_Position.z -= max(0.0, retopologyBias) / abs(gl_Position.w); + gl_Position.z -= retopologyBias / abs(gl_Position.w); view_clipping_distances(world_pos); } diff --git a/source/blender/draw/engines/overlay/shaders/overlay_edit_mesh_common_lib.glsl b/source/blender/draw/engines/overlay/shaders/overlay_edit_mesh_common_lib.glsl index 866f437a5bd..139d95a1449 100644 --- a/source/blender/draw/engines/overlay/shaders/overlay_edit_mesh_common_lib.glsl +++ b/source/blender/draw/engines/overlay/shaders/overlay_edit_mesh_common_lib.glsl @@ -54,7 +54,7 @@ vec4 EDIT_MESH_face_color(uint face_flag) { vec4 color = colorFace; vec4 color_active = mix(colorFaceSelect, colorEditMeshActive, 0.5); - color = (retopologyBias != -1.0) ? colorFaceRetopology : color; + color = (retopologyBias > 0.0) ? colorFaceRetopology : color; color = ((face_flag & FACE_FREESTYLE) != 0u) ? colorFaceFreestyle : color; color = ((face_flag & FACE_SELECTED) != 0u) ? colorFaceSelect : color; color = ((face_flag & FACE_ACTIVE) != 0u) ? color_active : color; diff --git a/source/blender/draw/engines/overlay/shaders/overlay_edit_mesh_vert.glsl b/source/blender/draw/engines/overlay/shaders/overlay_edit_mesh_vert.glsl index c673d8cdb82..ee20fa43e3a 100644 --- a/source/blender/draw/engines/overlay/shaders/overlay_edit_mesh_vert.glsl +++ b/source/blender/draw/engines/overlay/shaders/overlay_edit_mesh_vert.glsl @@ -96,7 +96,7 @@ void main() #endif /* Offset Z position for retopology overlay. */ - gl_Position.z -= max(0.0, retopologyBias) / abs(gl_Position.w); + gl_Position.z -= retopologyBias / abs(gl_Position.w); view_clipping_distances(world_pos); } diff --git a/source/blender/draw/engines/overlay/shaders/overlay_edit_mesh_vert_no_geom.glsl b/source/blender/draw/engines/overlay/shaders/overlay_edit_mesh_vert_no_geom.glsl index 50f10519fef..c7e60062f50 100644 --- a/source/blender/draw/engines/overlay/shaders/overlay_edit_mesh_vert_no_geom.glsl +++ b/source/blender/draw/engines/overlay/shaders/overlay_edit_mesh_vert_no_geom.glsl @@ -144,8 +144,8 @@ void main() #endif /* Offset Z position for retopology overlay. */ - out_pos0.z -= max(0.0, retopologyBias) / abs(out_pos0.w); - out_pos1.z -= max(0.0, retopologyBias) / abs(out_pos1.w); + out_pos0.z -= retopologyBias / abs(out_pos0.w); + out_pos1.z -= retopologyBias / abs(out_pos1.w); // -------- GEOM SHADER ALTERNATIVE ----------- // vec2 ss_pos[2]; -- 2.30.2 From 6f3ed2f125af3119f0f160a87c07af1993baf88e Mon Sep 17 00:00:00 2001 From: bonj Date: Tue, 14 Feb 2023 23:24:42 +0100 Subject: [PATCH 14/22] Fix shader name mess Oh boy, this is about to get confusing, so I recommend just looking at the PR's final changes instead. overlay_uniform_color_vert.glsl is renamed back to overlay_depth_only.glsl, like it was originally. overlay_uniform_color uses this vertex shader again. overlay_depth_only no longer has retopologyBias. For edit mesh I've added a new shader, overlay_edit_mesh_depth, with its own vertex shader, overlay_edit_mesh_depth_vert.glsl. I've added the necessary function, OVERLAY_shader_edit_mesh_depth, in hopefully the right places. It builds and runs fine at least. --- source/blender/draw/CMakeLists.txt | 2 +- .../draw/engines/overlay/overlay_edit_mesh.cc | 2 +- .../draw/engines/overlay/overlay_private.hh | 1 + .../draw/engines/overlay/overlay_shader.cc | 12 ++++++++++++ .../shaders/infos/overlay_edit_mode_info.hh | 15 +++++++++++++-- .../overlay/shaders/overlay_depth_only_vert.glsl | 3 --- ...ert.glsl => overlay_edit_mesh_depth_vert.glsl} | 3 +++ source/blender/draw/tests/shaders_test.cc | 1 + 8 files changed, 32 insertions(+), 7 deletions(-) rename source/blender/draw/engines/overlay/shaders/{overlay_uniform_color_vert.glsl => overlay_edit_mesh_depth_vert.glsl} (73%) diff --git a/source/blender/draw/CMakeLists.txt b/source/blender/draw/CMakeLists.txt index 730433dab90..5c4a07a6cb8 100644 --- a/source/blender/draw/CMakeLists.txt +++ b/source/blender/draw/CMakeLists.txt @@ -638,6 +638,7 @@ set(GLSL_SRC engines/overlay/shaders/overlay_edit_mesh_analysis_frag.glsl engines/overlay/shaders/overlay_edit_mesh_analysis_vert.glsl engines/overlay/shaders/overlay_edit_mesh_common_lib.glsl + engines/overlay/shaders/overlay_edit_mesh_depth_vert.glsl engines/overlay/shaders/overlay_edit_mesh_frag.glsl engines/overlay/shaders/overlay_edit_mesh_geom.glsl engines/overlay/shaders/overlay_edit_mesh_normal_vert.glsl @@ -708,7 +709,6 @@ set(GLSL_SRC engines/overlay/shaders/overlay_sculpt_mask_frag.glsl engines/overlay/shaders/overlay_sculpt_mask_vert.glsl engines/overlay/shaders/overlay_uniform_color_frag.glsl - engines/overlay/shaders/overlay_uniform_color_vert.glsl engines/overlay/shaders/overlay_varying_color.glsl engines/overlay/shaders/overlay_viewer_attribute_curve_vert.glsl engines/overlay/shaders/overlay_viewer_attribute_curves_vert.glsl diff --git a/source/blender/draw/engines/overlay/overlay_edit_mesh.cc b/source/blender/draw/engines/overlay/overlay_edit_mesh.cc index 9d278d8ec3d..2739a298102 100644 --- a/source/blender/draw/engines/overlay/overlay_edit_mesh.cc +++ b/source/blender/draw/engines/overlay/overlay_edit_mesh.cc @@ -112,7 +112,7 @@ void OVERLAY_edit_mesh_cache_init(OVERLAY_Data *vedata) ((show_retopology) ? DRWState(0) : DRW_STATE_CULL_BACK); DRW_PASS_CREATE(psl->edit_mesh_depth_ps[i], state | pd->clipping_state); - sh = OVERLAY_shader_depth_only(); + sh = OVERLAY_shader_edit_mesh_depth(); grp = pd->edit_mesh_depth_grp[i] = DRW_shgroup_create(sh, psl->edit_mesh_depth_ps[i]); DRW_shgroup_uniform_float_copy(grp, "retopologyBias", retopology_bias); } diff --git a/source/blender/draw/engines/overlay/overlay_private.hh b/source/blender/draw/engines/overlay/overlay_private.hh index b9aa77106f5..b4b1867a08f 100644 --- a/source/blender/draw/engines/overlay/overlay_private.hh +++ b/source/blender/draw/engines/overlay/overlay_private.hh @@ -730,6 +730,7 @@ GPUShader *OVERLAY_shader_edit_gpencil_wire(void); GPUShader *OVERLAY_shader_edit_lattice_point(void); GPUShader *OVERLAY_shader_edit_lattice_wire(void); GPUShader *OVERLAY_shader_edit_mesh_analysis(void); +GPUShader *OVERLAY_shader_edit_mesh_depth(void); GPUShader *OVERLAY_shader_edit_mesh_edge(bool use_flat_interp); GPUShader *OVERLAY_shader_edit_mesh_face(void); GPUShader *OVERLAY_shader_edit_mesh_facedot(void); diff --git a/source/blender/draw/engines/overlay/overlay_shader.cc b/source/blender/draw/engines/overlay/overlay_shader.cc index 2229316d295..e7297f5026d 100644 --- a/source/blender/draw/engines/overlay/overlay_shader.cc +++ b/source/blender/draw/engines/overlay/overlay_shader.cc @@ -153,6 +153,18 @@ GPUShader *OVERLAY_shader_depth_only(void) return sh_data->depth_only; } +GPUShader *OVERLAY_shader_edit_mesh_depth(void) +{ + const DRWContextState *draw_ctx = DRW_context_state_get(); + OVERLAY_Shaders *sh_data = &e_data.sh_data[draw_ctx->sh_cfg]; + if (!sh_data->depth_only) { + sh_data->depth_only = GPU_shader_create_from_info_name( + (draw_ctx->sh_cfg == GPU_SHADER_CFG_CLIPPED) ? "overlay_edit_mesh_depth_clipped" : + "overlay_edit_mesh_depth"); + } + return sh_data->depth_only; +} + GPUShader *OVERLAY_shader_edit_mesh_vert(void) { const DRWContextState *draw_ctx = DRW_context_state_get(); diff --git a/source/blender/draw/engines/overlay/shaders/infos/overlay_edit_mode_info.hh b/source/blender/draw/engines/overlay/shaders/infos/overlay_edit_mode_info.hh index 7306b80205d..6a8abbe241a 100644 --- a/source/blender/draw/engines/overlay/shaders/infos/overlay_edit_mode_info.hh +++ b/source/blender/draw/engines/overlay/shaders/infos/overlay_edit_mode_info.hh @@ -38,6 +38,18 @@ GPU_SHADER_CREATE_INFO(overlay_edit_mesh_common_no_geom) .additional_info("draw_modelmat", "draw_globals"); #endif +GPU_SHADER_CREATE_INFO(overlay_edit_mesh_depth) + .do_static_compilation(true) + .vertex_in(0, Type::VEC3, "pos") + .push_constant(Type::FLOAT, "retopologyBias") + .vertex_source("overlay_edit_mesh_depth_vert.glsl") + .fragment_source("overlay_depth_only_frag.glsl") + .additional_info("draw_mesh"); + +GPU_SHADER_CREATE_INFO(overlay_edit_mesh_depth_clipped) + .do_static_compilation(true) + .additional_info("overlay_edit_mesh_depth", "drw_clipped"); + GPU_SHADER_INTERFACE_INFO(overlay_edit_mesh_vert_iface, "") .smooth(Type::VEC4, "finalColor") .smooth(Type::FLOAT, "vertexCrease"); @@ -599,7 +611,6 @@ GPU_SHADER_CREATE_INFO(overlay_edit_gpencil_guide_point_clipped) GPU_SHADER_CREATE_INFO(overlay_depth_only) .do_static_compilation(true) .vertex_in(0, Type::VEC3, "pos") - .push_constant(Type::FLOAT, "retopologyBias") .vertex_source("overlay_depth_only_vert.glsl") .fragment_source("overlay_depth_only_frag.glsl") .additional_info("draw_mesh"); @@ -619,7 +630,7 @@ GPU_SHADER_CREATE_INFO(overlay_uniform_color) .vertex_in(0, Type::VEC3, "pos") .push_constant(Type::VEC4, "ucolor") .fragment_out(0, Type::VEC4, "fragColor") - .vertex_source("overlay_uniform_color_vert.glsl") + .vertex_source("overlay_depth_only_vert.glsl") .fragment_source("overlay_uniform_color_frag.glsl") .additional_info("draw_mesh"); diff --git a/source/blender/draw/engines/overlay/shaders/overlay_depth_only_vert.glsl b/source/blender/draw/engines/overlay/shaders/overlay_depth_only_vert.glsl index 87f4b77069c..d403890f44e 100644 --- a/source/blender/draw/engines/overlay/shaders/overlay_depth_only_vert.glsl +++ b/source/blender/draw/engines/overlay/shaders/overlay_depth_only_vert.glsl @@ -9,8 +9,5 @@ void main() vec3 world_pos = point_object_to_world(pos); gl_Position = point_world_to_ndc(world_pos); - /* Offset Z position for retopology overlay. */ - gl_Position.z -= retopologyBias / abs(gl_Position.w); - view_clipping_distances(world_pos); } diff --git a/source/blender/draw/engines/overlay/shaders/overlay_uniform_color_vert.glsl b/source/blender/draw/engines/overlay/shaders/overlay_edit_mesh_depth_vert.glsl similarity index 73% rename from source/blender/draw/engines/overlay/shaders/overlay_uniform_color_vert.glsl rename to source/blender/draw/engines/overlay/shaders/overlay_edit_mesh_depth_vert.glsl index d403890f44e..87f4b77069c 100644 --- a/source/blender/draw/engines/overlay/shaders/overlay_uniform_color_vert.glsl +++ b/source/blender/draw/engines/overlay/shaders/overlay_edit_mesh_depth_vert.glsl @@ -9,5 +9,8 @@ void main() vec3 world_pos = point_object_to_world(pos); gl_Position = point_world_to_ndc(world_pos); + /* Offset Z position for retopology overlay. */ + gl_Position.z -= retopologyBias / abs(gl_Position.w); + view_clipping_distances(world_pos); } diff --git a/source/blender/draw/tests/shaders_test.cc b/source/blender/draw/tests/shaders_test.cc index f238c7e25b1..b326f5dfa0c 100644 --- a/source/blender/draw/tests/shaders_test.cc +++ b/source/blender/draw/tests/shaders_test.cc @@ -219,6 +219,7 @@ static void test_overlay_glsl_shaders() EXPECT_NE(OVERLAY_shader_edit_lattice_point(), nullptr); EXPECT_NE(OVERLAY_shader_edit_lattice_wire(), nullptr); EXPECT_NE(OVERLAY_shader_edit_mesh_analysis(), nullptr); + EXPECT_NE(OVERLAY_shader_edit_mesh_depth(), nullptr); EXPECT_NE(OVERLAY_shader_edit_mesh_edge(false), nullptr); EXPECT_NE(OVERLAY_shader_edit_mesh_edge(true), nullptr); EXPECT_NE(OVERLAY_shader_edit_mesh_face(), nullptr); -- 2.30.2 From 7aa7153b727d958ee8bc8da6ef7e6aaeaad96aa9 Mon Sep 17 00:00:00 2001 From: bonj Date: Sun, 19 Feb 2023 18:40:20 +0100 Subject: [PATCH 15/22] Fix overlay_edit_mesh_depth bug This is what happens when you copy paste without reading carefully. This shader was sharing a variable with the regular overlay_depth_only shader, so whichever was used first during a session would be used for both. Now it has its own variable, so the shaders don't interfere with each other anymore. --- source/blender/draw/engines/overlay/overlay_shader.cc | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/source/blender/draw/engines/overlay/overlay_shader.cc b/source/blender/draw/engines/overlay/overlay_shader.cc index e7297f5026d..b716f3e0e0e 100644 --- a/source/blender/draw/engines/overlay/overlay_shader.cc +++ b/source/blender/draw/engines/overlay/overlay_shader.cc @@ -40,6 +40,7 @@ struct OVERLAY_Shaders { GPUShader *edit_mesh_vert; GPUShader *edit_mesh_edge; GPUShader *edit_mesh_edge_flat; + GPUShader *edit_mesh_depth; GPUShader *edit_mesh_face; GPUShader *edit_mesh_facedot; GPUShader *edit_mesh_skin_root; @@ -157,12 +158,12 @@ GPUShader *OVERLAY_shader_edit_mesh_depth(void) { const DRWContextState *draw_ctx = DRW_context_state_get(); OVERLAY_Shaders *sh_data = &e_data.sh_data[draw_ctx->sh_cfg]; - if (!sh_data->depth_only) { - sh_data->depth_only = GPU_shader_create_from_info_name( + if (!sh_data->edit_mesh_depth) { + sh_data->edit_mesh_depth = GPU_shader_create_from_info_name( (draw_ctx->sh_cfg == GPU_SHADER_CFG_CLIPPED) ? "overlay_edit_mesh_depth_clipped" : "overlay_edit_mesh_depth"); } - return sh_data->depth_only; + return sh_data->edit_mesh_depth; } GPUShader *OVERLAY_shader_edit_mesh_vert(void) -- 2.30.2 From ad07bd69317fc15b25002fd89c2ad17f01afb1f4 Mon Sep 17 00:00:00 2001 From: bonj Date: Sun, 26 Feb 2023 14:19:38 +0100 Subject: [PATCH 16/22] Use new and improved math for retopology offset The clip distances no longer need to be factored in on the C++ side, so that simplifies how bias is calculated. I've added a new function to the common_view_lib, which uses math I found in a neat PDF for perspective, and math I came up with through a little trial and error for orthographic. The shaders that use retopology bias now have an extra step to get the view position, but that was being calculated to get the homogenous position anyway so it's just an extra variable. The offset is done at the start of the vertex shader now instead of the end; I think it makes sense because the offset it does is usually much larger than anything that comes after. --- .../draw/engines/overlay/overlay_edit_mesh.cc | 6 +----- .../shaders/overlay_edit_mesh_depth_vert.glsl | 5 +++-- .../overlay/shaders/overlay_edit_mesh_vert.glsl | 9 +++++---- .../shaders/overlay_edit_mesh_vert_no_geom.glsl | 15 +++++++++------ .../draw/intern/shaders/common_view_lib.glsl | 15 +++++++++++++++ 5 files changed, 33 insertions(+), 17 deletions(-) diff --git a/source/blender/draw/engines/overlay/overlay_edit_mesh.cc b/source/blender/draw/engines/overlay/overlay_edit_mesh.cc index 2739a298102..3dcbedf43e5 100644 --- a/source/blender/draw/engines/overlay/overlay_edit_mesh.cc +++ b/source/blender/draw/engines/overlay/overlay_edit_mesh.cc @@ -64,11 +64,7 @@ void OVERLAY_edit_mesh_cache_init(OVERLAY_Data *vedata) RegionView3D *rv3d = draw_ctx->rv3d; bool show_retopology = (v3d->overlay.edit_flag & V3D_OVERLAY_EDIT_RETOPOLOGY) != 0; /* Add epsilon to ensure the value is never zero when the effect is enabled. */ - float retopology_bias = (show_retopology) ? - ((rv3d->is_persp) ? - (v3d->overlay.retopology_bias * v3d->clip_start + FLT_EPSILON) : - (v3d->overlay.retopology_bias / v3d->clip_end + FLT_EPSILON)) : - 0.0f; + float retopology_bias = (show_retopology) ? (v3d->overlay.retopology_bias + FLT_EPSILON) : 0.0f; pd->edit_mesh.do_faces = true; pd->edit_mesh.do_edges = true; diff --git a/source/blender/draw/engines/overlay/shaders/overlay_edit_mesh_depth_vert.glsl b/source/blender/draw/engines/overlay/shaders/overlay_edit_mesh_depth_vert.glsl index 87f4b77069c..fda6656d8f1 100644 --- a/source/blender/draw/engines/overlay/shaders/overlay_edit_mesh_depth_vert.glsl +++ b/source/blender/draw/engines/overlay/shaders/overlay_edit_mesh_depth_vert.glsl @@ -7,10 +7,11 @@ void main() GPU_INTEL_VERTEX_SHADER_WORKAROUND vec3 world_pos = point_object_to_world(pos); - gl_Position = point_world_to_ndc(world_pos); + vec3 view_pos = point_world_to_view(world_pos); + gl_Position = point_view_to_ndc(view_pos); /* Offset Z position for retopology overlay. */ - gl_Position.z -= retopologyBias / abs(gl_Position.w); + gl_Position.z -= get_homogenous_z_offset(view_pos.z, gl_Position.w, retopologyBias); view_clipping_distances(world_pos); } diff --git a/source/blender/draw/engines/overlay/shaders/overlay_edit_mesh_vert.glsl b/source/blender/draw/engines/overlay/shaders/overlay_edit_mesh_vert.glsl index ee20fa43e3a..3da2b74839a 100644 --- a/source/blender/draw/engines/overlay/shaders/overlay_edit_mesh_vert.glsl +++ b/source/blender/draw/engines/overlay/shaders/overlay_edit_mesh_vert.glsl @@ -29,7 +29,11 @@ void main() GPU_INTEL_VERTEX_SHADER_WORKAROUND vec3 world_pos = point_object_to_world(pos); - gl_Position = point_world_to_ndc(world_pos); + vec3 view_pos = point_world_to_view(world_pos); + gl_Position = point_view_to_ndc(view_pos); + + /* Offset Z position for retopology overlay. */ + gl_Position.z -= get_homogenous_z_offset(view_pos.z, gl_Position.w, retopologyBias); uvec4 m_data = data & uvec4(dataMask); @@ -95,8 +99,5 @@ void main() finalColor.rgb = non_linear_blend_color(colorEditMeshMiddle.rgb, finalColor.rgb, facing); #endif - /* Offset Z position for retopology overlay. */ - gl_Position.z -= retopologyBias / abs(gl_Position.w); - view_clipping_distances(world_pos); } diff --git a/source/blender/draw/engines/overlay/shaders/overlay_edit_mesh_vert_no_geom.glsl b/source/blender/draw/engines/overlay/shaders/overlay_edit_mesh_vert_no_geom.glsl index c7e60062f50..4cd208bec74 100644 --- a/source/blender/draw/engines/overlay/shaders/overlay_edit_mesh_vert_no_geom.glsl +++ b/source/blender/draw/engines/overlay/shaders/overlay_edit_mesh_vert_no_geom.glsl @@ -82,8 +82,15 @@ void main() vec3 world_pos0 = point_object_to_world(in_pos0); vec3 world_pos1 = point_object_to_world(in_pos1); - vec4 out_pos0 = point_world_to_ndc(world_pos0); - vec4 out_pos1 = point_world_to_ndc(world_pos1); + vec3 view_pos0 = point_world_to_view(world_pos0); + vec3 view_pos1 = point_world_to_view(world_pos1); + vec4 out_pos0 = point_view_to_ndc(view_pos0); + vec4 out_pos1 = point_view_to_ndc(view_pos1); + + /* Offset Z position for retopology overlay. */ + out_pos0.z -= get_homogenous_z_offset(view_pos0.z, out_pos0.w, retopologyBias); + out_pos1.z -= get_homogenous_z_offset(view_pos1.z, out_pos1.w, retopologyBias); + uvec4 m_data0 = uvec4(in_data0) & uvec4(dataMask); uvec4 m_data1 = uvec4(in_data1) & uvec4(dataMask); @@ -143,10 +150,6 @@ void main() colorEditMeshMiddle.rgb, out_finalColor[1].rgb, facing1); #endif - /* Offset Z position for retopology overlay. */ - out_pos0.z -= retopologyBias / abs(out_pos0.w); - out_pos1.z -= retopologyBias / abs(out_pos1.w); - // -------- GEOM SHADER ALTERNATIVE ----------- // vec2 ss_pos[2]; diff --git a/source/blender/draw/intern/shaders/common_view_lib.glsl b/source/blender/draw/intern/shaders/common_view_lib.glsl index 53ef194b4f5..e88d91b6936 100644 --- a/source/blender/draw/intern/shaders/common_view_lib.glsl +++ b/source/blender/draw/intern/shaders/common_view_lib.glsl @@ -257,6 +257,21 @@ vec3 point_world_to_view(vec3 p) return (ViewMatrix * vec4(p, 1.0)).xyz; } +/* From "Projection Matrix Tricks" by Eric Lengyel: + * http://www.terathon.com/gdc07_lengyel.pdf (p. 18 Depth Modification) + * + * View Z is used to adjust for perspective projection. + * Homogenous W is used to convert from NDC to homogenous space. */ +float get_homogenous_z_offset(float vs_z, float hs_w, float offset) +{ + if (ProjectionMatrix[3][3] == 0.0) { + return -ProjectionMatrix[3][2] * (offset / (vs_z * (vs_z + offset))) * hs_w; + } + else { + return -ProjectionMatrix[2][2] * offset * hs_w; + } +} + /* Due to some shader compiler bug, we somewhat need to access gl_VertexID * to make vertex shaders work. even if it's actually dead code. */ #if defined(GPU_INTEL) && defined(GPU_OPENGL) -- 2.30.2 From 2762fd7b8d8cb859519d06938541f9b9ee29415d Mon Sep 17 00:00:00 2001 From: bonj Date: Sun, 26 Feb 2023 22:51:24 +0100 Subject: [PATCH 17/22] Implement retopology overlay requests The bias property is now called offset, not just in the UI but everywhere, because I like consistency. get_homogenous_z_offset no longer negates its output, and has some more documentation. The offset property is now of distance type, because it is a viewspace offset. To make this more clear the soft max is increased to 10. Because there's no point in arbitrarily limiting the values users can input, the hard max is FLT_MAX now. I kept step the same, because it good the way it is. --- scripts/startup/bl_ui/space_view3d.py | 2 +- .../blenloader/intern/versioning_300.cc | 4 +-- .../draw/engines/overlay/overlay_edit_mesh.cc | 34 +++++++++++++------ .../shaders/infos/overlay_edit_mode_info.hh | 6 ++-- .../shaders/overlay_edit_mesh_common_lib.glsl | 2 +- .../shaders/overlay_edit_mesh_depth_vert.glsl | 2 +- .../shaders/overlay_edit_mesh_vert.glsl | 2 +- .../overlay_edit_mesh_vert_no_geom.glsl | 4 +-- .../draw/intern/shaders/common_view_lib.glsl | 14 ++++---- source/blender/makesdna/DNA_view3d_defaults.h | 2 +- source/blender/makesdna/DNA_view3d_types.h | 2 +- source/blender/makesrna/intern/rna_space.c | 11 +++--- 12 files changed, 49 insertions(+), 36 deletions(-) diff --git a/scripts/startup/bl_ui/space_view3d.py b/scripts/startup/bl_ui/space_view3d.py index 061a0d73cd4..be6062a3322 100644 --- a/scripts/startup/bl_ui/space_view3d.py +++ b/scripts/startup/bl_ui/space_view3d.py @@ -6554,7 +6554,7 @@ class VIEW3D_PT_overlay_edit_mesh_shading(Panel): row.prop(overlay, "show_retopology", text="") sub = row.row() sub.active = overlay.show_retopology - sub.prop(overlay, "retopology_bias", text="Retopology") + sub.prop(overlay, "retopology_offset", text="Retopology") col.prop(overlay, "show_weight", text="Vertex Group Weights") if overlay.show_weight: diff --git a/source/blender/blenloader/intern/versioning_300.cc b/source/blender/blenloader/intern/versioning_300.cc index 8ea106bee85..afe7cd00bcc 100644 --- a/source/blender/blenloader/intern/versioning_300.cc +++ b/source/blender/blenloader/intern/versioning_300.cc @@ -4014,13 +4014,13 @@ void blo_do_versions_300(FileData *fd, Library * /*lib*/, Main *bmain) */ { /* Z bias for retopology overlay. */ - if (!DNA_struct_elem_find(fd->filesdna, "View3DOverlay", "float", "retopology_bias")) { + if (!DNA_struct_elem_find(fd->filesdna, "View3DOverlay", "float", "retopology_offset")) { LISTBASE_FOREACH (bScreen *, screen, &bmain->screens) { LISTBASE_FOREACH (ScrArea *, area, &screen->areabase) { LISTBASE_FOREACH (SpaceLink *, sl, &area->spacedata) { if (sl->spacetype == SPACE_VIEW3D) { View3D *v3d = (View3D *)sl; - v3d->overlay.retopology_bias = 0.2f; + v3d->overlay.retopology_offset = 0.2f; } } } diff --git a/source/blender/draw/engines/overlay/overlay_edit_mesh.cc b/source/blender/draw/engines/overlay/overlay_edit_mesh.cc index 3dcbedf43e5..0552cdc3f2b 100644 --- a/source/blender/draw/engines/overlay/overlay_edit_mesh.cc +++ b/source/blender/draw/engines/overlay/overlay_edit_mesh.cc @@ -64,7 +64,8 @@ void OVERLAY_edit_mesh_cache_init(OVERLAY_Data *vedata) RegionView3D *rv3d = draw_ctx->rv3d; bool show_retopology = (v3d->overlay.edit_flag & V3D_OVERLAY_EDIT_RETOPOLOGY) != 0; /* Add epsilon to ensure the value is never zero when the effect is enabled. */ - float retopology_bias = (show_retopology) ? (v3d->overlay.retopology_bias + FLT_EPSILON) : 0.0f; + float retopology_offset = (show_retopology) ? (v3d->overlay.retopology_offset + FLT_EPSILON) : + 0.0f; pd->edit_mesh.do_faces = true; pd->edit_mesh.do_edges = true; @@ -104,13 +105,18 @@ void OVERLAY_edit_mesh_cache_init(OVERLAY_Data *vedata) /* Run Twice for in-front passes. */ for (int i = 0; i < 2; i++) { /* Complementary Depth Pass */ - state = DRW_STATE_WRITE_DEPTH | DRW_STATE_DEPTH_LESS_EQUAL | - ((show_retopology) ? DRWState(0) : DRW_STATE_CULL_BACK); + state = DRW_STATE_WRITE_DEPTH | DRW_STATE_DEPTH_LESS_EQUAL | DRW_STATE_CULL_BACK; + if (show_retopology) { + /* Do not cull backfaces for retopology depth pass. + * This prevents edit overlays from appearing behind any faces. + * Doing so reduces visual clutter. */ + state &= ~DRW_STATE_CULL_BACK; + } DRW_PASS_CREATE(psl->edit_mesh_depth_ps[i], state | pd->clipping_state); sh = OVERLAY_shader_edit_mesh_depth(); grp = pd->edit_mesh_depth_grp[i] = DRW_shgroup_create(sh, psl->edit_mesh_depth_ps[i]); - DRW_shgroup_uniform_float_copy(grp, "retopologyBias", retopology_bias); + DRW_shgroup_uniform_float_copy(grp, "retopologyOffset", retopology_offset); } { /* Normals */ @@ -129,7 +135,7 @@ void OVERLAY_edit_mesh_cache_init(OVERLAY_Data *vedata) (flag & V3D_OVERLAY_EDIT_CONSTANT_SCREEN_SIZE_NORMALS) != 0); DRW_shgroup_uniform_float_copy( grp, "normalScreenSize", v3d->overlay.normals_constant_screen_size); - DRW_shgroup_uniform_float_copy(grp, "retopologyBias", retopology_bias); + DRW_shgroup_uniform_float_copy(grp, "retopologyOffset", retopology_offset); } { /* Mesh Analysis Pass */ @@ -155,7 +161,13 @@ void OVERLAY_edit_mesh_cache_init(OVERLAY_Data *vedata) &psl->edit_mesh_faces_cage_ps[i]; DRWShadingGroup **shgrp = (j == 0) ? &pd->edit_mesh_faces_grp[i] : &pd->edit_mesh_faces_cage_grp[i]; - state = state_common | ((show_retopology) ? DRW_STATE_CULL_BACK : DRWState(0)); + state = state_common; + if (show_retopology) { + /* Cull backfaces for retopology face pass. + * This makes it so backfaces are not drawn. + * Doing so lets us distinguish backfaces from frontfaces. */ + state |= DRW_STATE_CULL_BACK; + } DRW_PASS_CREATE(*edit_face_ps, state | pd->clipping_state); grp = *shgrp = DRW_shgroup_create(face_sh, *edit_face_ps); @@ -163,7 +175,7 @@ void OVERLAY_edit_mesh_cache_init(OVERLAY_Data *vedata) DRW_shgroup_uniform_ivec4(grp, "dataMask", mask, 1); DRW_shgroup_uniform_float_copy(grp, "alpha", face_alpha); DRW_shgroup_uniform_bool_copy(grp, "selectFaces", select_face); - DRW_shgroup_uniform_float_copy(grp, "retopologyBias", retopology_bias); + DRW_shgroup_uniform_float_copy(grp, "retopologyOffset", retopology_offset); } if (do_zbufclip) { @@ -183,7 +195,7 @@ void OVERLAY_edit_mesh_cache_init(OVERLAY_Data *vedata) DRW_shgroup_uniform_texture_ref(grp, "depthTex", depth_tex); DRW_shgroup_uniform_bool_copy(grp, "selectEdges", pd->edit_mesh.do_edges || select_edge); DRW_shgroup_uniform_bool_copy(grp, "do_smooth_wire", do_smooth_wire); - DRW_shgroup_uniform_float_copy(grp, "retopologyBias", retopology_bias); + DRW_shgroup_uniform_float_copy(grp, "retopologyOffset", retopology_offset); /* Verts */ state |= DRW_STATE_WRITE_DEPTH; @@ -197,12 +209,12 @@ void OVERLAY_edit_mesh_cache_init(OVERLAY_Data *vedata) DRW_shgroup_uniform_float_copy(grp, "alpha", backwire_opacity); DRW_shgroup_uniform_texture_ref(grp, "depthTex", depth_tex); DRW_shgroup_uniform_ivec4_copy(grp, "dataMask", vert_mask); - DRW_shgroup_uniform_float_copy(grp, "retopologyBias", retopology_bias); + DRW_shgroup_uniform_float_copy(grp, "retopologyOffset", retopology_offset); sh = OVERLAY_shader_edit_mesh_skin_root(); grp = pd->edit_mesh_skin_roots_grp[i] = DRW_shgroup_create(sh, psl->edit_mesh_verts_ps[i]); DRW_shgroup_uniform_block(grp, "globalsBlock", G_draw.block_ubo); - DRW_shgroup_uniform_float_copy(grp, "retopologyBias", retopology_bias); + DRW_shgroup_uniform_float_copy(grp, "retopologyOffset", retopology_offset); } /* Face-dots */ if (select_face && show_face_dots) { @@ -212,7 +224,7 @@ void OVERLAY_edit_mesh_cache_init(OVERLAY_Data *vedata) DRW_shgroup_uniform_float_copy(grp, "alpha", backwire_opacity); DRW_shgroup_uniform_texture_ref(grp, "depthTex", depth_tex); DRW_shgroup_uniform_ivec4_copy(grp, "dataMask", vert_mask); - DRW_shgroup_uniform_float_copy(grp, "retopologyBias", retopology_bias); + DRW_shgroup_uniform_float_copy(grp, "retopologyOffset", retopology_offset); DRW_shgroup_state_enable(grp, DRW_STATE_WRITE_DEPTH); } else { diff --git a/source/blender/draw/engines/overlay/shaders/infos/overlay_edit_mode_info.hh b/source/blender/draw/engines/overlay/shaders/infos/overlay_edit_mode_info.hh index 6a8abbe241a..cc6ae57a60e 100644 --- a/source/blender/draw/engines/overlay/shaders/infos/overlay_edit_mode_info.hh +++ b/source/blender/draw/engines/overlay/shaders/infos/overlay_edit_mode_info.hh @@ -18,7 +18,7 @@ GPU_SHADER_CREATE_INFO(overlay_edit_mesh_common) .push_constant(Type::BOOL, "selectFaces") .push_constant(Type::BOOL, "selectEdges") .push_constant(Type::FLOAT, "alpha") - .push_constant(Type::FLOAT, "retopologyBias") + .push_constant(Type::FLOAT, "retopologyOffset") .push_constant(Type::IVEC4, "dataMask") .vertex_source("overlay_edit_mesh_vert.glsl") .additional_info("draw_modelmat", "draw_globals"); @@ -32,7 +32,7 @@ GPU_SHADER_CREATE_INFO(overlay_edit_mesh_common_no_geom) .push_constant(Type::BOOL, "selectFaces") .push_constant(Type::BOOL, "selectEdges") .push_constant(Type::FLOAT, "alpha") - .push_constant(Type::FLOAT, "retopologyBias") + .push_constant(Type::FLOAT, "retopologyOffset") .push_constant(Type::IVEC4, "dataMask") .vertex_source("overlay_edit_mesh_vert_no_geom.glsl") .additional_info("draw_modelmat", "draw_globals"); @@ -41,7 +41,7 @@ GPU_SHADER_CREATE_INFO(overlay_edit_mesh_common_no_geom) GPU_SHADER_CREATE_INFO(overlay_edit_mesh_depth) .do_static_compilation(true) .vertex_in(0, Type::VEC3, "pos") - .push_constant(Type::FLOAT, "retopologyBias") + .push_constant(Type::FLOAT, "retopologyOffset") .vertex_source("overlay_edit_mesh_depth_vert.glsl") .fragment_source("overlay_depth_only_frag.glsl") .additional_info("draw_mesh"); diff --git a/source/blender/draw/engines/overlay/shaders/overlay_edit_mesh_common_lib.glsl b/source/blender/draw/engines/overlay/shaders/overlay_edit_mesh_common_lib.glsl index 139d95a1449..293a5548bab 100644 --- a/source/blender/draw/engines/overlay/shaders/overlay_edit_mesh_common_lib.glsl +++ b/source/blender/draw/engines/overlay/shaders/overlay_edit_mesh_common_lib.glsl @@ -54,7 +54,7 @@ vec4 EDIT_MESH_face_color(uint face_flag) { vec4 color = colorFace; vec4 color_active = mix(colorFaceSelect, colorEditMeshActive, 0.5); - color = (retopologyBias > 0.0) ? colorFaceRetopology : color; + color = (retopologyOffset > 0.0) ? colorFaceRetopology : color; color = ((face_flag & FACE_FREESTYLE) != 0u) ? colorFaceFreestyle : color; color = ((face_flag & FACE_SELECTED) != 0u) ? colorFaceSelect : color; color = ((face_flag & FACE_ACTIVE) != 0u) ? color_active : color; diff --git a/source/blender/draw/engines/overlay/shaders/overlay_edit_mesh_depth_vert.glsl b/source/blender/draw/engines/overlay/shaders/overlay_edit_mesh_depth_vert.glsl index fda6656d8f1..12747c1ba09 100644 --- a/source/blender/draw/engines/overlay/shaders/overlay_edit_mesh_depth_vert.glsl +++ b/source/blender/draw/engines/overlay/shaders/overlay_edit_mesh_depth_vert.glsl @@ -11,7 +11,7 @@ void main() gl_Position = point_view_to_ndc(view_pos); /* Offset Z position for retopology overlay. */ - gl_Position.z -= get_homogenous_z_offset(view_pos.z, gl_Position.w, retopologyBias); + gl_Position.z += get_homogenous_z_offset(view_pos.z, gl_Position.w, retopologyOffset); view_clipping_distances(world_pos); } diff --git a/source/blender/draw/engines/overlay/shaders/overlay_edit_mesh_vert.glsl b/source/blender/draw/engines/overlay/shaders/overlay_edit_mesh_vert.glsl index 3da2b74839a..aea7218c10c 100644 --- a/source/blender/draw/engines/overlay/shaders/overlay_edit_mesh_vert.glsl +++ b/source/blender/draw/engines/overlay/shaders/overlay_edit_mesh_vert.glsl @@ -33,7 +33,7 @@ void main() gl_Position = point_view_to_ndc(view_pos); /* Offset Z position for retopology overlay. */ - gl_Position.z -= get_homogenous_z_offset(view_pos.z, gl_Position.w, retopologyBias); + gl_Position.z += get_homogenous_z_offset(view_pos.z, gl_Position.w, retopologyOffset); uvec4 m_data = data & uvec4(dataMask); diff --git a/source/blender/draw/engines/overlay/shaders/overlay_edit_mesh_vert_no_geom.glsl b/source/blender/draw/engines/overlay/shaders/overlay_edit_mesh_vert_no_geom.glsl index 4cd208bec74..aa50467a558 100644 --- a/source/blender/draw/engines/overlay/shaders/overlay_edit_mesh_vert_no_geom.glsl +++ b/source/blender/draw/engines/overlay/shaders/overlay_edit_mesh_vert_no_geom.glsl @@ -88,8 +88,8 @@ void main() vec4 out_pos1 = point_view_to_ndc(view_pos1); /* Offset Z position for retopology overlay. */ - out_pos0.z -= get_homogenous_z_offset(view_pos0.z, out_pos0.w, retopologyBias); - out_pos1.z -= get_homogenous_z_offset(view_pos1.z, out_pos1.w, retopologyBias); + out_pos0.z += get_homogenous_z_offset(view_pos0.z, out_pos0.w, retopologyOffset); + out_pos1.z += get_homogenous_z_offset(view_pos1.z, out_pos1.w, retopologyOffset); uvec4 m_data0 = uvec4(in_data0) & uvec4(dataMask); uvec4 m_data1 = uvec4(in_data1) & uvec4(dataMask); diff --git a/source/blender/draw/intern/shaders/common_view_lib.glsl b/source/blender/draw/intern/shaders/common_view_lib.glsl index e88d91b6936..3935de15ff8 100644 --- a/source/blender/draw/intern/shaders/common_view_lib.glsl +++ b/source/blender/draw/intern/shaders/common_view_lib.glsl @@ -257,18 +257,18 @@ vec3 point_world_to_view(vec3 p) return (ViewMatrix * vec4(p, 1.0)).xyz; } -/* From "Projection Matrix Tricks" by Eric Lengyel: - * http://www.terathon.com/gdc07_lengyel.pdf (p. 18 Depth Modification) - * - * View Z is used to adjust for perspective projection. - * Homogenous W is used to convert from NDC to homogenous space. */ +/* View Z is used to adjust for perspective projection. + * Homogenous W is used to convert from NDC to homogenous space. + * Offset is in viewspace, so positive values are closer to the camera. */ float get_homogenous_z_offset(float vs_z, float hs_w, float offset) { if (ProjectionMatrix[3][3] == 0.0) { - return -ProjectionMatrix[3][2] * (offset / (vs_z * (vs_z + offset))) * hs_w; + /* From "Projection Matrix Tricks" by Eric Lengyel: + * http://www.terathon.com/gdc07_lengyel.pdf (p. 24 Depth Modification) */ + return ProjectionMatrix[3][2] * (offset / (vs_z * (vs_z + offset))) * hs_w; } else { - return -ProjectionMatrix[2][2] * offset * hs_w; + return ProjectionMatrix[2][2] * offset * hs_w; } } diff --git a/source/blender/makesdna/DNA_view3d_defaults.h b/source/blender/makesdna/DNA_view3d_defaults.h index 7a66e3cc44e..e3861b9a2fa 100644 --- a/source/blender/makesdna/DNA_view3d_defaults.h +++ b/source/blender/makesdna/DNA_view3d_defaults.h @@ -39,7 +39,7 @@ .flag = V3D_OVERLAY_VIEWER_ATTRIBUTE | V3D_OVERLAY_SCULPT_SHOW_MASK | V3D_OVERLAY_SCULPT_SHOW_FACE_SETS, \ .wireframe_threshold = 1.0f, \ .wireframe_opacity = 1.0f, \ - .retopology_bias = 0.2f, \ + .retopology_offset = 0.2f, \ .viewer_attribute_opacity = 1.0f, \ .xray_alpha_bone = 0.5f, \ .bone_wire_alpha = 1.0f, \ diff --git a/source/blender/makesdna/DNA_view3d_types.h b/source/blender/makesdna/DNA_view3d_types.h index e922eeccfa1..d01e8158ce0 100644 --- a/source/blender/makesdna/DNA_view3d_types.h +++ b/source/blender/makesdna/DNA_view3d_types.h @@ -221,7 +221,7 @@ typedef struct View3DOverlay { /** Other settings. */ float wireframe_threshold; float wireframe_opacity; - float retopology_bias; + float retopology_offset; /** Grease pencil settings. */ float gpencil_paper_opacity; diff --git a/source/blender/makesrna/intern/rna_space.c b/source/blender/makesrna/intern/rna_space.c index 390a17989cf..1e3f8bf89ae 100644 --- a/source/blender/makesrna/intern/rna_space.c +++ b/source/blender/makesrna/intern/rna_space.c @@ -4532,11 +4532,12 @@ static void rna_def_space_view3d_overlay(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Retopology", "Use retopology display"); RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D | NS_VIEW3D_SHADING, NULL); - prop = RNA_def_property(srna, "retopology_bias", PROP_FLOAT, PROP_FACTOR); - RNA_def_property_float_sdna(prop, NULL, "overlay.retopology_bias"); - RNA_def_property_ui_text(prop, "Retopology Bias", "Z Bias used to draw edit mesh in front"); - RNA_def_property_range(prop, 0.0f, 100000.0f); - RNA_def_property_ui_range(prop, 0.0f, 1.0f, 0.1f, 3); + prop = RNA_def_property(srna, "retopology_offset", PROP_FLOAT, PROP_DISTANCE); + RNA_def_property_float_sdna(prop, NULL, "overlay.retopology_offset"); + RNA_def_property_ui_text( + prop, "Retopology Offset", "Offset used to draw edit mesh in front of other geometry"); + RNA_def_property_range(prop, 0.0f, FLT_MAX); + RNA_def_property_ui_range(prop, 0.0f, 10.0f, 0.1f, 3); RNA_def_property_clear_flag(prop, PROP_ANIMATABLE); RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL); -- 2.30.2 From e7d2e05fa1aaa73fa7e8dfe43b4fff81ce93c5fe Mon Sep 17 00:00:00 2001 From: bonj Date: Tue, 28 Feb 2023 04:16:38 +0100 Subject: [PATCH 18/22] Use max instead of plus for retopology epsilon Jeroen Bakker requested this, and it makes sense to me. He also asked me to get rid of the comment. --- source/blender/draw/engines/overlay/overlay_edit_mesh.cc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/source/blender/draw/engines/overlay/overlay_edit_mesh.cc b/source/blender/draw/engines/overlay/overlay_edit_mesh.cc index 0552cdc3f2b..d3b977d2f0a 100644 --- a/source/blender/draw/engines/overlay/overlay_edit_mesh.cc +++ b/source/blender/draw/engines/overlay/overlay_edit_mesh.cc @@ -63,9 +63,9 @@ void OVERLAY_edit_mesh_cache_init(OVERLAY_Data *vedata) RegionView3D *rv3d = draw_ctx->rv3d; bool show_retopology = (v3d->overlay.edit_flag & V3D_OVERLAY_EDIT_RETOPOLOGY) != 0; - /* Add epsilon to ensure the value is never zero when the effect is enabled. */ - float retopology_offset = (show_retopology) ? (v3d->overlay.retopology_offset + FLT_EPSILON) : - 0.0f; + float retopology_offset = (show_retopology) ? + max_ff(v3d->overlay.retopology_offset, FLT_EPSILON) : + 0.0f; pd->edit_mesh.do_faces = true; pd->edit_mesh.do_edges = true; -- 2.30.2 From 3a90751a0bb0864fd707749afa838acfa5de63f1 Mon Sep 17 00:00:00 2001 From: bonj Date: Tue, 28 Feb 2023 13:38:43 +0100 Subject: [PATCH 19/22] Rename parameter for get_homogenous_z_offset Apparently offset is already used, and you can't overwrite it on Metal, so I'm renaming it to vs_offset. Also I'm adjusting the comment a little. --- source/blender/draw/intern/shaders/common_view_lib.glsl | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/source/blender/draw/intern/shaders/common_view_lib.glsl b/source/blender/draw/intern/shaders/common_view_lib.glsl index 3935de15ff8..8e48089be13 100644 --- a/source/blender/draw/intern/shaders/common_view_lib.glsl +++ b/source/blender/draw/intern/shaders/common_view_lib.glsl @@ -257,18 +257,18 @@ vec3 point_world_to_view(vec3 p) return (ViewMatrix * vec4(p, 1.0)).xyz; } -/* View Z is used to adjust for perspective projection. +/* Viewspace Z is used to adjust for perspective projection. * Homogenous W is used to convert from NDC to homogenous space. * Offset is in viewspace, so positive values are closer to the camera. */ -float get_homogenous_z_offset(float vs_z, float hs_w, float offset) +float get_homogenous_z_offset(float vs_z, float hs_w, float vs_offset) { if (ProjectionMatrix[3][3] == 0.0) { /* From "Projection Matrix Tricks" by Eric Lengyel: * http://www.terathon.com/gdc07_lengyel.pdf (p. 24 Depth Modification) */ - return ProjectionMatrix[3][2] * (offset / (vs_z * (vs_z + offset))) * hs_w; + return ProjectionMatrix[3][2] * (vs_offset / (vs_z * (vs_z + vs_offset))) * hs_w; } else { - return ProjectionMatrix[2][2] * offset * hs_w; + return ProjectionMatrix[2][2] * vs_offset * hs_w; } } -- 2.30.2 From 40a930e13c998b4fa10feb49a625fcae593c9618 Mon Sep 17 00:00:00 2001 From: bonj Date: Tue, 28 Feb 2023 13:56:03 +0100 Subject: [PATCH 20/22] Reuse view_pos for facing based color blend I'm already calculating the view position earlier in the function, so might as well reuse it here instead of calculating it again. --- .../engines/overlay/shaders/overlay_edit_mesh_vert.glsl | 3 +-- .../overlay/shaders/overlay_edit_mesh_vert_no_geom.glsl | 6 ++---- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/source/blender/draw/engines/overlay/shaders/overlay_edit_mesh_vert.glsl b/source/blender/draw/engines/overlay/shaders/overlay_edit_mesh_vert.glsl index aea7218c10c..36bb708d084 100644 --- a/source/blender/draw/engines/overlay/shaders/overlay_edit_mesh_vert.glsl +++ b/source/blender/draw/engines/overlay/shaders/overlay_edit_mesh_vert.glsl @@ -89,9 +89,8 @@ void main() #if !defined(FACE) /* Facing based color blend */ - vec3 vpos = point_world_to_view(world_pos); vec3 view_normal = normalize(normal_object_to_view(vnor) + 1e-4); - vec3 view_vec = (drw_view.winmat[3][3] == 0.0) ? normalize(vpos) : vec3(0.0, 0.0, 1.0); + vec3 view_vec = (drw_view.winmat[3][3] == 0.0) ? normalize(view_pos) : vec3(0.0, 0.0, 1.0); float facing = dot(view_vec, view_normal); facing = 1.0 - abs(facing) * 0.2; diff --git a/source/blender/draw/engines/overlay/shaders/overlay_edit_mesh_vert_no_geom.glsl b/source/blender/draw/engines/overlay/shaders/overlay_edit_mesh_vert_no_geom.glsl index aa50467a558..30e32f70eb3 100644 --- a/source/blender/draw/engines/overlay/shaders/overlay_edit_mesh_vert_no_geom.glsl +++ b/source/blender/draw/engines/overlay/shaders/overlay_edit_mesh_vert_no_geom.glsl @@ -131,15 +131,13 @@ void main() #if !defined(FACE) /* Facing based color blend */ - vec3 vpos0 = point_world_to_view(world_pos0); vec3 view_normal0 = normalize(normal_object_to_view(in_vnor0) + 1e-4); - vec3 view_vec0 = (ProjectionMatrix[3][3] == 0.0) ? normalize(vpos0) : vec3(0.0, 0.0, 1.0); + vec3 view_vec0 = (ProjectionMatrix[3][3] == 0.0) ? normalize(view_pos0) : vec3(0.0, 0.0, 1.0); float facing0 = dot(view_vec0, view_normal0); facing0 = 1.0 - abs(facing0) * 0.2; - vec3 vpos1 = point_world_to_view(world_pos1); vec3 view_normal1 = normalize(normal_object_to_view(in_vnor1) + 1e-4); - vec3 view_vec1 = (ProjectionMatrix[3][3] == 0.0) ? normalize(vpos1) : vec3(0.0, 0.0, 1.0); + vec3 view_vec1 = (ProjectionMatrix[3][3] == 0.0) ? normalize(view_pos1) : vec3(0.0, 0.0, 1.0); float facing1 = dot(view_vec1, view_normal1); facing1 = 1.0 - abs(facing1) * 0.2; -- 2.30.2 From 2e92bcdae6ef33e77bb53e27a67abf26ce5bfd49 Mon Sep 17 00:00:00 2001 From: bonj Date: Tue, 28 Feb 2023 18:13:49 +0100 Subject: [PATCH 21/22] Clamp retopology offset for perspective projection This way it can't offset a vertex to behind the camera, and by keeping the ratio between Z and offset large enough, it avoids floating point precision errors. --- source/blender/draw/intern/shaders/common_view_lib.glsl | 2 ++ 1 file changed, 2 insertions(+) diff --git a/source/blender/draw/intern/shaders/common_view_lib.glsl b/source/blender/draw/intern/shaders/common_view_lib.glsl index 8e48089be13..a7a81d155f2 100644 --- a/source/blender/draw/intern/shaders/common_view_lib.glsl +++ b/source/blender/draw/intern/shaders/common_view_lib.glsl @@ -263,6 +263,8 @@ vec3 point_world_to_view(vec3 p) float get_homogenous_z_offset(float vs_z, float hs_w, float vs_offset) { if (ProjectionMatrix[3][3] == 0.0) { + /* Clamp offset to half of Z to avoid floating point precision errors. */ + vs_offset = min(vs_offset, vs_z * -0.5); /* From "Projection Matrix Tricks" by Eric Lengyel: * http://www.terathon.com/gdc07_lengyel.pdf (p. 24 Depth Modification) */ return ProjectionMatrix[3][2] * (vs_offset / (vs_z * (vs_z + vs_offset))) * hs_w; -- 2.30.2 From 113dc37272a7a9871f60d4654cc3ce70d787f3a5 Mon Sep 17 00:00:00 2001 From: bonj Date: Wed, 1 Mar 2023 00:25:55 +0100 Subject: [PATCH 22/22] Remove unused variable rv3d This was necessary when the clip distances were used to calculate offset, but that's done inside the shader now, so it's no longer needed. --- source/blender/draw/engines/overlay/overlay_edit_mesh.cc | 1 - 1 file changed, 1 deletion(-) diff --git a/source/blender/draw/engines/overlay/overlay_edit_mesh.cc b/source/blender/draw/engines/overlay/overlay_edit_mesh.cc index d3b977d2f0a..79df7fec679 100644 --- a/source/blender/draw/engines/overlay/overlay_edit_mesh.cc +++ b/source/blender/draw/engines/overlay/overlay_edit_mesh.cc @@ -61,7 +61,6 @@ void OVERLAY_edit_mesh_cache_init(OVERLAY_Data *vedata) bool show_face_dots = (v3d->overlay.edit_flag & V3D_OVERLAY_EDIT_FACE_DOT) != 0 || pd->edit_mesh.do_zbufclip; - RegionView3D *rv3d = draw_ctx->rv3d; bool show_retopology = (v3d->overlay.edit_flag & V3D_OVERLAY_EDIT_RETOPOLOGY) != 0; float retopology_offset = (show_retopology) ? max_ff(v3d->overlay.retopology_offset, FLT_EPSILON) : -- 2.30.2