Changeset View
Changeset View
Standalone View
Standalone View
source/blender/editors/mesh/editmesh_mask_extract.c
| Show First 20 Lines • Show All 74 Lines • ▼ Show 20 Lines | |||||
| static int paint_mask_extract_exec(bContext *C, wmOperator *op) | static int paint_mask_extract_exec(bContext *C, wmOperator *op) | ||||
| { | { | ||||
| struct Main *bmain = CTX_data_main(C); | struct Main *bmain = CTX_data_main(C); | ||||
| Object *ob = CTX_data_active_object(C); | Object *ob = CTX_data_active_object(C); | ||||
| View3D *v3d = CTX_wm_view3d(C); | View3D *v3d = CTX_wm_view3d(C); | ||||
| Scene *scene = CTX_data_scene(C); | Scene *scene = CTX_data_scene(C); | ||||
| BKE_sculpt_mask_layers_ensure(ob, NULL); | |||||
| Mesh *mesh = ob->data; | Mesh *mesh = ob->data; | ||||
| Mesh *new_mesh = BKE_mesh_copy(bmain, mesh); | Mesh *new_mesh = BKE_mesh_copy(bmain, mesh); | ||||
| const BMAllocTemplate allocsize = BMALLOC_TEMPLATE_FROM_ME(new_mesh); | const BMAllocTemplate allocsize = BMALLOC_TEMPLATE_FROM_ME(new_mesh); | ||||
| BMesh *bm; | BMesh *bm; | ||||
| bm = BM_mesh_create(&allocsize, | bm = BM_mesh_create(&allocsize, | ||||
| &((struct BMeshCreateParams){ | &((struct BMeshCreateParams){ | ||||
| .use_toolflags = true, | .use_toolflags = true, | ||||
| })); | })); | ||||
| BM_mesh_bm_from_me(bm, | BM_mesh_bm_from_me(bm, | ||||
| new_mesh, | new_mesh, | ||||
| (&(struct BMeshFromMeshParams){ | (&(struct BMeshFromMeshParams){ | ||||
| .calc_face_normal = true, | .calc_face_normal = true, | ||||
| })); | })); | ||||
| BMEditMesh *em = BKE_editmesh_create(bm, false); | BMEditMesh *em = BKE_editmesh_create(bm, false); | ||||
| BMVert *v; | BMVert *v; | ||||
| BMEdge *ed; | BMEdge *ed; | ||||
| BMFace *f; | BMFace *f; | ||||
| BMIter iter; | BMIter iter; | ||||
| BMIter face_iter; | BMIter face_iter; | ||||
| /* Delete all unmasked faces */ | /* Delete all unmasked faces */ | ||||
| const int cd_vert_mask_offset = CustomData_get_offset(&bm->vdata, CD_PAINT_MASK); | |||||
| BLI_assert(cd_vert_mask_offset != -1); | |||||
| BM_mesh_elem_hflag_disable_all(bm, BM_VERT | BM_EDGE | BM_FACE, BM_ELEM_TAG, false); | BM_mesh_elem_hflag_disable_all(bm, BM_VERT | BM_EDGE | BM_FACE, BM_ELEM_TAG, false); | ||||
| const int cd_vert_mask_offset = CustomData_get_offset(&bm->vdata, CD_PAINT_MASK); | |||||
| float mask_threshold = RNA_float_get(op->ptr, "mask_threshold"); | float mask_threshold = RNA_float_get(op->ptr, "mask_threshold"); | ||||
| BM_ITER_MESH (f, &iter, bm, BM_FACES_OF_MESH) { | BM_ITER_MESH (f, &iter, bm, BM_FACES_OF_MESH) { | ||||
| bool keep_face = true; | bool keep_face = true; | ||||
| BM_ITER_ELEM (v, &face_iter, f, BM_VERTS_OF_FACE) { | BM_ITER_ELEM (v, &face_iter, f, BM_VERTS_OF_FACE) { | ||||
| const float mask = BM_ELEM_CD_GET_FLOAT(v, cd_vert_mask_offset); | const float mask = BM_ELEM_CD_GET_FLOAT(v, cd_vert_mask_offset); | ||||
| if (mask < mask_threshold) { | if (mask < mask_threshold) { | ||||
| keep_face = false; | keep_face = false; | ||||
| ▲ Show 20 Lines • Show All 213 Lines • ▼ Show 20 Lines | |||||
| } | } | ||||
| static int paint_mask_slice_exec(bContext *C, wmOperator *op) | static int paint_mask_slice_exec(bContext *C, wmOperator *op) | ||||
| { | { | ||||
| struct Main *bmain = CTX_data_main(C); | struct Main *bmain = CTX_data_main(C); | ||||
| Object *ob = CTX_data_active_object(C); | Object *ob = CTX_data_active_object(C); | ||||
| View3D *v3d = CTX_wm_view3d(C); | View3D *v3d = CTX_wm_view3d(C); | ||||
| BKE_sculpt_mask_layers_ensure(ob, NULL); | |||||
| Mesh *mesh = ob->data; | Mesh *mesh = ob->data; | ||||
| Mesh *new_mesh = BKE_mesh_copy(bmain, mesh); | Mesh *new_mesh = BKE_mesh_copy(bmain, mesh); | ||||
| if (ob->mode == OB_MODE_SCULPT) { | if (ob->mode == OB_MODE_SCULPT) { | ||||
| ED_sculpt_undo_geometry_begin(ob, "mask slice"); | ED_sculpt_undo_geometry_begin(ob, "mask slice"); | ||||
| } | } | ||||
| BMesh *bm; | BMesh *bm; | ||||
| ▲ Show 20 Lines • Show All 112 Lines • Show Last 20 Lines | |||||