Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'source/blender/editors/mesh/editmesh_mask_extract.c')
-rw-r--r--source/blender/editors/mesh/editmesh_mask_extract.c21
1 files changed, 15 insertions, 6 deletions
diff --git a/source/blender/editors/mesh/editmesh_mask_extract.c b/source/blender/editors/mesh/editmesh_mask_extract.c
index ac3feed4c2a..8ef1f9ee176 100644
--- a/source/blender/editors/mesh/editmesh_mask_extract.c
+++ b/source/blender/editors/mesh/editmesh_mask_extract.c
@@ -107,7 +107,7 @@ static int geometry_extract_apply(bContext *C,
BKE_sculpt_mask_layers_ensure(ob, NULL);
Mesh *mesh = ob->data;
- Mesh *new_mesh = BKE_mesh_copy(bmain, mesh);
+ Mesh *new_mesh = (Mesh *)BKE_id_copy(bmain, &mesh->id);
const BMAllocTemplate allocsize = BMALLOC_TEMPLATE_FROM_ME(new_mesh);
BMesh *bm;
@@ -222,6 +222,11 @@ static int geometry_extract_apply(bContext *C,
Mesh *new_ob_mesh = new_ob->data;
CustomData_free_layers(&new_ob_mesh->pdata, CD_SCULPT_FACE_SETS, new_ob_mesh->totpoly);
+ /* Remove the mask from the new object so it can be sculpted directly after extracting. */
+ CustomData_free_layers(&new_ob_mesh->vdata, CD_PAINT_MASK, new_ob_mesh->totvert);
+
+ BKE_mesh_copy_settings(new_ob_mesh, mesh);
+
if (params->apply_shrinkwrap) {
BKE_shrinkwrap_mesh_nearest_surface_deform(C, new_ob, ob);
}
@@ -343,7 +348,7 @@ void MESH_OT_paint_mask_extract(wmOperatorType *ot)
ot->invoke = paint_mask_extract_invoke;
ot->exec = paint_mask_extract_exec;
- ot->flag = OPTYPE_REGISTER;
+ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
RNA_def_float(
ot->srna,
@@ -427,7 +432,7 @@ void MESH_OT_face_set_extract(wmOperatorType *ot)
ot->invoke = face_set_extract_invoke;
ot->modal = face_set_extract_modal;
- ot->flag = OPTYPE_REGISTER;
+ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
geometry_extract_props(ot->srna);
}
@@ -491,7 +496,7 @@ static int paint_mask_slice_exec(bContext *C, wmOperator *op)
BKE_sculpt_mask_layers_ensure(ob, NULL);
Mesh *mesh = ob->data;
- Mesh *new_mesh = BKE_mesh_copy(bmain, mesh);
+ Mesh *new_mesh = (Mesh *)BKE_id_copy(bmain, &mesh->id);
if (ob->mode == OB_MODE_SCULPT) {
ED_sculpt_undo_geometry_begin(ob, "mask slice");
@@ -527,7 +532,7 @@ static int paint_mask_slice_exec(bContext *C, wmOperator *op)
}
Object *new_ob = ED_object_add_type(
C, OB_MESH, NULL, ob->loc, ob->rot, false, local_view_bits);
- Mesh *new_ob_mesh = BKE_mesh_copy(bmain, mesh);
+ Mesh *new_ob_mesh = (Mesh *)BKE_id_copy(bmain, &mesh->id);
const BMAllocTemplate allocsize_new_ob = BMALLOC_TEMPLATE_FROM_ME(new_ob_mesh);
bm = BM_mesh_create(&allocsize_new_ob,
@@ -553,8 +558,12 @@ static int paint_mask_slice_exec(bContext *C, wmOperator *op)
mesh);
BM_mesh_free(bm);
+ /* Remove the mask from the new object so it can be sculpted directly after slicing. */
+ CustomData_free_layers(&new_ob_mesh->vdata, CD_PAINT_MASK, new_ob_mesh->totvert);
+
BKE_mesh_nomain_to_mesh(new_ob_mesh, new_ob->data, new_ob, &CD_MASK_MESH, true);
BKE_mesh_calc_normals(new_ob->data);
+ BKE_mesh_copy_settings(new_ob->data, mesh);
WM_event_add_notifier(C, NC_OBJECT | ND_MODIFIER, new_ob);
BKE_mesh_batch_cache_dirty_tag(new_ob->data, BKE_MESH_BATCH_DIRTY_ALL);
DEG_relations_tag_update(bmain);
@@ -595,7 +604,7 @@ void MESH_OT_paint_mask_slice(wmOperatorType *ot)
ot->poll = geometry_extract_poll;
ot->exec = paint_mask_slice_exec;
- ot->flag = OPTYPE_REGISTER;
+ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
RNA_def_float(
ot->srna,