Correct snap checks for edges & faces
Snap targets can't contain vertices which are being transformed
This commit is contained in:
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)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user