diff --git a/source/blender/editors/space_node/drawnode.cc b/source/blender/editors/space_node/drawnode.cc index 1c745aaad55..2455cfd4d43 100644 --- a/source/blender/editors/space_node/drawnode.cc +++ b/source/blender/editors/space_node/drawnode.cc @@ -2137,7 +2137,7 @@ static NodeLinkDrawConfig nodelink_get_draw_config(const bContext &C, const float scale = UI_view2d_scale_get_x(&v2d); /* Clamp the thickness to make the links more readable when zooming out. */ - draw_config.thickness = LINK_WIDTH * max_ff(UI_SCALE_FAC * scale, 1.0f) * + draw_config.thickness = LINK_WIDTH * max_ff(UI_SCALE_FAC * scale, 1.25f) * (field_link ? 0.7f : 1.0f); draw_config.highlighted = link.flag & NODE_LINK_TEMP_HIGHLIGHT; draw_config.drawarrow = ((link.tonode && (link.tonode->type == NODE_REROUTE)) && diff --git a/source/blender/gpu/shaders/gpu_shader_2D_nodelink_frag.glsl b/source/blender/gpu/shaders/gpu_shader_2D_nodelink_frag.glsl index 860386d366b..ee0a424834b 100644 --- a/source/blender/gpu/shaders/gpu_shader_2D_nodelink_frag.glsl +++ b/source/blender/gpu/shaders/gpu_shader_2D_nodelink_frag.glsl @@ -5,28 +5,50 @@ #define ANTIALIAS 1.5 #define MINIMUM_ALPHA 0.5 +float dash_mask(float distance_along_line, float dash_length, float dash_factor) +{ + float normalized_distance = fract(distance_along_line / dash_length); + + /* Checking if `normalized_distance <= dashFactor` is already enough for a basic + * dash, however we want to handle a nice antialias. */ + + float normalized_distance_triangle = abs(normalized_distance * 2.0 - 1.0); + float t = aspect * ANTIALIAS / dash_length; + float slope = 1.0 / (2.0 * t); + + float unclamped_alpha = 1.0 - slope * (normalized_distance_triangle - dash_factor + t); + + return max(0.0, min(unclamped_alpha, 1.0)); +} + void main() { fragColor = finalColor; if ((isMainLine != 0) && (dashFactor < 1.0)) { float distance_along_line = lineLength * lineU; - float normalized_distance = fract(distance_along_line / dashLength); - /* Checking if `normalized_distance <= dashFactor` is already enough for a basic - * dash, however we want to handle a nice anti-alias. */ + float current_scale_level = floor(dashLevel); + float next_scale_level = ceil(dashLevel); + /* Smoothly blend between two levels of dash sizes. The interval was chosen by feel. */ + float mix_factor = smoothstep(0.6, 0.9, fract(dashLevel)); - float dash_center = dashLength * dashFactor * 0.5; - float normalized_distance_triangle = - 1.0 - abs((fract((distance_along_line - dash_center) / dashLength)) * 2.0 - 1.0); - float t = aspect * ANTIALIAS / dashLength; - float slope = 1.0 / (2.0 * t); + float current_dash_length = dashLength * pow(2.0, current_scale_level); - float unclamped_alpha = 1.0 - slope * (normalized_distance_triangle - dashFactor + t); - float alpha = max(dashAlpha, min(unclamped_alpha, 1.0)); + /* Widen the gap to approach the width of the next level. + * This assumes the dashFactor is at least 0.5. */ + float current_dash_factor = 1.0 - ((1.0 - dashFactor) * (1.0 + mix_factor)); + float current_level_dash_mask = dash_mask( + distance_along_line, current_dash_length, current_dash_factor); - fragColor.a *= alpha; + float next_dash_length = current_dash_length * 2.0; + float next_level_dash_mask = dash_mask(distance_along_line, next_dash_length, dashFactor); + + float dash_alpha = max(dashAlpha, current_level_dash_mask + mix_factor * next_level_dash_mask); + + fragColor.a *= dash_alpha; } - fragColor.a *= smoothstep(lineThickness, lineThickness - ANTIALIAS, abs(colorGradient)); + fragColor.a = min(fragColor.a, + smoothstep(lineThickness, lineThickness - ANTIALIAS, abs(colorGradient))); } diff --git a/source/blender/gpu/shaders/gpu_shader_2D_nodelink_vert.glsl b/source/blender/gpu/shaders/gpu_shader_2D_nodelink_vert.glsl index cc7e3a49cfb..6510341732d 100644 --- a/source/blender/gpu/shaders/gpu_shader_2D_nodelink_vert.glsl +++ b/source/blender/gpu/shaders/gpu_shader_2D_nodelink_vert.glsl @@ -108,6 +108,7 @@ void main(void) float expand_dist = line_thickness * (uv.y * 2.0 - 1.0); colorGradient = expand_dist; lineThickness = line_thickness; + dashLevel = max(0.5, log(node_link_data.aspect) / log(2.0)); finalColor[3] *= dim_factor; diff --git a/source/blender/gpu/shaders/infos/gpu_shader_2D_nodelink_info.hh b/source/blender/gpu/shaders/infos/gpu_shader_2D_nodelink_info.hh index 3dcaf6b2658..ef81b8d4a1a 100644 --- a/source/blender/gpu/shaders/infos/gpu_shader_2D_nodelink_info.hh +++ b/source/blender/gpu/shaders/infos/gpu_shader_2D_nodelink_info.hh @@ -17,6 +17,7 @@ GPU_SHADER_INTERFACE_INFO(nodelink_iface, "") .flat(Type::FLOAT, "dashLength") .flat(Type::FLOAT, "dashFactor") .flat(Type::FLOAT, "dashAlpha") + .flat(Type::FLOAT, "dashLevel") .flat(Type::INT, "isMainLine") .flat(Type::FLOAT, "aspect");