WIP Fix #104501: CLear CD_FLAG_NOCOPY flag after use. Handle the case when it goes wrong more elegantly. #104600
|
@ -1011,6 +1011,8 @@ void BM_mesh_bm_to_me(Main *bmain, BMesh *bm, Mesh *me, const struct BMeshToMesh
|
|||
|
||||
const int ototvert = me->totvert;
|
||||
|
||||
blender::Vector<int> ldata_layers_marked_nocopy;
|
||||
|
||||
/* Free custom data. */
|
||||
CustomData_free(&me->vdata, me->totvert);
|
||||
CustomData_free(&me->edata, me->totedge);
|
||||
|
@ -1041,9 +1043,17 @@ void BM_mesh_bm_to_me(Main *bmain, BMesh *bm, Mesh *me, const struct BMeshToMesh
|
|||
&bm->ldata, CD_PROP_BOOL, BKE_uv_map_edge_select_name_get(layer_name, sub_layer_name));
|
||||
int pin_layer_index = CustomData_get_named_layer_index(
|
||||
&bm->ldata, CD_PROP_BOOL, BKE_uv_map_pin_name_get(layer_name, sub_layer_name));
|
||||
int vertsel_offset = bm->ldata.layers[vertsel_layer_index].offset;
|
||||
int edgesel_offset = bm->ldata.layers[edgesel_layer_index].offset;
|
||||
int pin_offset = bm->ldata.layers[pin_layer_index].offset;
|
||||
|
||||
|
||||
/* If ever the uv map associated bool layers become optional in BMesh as well (like in Mesh)
|
||||
* this assert needs to be removed. For now it is a bug if they doin't exist. */
|
||||
BLI_assert(vertsel_layer_index >= 0 && edgesel_layer_index >= 0 && pin_layer_index >= 0);
|
||||
|
||||
int vertsel_offset = vertsel_layer_index >= 0 ? bm->ldata.layers[vertsel_layer_index].offset :
|
||||
-1;
|
||||
int edgesel_offset = edgesel_layer_index >= 0 ? bm->ldata.layers[edgesel_layer_index].offset :
|
||||
-1;
|
||||
int pin_offset = pin_layer_index >= 0 ? bm->ldata.layers[pin_layer_index].offset : -1;
|
||||
|
||||
bool need_vertsel = false;
|
||||
bool need_edgesel = false;
|
||||
bool need_pin = false;
|
||||
|
@ -1051,10 +1061,20 @@ void BM_mesh_bm_to_me(Main *bmain, BMesh *bm, Mesh *me, const struct BMeshToMesh
|
|||
BM_ITER_MESH (f, &iter, bm, BM_FACES_OF_MESH) {
|
||||
BMIter liter;
|
||||
BMLoop *l;
|
||||
BM_ITER_ELEM (l, &liter, f, BM_LOOPS_OF_FACE) {
|
||||
need_vertsel |= BM_ELEM_CD_GET_BOOL(l, vertsel_offset);
|
||||
need_edgesel |= BM_ELEM_CD_GET_BOOL(l, edgesel_offset);
|
||||
need_pin |= BM_ELEM_CD_GET_BOOL(l, pin_offset);
|
||||
if (vertsel_layer_index >= 0) {
|
||||
BM_ITER_ELEM (l, &liter, f, BM_LOOPS_OF_FACE) {
|
||||
need_vertsel |= BM_ELEM_CD_GET_BOOL(l, vertsel_offset);
|
||||
}
|
||||
}
|
||||
if (edgesel_layer_index >= 0) {
|
||||
BM_ITER_ELEM (l, &liter, f, BM_LOOPS_OF_FACE) {
|
||||
need_edgesel |= BM_ELEM_CD_GET_BOOL(l, edgesel_offset);
|
||||
}
|
||||
}
|
||||
if (pin_layer_index) {
|
||||
BM_ITER_ELEM (l, &liter, f, BM_LOOPS_OF_FACE) {
|
||||
need_pin |= BM_ELEM_CD_GET_BOOL(l, pin_offset);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1063,18 +1083,21 @@ void BM_mesh_bm_to_me(Main *bmain, BMesh *bm, Mesh *me, const struct BMeshToMesh
|
|||
}
|
||||
else {
|
||||
bm->ldata.layers[vertsel_layer_index].flag |= CD_FLAG_NOCOPY;
|
||||
ldata_layers_marked_nocopy.append(vertsel_layer_index);
|
||||
}
|
||||
if (need_edgesel) {
|
||||
bm->ldata.layers[edgesel_layer_index].flag &= ~CD_FLAG_NOCOPY;
|
||||
}
|
||||
else {
|
||||
bm->ldata.layers[edgesel_layer_index].flag |= CD_FLAG_NOCOPY;
|
||||
ldata_layers_marked_nocopy.append(edgesel_layer_index);
|
||||
}
|
||||
if (need_pin) {
|
||||
bm->ldata.layers[pin_layer_index].flag &= ~CD_FLAG_NOCOPY;
|
||||
}
|
||||
else {
|
||||
bm->ldata.layers[pin_layer_index].flag |= CD_FLAG_NOCOPY;
|
||||
ldata_layers_marked_nocopy.append(pin_layer_index);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1087,6 +1110,11 @@ void BM_mesh_bm_to_me(Main *bmain, BMesh *bm, Mesh *me, const struct BMeshToMesh
|
|||
CustomData_copy(&bm->pdata, &me->pdata, mask.pmask, CD_SET_DEFAULT, me->totpoly);
|
||||
}
|
||||
|
||||
/* Clear the CD_FLAG_NOCOPY flags for the layers they were temporarily set on */
|
||||
for (const int i : ldata_layers_marked_nocopy) {
|
||||
bm->ldata.layers[i].flag &= ~CD_FLAG_NOCOPY;
|
||||
}
|
||||
|
||||
CustomData_add_layer_named(
|
||||
&me->vdata, CD_PROP_FLOAT3, CD_CONSTRUCT, nullptr, me->totvert, "position");
|
||||
CustomData_add_layer(&me->edata, CD_MEDGE, CD_SET_DEFAULT, nullptr, me->totedge);
|
||||
|
|
Loading…
Reference in New Issue
Typo:
doin't