[Bf-blender-cvs] [626c9888d7d] soc-2017-normal-tools: cleanup of point_normals and added poll
Rohan Rathi
noreply at git.blender.org
Tue Jul 4 20:23:28 CEST 2017
Commit: 626c9888d7d0fe6038a90a3d5abebf4f641fb7f4
Author: Rohan Rathi
Date: Tue Jul 4 23:53:06 2017 +0530
Branches: soc-2017-normal-tools
https://developer.blender.org/rB626c9888d7d0fe6038a90a3d5abebf4f641fb7f4
cleanup of point_normals and added poll
===================================================================
M source/blender/bmesh/intern/bmesh_mesh.c
M source/blender/editors/include/ED_screen.h
M source/blender/editors/mesh/editmesh_tools.c
M source/blender/editors/screen/screen_ops.c
M source/blender/editors/transform/transform_ops.c
===================================================================
diff --git a/source/blender/bmesh/intern/bmesh_mesh.c b/source/blender/bmesh/intern/bmesh_mesh.c
index f82aebb2478..2e750837fb6 100644
--- a/source/blender/bmesh/intern/bmesh_mesh.c
+++ b/source/blender/bmesh/intern/bmesh_mesh.c
@@ -1239,6 +1239,8 @@ LoopNormalData *BM_loop_normal_init(BMesh *bm)
faces = bm->selectmode & SCE_SELECT_FACE;
int totloopsel = 0;
+ BLI_assert(bm->spacearr_dirty == 0);
+
BLI_bitmap *loops = BLI_BITMAP_NEW(bm->totloop, "__func__");
if (verts + edges + faces > 1) { /* More than 1 sel mode, check if only individual normals to edit */
totloopsel = BM_loop_normal_mark_indiv(bm, loops);
diff --git a/source/blender/editors/include/ED_screen.h b/source/blender/editors/include/ED_screen.h
index ec09add56b8..56e741aee18 100644
--- a/source/blender/editors/include/ED_screen.h
+++ b/source/blender/editors/include/ED_screen.h
@@ -168,6 +168,7 @@ int ED_operator_object_active_editable_font(struct bContext *C);
int ED_operator_editmesh(struct bContext *C);
int ED_operator_editmesh_view3d(struct bContext *C);
int ED_operator_editmesh_region_view3d(struct bContext *C);
+int ED_operator_editmesh_auto_smooth(struct bContext *C);
int ED_operator_editarmature(struct bContext *C);
int ED_operator_editcurve(struct bContext *C);
int ED_operator_editcurve_3d(struct bContext *C);
diff --git a/source/blender/editors/mesh/editmesh_tools.c b/source/blender/editors/mesh/editmesh_tools.c
index de9085effdf..e85c3703adf 100644
--- a/source/blender/editors/mesh/editmesh_tools.c
+++ b/source/blender/editors/mesh/editmesh_tools.c
@@ -5987,84 +5987,25 @@ static int init_point_normals(bContext *C, wmOperator *op, const wmEvent *event)
{
Object *obedit = CTX_data_edit_object(C);
BMesh *bm = BKE_editmesh_from_object(obedit)->bm;
- BMVert *v;
- BMLoop *l;
- BMIter viter, liter;
BM_lnorspace_update(bm);
- LoopNormalData *ld;
- int cd_custom_normal_offset = CustomData_get_offset(&bm->ldata, CD_CUSTOMLOOPNORMAL);
-
- PropertyRNA *prop = RNA_struct_find_property(op->ptr, "selected");
- int totloopsel = RNA_property_array_length(op->ptr, prop);
-
- /* This if statement is required as if we RMB on mesh then prev selected loop data is lost */
-
- if (totloopsel) {
-
- int *loop_sel = MEM_mallocN(sizeof(*loop_sel) * totloopsel, "__func__");
-
- RNA_int_get_array(op->ptr, "selected", loop_sel); /* Get loop indices of previous selected vertices */
- ld = MEM_mallocN(sizeof(LoopNormalData), "__func__");
-
- TransDataLoopNormal *tld = ld->normal = MEM_mallocN(sizeof(*tld) * totloopsel, "__func__");
- int *loop_cur = loop_sel;
-
- for (int i = 0; i < totloopsel; i++, loop_cur++) {
-
- BM_ITER_MESH(v, &viter, bm, BM_VERTS_OF_MESH) {
- BM_ITER_ELEM(l, &liter, v, BM_LOOPS_OF_VERT) {
- if (*loop_cur == BM_elem_index_get(l)) {
- InitTransDataNormal(bm, tld, v, l, cd_custom_normal_offset); /* Init those loop normals used in previous call */
- tld++;
- }
- }
- }
- }
- ld->totloop = totloopsel;
- MEM_freeN(loop_sel);
- }
- else {
- ld = BM_loop_normal_init(bm);
- totloopsel = ld->totloop;
- }
+ LoopNormalData *ld = BM_loop_normal_init(bm);
ld->funcdata = NULL;
op->customdata = ld;
- return totloopsel;
+ return ld->totloop;
}
-static void apply_point_normals(bContext *C, wmOperator *op, const wmEvent *event, float target[3], bool vert)
+static void apply_point_normals(bContext *C, wmOperator *op, const wmEvent *event, float target[3])
{
Object *obedit = CTX_data_edit_object(C);
BMesh *bm = BKE_editmesh_from_object(obedit)->bm;
- BMLoop *l;
- BMIter liter;
LoopNormalData *ld = op->customdata;
TransDataLoopNormal *tld = ld->normal;
const bool point_away = RNA_boolean_get(op->ptr, "point_away");
- if (vert) { /* if active vert is pivot, keep its normal same */
- BMElem *ele;
- ele = BM_mesh_active_elem_get(bm);
-
- if (ele->head.htype == BM_VERT) {
- BM_ITER_ELEM(l, &liter, ((BMVert *)ele), BM_LOOPS_OF_VERT) {
- int loop_index = BM_elem_index_get(l);
- tld = ld->normal;
-
- for (int i = 0; i < ld->totloop; i++, tld++) {
- if (tld->loop_index == loop_index) {
- tld->loop_index = -1;
- break;
- }
- }
- }
- tld = ld->normal;
- }
- }
for (int i = 0; i < ld->totloop; i++, tld++) {
sub_v3_v3v3(tld->nloc, target, tld->loc);
normalize_v3(tld->nloc);
@@ -6072,7 +6013,7 @@ static void apply_point_normals(bContext *C, wmOperator *op, const wmEvent *even
if (point_away) {
negate_v3(tld->nloc);
}
- if (tld->loop_index != -1) {
+ if (tld->loop_index != -1 && !is_zero_v3(tld->nloc)) {
BKE_lnor_space_custom_normal_to_data(bm->lnor_spacearr->lspacearr[tld->loop_index], tld->nloc, tld->clnors_data);
}
}
@@ -6120,10 +6061,9 @@ static int point_normals_mouse(bContext *C, wmOperator *op, const wmEvent *event
PropertyRNA *prop = RNA_struct_find_property(op->ptr, "align");
RNA_def_property_clear_flag(prop, PROP_HIDDEN);
- const bool check_vert = RNA_boolean_get(op->ptr, "check_vert"),
- align = RNA_boolean_get(op->ptr, "align");
+ const bool align = RNA_boolean_get(op->ptr, "align");
- apply_point_normals(C, op, event, target, check_vert);
+ apply_point_normals(C, op, event, target);
EDBM_update_generic(em, true, false);
if (event->type == LEFTMOUSE) {
@@ -6153,7 +6093,6 @@ static int edbm_point_normals_modal(bContext *C, wmOperator *op, const wmEvent *
BMEditMesh *em = BKE_editmesh_from_object(obedit);
BMesh *bm = em->bm;
float target[3];
- static BMElem *ele_ref = NULL;
int i = 0;
bool handled = false;
@@ -6166,22 +6105,6 @@ static int edbm_point_normals_modal(bContext *C, wmOperator *op, const wmEvent *
return apply(C, op, event);
}
- if (ele_ref) {
- BMElem *ele_new = BM_mesh_active_elem_get(bm);
- if (ele_ref == ele_new) {
- ele_ref = NULL;
- point_normals_free(C, op, false);
-
- return OPERATOR_CANCELLED;
- }
- RNA_boolean_set(op->ptr, "check_vert", true);
- ED_object_editmode_calc_active_center(obedit, false, target);
- RNA_property_float_set_array(op->ptr, prop, target);
-
- handled = true;
- ele_ref = NULL;
- }
-
if (event->val == KM_PRESS) {
BMVert *v;
BMIter viter;
@@ -6195,20 +6118,16 @@ static int edbm_point_normals_modal(bContext *C, wmOperator *op, const wmEvent *
handled = true;
}
if (event->type == RIGHTMOUSE) {
- ele_ref = BM_mesh_active_elem_get(bm);
- if (!ele_ref) {
- ele_ref = ele_ref + 1; /* If entire mesh is selected, make ele_ref no longer NULL (it is never dereferenced) */
- }
- int *loop_sel = MEM_mallocN(sizeof(*loop_sel) * ld->totloop, "__func__");
- TransDataLoopNormal *tld = ld->normal;
- for (i = 0; i < ld->totloop; i++, tld++) {
- loop_sel[i] = tld->loop_index;
+ view3d_operator_needs_opengl(C);
+ bool retval = EDBM_select_pick(C, event->mval, false, false, false);
+ if (!retval) {
+ point_normals_free(C, op, false);
+ return OPERATOR_CANCELLED;
}
- prop = RNA_struct_find_property(op->ptr, "selected");
- RNA_def_property_array(prop, ld->totloop);
- RNA_property_int_set_array(op->ptr, prop, loop_sel); //Store selected loops, will be lost as selected elem changes
- MEM_freeN(loop_sel);
+ ED_object_editmode_calc_active_center(obedit, false, target);
+ RNA_property_float_set_array(op->ptr, prop, target);
+ handled = true;
}
else if (event->type == LKEY) {
@@ -6257,7 +6176,6 @@ static int edbm_point_normals_modal(bContext *C, wmOperator *op, const wmEvent *
if (!ED_object_editmode_calc_active_center(obedit, false, target)) {
return OPERATOR_CANCELLED;
}
- RNA_boolean_set(op->ptr, "check_vert", true);
RNA_property_float_set_array(op->ptr, prop, target);
break;
@@ -6319,8 +6237,7 @@ static int edbm_point_normals_modal(bContext *C, wmOperator *op, const wmEvent *
}
if (handled) {
- bool check_vert = RNA_boolean_get(op->ptr, "check_vert");
- apply_point_normals(C, op, event, target, check_vert);
+ apply_point_normals(C, op, event, target);
EDBM_update_generic(em, true, false); /* Recheck bools */
point_normals_free(C, op, false);
@@ -6335,22 +6252,12 @@ static int edbm_point_normals_invoke(bContext *C, wmOperator *op, const wmEvent
{
Object *obedit = CTX_data_edit_object(C);
BMesh *bm = BKE_editmesh_from_object(obedit)->bm;
-
- if ((((Mesh *)(obedit->data))->flag & ME_AUTOSMOOTH) == 0) {
- BKE_report(op->reports, RPT_ERROR, "Auto Smooth is turned off");
- return OPERATOR_CANCELLED;
- }
-
- PropertyRNA *prop = RNA_struct_find_property(op->ptr, "selected");
- RNA_def_property_array(prop, 0);
if (!init_point_normals(C, op, event)) {
point_normals_free(C, op, false);
return OPERATOR_CANCELLED;
}
- RNA_boolean_set(op->ptr, "check_vert", 0);
-
WM_event_add_modal_handler(C, op);
char header[UI_MAX_DRAW_STR];
@@ -6376,8 +6283,7 @@ static int edbm_point_normals_exec(bContext *C, wmOperator *op)
}
float target[3];
- bool point_away = RNA_boolean_get(op->ptr, "point_away"), check_vert = RNA_boolean_get(op->ptr, "check_vert"),
- align = RNA_boolean_get(op->ptr, "align");
+ bool point_away = RNA_boolean_get(op->ptr, "point_away"), align = RNA_boolean_get(op->ptr, "align");
if (align) { /* Set TransData loc to center loc if align true */
float *center = MEM_mallocN(sizeof(*center) * 3, "__func__");
@@ -6404,7 +6310,7 @@ static int edbm_point_normals_exec(bContext *C, wmOperator *op)
prop = RNA_struct_find_property(op->ptr, "target_location");
RNA_property_float_get_array(op->ptr, prop, target);
- apply_point_normals(C, op, NULL, target, check_vert);
+ apply_point_normals(C, op, NULL, target);
EDBM_update_generic(em, true, false);
point_normals_free(C, op, align);
@@ -6423,7 +6329,7 @@ void MESH_OT_point_normals(struct wmOperatorType *ot)
ot->exec = edbm_point_normals_exec;
ot->invoke = edbm_point_normals_invoke;
ot->modal = edbm_point_normals_modal;
- ot->poll = ED_operator_editmesh;
+ ot->poll = ED_operator_editmesh_auto_smooth;
/* flags */
ot->flag = OPTYPE_BLOCKING | OPTYPE_REGISTER | OPTYPE_UNDO;
@@ -6438,12 +6344,6 @@ void MESH_OT_point_normals(struct wmOperatorType *ot)
prop = RNA_def_property(ot->srna, "target_location", PROP_FLOAT, PROP_XY
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list