From b9fa32cccdbfeef776580a6d38e19f05b37fc89b Mon Sep 17 00:00:00 2001 From: mano-wii Date: Sat, 11 Feb 2023 14:50:37 -0300 Subject: [PATCH] Fix #104587: 'Extrude To Cursor' snapping ignoring 'Target Selection' Although not a transform operator, `Extrude to Cursor` depends on some snapping settings. So it should use the `Target Selection` options as well. --- source/blender/editors/mesh/editmesh_utils.c | 47 ++++++++++++-------- 1 file changed, 28 insertions(+), 19 deletions(-) diff --git a/source/blender/editors/mesh/editmesh_utils.c b/source/blender/editors/mesh/editmesh_utils.c index cde57c7226b..94567919316 100644 --- a/source/blender/editors/mesh/editmesh_utils.c +++ b/source/blender/editors/mesh/editmesh_utils.c @@ -1924,31 +1924,40 @@ void EDBM_project_snap_verts( ED_view3d_init_mats_rv3d(obedit, region->regiondata); - struct SnapObjectContext *snap_context = ED_transform_snap_object_context_create( - CTX_data_scene(C), 0); + Scene *scene = CTX_data_scene(C); + struct SnapObjectContext *snap_context = ED_transform_snap_object_context_create(scene, 0); + + eSnapTargetOP target_op = SCE_SNAP_TARGET_NOT_ACTIVE; + const int snap_flag = scene->toolsettings->snap_flag; + + SET_FLAG_FROM_TEST( + target_op, !(snap_flag & SCE_SNAP_TO_INCLUDE_EDITED), SCE_SNAP_TARGET_NOT_EDITED); + SET_FLAG_FROM_TEST( + target_op, !(snap_flag & SCE_SNAP_TO_INCLUDE_NONEDITED), SCE_SNAP_TARGET_NOT_NONEDITED); + SET_FLAG_FROM_TEST( + target_op, (snap_flag & SCE_SNAP_TO_ONLY_SELECTABLE), SCE_SNAP_TARGET_ONLY_SELECTABLE); BM_ITER_MESH (eve, &iter, em->bm, BM_VERTS_OF_MESH) { if (BM_elem_flag_test(eve, BM_ELEM_SELECT)) { float mval[2], co_proj[3]; if (ED_view3d_project_float_object(region, eve->co, mval, V3D_PROJ_TEST_NOP) == V3D_PROJ_RET_OK) { - if (ED_transform_snap_object_project_view3d( - snap_context, - depsgraph, - region, - CTX_wm_view3d(C), - SCE_SNAP_MODE_FACE_RAYCAST, - &(const struct SnapObjectParams){ - .snap_target_select = SCE_SNAP_TARGET_NOT_ACTIVE, - .edit_mode_type = SNAP_GEOM_FINAL, - .use_occlusion_test = true, - }, - NULL, - mval, - NULL, - NULL, - co_proj, - NULL)) { + if (ED_transform_snap_object_project_view3d(snap_context, + depsgraph, + region, + CTX_wm_view3d(C), + SCE_SNAP_MODE_FACE_RAYCAST, + &(const struct SnapObjectParams){ + .snap_target_select = target_op, + .edit_mode_type = SNAP_GEOM_FINAL, + .use_occlusion_test = true, + }, + NULL, + mval, + NULL, + NULL, + co_proj, + NULL)) { mul_v3_m4v3(eve->co, obedit->world_to_object, co_proj); } }