Merge branch 'blender-v2.91-release'

This commit is contained in:
Campbell Barton 2020-10-23 14:00:28 +11:00
commit 06e6068902
2 changed files with 25 additions and 15 deletions

View File

@ -541,7 +541,9 @@ void BKE_lnor_spacearr_clear(MLoopNorSpaceArray *lnors_spacearr)
lnors_spacearr->num_spaces = 0;
lnors_spacearr->lspacearr = NULL;
lnors_spacearr->loops_pool = NULL;
BLI_memarena_clear(lnors_spacearr->mem);
if (lnors_spacearr->mem != NULL) {
BLI_memarena_clear(lnors_spacearr->mem);
}
}
void BKE_lnor_spacearr_free(MLoopNorSpaceArray *lnors_spacearr)

View File

@ -4233,24 +4233,26 @@ static Base *mesh_separate_arrays(Main *bmain,
BMFace **faces,
uint faces_len)
{
const BMAllocTemplate bm_new_allocsize = {
.totvert = verts_len,
.totedge = edges_len,
.totloop = faces_len * 3,
.totface = faces_len,
};
const bool use_custom_normals = (bm_old->lnor_spacearr != NULL);
Base *base_new;
Object *obedit = base_old->object;
BMesh *bm_new;
bm_new = BM_mesh_create(&bm_mesh_allocsize_default,
&((struct BMeshCreateParams){
.use_toolflags = true,
}));
BMesh *bm_new = BM_mesh_create(&bm_new_allocsize, &((struct BMeshCreateParams){0}));
CustomData_copy(&bm_old->vdata, &bm_new->vdata, CD_MASK_BMESH.vmask, CD_CALLOC, 0);
CustomData_copy(&bm_old->edata, &bm_new->edata, CD_MASK_BMESH.emask, CD_CALLOC, 0);
CustomData_copy(&bm_old->ldata, &bm_new->ldata, CD_MASK_BMESH.lmask, CD_CALLOC, 0);
CustomData_copy(&bm_old->pdata, &bm_new->pdata, CD_MASK_BMESH.pmask, CD_CALLOC, 0);
CustomData_bmesh_init_pool(&bm_new->vdata, verts_len, BM_VERT);
CustomData_bmesh_init_pool(&bm_new->edata, edges_len, BM_EDGE);
CustomData_bmesh_init_pool(&bm_new->ldata, faces_len * 3, BM_LOOP);
CustomData_bmesh_init_pool(&bm_new->pdata, faces_len, BM_FACE);
if (use_custom_normals) {
/* Needed so the temporary normal layer is copied too. */
BM_mesh_copy_init_customdata_all_layers(bm_new, bm_old, BM_ALL, &bm_new_allocsize);
}
else {
BM_mesh_copy_init_customdata(bm_new, bm_old, &bm_new_allocsize);
}
/* Take into account user preferences for duplicating actions. */
const eDupli_ID_Flags dupflag = USER_DUP_MESH | (U.dupflag & USER_DUP_ACT);
@ -4270,6 +4272,10 @@ static Base *mesh_separate_arrays(Main *bmain,
BM_mesh_copy_arrays(bm_old, bm_new, verts, verts_len, edges, edges_len, faces, faces_len);
if (use_custom_normals) {
BM_custom_loop_normals_from_vector_layer(bm_new, false);
}
for (uint i = 0; i < verts_len; i++) {
BM_vert_kill(bm_old, verts[i]);
}
@ -4432,6 +4438,8 @@ static bool mesh_separate_loose(
ED_mesh_geometry_clear(base_old->object->data);
}
BM_custom_loop_normals_to_vector_layer(bm_old);
/* Separate out all groups except the first. */
uint group_ofs[3] = {UNPACK3(groups[0])};
for (int i = 1; i < groups_len; i++) {