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_tools.c')
-rw-r--r--source/blender/editors/mesh/editmesh_tools.c95
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,