From 579b4cc42c8be9bcf51ba352ba5a93bdf573491c Mon Sep 17 00:00:00 2001 From: Gilberto Rodrigues Date: Fri, 14 Jul 2023 06:18:34 -0300 Subject: [PATCH 01/19] Add Toggle for Edit Mode Fresnel --- scripts/startup/bl_ui/space_userpref.py | 4 +++ .../draw/engines/overlay/overlay_edit_mesh.cc | 6 ++++ .../draw/engines/overlay/overlay_wireframe.cc | 3 ++ .../shaders/infos/overlay_edit_mode_info.hh | 1 + .../shaders/overlay_edit_mesh_vert.glsl | 16 +++++----- .../overlay_edit_mesh_vert_no_geom.glsl | 30 ++++++++++--------- source/blender/makesdna/DNA_userdef_types.h | 1 + source/blender/makesrna/intern/rna_userdef.cc | 8 +++++ 8 files changed, 48 insertions(+), 21 deletions(-) diff --git a/scripts/startup/bl_ui/space_userpref.py b/scripts/startup/bl_ui/space_userpref.py index 81330ec7cbf..5463e09607e 100644 --- a/scripts/startup/bl_ui/space_userpref.py +++ b/scripts/startup/bl_ui/space_userpref.py @@ -747,6 +747,10 @@ class USERPREF_PT_viewport_display(ViewportPanel, CenterAlignMixIn, Panel): if view.mini_axis_type == 'GIZMO': col.prop(view, "gizmo_size_navigate_v3d", text="Size") + layout.separator() + col = layout.column(heading="Fresnel") + col.prop(view, "use_fresnel_effect_edit") + class USERPREF_PT_viewport_quality(ViewportPanel, CenterAlignMixIn, Panel): bl_label = "Quality" diff --git a/source/blender/draw/engines/overlay/overlay_edit_mesh.cc b/source/blender/draw/engines/overlay/overlay_edit_mesh.cc index bd3dbe59fbe..77844d1b452 100644 --- a/source/blender/draw/engines/overlay/overlay_edit_mesh.cc +++ b/source/blender/draw/engines/overlay/overlay_edit_mesh.cc @@ -65,6 +65,8 @@ void OVERLAY_edit_mesh_cache_init(OVERLAY_Data *vedata) bool show_retopology = RETOPOLOGY_ENABLED(v3d); float retopology_offset = RETOPOLOGY_OFFSET(v3d); + const bool use_fresnel_edit = (U.gpu_flag & USER_GPU_FLAG_FRESNEL_EDIT) != 0; + pd->edit_mesh.do_faces = true; pd->edit_mesh.do_edges = true; @@ -174,6 +176,7 @@ void OVERLAY_edit_mesh_cache_init(OVERLAY_Data *vedata) DRW_shgroup_uniform_float_copy(grp, "alpha", face_alpha); DRW_shgroup_uniform_bool_copy(grp, "selectFaces", select_face); DRW_shgroup_uniform_float_copy(grp, "retopologyOffset", retopology_offset); + DRW_shgroup_uniform_bool_copy(grp, "useFresnelEdit", use_fresnel_edit); } if (do_zbufclip) { @@ -194,6 +197,7 @@ void OVERLAY_edit_mesh_cache_init(OVERLAY_Data *vedata) 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, "retopologyOffset", retopology_offset); + DRW_shgroup_uniform_bool_copy(grp, "useFresnelEdit", use_fresnel_edit); /* Verts */ state |= DRW_STATE_WRITE_DEPTH; @@ -208,6 +212,7 @@ void OVERLAY_edit_mesh_cache_init(OVERLAY_Data *vedata) DRW_shgroup_uniform_texture_ref(grp, "depthTex", depth_tex); DRW_shgroup_uniform_ivec4_copy(grp, "dataMask", vert_mask); DRW_shgroup_uniform_float_copy(grp, "retopologyOffset", retopology_offset); + DRW_shgroup_uniform_bool_copy(grp, "useFresnelEdit", use_fresnel_edit); 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]); @@ -223,6 +228,7 @@ void OVERLAY_edit_mesh_cache_init(OVERLAY_Data *vedata) DRW_shgroup_uniform_texture_ref(grp, "depthTex", depth_tex); DRW_shgroup_uniform_ivec4_copy(grp, "dataMask", vert_mask); DRW_shgroup_uniform_float_copy(grp, "retopologyOffset", retopology_offset); + DRW_shgroup_uniform_bool_copy(grp, "useFresnelEdit", use_fresnel_edit); DRW_shgroup_state_enable(grp, DRW_STATE_WRITE_DEPTH); } else { diff --git a/source/blender/draw/engines/overlay/overlay_wireframe.cc b/source/blender/draw/engines/overlay/overlay_wireframe.cc index e7c04f17159..cddfcd6aad4 100644 --- a/source/blender/draw/engines/overlay/overlay_wireframe.cc +++ b/source/blender/draw/engines/overlay/overlay_wireframe.cc @@ -65,6 +65,8 @@ void OVERLAY_wireframe_cache_init(OVERLAY_Data *vedata) bool is_object_color = is_wire_shmode && (shading->wire_color_type == V3D_SHADING_OBJECT_COLOR); bool is_random_color = is_wire_shmode && (shading->wire_color_type == V3D_SHADING_RANDOM_COLOR); + const bool use_fresnel_edit = (U.gpu_flag & USER_GPU_FLAG_FRESNEL_EDIT) != 0; + const bool use_select = (DRW_state_is_select() || DRW_state_is_depth()); GPUShader *wires_sh = use_select ? OVERLAY_shader_wireframe_select() : OVERLAY_shader_wireframe(pd->antialiasing.enabled); @@ -98,6 +100,7 @@ void OVERLAY_wireframe_cache_init(OVERLAY_Data *vedata) DRW_shgroup_uniform_bool_copy(grp, "isObjectColor", is_object_color); DRW_shgroup_uniform_bool_copy(grp, "isRandomColor", is_random_color); DRW_shgroup_uniform_bool_copy(grp, "isHair", false); + DRW_shgroup_uniform_bool_copy(grp, "useFresnelEdit", use_fresnel_edit); pd->wires_all_grp[xray][use_coloring] = grp = DRW_shgroup_create(wires_sh, pass); DRW_shgroup_uniform_float_copy(grp, "wireStepParam", 1.0f); 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 9a0847b7afc..fa88241e7e7 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 @@ -19,6 +19,7 @@ GPU_SHADER_CREATE_INFO(overlay_edit_mesh_common) .fragment_out(0, Type::VEC4, "fragColor") .push_constant(Type::BOOL, "selectFaces") .push_constant(Type::BOOL, "selectEdges") + .push_constant(Type::BOOL, "useFresnelEdit") .push_constant(Type::FLOAT, "alpha") .push_constant(Type::FLOAT, "retopologyOffset") .push_constant(Type::IVEC4, "dataMask") 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 b10e48441c4..30eaa0bfbb0 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 @@ -93,14 +93,16 @@ void main() finalColor.a *= (occluded) ? alpha : 1.0; #if !defined(FACE) - /* Facing based color blend */ - vec3 view_normal = normalize(normal_object_to_view(vnor) + 1e-4); - 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; + if (useFresnelEdit) { + /* Facing based color blend */ + vec3 view_normal = normalize(normal_object_to_view(vnor) + 1e-4); + 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; - /* Do interpolation in a non-linear space to have a better visual result. */ - finalColor.rgb = non_linear_blend_color(colorEditMeshMiddle.rgb, finalColor.rgb, facing); + /* Do interpolation in a non-linear space to have a better visual result. */ + finalColor.rgb = non_linear_blend_color(colorEditMeshMiddle.rgb, finalColor.rgb, facing); + } #endif 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 1eec222e6a9..3b9e8f73774 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 @@ -130,22 +130,24 @@ void main() out_finalColor[1].a *= (occluded1) ? alpha : 1.0; #if !defined(FACE) - /* Facing based color blend */ - vec3 view_normal0 = normalize(normal_object_to_view(in_vnor0) + 1e-4); - 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; + if (useFresnelEdit) { + /* Facing based color blend */ + vec3 view_normal0 = normalize(normal_object_to_view(in_vnor0) + 1e-4); + 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 view_normal1 = normalize(normal_object_to_view(in_vnor1) + 1e-4); - 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; + vec3 view_normal1 = normalize(normal_object_to_view(in_vnor1) + 1e-4); + 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; - /* Do interpolation in a non-linear space to have a better visual result. */ - out_finalColor[0].rgb = non_linear_blend_color( - colorEditMeshMiddle.rgb, out_finalColor[0].rgb, facing0); - out_finalColor[1].rgb = non_linear_blend_color( - colorEditMeshMiddle.rgb, out_finalColor[1].rgb, facing1); + /* Do interpolation in a non-linear space to have a better visual result. */ + out_finalColor[0].rgb = non_linear_blend_color( + colorEditMeshMiddle.rgb, out_finalColor[0].rgb, facing0); + out_finalColor[1].rgb = non_linear_blend_color( + colorEditMeshMiddle.rgb, out_finalColor[1].rgb, facing1); + } #endif // -------- GEOM SHADER ALTERNATIVE ----------- // diff --git a/source/blender/makesdna/DNA_userdef_types.h b/source/blender/makesdna/DNA_userdef_types.h index fd6cb6d2732..c3f0a375037 100644 --- a/source/blender/makesdna/DNA_userdef_types.h +++ b/source/blender/makesdna/DNA_userdef_types.h @@ -1187,6 +1187,7 @@ typedef enum eUserpref_GPU_Flag { USER_GPU_FLAG_NO_EDIT_MODE_SMOOTH_WIRE = (1 << 1), USER_GPU_FLAG_OVERLAY_SMOOTH_WIRE = (1 << 2), USER_GPU_FLAG_SUBDIVISION_EVALUATION = (1 << 3), + USER_GPU_FLAG_FRESNEL_EDIT = (1 << 4), } eUserpref_GPU_Flag; /** #UserDef.tablet_api */ diff --git a/source/blender/makesrna/intern/rna_userdef.cc b/source/blender/makesrna/intern/rna_userdef.cc index 0c5a2664cdd..16d215cb422 100644 --- a/source/blender/makesrna/intern/rna_userdef.cc +++ b/source/blender/makesrna/intern/rna_userdef.cc @@ -4694,6 +4694,14 @@ static void rna_def_userdef_view(BlenderRNA *brna) "overlay while animation is played back"); RNA_def_property_update(prop, 0, "rna_userdef_update"); + prop = RNA_def_property(srna, "use_fresnel_effect_edit", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, nullptr, "gpu_flag", USER_GPU_FLAG_FRESNEL_EDIT); + RNA_def_property_ui_text(prop, + "Edit Mode", "Enable fresnel effect on edit mode.\n" + "It improves a bit the shape readability of very dense meshes, " + "but increases eye fatigue when modeling lower poly"); + RNA_def_property_update(prop, 0, "rna_userdef_gpu_update"); + USERDEF_TAG_DIRTY_PROPERTY_UPDATE_DISABLE; prop = RNA_def_property(srna, "show_addons_enabled_only", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna( -- 2.30.2 From c01495da06aa00af0103efe6aa14e430726ecde5 Mon Sep 17 00:00:00 2001 From: Gilberto Rodrigues Date: Sat, 15 Jul 2023 22:09:01 -0300 Subject: [PATCH 02/19] Add slider instead of toggle, and pass through GlobalsUboStorage. --- scripts/startup/bl_ui/space_userpref.py | 2 +- .../draw/engines/overlay/overlay_edit_mesh.cc | 6 ---- .../draw/engines/overlay/overlay_wireframe.cc | 3 -- .../shaders/infos/overlay_edit_mode_info.hh | 1 - .../shaders/overlay_edit_mesh_vert.glsl | 17 +++++------ .../overlay_edit_mesh_vert_no_geom.glsl | 30 +++++++++---------- source/blender/draw/intern/draw_common.c | 1 + .../draw/intern/draw_common_shader_shared.h | 3 ++ source/blender/makesdna/DNA_userdef_types.h | 5 +++- source/blender/makesrna/intern/rna_userdef.cc | 10 ++++--- 10 files changed, 37 insertions(+), 41 deletions(-) diff --git a/scripts/startup/bl_ui/space_userpref.py b/scripts/startup/bl_ui/space_userpref.py index 5463e09607e..3b3e85f9808 100644 --- a/scripts/startup/bl_ui/space_userpref.py +++ b/scripts/startup/bl_ui/space_userpref.py @@ -749,7 +749,7 @@ class USERPREF_PT_viewport_display(ViewportPanel, CenterAlignMixIn, Panel): layout.separator() col = layout.column(heading="Fresnel") - col.prop(view, "use_fresnel_effect_edit") + col.prop(view, "fresnel_effect_factor") class USERPREF_PT_viewport_quality(ViewportPanel, CenterAlignMixIn, Panel): diff --git a/source/blender/draw/engines/overlay/overlay_edit_mesh.cc b/source/blender/draw/engines/overlay/overlay_edit_mesh.cc index 77844d1b452..bd3dbe59fbe 100644 --- a/source/blender/draw/engines/overlay/overlay_edit_mesh.cc +++ b/source/blender/draw/engines/overlay/overlay_edit_mesh.cc @@ -65,8 +65,6 @@ void OVERLAY_edit_mesh_cache_init(OVERLAY_Data *vedata) bool show_retopology = RETOPOLOGY_ENABLED(v3d); float retopology_offset = RETOPOLOGY_OFFSET(v3d); - const bool use_fresnel_edit = (U.gpu_flag & USER_GPU_FLAG_FRESNEL_EDIT) != 0; - pd->edit_mesh.do_faces = true; pd->edit_mesh.do_edges = true; @@ -176,7 +174,6 @@ void OVERLAY_edit_mesh_cache_init(OVERLAY_Data *vedata) DRW_shgroup_uniform_float_copy(grp, "alpha", face_alpha); DRW_shgroup_uniform_bool_copy(grp, "selectFaces", select_face); DRW_shgroup_uniform_float_copy(grp, "retopologyOffset", retopology_offset); - DRW_shgroup_uniform_bool_copy(grp, "useFresnelEdit", use_fresnel_edit); } if (do_zbufclip) { @@ -197,7 +194,6 @@ void OVERLAY_edit_mesh_cache_init(OVERLAY_Data *vedata) 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, "retopologyOffset", retopology_offset); - DRW_shgroup_uniform_bool_copy(grp, "useFresnelEdit", use_fresnel_edit); /* Verts */ state |= DRW_STATE_WRITE_DEPTH; @@ -212,7 +208,6 @@ void OVERLAY_edit_mesh_cache_init(OVERLAY_Data *vedata) DRW_shgroup_uniform_texture_ref(grp, "depthTex", depth_tex); DRW_shgroup_uniform_ivec4_copy(grp, "dataMask", vert_mask); DRW_shgroup_uniform_float_copy(grp, "retopologyOffset", retopology_offset); - DRW_shgroup_uniform_bool_copy(grp, "useFresnelEdit", use_fresnel_edit); 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]); @@ -228,7 +223,6 @@ void OVERLAY_edit_mesh_cache_init(OVERLAY_Data *vedata) DRW_shgroup_uniform_texture_ref(grp, "depthTex", depth_tex); DRW_shgroup_uniform_ivec4_copy(grp, "dataMask", vert_mask); DRW_shgroup_uniform_float_copy(grp, "retopologyOffset", retopology_offset); - DRW_shgroup_uniform_bool_copy(grp, "useFresnelEdit", use_fresnel_edit); DRW_shgroup_state_enable(grp, DRW_STATE_WRITE_DEPTH); } else { diff --git a/source/blender/draw/engines/overlay/overlay_wireframe.cc b/source/blender/draw/engines/overlay/overlay_wireframe.cc index cddfcd6aad4..e7c04f17159 100644 --- a/source/blender/draw/engines/overlay/overlay_wireframe.cc +++ b/source/blender/draw/engines/overlay/overlay_wireframe.cc @@ -65,8 +65,6 @@ void OVERLAY_wireframe_cache_init(OVERLAY_Data *vedata) bool is_object_color = is_wire_shmode && (shading->wire_color_type == V3D_SHADING_OBJECT_COLOR); bool is_random_color = is_wire_shmode && (shading->wire_color_type == V3D_SHADING_RANDOM_COLOR); - const bool use_fresnel_edit = (U.gpu_flag & USER_GPU_FLAG_FRESNEL_EDIT) != 0; - const bool use_select = (DRW_state_is_select() || DRW_state_is_depth()); GPUShader *wires_sh = use_select ? OVERLAY_shader_wireframe_select() : OVERLAY_shader_wireframe(pd->antialiasing.enabled); @@ -100,7 +98,6 @@ void OVERLAY_wireframe_cache_init(OVERLAY_Data *vedata) DRW_shgroup_uniform_bool_copy(grp, "isObjectColor", is_object_color); DRW_shgroup_uniform_bool_copy(grp, "isRandomColor", is_random_color); DRW_shgroup_uniform_bool_copy(grp, "isHair", false); - DRW_shgroup_uniform_bool_copy(grp, "useFresnelEdit", use_fresnel_edit); pd->wires_all_grp[xray][use_coloring] = grp = DRW_shgroup_create(wires_sh, pass); DRW_shgroup_uniform_float_copy(grp, "wireStepParam", 1.0f); 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 fa88241e7e7..9a0847b7afc 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 @@ -19,7 +19,6 @@ GPU_SHADER_CREATE_INFO(overlay_edit_mesh_common) .fragment_out(0, Type::VEC4, "fragColor") .push_constant(Type::BOOL, "selectFaces") .push_constant(Type::BOOL, "selectEdges") - .push_constant(Type::BOOL, "useFresnelEdit") .push_constant(Type::FLOAT, "alpha") .push_constant(Type::FLOAT, "retopologyOffset") .push_constant(Type::IVEC4, "dataMask") 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 30eaa0bfbb0..42af6bd7bcf 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 @@ -93,16 +93,15 @@ void main() finalColor.a *= (occluded) ? alpha : 1.0; #if !defined(FACE) - if (useFresnelEdit) { - /* Facing based color blend */ - vec3 view_normal = normalize(normal_object_to_view(vnor) + 1e-4); - 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; + /* Facing based color blend */ + vec3 view_normal = normalize(normal_object_to_view(vnor) + 1e-4); + 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; - /* Do interpolation in a non-linear space to have a better visual result. */ - finalColor.rgb = non_linear_blend_color(colorEditMeshMiddle.rgb, finalColor.rgb, facing); - } + /* Do interpolation in a non-linear space to have a better visual result. */ + finalColor.rgb = mix(finalColor.rgb, non_linear_blend_color(colorEditMeshMiddle.rgb, + finalColor.rgb, facing), fresnelMix); #endif 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 3b9e8f73774..c0f20beb547 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 @@ -130,24 +130,22 @@ void main() out_finalColor[1].a *= (occluded1) ? alpha : 1.0; #if !defined(FACE) - if (useFresnelEdit) { - /* Facing based color blend */ - vec3 view_normal0 = normalize(normal_object_to_view(in_vnor0) + 1e-4); - 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; + /* Facing based color blend */ + vec3 view_normal0 = normalize(normal_object_to_view(in_vnor0) + 1e-4); + 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 view_normal1 = normalize(normal_object_to_view(in_vnor1) + 1e-4); - 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; + vec3 view_normal1 = normalize(normal_object_to_view(in_vnor1) + 1e-4); + 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; - /* Do interpolation in a non-linear space to have a better visual result. */ - out_finalColor[0].rgb = non_linear_blend_color( - colorEditMeshMiddle.rgb, out_finalColor[0].rgb, facing0); - out_finalColor[1].rgb = non_linear_blend_color( - colorEditMeshMiddle.rgb, out_finalColor[1].rgb, facing1); - } + /* Do interpolation in a non-linear space to have a better visual result. */ + out_finalColor[0].rgb = mix(out_finalColor[0].rgb, non_linear_blend_color( + colorEditMeshMiddle.rgb, out_finalColor[0].rgb, facing0), fresnelMix); + out_finalColor[1].rgb = mix(out_finalColor[1].rgb, non_linear_blend_color( + colorEditMeshMiddle.rgb, out_finalColor[1].rgb, facing1), fresnelMix); #endif // -------- GEOM SHADER ALTERNATIVE ----------- // diff --git a/source/blender/draw/intern/draw_common.c b/source/blender/draw/intern/draw_common.c index eabbdb601db..2286fdcebec 100644 --- a/source/blender/draw/intern/draw_common.c +++ b/source/blender/draw/intern/draw_common.c @@ -82,6 +82,7 @@ void DRW_globals_update(void) UI_GetThemeColor4fv(TH_TRANSPARENT_CHECKER_PRIMARY, gb->color_checker_primary); UI_GetThemeColor4fv(TH_TRANSPARENT_CHECKER_SECONDARY, gb->color_checker_secondary); gb->size_checker = UI_GetThemeValuef(TH_TRANSPARENT_CHECKER_SIZE); + gb->fresnel_mix = U.fresnel_mix_factor; UI_GetThemeColor4fv(TH_V3D_CLIPPING_BORDER, gb->color_clipping_border); /* Custom median color to slightly affect the edit mesh colors. */ diff --git a/source/blender/draw/intern/draw_common_shader_shared.h b/source/blender/draw/intern/draw_common_shader_shared.h index d3cbbd59816..e72d1c6a3f3 100644 --- a/source/blender/draw/intern/draw_common_shader_shared.h +++ b/source/blender/draw/intern/draw_common_shader_shared.h @@ -134,6 +134,8 @@ struct GlobalsUboStorage { float size_vertex, size_edge, size_edge_fix, size_face_dot; float size_checker; float size_vertex_gpencil; + float fresnel_mix; + float _padd[3]; }; BLI_STATIC_ASSERT_ALIGN(GlobalsUboStorage, 16) @@ -244,6 +246,7 @@ BLI_STATIC_ASSERT_ALIGN(GlobalsUboStorage, 16) # define sizeFaceDot globalsBlock.size_face_dot # define sizeChecker globalsBlock.size_checker # define sizeVertexGpencil globalsBlock.size_vertex_gpencil +# define fresnelMix globalsBlock.fresnel_mix #endif /* See: 'draw_cache_impl.h' for matching includes. */ diff --git a/source/blender/makesdna/DNA_userdef_types.h b/source/blender/makesdna/DNA_userdef_types.h index c3f0a375037..ebf0ff46236 100644 --- a/source/blender/makesdna/DNA_userdef_types.h +++ b/source/blender/makesdna/DNA_userdef_types.h @@ -993,6 +993,10 @@ typedef struct UserDef { struct WalkNavigation walk_navigation; + /** Fresnel */ + float fresnel_mix_factor; + char _pad[4]; + /** The UI for the user preferences. */ UserDef_SpaceData space_data; UserDef_FileSpaceData file_space_data; @@ -1187,7 +1191,6 @@ typedef enum eUserpref_GPU_Flag { USER_GPU_FLAG_NO_EDIT_MODE_SMOOTH_WIRE = (1 << 1), USER_GPU_FLAG_OVERLAY_SMOOTH_WIRE = (1 << 2), USER_GPU_FLAG_SUBDIVISION_EVALUATION = (1 << 3), - USER_GPU_FLAG_FRESNEL_EDIT = (1 << 4), } eUserpref_GPU_Flag; /** #UserDef.tablet_api */ diff --git a/source/blender/makesrna/intern/rna_userdef.cc b/source/blender/makesrna/intern/rna_userdef.cc index 16d215cb422..de8c0a04913 100644 --- a/source/blender/makesrna/intern/rna_userdef.cc +++ b/source/blender/makesrna/intern/rna_userdef.cc @@ -4694,10 +4694,12 @@ static void rna_def_userdef_view(BlenderRNA *brna) "overlay while animation is played back"); RNA_def_property_update(prop, 0, "rna_userdef_update"); - prop = RNA_def_property(srna, "use_fresnel_effect_edit", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, nullptr, "gpu_flag", USER_GPU_FLAG_FRESNEL_EDIT); - RNA_def_property_ui_text(prop, - "Edit Mode", "Enable fresnel effect on edit mode.\n" + prop = RNA_def_property(srna, "fresnel_effect_factor", PROP_FLOAT, PROP_FACTOR); + RNA_def_property_float_sdna(prop, nullptr, "fresnel_mix_factor"); + RNA_def_property_range(prop, 0, 1.0); + RNA_def_property_ui_text(prop, + "Fresnel Factor", + "Intensity of the fresnel effect on edit mesh overlays.\n" "It improves a bit the shape readability of very dense meshes, " "but increases eye fatigue when modeling lower poly"); RNA_def_property_update(prop, 0, "rna_userdef_gpu_update"); -- 2.30.2 From db0a7754f3c230ffa6c58623580c479514095590 Mon Sep 17 00:00:00 2001 From: Gilberto Rodrigues Date: Mon, 17 Jul 2023 00:51:06 -0300 Subject: [PATCH 03/19] Reorganize overlay_wireframe_vert.glsl --- .../shaders/overlay_wireframe_vert.glsl | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/source/blender/draw/engines/overlay/shaders/overlay_wireframe_vert.glsl b/source/blender/draw/engines/overlay/shaders/overlay_wireframe_vert.glsl index 66b4b64a031..e5a3111c38b 100644 --- a/source/blender/draw/engines/overlay/shaders/overlay_wireframe_vert.glsl +++ b/source/blender/draw/engines/overlay/shaders/overlay_wireframe_vert.glsl @@ -107,8 +107,19 @@ void main() #ifndef SELECT_EDGES edgePos = edgeStart; +#else + /* HACK: to avoid losing sub-pixel object in selections, we add a bit of randomness to the + * wire to at least create one fragment that will pass the occlusion query. */ + gl_Position.xy += sizeViewportInv * gl_Position.w * ((gl_VertexID % 2 == 0) ? -1.0 : 1.0); +#endif + + /* Cull flat edges below threshold. */ + if (!no_attr && !is_edge_sharpness_visible(wd)) { + edgeStart = vec2(-1.0); + } vec3 rim_col, wire_col; + if (isObjectColor || isRandomColor) { wire_object_color_get(rim_col, wire_col); } @@ -124,20 +135,9 @@ void main() vec3 final_front_col = mix(rim_col, wire_col, 0.35); finalColor.rgb = mix(rim_col, final_front_col, facing); finalColor.rgb = pow(finalColor.rgb, vec3(2.2)); + finalColor.a = wireOpacity; finalColor.rgb *= wireOpacity; -#endif - - /* Cull flat edges below threshold. */ - if (!no_attr && !is_edge_sharpness_visible(wd)) { - edgeStart = vec2(-1.0); - } - -#ifdef SELECT_EDGES - /* HACK: to avoid losing sub-pixel object in selections, we add a bit of randomness to the - * wire to at least create one fragment that will pass the occlusion query. */ - gl_Position.xy += sizeViewportInv * gl_Position.w * ((gl_VertexID % 2 == 0) ? -1.0 : 1.0); -#endif view_clipping_distances(wpos); } -- 2.30.2 From e8b2aea0e195a1d021e12576ff4446fbc6ecaaa0 Mon Sep 17 00:00:00 2001 From: Gilberto Rodrigues Date: Mon, 17 Jul 2023 01:27:54 -0300 Subject: [PATCH 04/19] todo --- .../draw/engines/overlay/shaders/overlay_wireframe_vert.glsl | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/source/blender/draw/engines/overlay/shaders/overlay_wireframe_vert.glsl b/source/blender/draw/engines/overlay/shaders/overlay_wireframe_vert.glsl index e5a3111c38b..83a2b88478c 100644 --- a/source/blender/draw/engines/overlay/shaders/overlay_wireframe_vert.glsl +++ b/source/blender/draw/engines/overlay/shaders/overlay_wireframe_vert.glsl @@ -136,8 +136,7 @@ void main() finalColor.rgb = mix(rim_col, final_front_col, facing); finalColor.rgb = pow(finalColor.rgb, vec3(2.2)); - finalColor.a = wireOpacity; - finalColor.rgb *= wireOpacity; - + finalColor.a = wireOpacity; //multiplicar com opacidade da cor do obj + finalColor.rgb *= wireOpacity; //should be finalColor.rgb = mix(backgroundcolor,finalColor.rgb, wireOpacity); pra arrumar a cor do wireframe mode com xray view_clipping_distances(wpos); } -- 2.30.2 From e69fc0b12e1e98308e2dfa2a42fb4428b9a20913 Mon Sep 17 00:00:00 2001 From: Gilberto Rodrigues Date: Mon, 17 Jul 2023 23:47:53 -0300 Subject: [PATCH 05/19] Change back from slider to toggle. --- scripts/startup/bl_ui/space_userpref.py | 2 +- source/blender/draw/intern/draw_common.c | 2 +- source/blender/makesdna/DNA_userdef_types.h | 4 +--- source/blender/makesrna/intern/rna_userdef.cc | 7 +++---- 4 files changed, 6 insertions(+), 9 deletions(-) diff --git a/scripts/startup/bl_ui/space_userpref.py b/scripts/startup/bl_ui/space_userpref.py index 3b3e85f9808..b72761ac149 100644 --- a/scripts/startup/bl_ui/space_userpref.py +++ b/scripts/startup/bl_ui/space_userpref.py @@ -749,7 +749,7 @@ class USERPREF_PT_viewport_display(ViewportPanel, CenterAlignMixIn, Panel): layout.separator() col = layout.column(heading="Fresnel") - col.prop(view, "fresnel_effect_factor") + col.prop(view, "fresnel_effect") class USERPREF_PT_viewport_quality(ViewportPanel, CenterAlignMixIn, Panel): diff --git a/source/blender/draw/intern/draw_common.c b/source/blender/draw/intern/draw_common.c index 2286fdcebec..5e73d0f7f04 100644 --- a/source/blender/draw/intern/draw_common.c +++ b/source/blender/draw/intern/draw_common.c @@ -82,7 +82,7 @@ void DRW_globals_update(void) UI_GetThemeColor4fv(TH_TRANSPARENT_CHECKER_PRIMARY, gb->color_checker_primary); UI_GetThemeColor4fv(TH_TRANSPARENT_CHECKER_SECONDARY, gb->color_checker_secondary); gb->size_checker = UI_GetThemeValuef(TH_TRANSPARENT_CHECKER_SIZE); - gb->fresnel_mix = U.fresnel_mix_factor; + gb->fresnel_mix = ((U.gpu_flag & USER_GPU_FLAG_FRESNEL) == 0 ) ? 0.0 : 1.0; UI_GetThemeColor4fv(TH_V3D_CLIPPING_BORDER, gb->color_clipping_border); /* Custom median color to slightly affect the edit mesh colors. */ diff --git a/source/blender/makesdna/DNA_userdef_types.h b/source/blender/makesdna/DNA_userdef_types.h index ebf0ff46236..d27e2c91394 100644 --- a/source/blender/makesdna/DNA_userdef_types.h +++ b/source/blender/makesdna/DNA_userdef_types.h @@ -993,9 +993,6 @@ typedef struct UserDef { struct WalkNavigation walk_navigation; - /** Fresnel */ - float fresnel_mix_factor; - char _pad[4]; /** The UI for the user preferences. */ UserDef_SpaceData space_data; @@ -1191,6 +1188,7 @@ typedef enum eUserpref_GPU_Flag { USER_GPU_FLAG_NO_EDIT_MODE_SMOOTH_WIRE = (1 << 1), USER_GPU_FLAG_OVERLAY_SMOOTH_WIRE = (1 << 2), USER_GPU_FLAG_SUBDIVISION_EVALUATION = (1 << 3), + USER_GPU_FLAG_FRESNEL = (1 << 4), } eUserpref_GPU_Flag; /** #UserDef.tablet_api */ diff --git a/source/blender/makesrna/intern/rna_userdef.cc b/source/blender/makesrna/intern/rna_userdef.cc index de8c0a04913..6823160d1c9 100644 --- a/source/blender/makesrna/intern/rna_userdef.cc +++ b/source/blender/makesrna/intern/rna_userdef.cc @@ -4694,11 +4694,10 @@ static void rna_def_userdef_view(BlenderRNA *brna) "overlay while animation is played back"); RNA_def_property_update(prop, 0, "rna_userdef_update"); - prop = RNA_def_property(srna, "fresnel_effect_factor", PROP_FLOAT, PROP_FACTOR); - RNA_def_property_float_sdna(prop, nullptr, "fresnel_mix_factor"); - RNA_def_property_range(prop, 0, 1.0); + prop = RNA_def_property(srna, "fresnel_effect", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, nullptr, "gpu_flag", USER_GPU_FLAG_FRESNEL); RNA_def_property_ui_text(prop, - "Fresnel Factor", + "Fresnel", "Intensity of the fresnel effect on edit mesh overlays.\n" "It improves a bit the shape readability of very dense meshes, " "but increases eye fatigue when modeling lower poly"); -- 2.30.2 From 1ee1c9ddeee068a0fa5f6a5665b9841c2fe5fb33 Mon Sep 17 00:00:00 2001 From: Gilberto Rodrigues Date: Tue, 18 Jul 2023 00:00:06 -0300 Subject: [PATCH 06/19] Fix tooltip --- source/blender/makesrna/intern/rna_userdef.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/blender/makesrna/intern/rna_userdef.cc b/source/blender/makesrna/intern/rna_userdef.cc index 6823160d1c9..25b6fd273fa 100644 --- a/source/blender/makesrna/intern/rna_userdef.cc +++ b/source/blender/makesrna/intern/rna_userdef.cc @@ -4697,8 +4697,8 @@ static void rna_def_userdef_view(BlenderRNA *brna) prop = RNA_def_property(srna, "fresnel_effect", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, nullptr, "gpu_flag", USER_GPU_FLAG_FRESNEL); RNA_def_property_ui_text(prop, - "Fresnel", - "Intensity of the fresnel effect on edit mesh overlays.\n" + "Edit Mode", + "Toggle fresnel effect on edit mesh overlays.\n" "It improves a bit the shape readability of very dense meshes, " "but increases eye fatigue when modeling lower poly"); RNA_def_property_update(prop, 0, "rna_userdef_gpu_update"); -- 2.30.2 From 86e22b50a7ceb4958cb07b909c13a82be9609692 Mon Sep 17 00:00:00 2001 From: Gilberto Rodrigues Date: Wed, 19 Jul 2023 01:29:53 -0300 Subject: [PATCH 07/19] Refactor overlay_wireframe_vert.glsl to add object mode fresnel toggle --- .../draw/engines/overlay/overlay_wireframe.cc | 7 +- .../shaders/infos/overlay_wireframe_info.hh | 2 +- .../shaders/overlay_wireframe_vert.glsl | 110 +++++++----------- 3 files changed, 48 insertions(+), 71 deletions(-) diff --git a/source/blender/draw/engines/overlay/overlay_wireframe.cc b/source/blender/draw/engines/overlay/overlay_wireframe.cc index e7c04f17159..c3c15522a46 100644 --- a/source/blender/draw/engines/overlay/overlay_wireframe.cc +++ b/source/blender/draw/engines/overlay/overlay_wireframe.cc @@ -60,10 +60,9 @@ void OVERLAY_wireframe_cache_init(OVERLAY_Data *vedata) pd->shdata.wire_opacity = pd->overlay.wireframe_opacity; - bool is_wire_shmode = (shading->type == OB_WIRE); bool is_material_shmode = (shading->type > OB_SOLID); - bool is_object_color = is_wire_shmode && (shading->wire_color_type == V3D_SHADING_OBJECT_COLOR); - bool is_random_color = is_wire_shmode && (shading->wire_color_type == V3D_SHADING_RANDOM_COLOR); + bool is_single_color = (shading->wire_color_type == V3D_SHADING_SINGLE_COLOR); + bool is_random_color = (shading->wire_color_type == V3D_SHADING_RANDOM_COLOR); const bool use_select = (DRW_state_is_select() || DRW_state_is_depth()); GPUShader *wires_sh = use_select ? OVERLAY_shader_wireframe_select() : @@ -95,7 +94,7 @@ void OVERLAY_wireframe_cache_init(OVERLAY_Data *vedata) DRW_shgroup_uniform_float_copy(grp, "wireOpacity", pd->shdata.wire_opacity); DRW_shgroup_uniform_bool_copy(grp, "useColoring", use_coloring); DRW_shgroup_uniform_bool_copy(grp, "isTransform", (G.moving & G_TRANSFORM_OBJ) != 0); - DRW_shgroup_uniform_bool_copy(grp, "isObjectColor", is_object_color); + DRW_shgroup_uniform_bool_copy(grp, "isSingleColor", is_single_color); DRW_shgroup_uniform_bool_copy(grp, "isRandomColor", is_random_color); DRW_shgroup_uniform_bool_copy(grp, "isHair", false); diff --git a/source/blender/draw/engines/overlay/shaders/infos/overlay_wireframe_info.hh b/source/blender/draw/engines/overlay/shaders/infos/overlay_wireframe_info.hh index ce27d80436c..fbfa9d9faf8 100644 --- a/source/blender/draw/engines/overlay/shaders/infos/overlay_wireframe_info.hh +++ b/source/blender/draw/engines/overlay/shaders/infos/overlay_wireframe_info.hh @@ -15,7 +15,7 @@ GPU_SHADER_CREATE_INFO(overlay_wireframe) .push_constant(Type::FLOAT, "wireOpacity") .push_constant(Type::BOOL, "useColoring") .push_constant(Type::BOOL, "isTransform") - .push_constant(Type::BOOL, "isObjectColor") + .push_constant(Type::BOOL, "isSingleColor") .push_constant(Type::BOOL, "isRandomColor") .push_constant(Type::BOOL, "isHair") .push_constant(Type::MAT4, "hairDupliMatrix") diff --git a/source/blender/draw/engines/overlay/shaders/overlay_wireframe_vert.glsl b/source/blender/draw/engines/overlay/shaders/overlay_wireframe_vert.glsl index 83a2b88478c..6b7222f22c7 100644 --- a/source/blender/draw/engines/overlay/shaders/overlay_wireframe_vert.glsl +++ b/source/blender/draw/engines/overlay/shaders/overlay_wireframe_vert.glsl @@ -6,35 +6,6 @@ bool is_edge_sharpness_visible(float wd) return wd <= wireStepParam; } -void wire_color_get(out vec3 rim_col, out vec3 wire_col) -{ - int flag = int(abs(ObjectInfo.w)); - bool is_selected = (flag & DRW_BASE_SELECTED) != 0; - bool is_from_set = (flag & DRW_BASE_FROM_SET) != 0; - bool is_active = (flag & DRW_BASE_ACTIVE) != 0; - - if (is_from_set) { - rim_col = colorWire.rgb; - wire_col = colorWire.rgb; - } - else if (is_selected && useColoring) { - if (isTransform) { - rim_col = colorTransform.rgb; - } - else if (is_active) { - rim_col = colorActive.rgb; - } - else { - rim_col = colorSelect.rgb; - } - wire_col = colorWire.rgb; - } - else { - rim_col = colorWire.rgb; - wire_col = colorBackground.rgb; - } -} - vec3 hsv_to_rgb(vec3 hsv) { vec3 nrgb = abs(hsv.x * 6.0 - vec3(3.0, 2.0, 4.0)) * vec3(1, -1, -1) + vec3(-1, 2, 2); @@ -42,33 +13,6 @@ vec3 hsv_to_rgb(vec3 hsv) return ((nrgb - 1.0) * hsv.y + 1.0) * hsv.z; } -void wire_object_color_get(out vec3 rim_col, out vec3 wire_col) -{ - int flag = int(abs(ObjectInfo.w)); - bool is_selected = (flag & DRW_BASE_SELECTED) != 0; - - if (isObjectColor) { - rim_col = wire_col = ObjectColor.rgb * 0.5; - } - else { - float hue = ObjectInfo.z; - vec3 hsv = vec3(hue, 0.75, 0.8); - rim_col = wire_col = hsv_to_rgb(hsv); - } - - if (is_selected && useColoring) { - /* "Normalize" color. */ - wire_col += 1e-4; /* Avoid division by 0. */ - float brightness = max(wire_col.x, max(wire_col.y, wire_col.z)); - wire_col *= 0.5 / brightness; - rim_col += 0.75; - } - else { - rim_col *= 0.5; - wire_col += 0.5; - } -} - void main() { bool no_attr = all(equal(nor, vec3(0))); @@ -118,25 +62,59 @@ void main() edgeStart = vec2(-1.0); } - vec3 rim_col, wire_col; + int flag = int(abs(ObjectInfo.w)); + bool is_selected = (flag & DRW_BASE_SELECTED) != 0; + bool is_active = (flag & DRW_BASE_ACTIVE) != 0; + bool selected_coloring = is_selected && useColoring; - if (isObjectColor || isRandomColor) { - wire_object_color_get(rim_col, wire_col); + /* Base Color */ + vec3 wire_col, rim_col, no_fresnel_col, fresnel_col; + + if (isRandomColor) { /* Dim random color. */ + float hue = ObjectInfo.z; + vec3 hsv = vec3(hue, 0.75, 0.8); + wire_col = hsv_to_rgb(hsv); } - else { - wire_color_get(rim_col, wire_col); + else { /* Initialize variable. */ + wire_col = ObjectColor.rgb; } + wire_col = (isSingleColor) ? colorWire.rgb : wire_col; + + /* Fresnel */ + no_fresnel_col = wire_col; + rim_col = wire_col; + + /* "Normalize" color. */ + wire_col += 1e-4; /* Avoid division by 0. */ + float brightness = max(wire_col.x, max(wire_col.y, wire_col.z)); + wire_col *= 0.5 / brightness; + rim_col += 0.75; facing = clamp(abs(facing), 0.0, 1.0); /* Do interpolation in a non-linear space to have a better visual result. */ rim_col = pow(rim_col, vec3(1.0 / 2.2)); wire_col = pow(wire_col, vec3(1.0 / 2.2)); - vec3 final_front_col = mix(rim_col, wire_col, 0.35); - finalColor.rgb = mix(rim_col, final_front_col, facing); - finalColor.rgb = pow(finalColor.rgb, vec3(2.2)); + fresnel_col = mix(rim_col, wire_col, 0.35); + fresnel_col = mix(rim_col, fresnel_col, facing); + fresnel_col = pow(fresnel_col, vec3(2.2)); - finalColor.a = wireOpacity; //multiplicar com opacidade da cor do obj - finalColor.rgb *= wireOpacity; //should be finalColor.rgb = mix(backgroundcolor,finalColor.rgb, wireOpacity); pra arrumar a cor do wireframe mode com xray + finalColor.rgb = mix(no_fresnel_col.rgb, fresnel_col, fresnelMix); + + /* Selection Color */ + if (selected_coloring) { + if (isTransform) { + finalColor.rgb = colorTransform.rgb; + } + else if (is_active) { + finalColor.rgb = colorActive.rgb; + } + else { + finalColor.rgb = colorSelect.rgb; + } + } + + finalColor.a = wireOpacity; + finalColor.rgb *= wireOpacity; view_clipping_distances(wpos); } -- 2.30.2 From 4c689fa87d82bd0c70ab7c3a900e01db0acb3836 Mon Sep 17 00:00:00 2001 From: Gilberto Rodrigues Date: Wed, 19 Jul 2023 02:05:57 -0300 Subject: [PATCH 08/19] UI: Enable Wire Color selection in any shading mode --- scripts/startup/bl_ui/space_view3d.py | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/scripts/startup/bl_ui/space_view3d.py b/scripts/startup/bl_ui/space_view3d.py index 457f5170abe..eedce7827b4 100644 --- a/scripts/startup/bl_ui/space_view3d.py +++ b/scripts/startup/bl_ui/space_view3d.py @@ -6235,13 +6235,13 @@ class VIEW3D_PT_shading_lighting(Panel): class VIEW3D_PT_shading_color(Panel): bl_space_type = 'VIEW_3D' bl_region_type = 'HEADER' - bl_label = "Color" + bl_label = "Wire Color" bl_parent_id = 'VIEW3D_PT_shading' @classmethod def poll(cls, context): shading = VIEW3D_PT_shading.get_shading(context) - return shading.type in {'WIREFRAME', 'SOLID'} + return shading.type in {'WIREFRAME', 'SOLID', 'MATERIAL', 'RENDERED'} def _draw_color_type(self, context): layout = self.layout @@ -6261,12 +6261,15 @@ class VIEW3D_PT_shading_color(Panel): layout.row().prop(shading, "background_color", text="") def draw(self, context): + layout = self.layout shading = VIEW3D_PT_shading.get_shading(context) - if shading.type == 'WIREFRAME': - self.layout.row().prop(shading, "wireframe_color_type", expand=True) - else: + + self.layout.row().prop(shading, "wireframe_color_type", expand=True) + self.layout.separator() + + if shading.type == 'SOLID': + layout.row().label(text="Color") self._draw_color_type(context) - self.layout.separator() self._draw_background_color(context) -- 2.30.2 From 5bd7099eb93b78d6703fcff90d1075811340bf61 Mon Sep 17 00:00:00 2001 From: Gilberto Rodrigues Date: Wed, 19 Jul 2023 06:25:17 -0300 Subject: [PATCH 09/19] Simplify further. Fix colored fresnel. --- .../shaders/overlay_wireframe_vert.glsl | 38 ++++++------------- 1 file changed, 11 insertions(+), 27 deletions(-) diff --git a/source/blender/draw/engines/overlay/shaders/overlay_wireframe_vert.glsl b/source/blender/draw/engines/overlay/shaders/overlay_wireframe_vert.glsl index 6b7222f22c7..c9dac14d819 100644 --- a/source/blender/draw/engines/overlay/shaders/overlay_wireframe_vert.glsl +++ b/source/blender/draw/engines/overlay/shaders/overlay_wireframe_vert.glsl @@ -68,38 +68,15 @@ void main() bool selected_coloring = is_selected && useColoring; /* Base Color */ - vec3 wire_col, rim_col, no_fresnel_col, fresnel_col; - if (isRandomColor) { /* Dim random color. */ float hue = ObjectInfo.z; vec3 hsv = vec3(hue, 0.75, 0.8); - wire_col = hsv_to_rgb(hsv); + finalColor.rgb = hsv_to_rgb(hsv); } else { /* Initialize variable. */ - wire_col = ObjectColor.rgb; + finalColor.rgb = ObjectColor.rgb; } - wire_col = (isSingleColor) ? colorWire.rgb : wire_col; - - /* Fresnel */ - no_fresnel_col = wire_col; - rim_col = wire_col; - - /* "Normalize" color. */ - wire_col += 1e-4; /* Avoid division by 0. */ - float brightness = max(wire_col.x, max(wire_col.y, wire_col.z)); - wire_col *= 0.5 / brightness; - rim_col += 0.75; - - facing = clamp(abs(facing), 0.0, 1.0); - - /* Do interpolation in a non-linear space to have a better visual result. */ - rim_col = pow(rim_col, vec3(1.0 / 2.2)); - wire_col = pow(wire_col, vec3(1.0 / 2.2)); - fresnel_col = mix(rim_col, wire_col, 0.35); - fresnel_col = mix(rim_col, fresnel_col, facing); - fresnel_col = pow(fresnel_col, vec3(2.2)); - - finalColor.rgb = mix(no_fresnel_col.rgb, fresnel_col, fresnelMix); + finalColor.rgb = (isSingleColor) ? colorWire.rgb : finalColor.rgb; /* Selection Color */ if (selected_coloring) { @@ -113,8 +90,15 @@ void main() finalColor.rgb = colorSelect.rgb; } } + /* Fresnel */ + facing = clamp(abs(facing), 0.0, 1.0); + float fresnel_alpha; - finalColor.a = wireOpacity; + fresnel_alpha = mix(0.0, 0.8, facing); + fresnel_alpha *= fresnelMix; + + finalColor.a = wireOpacity - fresnel_alpha; finalColor.rgb *= wireOpacity; + view_clipping_distances(wpos); } -- 2.30.2 From 01fd6f91953e2fe879200335540a150f7a73ac0a Mon Sep 17 00:00:00 2001 From: Gilberto Rodrigues Date: Wed, 19 Jul 2023 07:24:11 -0300 Subject: [PATCH 10/19] Separate toggle for object mode fresnel --- scripts/startup/bl_ui/space_userpref.py | 1 + .../overlay/shaders/overlay_wireframe_vert.glsl | 2 +- source/blender/draw/intern/draw_common.c | 1 + source/blender/draw/intern/draw_common_shader_shared.h | 4 +++- source/blender/makesdna/DNA_userdef_types.h | 1 + source/blender/makesrna/intern/rna_userdef.cc | 10 +++++++++- 6 files changed, 16 insertions(+), 3 deletions(-) diff --git a/scripts/startup/bl_ui/space_userpref.py b/scripts/startup/bl_ui/space_userpref.py index b72761ac149..e1c418aa8d8 100644 --- a/scripts/startup/bl_ui/space_userpref.py +++ b/scripts/startup/bl_ui/space_userpref.py @@ -750,6 +750,7 @@ class USERPREF_PT_viewport_display(ViewportPanel, CenterAlignMixIn, Panel): layout.separator() col = layout.column(heading="Fresnel") col.prop(view, "fresnel_effect") + col.prop(view, "fresnel_effect_ob") class USERPREF_PT_viewport_quality(ViewportPanel, CenterAlignMixIn, Panel): diff --git a/source/blender/draw/engines/overlay/shaders/overlay_wireframe_vert.glsl b/source/blender/draw/engines/overlay/shaders/overlay_wireframe_vert.glsl index c9dac14d819..720c814fdc5 100644 --- a/source/blender/draw/engines/overlay/shaders/overlay_wireframe_vert.glsl +++ b/source/blender/draw/engines/overlay/shaders/overlay_wireframe_vert.glsl @@ -95,7 +95,7 @@ void main() float fresnel_alpha; fresnel_alpha = mix(0.0, 0.8, facing); - fresnel_alpha *= fresnelMix; + fresnel_alpha *= fresnelMixOb; finalColor.a = wireOpacity - fresnel_alpha; finalColor.rgb *= wireOpacity; diff --git a/source/blender/draw/intern/draw_common.c b/source/blender/draw/intern/draw_common.c index 5e73d0f7f04..387021176fd 100644 --- a/source/blender/draw/intern/draw_common.c +++ b/source/blender/draw/intern/draw_common.c @@ -83,6 +83,7 @@ void DRW_globals_update(void) UI_GetThemeColor4fv(TH_TRANSPARENT_CHECKER_SECONDARY, gb->color_checker_secondary); gb->size_checker = UI_GetThemeValuef(TH_TRANSPARENT_CHECKER_SIZE); gb->fresnel_mix = ((U.gpu_flag & USER_GPU_FLAG_FRESNEL) == 0 ) ? 0.0 : 1.0; + gb->fresnel_mix_ob = ((U.gpu_flag & USER_GPU_FLAG_FRESNEL_OB) == 0 ) ? 0.0 : 1.0; UI_GetThemeColor4fv(TH_V3D_CLIPPING_BORDER, gb->color_clipping_border); /* Custom median color to slightly affect the edit mesh colors. */ diff --git a/source/blender/draw/intern/draw_common_shader_shared.h b/source/blender/draw/intern/draw_common_shader_shared.h index e72d1c6a3f3..bb7177724e9 100644 --- a/source/blender/draw/intern/draw_common_shader_shared.h +++ b/source/blender/draw/intern/draw_common_shader_shared.h @@ -135,7 +135,8 @@ struct GlobalsUboStorage { float size_checker; float size_vertex_gpencil; float fresnel_mix; - float _padd[3]; + float fresnel_mix_ob; + float _padd[2]; }; BLI_STATIC_ASSERT_ALIGN(GlobalsUboStorage, 16) @@ -247,6 +248,7 @@ BLI_STATIC_ASSERT_ALIGN(GlobalsUboStorage, 16) # define sizeChecker globalsBlock.size_checker # define sizeVertexGpencil globalsBlock.size_vertex_gpencil # define fresnelMix globalsBlock.fresnel_mix +# define fresnelMixOb globalsBlock.fresnel_mix_ob #endif /* See: 'draw_cache_impl.h' for matching includes. */ diff --git a/source/blender/makesdna/DNA_userdef_types.h b/source/blender/makesdna/DNA_userdef_types.h index d27e2c91394..b1bee98e221 100644 --- a/source/blender/makesdna/DNA_userdef_types.h +++ b/source/blender/makesdna/DNA_userdef_types.h @@ -1189,6 +1189,7 @@ typedef enum eUserpref_GPU_Flag { USER_GPU_FLAG_OVERLAY_SMOOTH_WIRE = (1 << 2), USER_GPU_FLAG_SUBDIVISION_EVALUATION = (1 << 3), USER_GPU_FLAG_FRESNEL = (1 << 4), + USER_GPU_FLAG_FRESNEL_OB = (1 << 5), } eUserpref_GPU_Flag; /** #UserDef.tablet_api */ diff --git a/source/blender/makesrna/intern/rna_userdef.cc b/source/blender/makesrna/intern/rna_userdef.cc index 25b6fd273fa..c1ae218daf7 100644 --- a/source/blender/makesrna/intern/rna_userdef.cc +++ b/source/blender/makesrna/intern/rna_userdef.cc @@ -4698,11 +4698,19 @@ static void rna_def_userdef_view(BlenderRNA *brna) RNA_def_property_boolean_sdna(prop, nullptr, "gpu_flag", USER_GPU_FLAG_FRESNEL); RNA_def_property_ui_text(prop, "Edit Mode", - "Toggle fresnel effect on edit mesh overlays.\n" + "Toggle a fresnel effect on edit mesh overlays.\n" "It improves a bit the shape readability of very dense meshes, " "but increases eye fatigue when modeling lower poly"); RNA_def_property_update(prop, 0, "rna_userdef_gpu_update"); + prop = RNA_def_property(srna, "fresnel_effect_ob", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, nullptr, "gpu_flag", USER_GPU_FLAG_FRESNEL_OB); + RNA_def_property_ui_text(prop, + "Object Mode", + "Toggle a fresnel fading effect on object mode wireframes.\n" + "It improves the shape readability of very dense meshes"); + RNA_def_property_update(prop, 0, "rna_userdef_gpu_update"); + USERDEF_TAG_DIRTY_PROPERTY_UPDATE_DISABLE; prop = RNA_def_property(srna, "show_addons_enabled_only", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna( -- 2.30.2 From 124f2634f67f4c138bacd1d57c92c12cd2bc3866 Mon Sep 17 00:00:00 2001 From: Gilberto Rodrigues Date: Wed, 19 Jul 2023 19:31:35 -0300 Subject: [PATCH 11/19] Improve fresnel on bright wireframes --- .../shaders/overlay_wireframe_vert.glsl | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/source/blender/draw/engines/overlay/shaders/overlay_wireframe_vert.glsl b/source/blender/draw/engines/overlay/shaders/overlay_wireframe_vert.glsl index 720c814fdc5..0a40ed54a8c 100644 --- a/source/blender/draw/engines/overlay/shaders/overlay_wireframe_vert.glsl +++ b/source/blender/draw/engines/overlay/shaders/overlay_wireframe_vert.glsl @@ -62,11 +62,6 @@ void main() edgeStart = vec2(-1.0); } - int flag = int(abs(ObjectInfo.w)); - bool is_selected = (flag & DRW_BASE_SELECTED) != 0; - bool is_active = (flag & DRW_BASE_ACTIVE) != 0; - bool selected_coloring = is_selected && useColoring; - /* Base Color */ if (isRandomColor) { /* Dim random color. */ float hue = ObjectInfo.z; @@ -79,7 +74,11 @@ void main() finalColor.rgb = (isSingleColor) ? colorWire.rgb : finalColor.rgb; /* Selection Color */ - if (selected_coloring) { + int flag = int(abs(ObjectInfo.w)); + bool is_selected = (flag & DRW_BASE_SELECTED) != 0; + bool is_active = (flag & DRW_BASE_ACTIVE) != 0; + + if (is_selected && useColoring) { if (isTransform) { finalColor.rgb = colorTransform.rgb; } @@ -90,14 +89,13 @@ void main() finalColor.rgb = colorSelect.rgb; } } + /* Fresnel */ facing = clamp(abs(facing), 0.0, 1.0); - float fresnel_alpha; - - fresnel_alpha = mix(0.0, 0.8, facing); - fresnel_alpha *= fresnelMixOb; + float fresnel_alpha = mix(0.0, 0.8, facing)*fresnelMixOb; finalColor.a = wireOpacity - fresnel_alpha; + finalColor.rgb = mix(finalColor.rgb, finalColor.rgb*(1-fresnel_alpha), fresnelMixOb); finalColor.rgb *= wireOpacity; view_clipping_distances(wpos); -- 2.30.2 From ce0e7fd3a6bdab2b9dccb9dc3531698573442a59 Mon Sep 17 00:00:00 2001 From: Gilberto Rodrigues Date: Sun, 23 Jul 2023 23:24:35 -0300 Subject: [PATCH 12/19] Rename variables, change tooltips --- scripts/startup/bl_ui/space_userpref.py | 4 ++-- .../overlay/shaders/overlay_edit_mesh_vert.glsl | 2 +- .../shaders/overlay_edit_mesh_vert_no_geom.glsl | 4 ++-- .../overlay/shaders/overlay_wireframe_vert.glsl | 4 ++-- source/blender/draw/intern/draw_common.c | 2 +- .../draw/intern/draw_common_shader_shared.h | 4 ++-- source/blender/makesdna/DNA_userdef_types.h | 4 ++-- source/blender/makesrna/intern/rna_userdef.cc | 14 +++++++------- 8 files changed, 19 insertions(+), 19 deletions(-) diff --git a/scripts/startup/bl_ui/space_userpref.py b/scripts/startup/bl_ui/space_userpref.py index e1c418aa8d8..0b4e2f08a5d 100644 --- a/scripts/startup/bl_ui/space_userpref.py +++ b/scripts/startup/bl_ui/space_userpref.py @@ -749,8 +749,8 @@ class USERPREF_PT_viewport_display(ViewportPanel, CenterAlignMixIn, Panel): layout.separator() col = layout.column(heading="Fresnel") - col.prop(view, "fresnel_effect") - col.prop(view, "fresnel_effect_ob") + col.prop(view, "use_fresnel_edit") + col.prop(view, "use_fresnel") class USERPREF_PT_viewport_quality(ViewportPanel, CenterAlignMixIn, Panel): 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 42af6bd7bcf..389e162709a 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 @@ -101,7 +101,7 @@ void main() /* Do interpolation in a non-linear space to have a better visual result. */ finalColor.rgb = mix(finalColor.rgb, non_linear_blend_color(colorEditMeshMiddle.rgb, - finalColor.rgb, facing), fresnelMix); + finalColor.rgb, facing), fresnelMixEdit); #endif 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 c0f20beb547..ab8b954edd6 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,9 +143,9 @@ void main() /* Do interpolation in a non-linear space to have a better visual result. */ out_finalColor[0].rgb = mix(out_finalColor[0].rgb, non_linear_blend_color( - colorEditMeshMiddle.rgb, out_finalColor[0].rgb, facing0), fresnelMix); + colorEditMeshMiddle.rgb, out_finalColor[0].rgb, facing0), fresnelMixEdit); out_finalColor[1].rgb = mix(out_finalColor[1].rgb, non_linear_blend_color( - colorEditMeshMiddle.rgb, out_finalColor[1].rgb, facing1), fresnelMix); + colorEditMeshMiddle.rgb, out_finalColor[1].rgb, facing1), fresnelMixEdit); #endif // -------- GEOM SHADER ALTERNATIVE ----------- // diff --git a/source/blender/draw/engines/overlay/shaders/overlay_wireframe_vert.glsl b/source/blender/draw/engines/overlay/shaders/overlay_wireframe_vert.glsl index 0a40ed54a8c..7d193cbb8d5 100644 --- a/source/blender/draw/engines/overlay/shaders/overlay_wireframe_vert.glsl +++ b/source/blender/draw/engines/overlay/shaders/overlay_wireframe_vert.glsl @@ -92,10 +92,10 @@ void main() /* Fresnel */ facing = clamp(abs(facing), 0.0, 1.0); - float fresnel_alpha = mix(0.0, 0.8, facing)*fresnelMixOb; + float fresnel_alpha = mix(0.0, 0.8, facing)*fresnelMix; finalColor.a = wireOpacity - fresnel_alpha; - finalColor.rgb = mix(finalColor.rgb, finalColor.rgb*(1-fresnel_alpha), fresnelMixOb); + finalColor.rgb = mix(finalColor.rgb, finalColor.rgb*(1-fresnel_alpha), fresnelMix); finalColor.rgb *= wireOpacity; view_clipping_distances(wpos); diff --git a/source/blender/draw/intern/draw_common.c b/source/blender/draw/intern/draw_common.c index 387021176fd..da6a6380713 100644 --- a/source/blender/draw/intern/draw_common.c +++ b/source/blender/draw/intern/draw_common.c @@ -82,8 +82,8 @@ void DRW_globals_update(void) UI_GetThemeColor4fv(TH_TRANSPARENT_CHECKER_PRIMARY, gb->color_checker_primary); UI_GetThemeColor4fv(TH_TRANSPARENT_CHECKER_SECONDARY, gb->color_checker_secondary); gb->size_checker = UI_GetThemeValuef(TH_TRANSPARENT_CHECKER_SIZE); + gb->fresnel_mix_edit = ((U.gpu_flag & USER_GPU_FLAG_FRESNEL_EDIT) == 0 ) ? 0.0 : 1.0; gb->fresnel_mix = ((U.gpu_flag & USER_GPU_FLAG_FRESNEL) == 0 ) ? 0.0 : 1.0; - gb->fresnel_mix_ob = ((U.gpu_flag & USER_GPU_FLAG_FRESNEL_OB) == 0 ) ? 0.0 : 1.0; UI_GetThemeColor4fv(TH_V3D_CLIPPING_BORDER, gb->color_clipping_border); /* Custom median color to slightly affect the edit mesh colors. */ diff --git a/source/blender/draw/intern/draw_common_shader_shared.h b/source/blender/draw/intern/draw_common_shader_shared.h index bb7177724e9..f8a283868ab 100644 --- a/source/blender/draw/intern/draw_common_shader_shared.h +++ b/source/blender/draw/intern/draw_common_shader_shared.h @@ -134,8 +134,8 @@ struct GlobalsUboStorage { float size_vertex, size_edge, size_edge_fix, size_face_dot; float size_checker; float size_vertex_gpencil; + float fresnel_mix_edit; float fresnel_mix; - float fresnel_mix_ob; float _padd[2]; }; BLI_STATIC_ASSERT_ALIGN(GlobalsUboStorage, 16) @@ -247,8 +247,8 @@ BLI_STATIC_ASSERT_ALIGN(GlobalsUboStorage, 16) # define sizeFaceDot globalsBlock.size_face_dot # define sizeChecker globalsBlock.size_checker # define sizeVertexGpencil globalsBlock.size_vertex_gpencil +# define fresnelMixEdit globalsBlock.fresnel_mix_edit # define fresnelMix globalsBlock.fresnel_mix -# define fresnelMixOb globalsBlock.fresnel_mix_ob #endif /* See: 'draw_cache_impl.h' for matching includes. */ diff --git a/source/blender/makesdna/DNA_userdef_types.h b/source/blender/makesdna/DNA_userdef_types.h index b1bee98e221..b942b139bd4 100644 --- a/source/blender/makesdna/DNA_userdef_types.h +++ b/source/blender/makesdna/DNA_userdef_types.h @@ -1188,8 +1188,8 @@ typedef enum eUserpref_GPU_Flag { USER_GPU_FLAG_NO_EDIT_MODE_SMOOTH_WIRE = (1 << 1), USER_GPU_FLAG_OVERLAY_SMOOTH_WIRE = (1 << 2), USER_GPU_FLAG_SUBDIVISION_EVALUATION = (1 << 3), - USER_GPU_FLAG_FRESNEL = (1 << 4), - USER_GPU_FLAG_FRESNEL_OB = (1 << 5), + USER_GPU_FLAG_FRESNEL_EDIT = (1 << 4), + USER_GPU_FLAG_FRESNEL = (1 << 5), } eUserpref_GPU_Flag; /** #UserDef.tablet_api */ diff --git a/source/blender/makesrna/intern/rna_userdef.cc b/source/blender/makesrna/intern/rna_userdef.cc index c1ae218daf7..cd78073003c 100644 --- a/source/blender/makesrna/intern/rna_userdef.cc +++ b/source/blender/makesrna/intern/rna_userdef.cc @@ -4694,20 +4694,20 @@ static void rna_def_userdef_view(BlenderRNA *brna) "overlay while animation is played back"); RNA_def_property_update(prop, 0, "rna_userdef_update"); - prop = RNA_def_property(srna, "fresnel_effect", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, nullptr, "gpu_flag", USER_GPU_FLAG_FRESNEL); + prop = RNA_def_property(srna, "use_fresnel_edit", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, nullptr, "gpu_flag", USER_GPU_FLAG_FRESNEL_EDIT); RNA_def_property_ui_text(prop, "Edit Mode", - "Toggle a fresnel effect on edit mesh overlays.\n" + "Enable a fresnel effect on edit mesh overlays.\n" "It improves a bit the shape readability of very dense meshes, " "but increases eye fatigue when modeling lower poly"); RNA_def_property_update(prop, 0, "rna_userdef_gpu_update"); - prop = RNA_def_property(srna, "fresnel_effect_ob", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, nullptr, "gpu_flag", USER_GPU_FLAG_FRESNEL_OB); + prop = RNA_def_property(srna, "use_fresnel", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, nullptr, "gpu_flag", USER_GPU_FLAG_FRESNEL); RNA_def_property_ui_text(prop, - "Object Mode", - "Toggle a fresnel fading effect on object mode wireframes.\n" + "Other Modes", + "Enable a fresnel effect on wireframes.\n" "It improves the shape readability of very dense meshes"); RNA_def_property_update(prop, 0, "rna_userdef_gpu_update"); -- 2.30.2 From 05ed595ad66dfa3a18faf1ba02010d8734c2a24b Mon Sep 17 00:00:00 2001 From: Gilberto Rodrigues Date: Mon, 24 Jul 2023 11:15:12 -0300 Subject: [PATCH 13/19] UI: Show only supported wire color types --- source/blender/makesrna/intern/rna_space.cc | 39 +++++---------------- 1 file changed, 9 insertions(+), 30 deletions(-) diff --git a/source/blender/makesrna/intern/rna_space.cc b/source/blender/makesrna/intern/rna_space.cc index 81a1d3365b2..fe7724ef726 100644 --- a/source/blender/makesrna/intern/rna_space.cc +++ b/source/blender/makesrna/intern/rna_space.cc @@ -438,6 +438,13 @@ static const EnumPropertyItem rna_enum_shading_color_type_items[] = { {0, nullptr, 0, nullptr, nullptr}, }; +static const EnumPropertyItem rna_enum_shading_wire_color_type_items[] = { + {V3D_SHADING_SINGLE_COLOR, "SINGLE", 0, "Single", "Show scene wires in a single color"}, + {V3D_SHADING_OBJECT_COLOR, "OBJECT", 0, "Object", "Show object color on wires"}, + {V3D_SHADING_RANDOM_COLOR, "RANDOM", 0, "Random", "Show random object color on wires"}, + {0, nullptr, 0, nullptr, nullptr}, +}; + static const EnumPropertyItem rna_enum_studio_light_items[] = { {0, "DEFAULT", 0, "Default", ""}, {0, nullptr, 0, nullptr, nullptr}, @@ -1304,33 +1311,7 @@ static PointerRNA rna_View3DShading_selected_studio_light_get(PointerRNA *ptr) } /* shading.light */ -static const EnumPropertyItem *rna_View3DShading_color_type_itemf(bContext * /*C*/, - PointerRNA *ptr, - PropertyRNA * /*prop*/, - bool *r_free) -{ - View3DShading *shading = (View3DShading *)ptr->data; - int totitem = 0; - - if (shading->type == OB_WIRE) { - EnumPropertyItem *item = nullptr; - RNA_enum_items_add_value( - &item, &totitem, rna_enum_shading_color_type_items, V3D_SHADING_SINGLE_COLOR); - RNA_enum_items_add_value( - &item, &totitem, rna_enum_shading_color_type_items, V3D_SHADING_OBJECT_COLOR); - RNA_enum_items_add_value( - &item, &totitem, rna_enum_shading_color_type_items, V3D_SHADING_RANDOM_COLOR); - RNA_enum_item_end(&item, &totitem); - *r_free = true; - return item; - } - else { - /* Solid mode, or lookdev mode for workbench engine. */ - *r_free = false; - return rna_enum_shading_color_type_items; - } -} static void rna_View3DShading_studio_light_get_storage(View3DShading *shading, char **dna_storage, @@ -4168,7 +4149,6 @@ static void rna_def_space_view3d_shading(BlenderRNA *brna) prop = RNA_def_property(srna, "color_type", PROP_ENUM, PROP_NONE); RNA_def_property_enum_sdna(prop, nullptr, "color_type"); RNA_def_property_enum_items(prop, rna_enum_shading_color_type_items); - RNA_def_property_enum_funcs(prop, nullptr, nullptr, "rna_View3DShading_color_type_itemf"); RNA_def_property_ui_text(prop, "Color", "Color Type"); RNA_def_property_clear_flag(prop, PROP_ANIMATABLE); RNA_def_property_update( @@ -4176,9 +4156,8 @@ static void rna_def_space_view3d_shading(BlenderRNA *brna) prop = RNA_def_property(srna, "wireframe_color_type", PROP_ENUM, PROP_NONE); RNA_def_property_enum_sdna(prop, nullptr, "wire_color_type"); - RNA_def_property_enum_items(prop, rna_enum_shading_color_type_items); - RNA_def_property_enum_funcs(prop, nullptr, nullptr, "rna_View3DShading_color_type_itemf"); - RNA_def_property_ui_text(prop, "Color", "Color Type"); + RNA_def_property_enum_items(prop, rna_enum_shading_wire_color_type_items); + RNA_def_property_ui_text(prop, "Wire Color", "Wire Color Type"); RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D | NS_VIEW3D_SHADING, nullptr); prop = RNA_def_property(srna, "single_color", PROP_FLOAT, PROP_COLOR); -- 2.30.2 From 9f05a188ac104bc4c6c41ef06f084c4655747663 Mon Sep 17 00:00:00 2001 From: Gilberto Rodrigues Date: Mon, 24 Jul 2023 11:43:14 -0300 Subject: [PATCH 14/19] UI Fix: hide 'background color' in rendered shmode --- scripts/startup/bl_ui/space_view3d.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/scripts/startup/bl_ui/space_view3d.py b/scripts/startup/bl_ui/space_view3d.py index eedce7827b4..34227c8c881 100644 --- a/scripts/startup/bl_ui/space_view3d.py +++ b/scripts/startup/bl_ui/space_view3d.py @@ -6270,7 +6270,10 @@ class VIEW3D_PT_shading_color(Panel): if shading.type == 'SOLID': layout.row().label(text="Color") self._draw_color_type(context) - self._draw_background_color(context) + self.layout.separator() + self._draw_background_color(context) + elif shading.type == 'WIREFRAME': + self._draw_background_color(context) class VIEW3D_PT_shading_options(Panel): -- 2.30.2 From 40d3fa069dd2dcf23d170349e7525bba9542eadc Mon Sep 17 00:00:00 2001 From: Gilberto Rodrigues Date: Mon, 24 Jul 2023 12:02:07 -0300 Subject: [PATCH 15/19] Rename wire color type 'Single' to 'Theme' and Fix tooltips --- source/blender/makesrna/intern/rna_space.cc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/source/blender/makesrna/intern/rna_space.cc b/source/blender/makesrna/intern/rna_space.cc index fe7724ef726..e20635c3d6d 100644 --- a/source/blender/makesrna/intern/rna_space.cc +++ b/source/blender/makesrna/intern/rna_space.cc @@ -439,9 +439,9 @@ static const EnumPropertyItem rna_enum_shading_color_type_items[] = { }; static const EnumPropertyItem rna_enum_shading_wire_color_type_items[] = { - {V3D_SHADING_SINGLE_COLOR, "SINGLE", 0, "Single", "Show scene wires in a single color"}, - {V3D_SHADING_OBJECT_COLOR, "OBJECT", 0, "Object", "Show object color on wires"}, - {V3D_SHADING_RANDOM_COLOR, "RANDOM", 0, "Random", "Show random object color on wires"}, + {V3D_SHADING_SINGLE_COLOR, "THEME", 0, "Theme", "Show scene wireframes with the theme's wire color"}, + {V3D_SHADING_OBJECT_COLOR, "OBJECT", 0, "Object", "Show object color on wireframe"}, + {V3D_SHADING_RANDOM_COLOR, "RANDOM", 0, "Random", "Show random object color on wireframe"}, {0, nullptr, 0, nullptr, nullptr}, }; -- 2.30.2 From 4fc5e3ff044c1dd0600a560a85421d9894cf37d6 Mon Sep 17 00:00:00 2001 From: Gilberto Rodrigues Date: Sat, 12 Aug 2023 23:43:44 -0300 Subject: [PATCH 16/19] move to functions, change variables, fix typo. --- .../draw/engines/overlay/overlay_wireframe.cc | 7 +- .../shaders/infos/overlay_wireframe_info.hh | 3 +- .../shaders/overlay_wireframe_vert.glsl | 72 +++++++++++-------- .../draw/intern/draw_common_shader_shared.h | 2 +- .../draw/intern/shaders/common_view_lib.glsl | 3 + 5 files changed, 51 insertions(+), 36 deletions(-) diff --git a/source/blender/draw/engines/overlay/overlay_wireframe.cc b/source/blender/draw/engines/overlay/overlay_wireframe.cc index c3c15522a46..ae88fb4e801 100644 --- a/source/blender/draw/engines/overlay/overlay_wireframe.cc +++ b/source/blender/draw/engines/overlay/overlay_wireframe.cc @@ -61,8 +61,8 @@ void OVERLAY_wireframe_cache_init(OVERLAY_Data *vedata) pd->shdata.wire_opacity = pd->overlay.wireframe_opacity; bool is_material_shmode = (shading->type > OB_SOLID); - bool is_single_color = (shading->wire_color_type == V3D_SHADING_SINGLE_COLOR); - bool is_random_color = (shading->wire_color_type == V3D_SHADING_RANDOM_COLOR); + + int color_type = shading->wire_color_type; const bool use_select = (DRW_state_is_select() || DRW_state_is_depth()); GPUShader *wires_sh = use_select ? OVERLAY_shader_wireframe_select() : @@ -94,8 +94,7 @@ void OVERLAY_wireframe_cache_init(OVERLAY_Data *vedata) DRW_shgroup_uniform_float_copy(grp, "wireOpacity", pd->shdata.wire_opacity); DRW_shgroup_uniform_bool_copy(grp, "useColoring", use_coloring); DRW_shgroup_uniform_bool_copy(grp, "isTransform", (G.moving & G_TRANSFORM_OBJ) != 0); - DRW_shgroup_uniform_bool_copy(grp, "isSingleColor", is_single_color); - DRW_shgroup_uniform_bool_copy(grp, "isRandomColor", is_random_color); + DRW_shgroup_uniform_int_copy(grp, "colorType", color_type); DRW_shgroup_uniform_bool_copy(grp, "isHair", false); pd->wires_all_grp[xray][use_coloring] = grp = DRW_shgroup_create(wires_sh, pass); diff --git a/source/blender/draw/engines/overlay/shaders/infos/overlay_wireframe_info.hh b/source/blender/draw/engines/overlay/shaders/infos/overlay_wireframe_info.hh index fbfa9d9faf8..1b349fb083f 100644 --- a/source/blender/draw/engines/overlay/shaders/infos/overlay_wireframe_info.hh +++ b/source/blender/draw/engines/overlay/shaders/infos/overlay_wireframe_info.hh @@ -15,8 +15,7 @@ GPU_SHADER_CREATE_INFO(overlay_wireframe) .push_constant(Type::FLOAT, "wireOpacity") .push_constant(Type::BOOL, "useColoring") .push_constant(Type::BOOL, "isTransform") - .push_constant(Type::BOOL, "isSingleColor") - .push_constant(Type::BOOL, "isRandomColor") + .push_constant(Type::INT, "colorType") .push_constant(Type::BOOL, "isHair") .push_constant(Type::MAT4, "hairDupliMatrix") /* Scene Depth texture copy for manual depth test. */ diff --git a/source/blender/draw/engines/overlay/shaders/overlay_wireframe_vert.glsl b/source/blender/draw/engines/overlay/shaders/overlay_wireframe_vert.glsl index 7d193cbb8d5..e42b11671fc 100644 --- a/source/blender/draw/engines/overlay/shaders/overlay_wireframe_vert.glsl +++ b/source/blender/draw/engines/overlay/shaders/overlay_wireframe_vert.glsl @@ -13,6 +13,45 @@ vec3 hsv_to_rgb(vec3 hsv) return ((nrgb - 1.0) * hsv.y + 1.0) * hsv.z; } +vec3 wire_selected_color_get(bool is_active) +{ + vec3 wire_col; + if (isTransform) { + wire_col = colorTransform.rgb; + } + else if (is_active) { + wire_col = colorActive.rgb; + } + else { + wire_col = colorSelect.rgb; + } + return wire_col; +} + +vec3 wire_color_get() +{ + vec3 wire_col; + int flag = int(abs(ObjectInfo.w)); + bool is_active = (flag & DRW_BASE_ACTIVE) != 0; + bool is_selected = (flag & DRW_BASE_SELECTED) != 0; + + if (useColoring && is_selected) { + wire_col = wire_selected_color_get(is_active); + } + else if (colorType == V3D_SHADING_SINGLE_COLOR) { + wire_col = colorWire.rgb; + } + else if (colorType == V3D_SHADING_RANDOM_COLOR) { + /* Dim random color. */ + float hue = ObjectInfo.z; + vec3 hsv = vec3(hue, 0.75, 0.8); + wire_col = hsv_to_rgb(hsv); + } + else /* V3D_SHADING_OBJECT_COLOR */ + wire_col = ObjectColor.rgb; + return wire_col; +} + void main() { bool no_attr = all(equal(nor, vec3(0))); @@ -51,44 +90,19 @@ void main() #ifndef SELECT_EDGES edgePos = edgeStart; -#else +#else /* HACK: to avoid losing sub-pixel object in selections, we add a bit of randomness to the * wire to at least create one fragment that will pass the occlusion query. */ gl_Position.xy += sizeViewportInv * gl_Position.w * ((gl_VertexID % 2 == 0) ? -1.0 : 1.0); #endif - + /* Cull flat edges below threshold. */ if (!no_attr && !is_edge_sharpness_visible(wd)) { edgeStart = vec2(-1.0); } - /* Base Color */ - if (isRandomColor) { /* Dim random color. */ - float hue = ObjectInfo.z; - vec3 hsv = vec3(hue, 0.75, 0.8); - finalColor.rgb = hsv_to_rgb(hsv); - } - else { /* Initialize variable. */ - finalColor.rgb = ObjectColor.rgb; - } - finalColor.rgb = (isSingleColor) ? colorWire.rgb : finalColor.rgb; - - /* Selection Color */ - int flag = int(abs(ObjectInfo.w)); - bool is_selected = (flag & DRW_BASE_SELECTED) != 0; - bool is_active = (flag & DRW_BASE_ACTIVE) != 0; - - if (is_selected && useColoring) { - if (isTransform) { - finalColor.rgb = colorTransform.rgb; - } - else if (is_active) { - finalColor.rgb = colorActive.rgb; - } - else { - finalColor.rgb = colorSelect.rgb; - } - } + /* Wire Color */ + finalColor.rgb = wire_color_get(); /* Fresnel */ facing = clamp(abs(facing), 0.0, 1.0); diff --git a/source/blender/draw/intern/draw_common_shader_shared.h b/source/blender/draw/intern/draw_common_shader_shared.h index f8a283868ab..b8660202397 100644 --- a/source/blender/draw/intern/draw_common_shader_shared.h +++ b/source/blender/draw/intern/draw_common_shader_shared.h @@ -136,7 +136,7 @@ struct GlobalsUboStorage { float size_vertex_gpencil; float fresnel_mix_edit; float fresnel_mix; - float _padd[2]; + float _pad[2]; }; BLI_STATIC_ASSERT_ALIGN(GlobalsUboStorage, 16) diff --git a/source/blender/draw/intern/shaders/common_view_lib.glsl b/source/blender/draw/intern/shaders/common_view_lib.glsl index 20b09576d37..6963a5fd8d8 100644 --- a/source/blender/draw/intern/shaders/common_view_lib.glsl +++ b/source/blender/draw/intern/shaders/common_view_lib.glsl @@ -291,6 +291,9 @@ float get_homogenous_z_offset(float vs_z, float hs_w, float vs_offset) #define DRW_BASE_FROM_SET (1 << 3) #define DRW_BASE_ACTIVE (1 << 4) +#define V3D_SHADING_RANDOM_COLOR 1 +#define V3D_SHADING_SINGLE_COLOR 2 + /* ---- Opengl Depth conversion ---- */ float linear_depth(bool is_persp, float z, float zf, float zn) -- 2.30.2 From 83c12ba44af5992ca1157e2dba19bc6ebe0c77c6 Mon Sep 17 00:00:00 2001 From: Gilberto Rodrigues Date: Mon, 21 Aug 2023 04:30:48 -0300 Subject: [PATCH 17/19] Add Fresnel Intensity slider --- release/datafiles/userdef/userdef_default.c | 1 + scripts/startup/bl_ui/space_userpref.py | 2 +- .../engines/overlay/shaders/overlay_edit_mesh_vert.glsl | 2 +- .../engines/overlay/shaders/overlay_wireframe_vert.glsl | 2 +- source/blender/draw/intern/draw_common.c | 4 ++-- source/blender/makesdna/DNA_userdef_types.h | 3 +++ source/blender/makesrna/intern/rna_userdef.cc | 6 ++++++ 7 files changed, 15 insertions(+), 5 deletions(-) diff --git a/release/datafiles/userdef/userdef_default.c b/release/datafiles/userdef/userdef_default.c index a18bb88c8f6..f1796c423ee 100644 --- a/release/datafiles/userdef/userdef_default.c +++ b/release/datafiles/userdef/userdef_default.c @@ -120,6 +120,7 @@ const UserDef U_default = { .gizmo_flag = USER_GIZMO_DRAW, .gizmo_size = 75, .gizmo_size_navigate_v3d = 80, + .fresnel_intensity = 0.2, .edit_studio_light = 0, .lookdev_sphere_size = 150, .vbotimeout = 120, diff --git a/scripts/startup/bl_ui/space_userpref.py b/scripts/startup/bl_ui/space_userpref.py index 0b4e2f08a5d..3506ed11ce6 100644 --- a/scripts/startup/bl_ui/space_userpref.py +++ b/scripts/startup/bl_ui/space_userpref.py @@ -751,7 +751,7 @@ class USERPREF_PT_viewport_display(ViewportPanel, CenterAlignMixIn, Panel): col = layout.column(heading="Fresnel") col.prop(view, "use_fresnel_edit") col.prop(view, "use_fresnel") - + col.prop(view, "fresnel_intensity_factor") class USERPREF_PT_viewport_quality(ViewportPanel, CenterAlignMixIn, Panel): bl_label = "Quality" 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 389e162709a..25272fe508f 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 @@ -97,7 +97,7 @@ void main() vec3 view_normal = normalize(normal_object_to_view(vnor) + 1e-4); 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; + facing = 1.0 - abs(facing)*0.6; /* Do interpolation in a non-linear space to have a better visual result. */ finalColor.rgb = mix(finalColor.rgb, non_linear_blend_color(colorEditMeshMiddle.rgb, diff --git a/source/blender/draw/engines/overlay/shaders/overlay_wireframe_vert.glsl b/source/blender/draw/engines/overlay/shaders/overlay_wireframe_vert.glsl index e42b11671fc..f08467a6366 100644 --- a/source/blender/draw/engines/overlay/shaders/overlay_wireframe_vert.glsl +++ b/source/blender/draw/engines/overlay/shaders/overlay_wireframe_vert.glsl @@ -106,7 +106,7 @@ void main() /* Fresnel */ facing = clamp(abs(facing), 0.0, 1.0); - float fresnel_alpha = mix(0.0, 0.8, facing)*fresnelMix; + float fresnel_alpha = mix(0.0, fresnelMix, facing); finalColor.a = wireOpacity - fresnel_alpha; finalColor.rgb = mix(finalColor.rgb, finalColor.rgb*(1-fresnel_alpha), fresnelMix); diff --git a/source/blender/draw/intern/draw_common.c b/source/blender/draw/intern/draw_common.c index da6a6380713..692d93add71 100644 --- a/source/blender/draw/intern/draw_common.c +++ b/source/blender/draw/intern/draw_common.c @@ -82,8 +82,8 @@ void DRW_globals_update(void) UI_GetThemeColor4fv(TH_TRANSPARENT_CHECKER_PRIMARY, gb->color_checker_primary); UI_GetThemeColor4fv(TH_TRANSPARENT_CHECKER_SECONDARY, gb->color_checker_secondary); gb->size_checker = UI_GetThemeValuef(TH_TRANSPARENT_CHECKER_SIZE); - gb->fresnel_mix_edit = ((U.gpu_flag & USER_GPU_FLAG_FRESNEL_EDIT) == 0 ) ? 0.0 : 1.0; - gb->fresnel_mix = ((U.gpu_flag & USER_GPU_FLAG_FRESNEL) == 0 ) ? 0.0 : 1.0; + gb->fresnel_mix_edit = ((U.gpu_flag & USER_GPU_FLAG_FRESNEL_EDIT) == 0 ) ? 0.0 : U.fresnel_intensity; + gb->fresnel_mix = ((U.gpu_flag & USER_GPU_FLAG_FRESNEL) == 0 ) ? 0.0 : U.fresnel_intensity; UI_GetThemeColor4fv(TH_V3D_CLIPPING_BORDER, gb->color_clipping_border); /* Custom median color to slightly affect the edit mesh colors. */ diff --git a/source/blender/makesdna/DNA_userdef_types.h b/source/blender/makesdna/DNA_userdef_types.h index b942b139bd4..c9d70f963f5 100644 --- a/source/blender/makesdna/DNA_userdef_types.h +++ b/source/blender/makesdna/DNA_userdef_types.h @@ -993,6 +993,9 @@ typedef struct UserDef { struct WalkNavigation walk_navigation; + /** Fresnel */ + float fresnel_intensity; + char _pad[4]; /** The UI for the user preferences. */ UserDef_SpaceData space_data; diff --git a/source/blender/makesrna/intern/rna_userdef.cc b/source/blender/makesrna/intern/rna_userdef.cc index cd78073003c..0aaec59d6fa 100644 --- a/source/blender/makesrna/intern/rna_userdef.cc +++ b/source/blender/makesrna/intern/rna_userdef.cc @@ -4711,6 +4711,12 @@ static void rna_def_userdef_view(BlenderRNA *brna) "It improves the shape readability of very dense meshes"); RNA_def_property_update(prop, 0, "rna_userdef_gpu_update"); + prop = RNA_def_property(srna, "fresnel_intensity_factor", PROP_FLOAT, PROP_FACTOR); + RNA_def_property_float_sdna(prop, nullptr, "fresnel_intensity"); + RNA_def_property_ui_text(prop, "Fresnel Intensity", "Intensity of wireframe fresnel"); + RNA_def_property_range(prop, 0.0, 1.0); + RNA_def_property_update(prop, 0, "rna_userdef_gpu_update"); + USERDEF_TAG_DIRTY_PROPERTY_UPDATE_DISABLE; prop = RNA_def_property(srna, "show_addons_enabled_only", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna( -- 2.30.2 From f402f5098dc28c0cad9037ff3bc10903704eaa07 Mon Sep 17 00:00:00 2001 From: Gilberto Rodrigues Date: Mon, 21 Aug 2023 21:48:37 -0300 Subject: [PATCH 18/19] invert fresnel effect on wire color --- release/datafiles/userdef/userdef_default.c | 2 +- .../draw/engines/overlay/shaders/overlay_wireframe_vert.glsl | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/release/datafiles/userdef/userdef_default.c b/release/datafiles/userdef/userdef_default.c index f1796c423ee..e638f4d583d 100644 --- a/release/datafiles/userdef/userdef_default.c +++ b/release/datafiles/userdef/userdef_default.c @@ -120,7 +120,7 @@ const UserDef U_default = { .gizmo_flag = USER_GIZMO_DRAW, .gizmo_size = 75, .gizmo_size_navigate_v3d = 80, - .fresnel_intensity = 0.2, + .fresnel_intensity = 0.4, .edit_studio_light = 0, .lookdev_sphere_size = 150, .vbotimeout = 120, diff --git a/source/blender/draw/engines/overlay/shaders/overlay_wireframe_vert.glsl b/source/blender/draw/engines/overlay/shaders/overlay_wireframe_vert.glsl index f08467a6366..d2c9a8cb4a6 100644 --- a/source/blender/draw/engines/overlay/shaders/overlay_wireframe_vert.glsl +++ b/source/blender/draw/engines/overlay/shaders/overlay_wireframe_vert.glsl @@ -109,7 +109,7 @@ void main() float fresnel_alpha = mix(0.0, fresnelMix, facing); finalColor.a = wireOpacity - fresnel_alpha; - finalColor.rgb = mix(finalColor.rgb, finalColor.rgb*(1-fresnel_alpha), fresnelMix); + finalColor.rgb = mix(finalColor.rgb, finalColor.rgb*(fresnel_alpha), fresnelMix); finalColor.rgb *= wireOpacity; view_clipping_distances(wpos); -- 2.30.2 From 7567732bed54b2593ac5974be45351b19c3688da Mon Sep 17 00:00:00 2001 From: Gilberto Rodrigues Date: Tue, 22 Aug 2023 06:26:20 -0300 Subject: [PATCH 19/19] move fresnel to function --- .../shaders/overlay_wireframe_vert.glsl | 43 +++++++++++++------ 1 file changed, 29 insertions(+), 14 deletions(-) diff --git a/source/blender/draw/engines/overlay/shaders/overlay_wireframe_vert.glsl b/source/blender/draw/engines/overlay/shaders/overlay_wireframe_vert.glsl index d2c9a8cb4a6..39df61203f0 100644 --- a/source/blender/draw/engines/overlay/shaders/overlay_wireframe_vert.glsl +++ b/source/blender/draw/engines/overlay/shaders/overlay_wireframe_vert.glsl @@ -28,17 +28,10 @@ vec3 wire_selected_color_get(bool is_active) return wire_col; } -vec3 wire_color_get() +vec3 base_wire_color_get() { vec3 wire_col; - int flag = int(abs(ObjectInfo.w)); - bool is_active = (flag & DRW_BASE_ACTIVE) != 0; - bool is_selected = (flag & DRW_BASE_SELECTED) != 0; - - if (useColoring && is_selected) { - wire_col = wire_selected_color_get(is_active); - } - else if (colorType == V3D_SHADING_SINGLE_COLOR) { + if (colorType == V3D_SHADING_SINGLE_COLOR) { wire_col = colorWire.rgb; } else if (colorType == V3D_SHADING_RANDOM_COLOR) { @@ -52,6 +45,27 @@ vec3 wire_color_get() return wire_col; } +vec3 wire_color_get(bool is_active, bool is_selected) +{ + vec3 wire_col; + if (useColoring && is_selected) { + wire_col = wire_selected_color_get(is_active); + } + else + wire_col = base_wire_color_get(); + return wire_col; +} + +vec4 wire_fresnel_get(vec4 wire_col, float facing, bool is_selected) +{ + facing = clamp(abs(facing), 0.0, 1.0); + float fresnel_alpha = mix(0.0, fresnelMix, facing); + vec3 fresnel_color = wire_col.rgb * fresnel_alpha; + wire_col.rgb = mix(wire_col.rgb, fresnel_color, fresnelMix); + wire_col.a = wireOpacity * (1 - fresnel_alpha); + return wire_col; +} + void main() { bool no_attr = all(equal(nor, vec3(0))); @@ -102,14 +116,15 @@ void main() } /* Wire Color */ - finalColor.rgb = wire_color_get(); + int flag = int(abs(ObjectInfo.w)); + bool is_active = (flag & DRW_BASE_ACTIVE) != 0; + bool is_selected = (flag & DRW_BASE_SELECTED) != 0; + + finalColor.rgb = wire_color_get(is_active, is_selected); /* Fresnel */ - facing = clamp(abs(facing), 0.0, 1.0); - float fresnel_alpha = mix(0.0, fresnelMix, facing); + finalColor = wire_fresnel_get(finalColor, facing, is_selected); - finalColor.a = wireOpacity - fresnel_alpha; - finalColor.rgb = mix(finalColor.rgb, finalColor.rgb*(fresnel_alpha), fresnelMix); finalColor.rgb *= wireOpacity; view_clipping_distances(wpos); -- 2.30.2