Correct snap checks for edges & faces

Snap targets can't contain vertices which are being transformed
This commit is contained in:
Campbell Barton 2016-05-06 07:44:07 +10:00
parent 5e72ea4397
commit 3064270e13

@ -486,6 +486,35 @@ bool validSnappingNormal(TransInfo *t)
return false; return false;
} }
static bool bm_edge_is_snap_target(BMEdge *e, void *UNUSED(user_data))
{
if (BM_elem_flag_test(e, BM_ELEM_SELECT | BM_ELEM_HIDDEN) ||
BM_elem_flag_test(e->v1, BM_ELEM_SELECT) ||
BM_elem_flag_test(e->v2, BM_ELEM_SELECT))
{
return false;
}
return true;
}
static bool bm_face_is_snap_target(BMFace *f, void *UNUSED(user_data))
{
if (BM_elem_flag_test(f, BM_ELEM_SELECT | BM_ELEM_HIDDEN)) {
return false;
}
BMLoop *l_iter, *l_first;
l_iter = l_first = BM_FACE_FIRST_LOOP(f);
do {
if (BM_elem_flag_test(l_iter->v, BM_ELEM_SELECT)) {
return false;
}
} while ((l_iter = l_iter->next) != l_first);
return true;
}
static void initSnappingMode(TransInfo *t) static void initSnappingMode(TransInfo *t)
{ {
ToolSettings *ts = t->settings; ToolSettings *ts = t->settings;
@ -577,8 +606,8 @@ static void initSnappingMode(TransInfo *t)
ED_transform_snap_object_context_set_editmesh_callbacks( ED_transform_snap_object_context_set_editmesh_callbacks(
t->tsnap.object_context, t->tsnap.object_context,
(bool (*)(BMVert *, void *))BM_elem_cb_check_hflag_disabled, (bool (*)(BMVert *, void *))BM_elem_cb_check_hflag_disabled,
(bool (*)(BMEdge *, void *))BM_elem_cb_check_hflag_disabled, bm_edge_is_snap_target,
(bool (*)(BMFace *, void *))BM_elem_cb_check_hflag_disabled, bm_face_is_snap_target,
SET_UINT_IN_POINTER((BM_ELEM_SELECT | BM_ELEM_HIDDEN))); SET_UINT_IN_POINTER((BM_ELEM_SELECT | BM_ELEM_HIDDEN)));
} }
} }