Merge branch 'master' into blender28

This commit is contained in:
2018-06-15 15:42:42 +02:00
10 changed files with 46 additions and 36 deletions

View File

@@ -2508,20 +2508,18 @@ void BM_vert_separate_hflag(
} }
} }
void BM_vert_separate_wire_hflag( void BM_vert_separate_tested_edges(
BMesh *UNUSED(bm), BMVert *v_dst, BMVert *v_src, BMesh *UNUSED(bm), BMVert *v_dst, BMVert *v_src,
const char hflag) bool (*testfn)(BMEdge *, void *arg), void *arg)
{ {
LinkNode *edges_hflag = NULL; LinkNode *edges_hflag = NULL;
BMEdge *e_iter, *e_first; BMEdge *e_iter, *e_first;
e_iter = e_first = v_src->e; e_iter = e_first = v_src->e;
do { do {
if (BM_elem_flag_test(e_iter, hflag)) { if (testfn(e_iter, arg)) {
if (BM_edge_is_wire(e_iter)) {
BLI_linklist_prepend_alloca(&edges_hflag, e_iter); BLI_linklist_prepend_alloca(&edges_hflag, e_iter);
} }
}
} while ((e_iter = BM_DISK_EDGE_NEXT(e_iter, v_src)) != e_first); } while ((e_iter = BM_DISK_EDGE_NEXT(e_iter, v_src)) != e_first);
if (edges_hflag) { if (edges_hflag) {

View File

@@ -81,9 +81,9 @@ void BM_vert_separate(
void BM_vert_separate_hflag( void BM_vert_separate_hflag(
BMesh *bm, BMVert *v, const char hflag, const bool copy_select, BMesh *bm, BMVert *v, const char hflag, const bool copy_select,
BMVert ***r_vout, int *r_vout_len); BMVert ***r_vout, int *r_vout_len);
void BM_vert_separate_wire_hflag( void BM_vert_separate_tested_edges(
BMesh *bm, BMVert *v_dst, BMVert *v_src, BMesh *bm, BMVert *v_dst, BMVert *v_src,
const char hflag); bool (*testfn)(BMEdge *, void *arg), void *arg);
/** /**
* BMesh Kernel: For modifying structure. * BMesh Kernel: For modifying structure.

View File

@@ -1050,6 +1050,16 @@ static int bm_face_split_edgenet_find_connection(
*/ */
#ifdef USE_PARTIAL_CONNECT #ifdef USE_PARTIAL_CONNECT
/**
* Used to identify edges that get split off when making island from partial connection.
* fptr should be a BMFace*, but is a void* for general interface to BM_vert_separate_tested_edges
*/
static bool test_tagged_and_notface(BMEdge *e, void *fptr)
{
BMFace *f = (BMFace *)fptr;
return BM_elem_flag_test(e, BM_ELEM_INTERNAL_TAG) && !BM_edge_in_face(e, f);
}
/** /**
* Split vertices which are part of a partial connection * Split vertices which are part of a partial connection
* (only a single vertex connecting an island). * (only a single vertex connecting an island).
@@ -1058,7 +1068,7 @@ static int bm_face_split_edgenet_find_connection(
* This function leaves all the flags set as well. * This function leaves all the flags set as well.
* *
*/ */
static BMVert *bm_face_split_edgenet_partial_connect(BMesh *bm, BMVert *v_delimit) static BMVert *bm_face_split_edgenet_partial_connect(BMesh *bm, BMVert *v_delimit, BMFace *f)
{ {
/* -------------------------------------------------------------------- */ /* -------------------------------------------------------------------- */
/* Initial check that we may be a delimiting vert (keep this fast) */ /* Initial check that we may be a delimiting vert (keep this fast) */
@@ -1084,7 +1094,7 @@ static BMVert *bm_face_split_edgenet_partial_connect(BMesh *bm, BMVert *v_delimi
BLI_assert(BM_elem_flag_test(BM_edge_other_vert(e_iter, v_delimit), VERT_NOT_IN_STACK)); BLI_assert(BM_elem_flag_test(BM_edge_other_vert(e_iter, v_delimit), VERT_NOT_IN_STACK));
BLI_linklist_prepend_alloca(&e_delimit_list, e_iter); BLI_linklist_prepend_alloca(&e_delimit_list, e_iter);
e_delimit_list_len++; e_delimit_list_len++;
if (e_iter->l != NULL) { if (e_iter->l != NULL && BM_edge_in_face(e_iter, f)) {
e_face_init = e_iter; e_face_init = e_iter;
} }
} }
@@ -1133,7 +1143,7 @@ static BMVert *bm_face_split_edgenet_partial_connect(BMesh *bm, BMVert *v_delimi
bool is_delimit = false; bool is_delimit = false;
FOREACH_VERT_EDGE(v_delimit, e_iter, { FOREACH_VERT_EDGE(v_delimit, e_iter, {
BMVert *v_step = BM_edge_other_vert(e_iter, v_delimit); BMVert *v_step = BM_edge_other_vert(e_iter, v_delimit);
if (BM_elem_flag_test(v_step, VERT_NOT_IN_STACK) && BM_edge_is_wire(e_iter)) { if (BM_elem_flag_test(v_step, VERT_NOT_IN_STACK) && !BM_edge_in_face(e_iter, f)) {
is_delimit = true; /* if one vertex is valid - we have a mix */ is_delimit = true; /* if one vertex is valid - we have a mix */
} }
else { else {
@@ -1148,7 +1158,7 @@ static BMVert *bm_face_split_edgenet_partial_connect(BMesh *bm, BMVert *v_delimi
BMVert *v_split = NULL; BMVert *v_split = NULL;
if (is_delimit) { if (is_delimit) {
v_split = BM_vert_create(bm, v_delimit->co, NULL, 0); v_split = BM_vert_create(bm, v_delimit->co, NULL, 0);
BM_vert_separate_wire_hflag(bm, v_split, v_delimit, EDGE_NOT_IN_STACK); BM_vert_separate_tested_edges(bm, v_split, v_delimit, test_tagged_and_notface, f);
BM_elem_flag_enable(v_split, VERT_NOT_IN_STACK); BM_elem_flag_enable(v_split, VERT_NOT_IN_STACK);
BLI_assert(v_delimit->e != NULL); BLI_assert(v_delimit->e != NULL);
@@ -1224,6 +1234,7 @@ bool BM_face_split_edgenet_connect_islands(
const uint edge_arr_len = (uint)edge_net_init_len + (uint)f->len; const uint edge_arr_len = (uint)edge_net_init_len + (uint)f->len;
BMEdge **edge_arr = BLI_array_alloca(edge_arr, edge_arr_len); BMEdge **edge_arr = BLI_array_alloca(edge_arr, edge_arr_len);
bool ok = false; bool ok = false;
uint edge_net_new_len = (uint)edge_net_init_len;
memcpy(edge_arr, edge_net_init, sizeof(*edge_arr) * (size_t)edge_net_init_len); memcpy(edge_arr, edge_net_init, sizeof(*edge_arr) * (size_t)edge_net_init_len);
@@ -1272,7 +1283,7 @@ bool BM_face_split_edgenet_connect_islands(
BMVert *v_other; BMVert *v_other;
/* note, remapping will _never_ map a vertex to an already mapped vertex */ /* note, remapping will _never_ map a vertex to an already mapped vertex */
while (UNLIKELY((v_other = bm_face_split_edgenet_partial_connect(bm, v_delimit)))) { while (UNLIKELY((v_other = bm_face_split_edgenet_partial_connect(bm, v_delimit, f)))) {
struct TempVertPair *tvp = BLI_memarena_alloc(mem_arena, sizeof(*tvp)); struct TempVertPair *tvp = BLI_memarena_alloc(mem_arena, sizeof(*tvp));
tvp->next = temp_vert_pairs.list; tvp->next = temp_vert_pairs.list;
tvp->v_orig = v_delimit; tvp->v_orig = v_delimit;
@@ -1509,7 +1520,7 @@ bool BM_face_split_edgenet_connect_islands(
/* Create connections between groups */ /* Create connections between groups */
/* may be an over-alloc, but not by much */ /* may be an over-alloc, but not by much */
uint edge_net_new_len = (uint)edge_net_init_len + ((group_arr_len - 1) * 2); edge_net_new_len = (uint)edge_net_init_len + ((group_arr_len - 1) * 2);
BMEdge **edge_net_new = BLI_memarena_alloc(mem_arena, sizeof(*edge_net_new) * edge_net_new_len); BMEdge **edge_net_new = BLI_memarena_alloc(mem_arena, sizeof(*edge_net_new) * edge_net_new_len);
memcpy(edge_net_new, edge_net_init, sizeof(*edge_net_new) * (size_t)edge_net_init_len); memcpy(edge_net_new, edge_net_init, sizeof(*edge_net_new) * (size_t)edge_net_init_len);

View File

@@ -237,7 +237,7 @@ static void face_edges_add(
#ifdef USE_NET #ifdef USE_NET
static void face_edges_split( static void face_edges_split(
BMesh *bm, BMFace *f, struct LinkBase *e_ls_base, BMesh *bm, BMFace *f, struct LinkBase *e_ls_base,
bool use_island_connect, bool use_island_connect, bool use_partial_connect,
MemArena *mem_arena_edgenet) MemArena *mem_arena_edgenet)
{ {
uint i; uint i;
@@ -262,7 +262,7 @@ static void face_edges_split(
if (BM_face_split_edgenet_connect_islands( if (BM_face_split_edgenet_connect_islands(
bm, f, bm, f,
edge_arr, edge_arr_len, edge_arr, edge_arr_len,
false, use_partial_connect,
mem_arena_edgenet, mem_arena_edgenet,
&edge_arr_holes, &edge_arr_holes_len)) &edge_arr_holes, &edge_arr_holes_len))
{ {
@@ -980,7 +980,7 @@ bool BM_mesh_intersect(
struct BMLoop *(*looptris)[3], const int looptris_tot, struct BMLoop *(*looptris)[3], const int looptris_tot,
int (*test_fn)(BMFace *f, void *user_data), void *user_data, int (*test_fn)(BMFace *f, void *user_data), void *user_data,
const bool use_self, const bool use_separate, const bool use_dissolve, const bool use_island_connect, const bool use_self, const bool use_separate, const bool use_dissolve, const bool use_island_connect,
const bool use_edge_tag, const int boolean_mode, const bool use_partial_connect, const bool use_edge_tag, const int boolean_mode,
const float eps) const float eps)
{ {
struct ISectState s; struct ISectState s;
@@ -1491,7 +1491,7 @@ bool BM_mesh_intersect(
BLI_assert(BM_elem_index_get(f) == f_index); BLI_assert(BM_elem_index_get(f) == f_index);
face_edges_split(bm, f, e_ls_base, use_island_connect, mem_arena_edgenet); face_edges_split(bm, f, e_ls_base, use_island_connect, use_partial_connect, mem_arena_edgenet);
BLI_memarena_clear(mem_arena_edgenet); BLI_memarena_clear(mem_arena_edgenet);
} }

View File

@@ -30,7 +30,7 @@ bool BM_mesh_intersect(
struct BMLoop *(*looptris)[3], const int looptris_tot, struct BMLoop *(*looptris)[3], const int looptris_tot,
int (*test_fn)(BMFace *f, void *user_data), void *user_data, int (*test_fn)(BMFace *f, void *user_data), void *user_data,
const bool use_self, const bool use_separate, const bool use_dissolve, const bool use_island_connect, const bool use_self, const bool use_separate, const bool use_dissolve, const bool use_island_connect,
const bool use_edge_tag, const int boolean_mode, const bool use_partial_connect, const bool use_edge_tag, const int boolean_mode,
const float eps); const float eps);
enum { enum {

View File

@@ -200,7 +200,7 @@ static int edbm_intersect_exec(bContext *C, wmOperator *op)
em->bm, em->bm,
em->looptris, em->tottri, em->looptris, em->tottri,
test_fn, NULL, test_fn, NULL,
use_self, use_separate_all, true, true, true, use_self, use_separate_all, true, true, true, true,
-1, -1,
eps); eps);
@@ -303,7 +303,7 @@ static int edbm_intersect_boolean_exec(bContext *C, wmOperator *op)
em->bm, em->bm,
em->looptris, em->tottri, em->looptris, em->tottri,
test_fn, NULL, test_fn, NULL,
false, false, true, true, true, false, false, true, true, false, true,
boolean_operation, boolean_operation,
eps); eps);

View File

@@ -310,6 +310,7 @@ static Mesh *applyModifier(ModifierData *md, const ModifierEvalContext *ctx, Mes
use_dissolve, use_dissolve,
use_island_connect, use_island_connect,
false, false,
false,
bmd->operation, bmd->operation,
bmd->double_threshold); bmd->double_threshold);