diff options
Diffstat (limited to 'source/blender/editors/transform/transform_mode_translate.c')
-rw-r--r-- | source/blender/editors/transform/transform_mode_translate.c | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/source/blender/editors/transform/transform_mode_translate.c b/source/blender/editors/transform/transform_mode_translate.c index 60caa257a40..84cfeea96b0 100644 --- a/source/blender/editors/transform/transform_mode_translate.c +++ b/source/blender/editors/transform/transform_mode_translate.c @@ -34,6 +34,7 @@ #include "BKE_report.h" #include "BKE_unit.h" +#include "ED_node.h" #include "ED_screen.h" #include "WM_api.h" @@ -214,6 +215,39 @@ static void headerTranslation(TransInfo *t, const float vec[3], char str[UI_MAX_ } } +static float TranslationBetween(TransInfo *UNUSED(t), const float p1[3], const float p2[3]) +{ + return len_squared_v3v3(p1, p2); +} + +static void ApplySnapTranslation(TransInfo *t, float vec[3]) +{ + float point[3]; + getSnapPoint(t, point); + + if (t->spacetype == SPACE_NODE) { + char border = t->tsnap.snapNodeBorder; + if (border & (NODE_LEFT | NODE_RIGHT)) { + vec[0] = point[0] - t->tsnap.snapTarget[0]; + } + if (border & (NODE_BOTTOM | NODE_TOP)) { + vec[1] = point[1] - t->tsnap.snapTarget[1]; + } + } + else { + if (t->spacetype == SPACE_VIEW3D) { + if (t->options & CTX_PAINT_CURVE) { + if (ED_view3d_project_float_global(t->region, point, point, V3D_PROJ_TEST_NOP) != + V3D_PROJ_RET_OK) { + zero_v3(point); /* no good answer here... */ + } + } + } + + sub_v3_v3v3(vec, point, t->tsnap.snapTarget); + } +} + static void applyTranslationValue(TransInfo *t, const float vec[3]) { const bool apply_snap_align_rotation = usingSnappingNormal( @@ -376,6 +410,8 @@ void initTranslation(TransInfo *t) } t->transform = applyTranslation; + t->tsnap.applySnap = ApplySnapTranslation; + t->tsnap.distance = TranslationBetween; initMouseInputMode(t, &t->mouse, INPUT_VECTOR); |