diff --git a/source/blender/blenkernel/BKE_bvhutils.h b/source/blender/blenkernel/BKE_bvhutils.h index c4ed7972c2d..2570d70ec8c 100644 --- a/source/blender/blenkernel/BKE_bvhutils.h +++ b/source/blender/blenkernel/BKE_bvhutils.h @@ -78,7 +78,7 @@ typedef enum BVHCacheType { BVHTREE_FROM_LOOSEVERTS, BVHTREE_FROM_LOOSEEDGES, - BVHTREE_FROM_EM_VERTS, + BVHTREE_FROM_EM_LOOSEVERTS, BVHTREE_FROM_EM_EDGES, BVHTREE_FROM_EM_LOOPTRI, diff --git a/source/blender/blenkernel/intern/bvhutils.cc b/source/blender/blenkernel/intern/bvhutils.cc index a5ae64ee661..171dd1da9e7 100644 --- a/source/blender/blenkernel/intern/bvhutils.cc +++ b/source/blender/blenkernel/intern/bvhutils.cc @@ -618,7 +618,7 @@ static void bvhtree_from_mesh_setup_data(BVHTree *tree, r_data->nearest_callback = mesh_looptri_nearest_point; r_data->raycast_callback = mesh_looptri_spherecast; break; - case BVHTREE_FROM_EM_VERTS: + case BVHTREE_FROM_EM_LOOSEVERTS: case BVHTREE_FROM_EM_EDGES: case BVHTREE_FROM_EM_LOOPTRI: case BVHTREE_MAX_ITEM: @@ -639,7 +639,7 @@ static void bvhtree_from_editmesh_setup_data(BVHTree *tree, r_data->em = em; switch (bvh_cache_type) { - case BVHTREE_FROM_EM_VERTS: + case BVHTREE_FROM_EM_LOOSEVERTS: r_data->nearest_callback = nullptr; r_data->raycast_callback = editmesh_verts_spherecast; break; @@ -754,7 +754,7 @@ BVHTree *bvhtree_from_editmesh_verts_ex(BVHTreeFromEditMesh *data, bvhtree_balance(tree, false); if (data) { - bvhtree_from_editmesh_setup_data(tree, BVHTREE_FROM_EM_VERTS, em, data); + bvhtree_from_editmesh_setup_data(tree, BVHTREE_FROM_EM_LOOSEVERTS, em, data); } return tree; @@ -1223,7 +1223,7 @@ BVHTree *BKE_bvhtree_from_mesh_get(BVHTreeFromMesh *data, 0.0f, tree_type, 6, positions, corner_verts.data(), looptris, {}, -1); break; } - case BVHTREE_FROM_EM_VERTS: + case BVHTREE_FROM_EM_LOOSEVERTS: case BVHTREE_FROM_EM_EDGES: case BVHTREE_FROM_EM_LOOPTRI: case BVHTREE_MAX_ITEM: @@ -1253,6 +1253,25 @@ BVHTree *BKE_bvhtree_from_mesh_get(BVHTreeFromMesh *data, return data->tree; } +static BitVector<> bmverts_loose_map_get(BMesh *bm, int *r_bmvert_active_len) +{ + BitVector<> bmvert_mask(bm->totvert); + + int i, bmvert_loose_len = 0; + BMIter iter; + BMVert *v; + BM_ITER_MESH_INDEX (v, &iter, bm, BM_VERTS_OF_MESH, i) { + if (v->e == nullptr) { + bmvert_mask[i].set(); + bmvert_loose_len++; + } + } + + *r_bmvert_active_len = bmvert_loose_len; + + return bmvert_mask; +} + BVHTree *BKE_bvhtree_from_editmesh_get(BVHTreeFromEditMesh *data, BMEditMesh *em, const int tree_type, @@ -1275,9 +1294,13 @@ BVHTree *BKE_bvhtree_from_editmesh_get(BVHTreeFromEditMesh *data, } switch (bvh_cache_type) { - case BVHTREE_FROM_EM_VERTS: - data->tree = bvhtree_from_editmesh_verts_create_tree(0.0f, tree_type, 6, em, {}, -1); + case BVHTREE_FROM_EM_LOOSEVERTS: { + int mask_bits_act_len = -1; + const BitVector<> mask = bmverts_loose_map_get(em->bm, &mask_bits_act_len); + data->tree = bvhtree_from_editmesh_verts_create_tree( + 0.0f, tree_type, 6, em, mask, mask_bits_act_len); break; + } case BVHTREE_FROM_EM_EDGES: data->tree = bvhtree_from_editmesh_edges_create_tree(0.0f, tree_type, 6, em, {}, -1); break; diff --git a/source/blender/editors/transform/transform_snap_object.hh b/source/blender/editors/transform/transform_snap_object.hh index bf1feb169a5..1457abf53f7 100644 --- a/source/blender/editors/transform/transform_snap_object.hh +++ b/source/blender/editors/transform/transform_snap_object.hh @@ -181,7 +181,7 @@ eSnapMode snapCurve(SnapObjectContext *sctx, Object *ob_eval, const float obmat[ /* transform_snap_object_editmesh.cc */ struct SnapCache_EditMesh { - /* Verts, Edges. */ + /* Loose Verts, Edges. */ BVHTree *bvhtree[2]; bool cached[2]; diff --git a/source/blender/editors/transform/transform_snap_object_armature.cc b/source/blender/editors/transform/transform_snap_object_armature.cc index c4f037c7b42..21e51d547d2 100644 --- a/source/blender/editors/transform/transform_snap_object_armature.cc +++ b/source/blender/editors/transform/transform_snap_object_armature.cc @@ -100,11 +100,11 @@ eSnapMode snapArmature(SnapObjectContext *sctx, nearest2d.nearest_point.index = -2; } - if (sctx->runtime.snap_to_flag & SCE_SNAP_TO_VERTEX) { + if (sctx->runtime.snap_to_flag & SCE_SNAP_TO_EDGE_ENDPOINT) { float dist_px_sq_edge = nearest2d.nearest_point.dist_sq; nearest2d.nearest_point.dist_sq = sctx->ret.dist_px_sq; if (nearest2d.snap_point(head_vec) || nearest2d.snap_point(tail_vec)) { - retval = SCE_SNAP_TO_POINT; + retval = SCE_SNAP_TO_EDGE_ENDPOINT; } else if (retval) { nearest2d.nearest_point.dist_sq = dist_px_sq_edge; diff --git a/source/blender/editors/transform/transform_snap_object_editmesh.cc b/source/blender/editors/transform/transform_snap_object_editmesh.cc index cd6f48dfd79..c3e7a32908f 100644 --- a/source/blender/editors/transform/transform_snap_object_editmesh.cc +++ b/source/blender/editors/transform/transform_snap_object_editmesh.cc @@ -474,7 +474,7 @@ eSnapMode snap_polygon_editmesh(SnapObjectContext *sctx, } while ((l_iter = l_iter->next) != l_first); } else { - elem = SCE_SNAP_TO_VERTEX; + elem = SCE_SNAP_TO_EDGE_ENDPOINT; BM_mesh_elem_index_ensure(em->bm, BM_VERT); BM_mesh_elem_table_ensure(em->bm, BM_VERT); do { @@ -534,13 +534,17 @@ static eSnapMode snapEditMesh(SnapCache_EditMesh *em_cache, if (treedata.tree == nullptr) { if (sctx->callbacks.edit_mesh.test_vert_fn) { + auto test_looseverts_fn = [](BMElem *elem, void *user_data) { + SnapObjectContext *sctx_ = static_cast(user_data); + BMVert *v = reinterpret_cast(elem); + if (v->e) { + return false; + } + return sctx_->callbacks.edit_mesh.test_vert_fn(v, sctx_->callbacks.edit_mesh.user_data); + }; blender::BitVector<> verts_mask(em->bm->totvert); const int verts_num_active = BM_iter_mesh_bitmap_from_filter( - BM_VERTS_OF_MESH, - em->bm, - verts_mask, - (bool (*)(BMElem *, void *))sctx->callbacks.edit_mesh.test_vert_fn, - sctx->callbacks.edit_mesh.user_data); + BM_VERTS_OF_MESH, em->bm, verts_mask, test_looseverts_fn, sctx); bvhtree_from_editmesh_verts_ex(&treedata, em, verts_mask, verts_num_active, 0.0f, 2, 6); } @@ -548,7 +552,7 @@ static eSnapMode snapEditMesh(SnapCache_EditMesh *em_cache, BKE_bvhtree_from_editmesh_get(&treedata, em, 2, - BVHTREE_FROM_EM_VERTS, + BVHTREE_FROM_EM_LOOSEVERTS, /* WORKAROUND: avoid updating while transforming. */ G.moving ? nullptr : &em_cache->mesh_runtime->bvh_cache, &em_cache->mesh_runtime->eval_mutex); @@ -558,7 +562,7 @@ static eSnapMode snapEditMesh(SnapCache_EditMesh *em_cache, } } - if (snap_to_flag & SCE_SNAP_TO_EDGE) { + if (snap_to_flag & SNAP_TO_EDGE_ELEMENTS) { BVHTreeFromEditMesh treedata{}; treedata.tree = em_cache->bvhtree[1];