From 7d99ac26cc26a4f89898e1553e422bacc148d086 Mon Sep 17 00:00:00 2001 From: Omar Emara Date: Tue, 7 Oct 2025 17:22:36 +0200 Subject: [PATCH] Fix #146886: Zero division in Distance Key node Pull Request: https://projects.blender.org/blender/blender/pulls/147550 --- .../shaders/library/gpu_shader_compositor_distance_matte.glsl | 3 ++- .../nodes/composite/nodes/node_composite_distance_matte.cc | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/source/blender/compositor/shaders/library/gpu_shader_compositor_distance_matte.glsl b/source/blender/compositor/shaders/library/gpu_shader_compositor_distance_matte.glsl index 25933a829fe..3e99ab6a5a9 100644 --- a/source/blender/compositor/shaders/library/gpu_shader_compositor_distance_matte.glsl +++ b/source/blender/compositor/shaders/library/gpu_shader_compositor_distance_matte.glsl @@ -3,6 +3,7 @@ * SPDX-License-Identifier: GPL-2.0-or-later */ #include "gpu_shader_common_color_utils.glsl" +#include "gpu_shader_math_safe_lib.glsl" #define CMP_NODE_DISTANCE_MATTE_COLOR_SPACE_RGBA 0 #define CMP_NODE_DISTANCE_MATTE_COLOR_SPACE_YCCA 1 @@ -30,7 +31,7 @@ void node_composite_distance_matte(const float4 color, float difference = distance(color_vector.xyz(), key_vector.xyz()); bool is_opaque = difference > tolerance + falloff; - float alpha = is_opaque ? color.w : max(0.0f, difference - tolerance) / falloff; + float alpha = is_opaque ? color.w : safe_divide(max(0.0f, difference - tolerance), falloff); matte = min(alpha, color.w); result = color * matte; } diff --git a/source/blender/nodes/composite/nodes/node_composite_distance_matte.cc b/source/blender/nodes/composite/nodes/node_composite_distance_matte.cc index 35a133a44c7..f5f878496ee 100644 --- a/source/blender/nodes/composite/nodes/node_composite_distance_matte.cc +++ b/source/blender/nodes/composite/nodes/node_composite_distance_matte.cc @@ -105,7 +105,8 @@ static void distance_key(const float4 color, float difference = math::distance(color_vector.xyz(), key_vector.xyz()); bool is_opaque = difference > tolerance + falloff; - float alpha = is_opaque ? color.w : math::max(0.0f, difference - tolerance) / falloff; + float alpha = is_opaque ? color.w : + math::safe_divide(math::max(0.0f, difference - tolerance), falloff); matte = math::min(alpha, color.w); result = color * matte; }