Merge branch 'master' into blender28
This commit is contained in:
Submodule release/scripts/addons updated: 8f2fd7e23f...ebd058d7a6
Submodule release/scripts/addons_contrib updated: 34a27a42d7...4747021578
@@ -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) {
|
||||||
|
@@ -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.
|
||||||
|
@@ -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);
|
||||||
|
|
||||||
|
@@ -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);
|
||||||
}
|
}
|
||||||
|
@@ -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 {
|
||||||
|
@@ -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);
|
||||||
|
|
||||||
|
@@ -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);
|
||||||
|
|
||||||
|
Submodule source/tools updated: f35d8e55af...ca3e38d896
Reference in New Issue
Block a user