diff --git a/source/blender/editors/transform/transform.c b/source/blender/editors/transform/transform.c index 27e2d7618b5..415160025b7 100644 --- a/source/blender/editors/transform/transform.c +++ b/source/blender/editors/transform/transform.c @@ -581,7 +581,7 @@ static bool transform_modal_item_poll(const wmOperator *op, int value) return false; } if (value == TFM_MODAL_ADD_SNAP) { - if (!validSnap(t)) { + if (!(t->tsnap.status & SNAP_TARGET_FOUND)) { return false; } } diff --git a/source/blender/editors/transform/transform.h b/source/blender/editors/transform/transform.h index e49999c00a5..508c85b04f3 100644 --- a/source/blender/editors/transform/transform.h +++ b/source/blender/editors/transform/transform.h @@ -143,6 +143,8 @@ typedef enum { /** Do not display Xform gizmo even though it is available. */ T_NO_GIZMO = 1 << 24, + + T_DRAW_SNAP_SOURCE = 1 << 25, } eTFlag; ENUM_OPERATORS(eTFlag, T_NO_GIZMO); diff --git a/source/blender/editors/transform/transform_mode_snapsource.c b/source/blender/editors/transform/transform_mode_snapsource.c index 0fc6c39edcd..4148a9a47de 100644 --- a/source/blender/editors/transform/transform_mode_snapsource.c +++ b/source/blender/editors/transform/transform_mode_snapsource.c @@ -61,12 +61,9 @@ static void snapsource_end(TransInfo *t) t->mouse.post = customdata->mouse_prev.post; t->mouse.use_virtual_mval = customdata->mouse_prev.use_virtual_mval; - transform_gizmo_3d_model_from_constraint_and_mode_set(t); - MEM_freeN(customdata); - t->tsnap.snap_source_fn = NULL; - + transform_gizmo_3d_model_from_constraint_and_mode_set(t); tranform_snap_source_restore_context(t); } @@ -74,6 +71,9 @@ static void snapsource_confirm(TransInfo *t) { BLI_assert(t->modifiers & MOD_EDIT_SNAP_SOURCE); getSnapPoint(t, t->tsnap.snap_source); + t->tsnap.snap_source_fn = NULL; + t->tsnap.status |= SNAP_SOURCE_FOUND; + t->flag |= T_DRAW_SNAP_SOURCE; int mval[2]; #ifndef RESET_TRANSFORMATION @@ -180,23 +180,12 @@ void transform_mode_snap_source_init(TransInfo *t, wmOperator *UNUSED(op)) t->mode_info = &TransMode_snapsource; t->tsnap.target_operation = SCE_SNAP_TARGET_ALL; - - if ((t->tsnap.status & SNAP_SOURCE_FOUND) == 0) { - if (t->tsnap.snap_source_fn) { - /* Calculate the current snap source for perpendicular snap. */ - t->tsnap.snap_source_fn(t); - } - if ((t->tsnap.status & SNAP_SOURCE_FOUND) == 0) { - /* Fallback. */ - copy_v3_v3(t->tsnap.snap_source, t->center_global); - t->tsnap.status |= SNAP_SOURCE_FOUND; - } - } + t->tsnap.status &= ~SNAP_SOURCE_FOUND; if ((t->tsnap.mode & ~(SCE_SNAP_MODE_INCREMENT | SCE_SNAP_MODE_GRID)) == 0) { /* Initialize snap modes for geometry. */ t->tsnap.mode &= ~(SCE_SNAP_MODE_INCREMENT | SCE_SNAP_MODE_GRID); - t->tsnap.mode |= SCE_SNAP_MODE_GEOM & ~SCE_SNAP_MODE_FACE_NEAREST; + t->tsnap.mode |= SCE_SNAP_MODE_GEOM; } if (t->data_type == &TransConvertType_Mesh) { diff --git a/source/blender/editors/transform/transform_snap.cc b/source/blender/editors/transform/transform_snap.cc index 6950c0e1fb7..23b4e9dc667 100644 --- a/source/blender/editors/transform/transform_snap.cc +++ b/source/blender/editors/transform/transform_snap.cc @@ -174,12 +174,10 @@ void drawSnapping(const bContext *C, TransInfo *t) return; } - const bool draw_source = (t->spacetype == SPACE_VIEW3D) && - (t->tsnap.status & SNAP_SOURCE_FOUND) && - ((t->tsnap.mode & SCE_SNAP_MODE_EDGE_PERPENDICULAR) || - t->tsnap.snap_source_fn == nullptr); + const bool draw_source = (t->tsnap.status & SNAP_SOURCE_FOUND) && (t->flag & T_DRAW_SNAP_SOURCE); + const bool draw_target = (t->tsnap.status & (SNAP_TARGET_FOUND | SNAP_MULTI_POINTS)); - if (!(draw_source || validSnap(t))) { + if (!(draw_source || draw_target)) { return; } @@ -767,6 +765,10 @@ static void initSnappingMode(TransInfo *t) t->tsnap.mode &= ~(SCE_SNAP_MODE_FACE_RAYCAST | SCE_SNAP_MODE_FACE_NEAREST); } + if (t->tsnap.mode & SCE_SNAP_MODE_EDGE_PERPENDICULAR) { + t->flag |= T_DRAW_SNAP_SOURCE; + } + setSnappingCallback(t); if (t->spacetype == SPACE_VIEW3D) { @@ -1388,7 +1390,7 @@ eSnapMode snapObjectsTransform( snap_object_params.use_occlusion_test = true; snap_object_params.use_backface_culling = (t->tsnap.flag & SCE_SNAP_BACKFACE_CULLING) != 0; - float *target = (t->tsnap.status & SNAP_SOURCE_FOUND) ? t->tsnap.snap_source : t->center_global; + float *prev_co = (t->tsnap.status & SNAP_SOURCE_FOUND) ? t->tsnap.snap_source : nullptr; return ED_transform_snap_object_project_view3d(t->tsnap.object_context, t->depsgraph, t->region, @@ -1397,7 +1399,7 @@ eSnapMode snapObjectsTransform( &snap_object_params, nullptr, mval, - target, + prev_co, dist_px, r_loc, r_no); diff --git a/source/blender/editors/transform/transform_snap_object.cc b/source/blender/editors/transform/transform_snap_object.cc index c900f984111..8bc50ceca1b 100644 --- a/source/blender/editors/transform/transform_snap_object.cc +++ b/source/blender/editors/transform/transform_snap_object.cc @@ -3294,8 +3294,10 @@ static eSnapMode transform_snap_context_project_view3d_mixed_impl(SnapObjectCont } } - if ((snap_to_flag & SCE_SNAP_MODE_FACE_NEAREST) && ELEM(nullptr, prev_co, init_co)) { - /* No location to work with #SCE_SNAP_MODE_FACE_NEAREST. */ + if (prev_co == nullptr) { + snap_to_flag &= ~(SCE_SNAP_MODE_EDGE_PERPENDICULAR | SCE_SNAP_MODE_FACE_NEAREST); + } + else if (init_co == nullptr) { snap_to_flag &= ~SCE_SNAP_MODE_FACE_NEAREST; }