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. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to