forked from bartvdbraak/blender
Fix T42488: Knife (selected_only + occlude) failed
This commit is contained in:
parent
8fe336ce7e
commit
171a6bb5dc
@ -41,6 +41,7 @@ extern "C" {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
typedef unsigned int (*GHashHashFP) (const void *key);
|
typedef unsigned int (*GHashHashFP) (const void *key);
|
||||||
|
/** returns false when equal */
|
||||||
typedef bool (*GHashCmpFP) (const void *a, const void *b);
|
typedef bool (*GHashCmpFP) (const void *a, const void *b);
|
||||||
typedef void (*GHashKeyFreeFP) (void *key);
|
typedef void (*GHashKeyFreeFP) (void *key);
|
||||||
typedef void (*GHashValFreeFP) (void *val);
|
typedef void (*GHashValFreeFP) (void *val);
|
||||||
|
@ -1383,6 +1383,11 @@ static void knife_find_line_hits(KnifeTool_OpData *kcd)
|
|||||||
ls = (BMLoop **)kcd->em->looptris[result->indexA];
|
ls = (BMLoop **)kcd->em->looptris[result->indexA];
|
||||||
f = ls[0]->f;
|
f = ls[0]->f;
|
||||||
set_lowest_face_tri(kcd, f, result->indexA);
|
set_lowest_face_tri(kcd, f, result->indexA);
|
||||||
|
|
||||||
|
/* occlude but never cut unselected faces (when only_select is used) */
|
||||||
|
if (kcd->only_select && !BM_elem_flag_test(f, BM_ELEM_SELECT)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
/* for faces, store index of lowest hit looptri in hash */
|
/* for faces, store index of lowest hit looptri in hash */
|
||||||
if (BLI_smallhash_haskey(&faces, (uintptr_t)f)) {
|
if (BLI_smallhash_haskey(&faces, (uintptr_t)f)) {
|
||||||
continue;
|
continue;
|
||||||
@ -1590,6 +1595,10 @@ static BMFace *knife_find_closest_face(KnifeTool_OpData *kcd, float co[3], float
|
|||||||
|
|
||||||
f = BKE_bmbvh_ray_cast(kcd->bmbvh, origin, ray, 0.0f, NULL, co, cageco);
|
f = BKE_bmbvh_ray_cast(kcd->bmbvh, origin, ray, 0.0f, NULL, co, cageco);
|
||||||
|
|
||||||
|
if (f && kcd->only_select && BM_elem_flag_test(f, BM_ELEM_SELECT) == 0) {
|
||||||
|
f = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
if (is_space)
|
if (is_space)
|
||||||
*is_space = !f;
|
*is_space = !f;
|
||||||
|
|
||||||
@ -2760,9 +2769,10 @@ static void knifetool_init(bContext *C, KnifeTool_OpData *kcd,
|
|||||||
|
|
||||||
kcd->cagecos = (const float (*)[3])BKE_editmesh_vertexCos_get(kcd->em, scene, NULL);
|
kcd->cagecos = (const float (*)[3])BKE_editmesh_vertexCos_get(kcd->em, scene, NULL);
|
||||||
|
|
||||||
kcd->bmbvh = BKE_bmbvh_new_from_editmesh(kcd->em,
|
kcd->bmbvh = BKE_bmbvh_new_from_editmesh(
|
||||||
|
kcd->em,
|
||||||
BMBVH_RETURN_ORIG |
|
BMBVH_RETURN_ORIG |
|
||||||
(only_select ? BMBVH_RESPECT_SELECT : BMBVH_RESPECT_HIDDEN),
|
((only_select && cut_through) ? BMBVH_RESPECT_SELECT : BMBVH_RESPECT_HIDDEN),
|
||||||
kcd->cagecos, false);
|
kcd->cagecos, false);
|
||||||
|
|
||||||
kcd->arena = BLI_memarena_new(MEM_SIZE_OPTIMAL(1 << 15), "knife");
|
kcd->arena = BLI_memarena_new(MEM_SIZE_OPTIMAL(1 << 15), "knife");
|
||||||
|
Loading…
Reference in New Issue
Block a user