From d4bc77794c4c3d54fa967055732dcfa41134a647 Mon Sep 17 00:00:00 2001 From: Germano Cavalcante Date: Thu, 17 Aug 2023 09:07:50 -0300 Subject: [PATCH] Fix #109454: Snapping from Tools doesn't work if Depth option is not `Surface` Tools and Drag & Drop snap options are edited through Tool Placement settings. This can cause confusion, even more so when the `Depth` option is not `Surface`, in which case the Snap Toggle is simply ignored and appears to be broken. The solution then is to prioritize Snap Toggle over the `Depth` option, so even if it's not `Surface`, the snap is still done when toggle is enabled. --- .../space_view3d/view3d_cursor_snap.cc | 40 +++++++++---------- .../editors/space_view3d/view3d_placement.cc | 3 -- 2 files changed, 20 insertions(+), 23 deletions(-) diff --git a/source/blender/editors/space_view3d/view3d_cursor_snap.cc b/source/blender/editors/space_view3d/view3d_cursor_snap.cc index 7539f5983ac..45218d7a671 100644 --- a/source/blender/editors/space_view3d/view3d_cursor_snap.cc +++ b/source/blender/editors/space_view3d/view3d_cursor_snap.cc @@ -604,13 +604,30 @@ static void v3d_cursor_snap_update(V3DSnapCursorState *state, V3DSnapCursorData *snap_data = &data_intern->snap_data; ToolSettings *tool_settings = scene->toolsettings; - const bool use_surface_nor = tool_settings->plane_orient == V3D_PLACE_ORIENT_SURFACE; - const bool use_surface_co = tool_settings->plane_depth == V3D_PLACE_DEPTH_SURFACE; + eSnapMode snap_elements = v3d_cursor_snap_elements(tool_settings); const bool calc_plane_omat = v3d_cursor_snap_calc_plane(); + snap_data->is_enabled = true; + if (!(state->flag & V3D_SNAPCURSOR_TOGGLE_ALWAYS_TRUE)) { +#ifdef USE_SNAP_DETECT_FROM_KEYMAP_HACK + snap_data->is_snap_invert = v3d_cursor_is_snap_invert(data_intern, wm); +#endif + + if (snap_data->is_snap_invert != !(tool_settings->snap_flag & SCE_SNAP)) { + snap_data->is_enabled = false; + if (!calc_plane_omat) { + snap_data->snap_elem = SCE_SNAP_TO_NONE; + return; + } + snap_elements = SCE_SNAP_TO_NONE; + } + } + + const bool use_surface_nor = tool_settings->plane_orient == V3D_PLACE_ORIENT_SURFACE; + const bool use_surface_co = snap_data->is_enabled || tool_settings->plane_depth == V3D_PLACE_DEPTH_SURFACE; + float co[3], no[3], face_nor[3], obmat[4][4], omat[3][3]; eSnapMode snap_elem = SCE_SNAP_TO_NONE; - eSnapMode snap_elements = v3d_cursor_snap_elements(tool_settings); int snap_elem_index[3] = {-1, -1, -1}; int index = -1; @@ -628,23 +645,6 @@ static void v3d_cursor_snap_update(V3DSnapCursorState *state, snap_elements |= SCE_SNAP_TO_FACE; } - snap_data->is_enabled = true; -#ifdef USE_SNAP_DETECT_FROM_KEYMAP_HACK - if (!(state->flag & V3D_SNAPCURSOR_TOGGLE_ALWAYS_TRUE)) { - snap_data->is_snap_invert = v3d_cursor_is_snap_invert(data_intern, wm); - - const ToolSettings *ts = scene->toolsettings; - if (snap_data->is_snap_invert != !(ts->snap_flag & SCE_SNAP)) { - snap_data->is_enabled = false; - if (!calc_plane_omat) { - snap_data->snap_elem = SCE_SNAP_TO_NONE; - return; - } - snap_elements = data_intern->snap_elem_hidden = SCE_SNAP_TO_FACE; - } - } -#endif - if (snap_elements & SCE_SNAP_TO_GEOM) { float prev_co[3] = {0.0f}; if (state->prevpoint) { diff --git a/source/blender/editors/space_view3d/view3d_placement.cc b/source/blender/editors/space_view3d/view3d_placement.cc index 2f559a6e725..3b174081938 100644 --- a/source/blender/editors/space_view3d/view3d_placement.cc +++ b/source/blender/editors/space_view3d/view3d_placement.cc @@ -734,14 +734,11 @@ static void view3d_interactive_add_begin(bContext *C, wmOperator *op, const wmEv /* Set this flag so snapping always updated. */ int mval[2]; WM_event_drag_start_mval(event, ipd->region, mval); - int flag_orig = snap_state_new->flag; - snap_state_new->flag |= V3D_SNAPCURSOR_TOGGLE_ALWAYS_TRUE; /* Be sure to also compute the #V3DSnapCursorData.plane_omat. */ snap_state->draw_plane = true; ED_view3d_cursor_snap_data_update(snap_state_new, C, mval[0], mval[1]); - snap_state_new->flag = eV3DSnapCursor(flag_orig); } } -- 2.30.2