From 7f89063161cfbc394db8807fa47db10f570a5908 Mon Sep 17 00:00:00 2001 From: Germano Cavalcante Date: Tue, 7 Nov 2023 18:30:34 -0300 Subject: [PATCH] Fix #114596: Face Nearest with steps sometimes breaks When multiple steps are tested, we cannot depend on the distance calculated for `nearest.dist_sq`, as it reduces with each step. --- source/blender/editors/transform/transform_snap_object.cc | 6 ++++++ .../blender/editors/transform/transform_snap_object_mesh.cc | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/source/blender/editors/transform/transform_snap_object.cc b/source/blender/editors/transform/transform_snap_object.cc index 36a833feea5..d11e62ef433 100644 --- a/source/blender/editors/transform/transform_snap_object.cc +++ b/source/blender/editors/transform/transform_snap_object.cc @@ -723,6 +723,12 @@ bool nearest_world_tree(SnapObjectContext *sctx, if (sctx->runtime.params.keep_on_same_target) { r_nearest->dist_sq = original_distance; } + else if (sctx->runtime.params.face_nearest_steps > 1) { + /* Recalculate the distance. + * When multiple steps are tested, we cannot depend on the distance calculated for + * `nearest.dist_sq`, as it reduces with each step. */ + r_nearest->dist_sq = math::distance_squared(sctx->runtime.curr_co, co); + } return true; } diff --git a/source/blender/editors/transform/transform_snap_object_mesh.cc b/source/blender/editors/transform/transform_snap_object_mesh.cc index 2cbe17340fb..9157e8bd90d 100644 --- a/source/blender/editors/transform/transform_snap_object_mesh.cc +++ b/source/blender/editors/transform/transform_snap_object_mesh.cc @@ -202,7 +202,7 @@ static bool nearest_world_mesh(SnapObjectContext *sctx, } BVHTreeNearest nearest{}; - nearest.dist_sq = sctx->ret.dist_px_sq; + nearest.dist_sq = sctx->ret.dist_nearest_sq; if (nearest_world_tree( sctx, treedata.tree, treedata.nearest_callback, obmat, &treedata, &nearest)) { SnapData::register_result(sctx, ob_eval, &me_eval->id, obmat, &nearest);