diff options
Diffstat (limited to 'source/blender/editors/mesh/editmesh_tools.c')
-rw-r--r-- | source/blender/editors/mesh/editmesh_tools.c | 95 |
1 files changed, 66 insertions, 29 deletions
diff --git a/source/blender/editors/mesh/editmesh_tools.c b/source/blender/editors/mesh/editmesh_tools.c index 4e1a56b3b55..b961f81e16a 100644 --- a/source/blender/editors/mesh/editmesh_tools.c +++ b/source/blender/editors/mesh/editmesh_tools.c @@ -75,7 +75,7 @@ #include "ED_uvedit.h" #include "ED_view3d.h" -#include "RE_render_ext.h" +#include "RE_texture.h" #include "UI_interface.h" #include "UI_resources.h" @@ -814,7 +814,7 @@ static BMElem *edbm_add_edge_face_exec__tricky_extend_sel(BMesh *bm) (BM_edge_share_face_check(e, ed_pair_v1[0]) == false) && (BM_edge_share_face_check(e, ed_pair_v2[0]) == false)) || -# if 1 /* better support mixed cases [#37203] */ +# if 1 /* better support mixed cases T37203. */ ((edbm_add_edge_face_exec__vert_edge_lookup(e->v1, e, ed_pair_v1, 2, BM_edge_is_wire) == 1) && (edbm_add_edge_face_exec__vert_edge_lookup( @@ -875,7 +875,7 @@ static void edbm_add_edge_face_exec__tricky_finalize_sel(BMesh *bm, BMElem *ele_ } else { BMLoop *l = BM_face_edge_share_loop(f, (BMEdge *)ele_desel); - BLI_assert(f->len == 4 || f->len == 3); + BLI_assert(ELEM(f->len, 4, 3)); BM_edge_select_set(bm, (BMEdge *)ele_desel, false); if (f->len == 4) { @@ -1765,11 +1765,16 @@ static bool edbm_edge_split_selected_edges(wmOperator *op, Object *obedit, BMEdi if (bm->totedgesel == 0) { return false; } + + BM_custom_loop_normals_to_vector_layer(em->bm); + if (!EDBM_op_call_and_selectf( em, op, "edges.out", false, "split_edges edges=%he", BM_ELEM_SELECT)) { return false; } + BM_custom_loop_normals_from_vector_layer(em->bm, false); + EDBM_select_flush(em); EDBM_update_generic(obedit->data, true, true); @@ -1805,6 +1810,8 @@ static bool edbm_edge_split_selected_verts(wmOperator *op, Object *obedit, BMEdi } } + BM_custom_loop_normals_to_vector_layer(em->bm); + if (!EDBM_op_callf(em, op, "split_edges edges=%he verts=%hv use_verts=%b", @@ -1836,6 +1843,8 @@ static bool edbm_edge_split_selected_verts(wmOperator *op, Object *obedit, BMEdi } } + BM_custom_loop_normals_from_vector_layer(em->bm, false); + EDBM_select_flush(em); EDBM_update_generic(obedit->data, true, true); @@ -2512,7 +2521,7 @@ static int edbm_do_smooth_vertex_exec(bContext *C, wmOperator *op) } /* mirror before smooth */ - if (((Mesh *)obedit->data)->editflag & ME_EDIT_MIRROR_X) { + if (((Mesh *)obedit->data)->symmetry & ME_SYMMETRY_X) { EDBM_verts_mirror_cache_begin(em, 0, false, true, false, use_topology); } @@ -2559,7 +2568,7 @@ static int edbm_do_smooth_vertex_exec(bContext *C, wmOperator *op) } /* apply mirror */ - if (((Mesh *)obedit->data)->editflag & ME_EDIT_MIRROR_X) { + if (((Mesh *)obedit->data)->symmetry & ME_SYMMETRY_X) { EDBM_verts_mirror_apply(em, BM_ELEM_SELECT, 0); EDBM_verts_mirror_cache_end(em); } @@ -2657,7 +2666,7 @@ static int edbm_do_smooth_laplacian_vertex_exec(bContext *C, wmOperator *op) } /* Mirror before smooth. */ - if (((Mesh *)obedit->data)->editflag & ME_EDIT_MIRROR_X) { + if (((Mesh *)obedit->data)->symmetry & ME_SYMMETRY_X) { EDBM_verts_mirror_cache_begin(em, 0, false, true, false, use_topology); } @@ -2683,7 +2692,7 @@ static int edbm_do_smooth_laplacian_vertex_exec(bContext *C, wmOperator *op) } /* Apply mirror. */ - if (((Mesh *)obedit->data)->editflag & ME_EDIT_MIRROR_X) { + if (((Mesh *)obedit->data)->symmetry & ME_SYMMETRY_X) { EDBM_verts_mirror_apply(em, BM_ELEM_SELECT, 0); EDBM_verts_mirror_cache_end(em); } @@ -3349,6 +3358,8 @@ static int edbm_remove_doubles_exec(bContext *C, wmOperator *op) { const float threshold = RNA_float_get(op->ptr, "threshold"); const bool use_unselected = RNA_boolean_get(op->ptr, "use_unselected"); + const bool use_sharp_edge_from_normals = RNA_boolean_get(op->ptr, "use_sharp_edge_from_normals"); + int count_multi = 0; ViewLayer *view_layer = CTX_data_view_layer(C); @@ -3409,7 +3420,7 @@ static int edbm_remove_doubles_exec(bContext *C, wmOperator *op) BM_mesh_elem_hflag_enable_test(em->bm, htype_select, BM_ELEM_SELECT, true, true, BM_ELEM_TAG); EDBM_selectmode_flush(em); - BM_custom_loop_normals_from_vector_layer(em->bm, true); + BM_custom_loop_normals_from_vector_layer(em->bm, use_sharp_edge_from_normals); if (count) { count_multi += count; @@ -3451,6 +3462,12 @@ void MESH_OT_remove_doubles(wmOperatorType *ot) false, "Unselected", "Merge selected to other unselected vertices"); + + RNA_def_boolean(ot->srna, + "use_sharp_edge_from_normals", + false, + "Sharp Edges", + "Calculate sharp edges using custom normal data (when available)"); } /** \} */ @@ -3700,7 +3717,7 @@ void MESH_OT_blend_from_shape(wmOperatorType *ot) PropertyRNA *prop; /* identifiers */ - ot->name = "Blend From Shape"; + ot->name = "Blend from Shape"; ot->description = "Blend in shape from a shape key"; ot->idname = "MESH_OT_blend_from_shape"; @@ -4030,7 +4047,7 @@ static int edbm_knife_cut_exec(bContext *C, wmOperator *op) /* for ED_view3d_project_float_object */ ED_view3d_init_mats_rv3d(obedit, region->regiondata); - /* TODO, investigate using index lookup for screen_vert_coords() rather then a hash table */ + /* TODO, investigate using index lookup for screen_vert_coords() rather than a hash table */ /* the floating point coordinates of verts in screen space will be * stored in a hash table according to the vertices pointer */ @@ -4065,7 +4082,7 @@ static int edbm_knife_cut_exec(bContext *C, wmOperator *op) isect = bm_edge_seg_isect(sco_a, sco_b, mouse_path, len, mode, &isected); if (isect != 0.0f) { - if (mode != KNIFE_MULTICUT && mode != KNIFE_MIDPOINT) { + if (!ELEM(mode, KNIFE_MULTICUT, KNIFE_MIDPOINT)) { BMO_slot_map_float_insert(&bmop, slot_edge_percents, be, isect); } } @@ -4225,24 +4242,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); @@ -4262,6 +4281,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]); } @@ -4424,6 +4447,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++) { @@ -5268,6 +5293,8 @@ static int edbm_quads_convert_to_tris_exec(bContext *C, wmOperator *op) BMOIter oiter; BMFace *f; + BM_custom_loop_normals_to_vector_layer(em->bm); + EDBM_op_init(em, &bmop, op, @@ -5292,6 +5319,8 @@ static int edbm_quads_convert_to_tris_exec(bContext *C, wmOperator *op) continue; } + BM_custom_loop_normals_from_vector_layer(em->bm, false); + EDBM_update_generic(obedit->data, true, true); } @@ -5981,6 +6010,8 @@ static int edbm_dissolve_limited_exec(bContext *C, wmOperator *op) dissolve_flag = BM_ELEM_SELECT; } + BM_custom_loop_normals_to_vector_layer(em->bm); + EDBM_op_call_and_selectf( em, op, @@ -5993,6 +6024,8 @@ static int edbm_dissolve_limited_exec(bContext *C, wmOperator *op) use_dissolve_boundaries, delimit); + BM_custom_loop_normals_from_vector_layer(em->bm, false); + EDBM_update_generic(obedit->data, true, true); } MEM_freeN(objects); @@ -6217,6 +6250,8 @@ static int edbm_split_exec(bContext *C, wmOperator *op) if ((em->bm->totvertsel == 0) && (em->bm->totedgesel == 0) && (em->bm->totfacesel == 0)) { continue; } + BM_custom_loop_normals_to_vector_layer(em->bm); + BMOperator bmop; EDBM_op_init(em, &bmop, op, "split geom=%hvef use_only_faces=%b", BM_ELEM_SELECT, false); BMO_op_exec(em->bm, &bmop); @@ -6224,6 +6259,8 @@ static int edbm_split_exec(bContext *C, wmOperator *op) BMO_slot_buffer_hflag_enable( em->bm, bmop.slots_out, "geom.out", BM_ALL_NOLOOP, BM_ELEM_SELECT, true); + BM_custom_loop_normals_from_vector_layer(em->bm, false); + if (!EDBM_op_finish(em, &bmop, op, true)) { continue; } @@ -7245,7 +7282,7 @@ void MESH_OT_wireframe(wmOperatorType *ot) RNA_def_boolean(ot->srna, "use_replace", true, "Replace", "Remove original faces"); prop = RNA_def_float_distance( ot->srna, "thickness", 0.01f, 0.0f, 1e4f, "Thickness", "", 0.0f, 10.0f); - /* use 1 rather then 10 for max else dragging the button moves too far */ + /* use 1 rather than 10 for max else dragging the button moves too far */ RNA_def_property_ui_range(prop, 0.0, 1.0, 0.01, 4); RNA_def_float_distance(ot->srna, "offset", 0.01f, 0.0f, 1e4f, "Offset", "", 0.0f, 10.0f); RNA_def_boolean(ot->srna, @@ -7254,7 +7291,7 @@ void MESH_OT_wireframe(wmOperatorType *ot) "Crease", "Crease hub edges for an improved subdivision surface"); prop = RNA_def_float( - ot->srna, "crease_weight", 0.01f, 0.0f, 1e3f, "Crease weight", "", 0.0f, 1.0f); + ot->srna, "crease_weight", 0.01f, 0.0f, 1e3f, "Crease Weight", "", 0.0f, 1.0f); RNA_def_property_ui_range(prop, 0.0, 1.0, 0.1, 2); } @@ -9276,7 +9313,7 @@ static int edbm_set_normals_from_faces_exec(bContext *C, wmOperator *op) void MESH_OT_set_normals_from_faces(struct wmOperatorType *ot) { /* identifiers */ - ot->name = "Set Normals From Faces"; + ot->name = "Set Normals from Faces"; ot->description = "Set the custom normals from the selected faces ones"; ot->idname = "MESH_OT_set_normals_from_faces"; @@ -9491,7 +9528,7 @@ void MESH_OT_mod_weighted_strength(struct wmOperatorType *ot) /* flags */ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; - ot->prop = RNA_def_boolean(ot->srna, "set", 0, "Set value", "Set Value of faces"); + ot->prop = RNA_def_boolean(ot->srna, "set", 0, "Set Value", "Set value of faces"); ot->prop = RNA_def_enum( ot->srna, |