Normal UI: for all ops needing autosmooth on, enable it if needed.
authorHoward Trickey <howard.trickey@gmail.com>
Mon, 20 May 2019 16:15:52 +0000 (12:15 -0400)
committerHoward Trickey <howard.trickey@gmail.com>
Mon, 20 May 2019 16:16:34 +0000 (12:16 -0400)
Now Normal menu operations and rotate normals (r n) do not need
manual enabling of autosmooth first.
See T64324 for discussion of Normal UI changes.

source/blender/blenkernel/BKE_editmesh.h
source/blender/blenkernel/intern/editmesh.c
source/blender/editors/mesh/editmesh_tools.c
source/blender/editors/transform/transform.c
source/blender/editors/transform/transform_ops.c

index 91a558a9ee2036883eb708a0857c31e7e82c9288..b7280c702d2b4bd15804a3d807352d2363895840 100644 (file)
@@ -90,6 +90,7 @@ void BKE_editmesh_color_free(BMEditMesh *em);
 void BKE_editmesh_color_ensure(BMEditMesh *em, const char htype);
 float (*BKE_editmesh_vertexCos_get_orco(BMEditMesh *em, int *r_numVerts))[3];
 void BKE_editmesh_lnorspace_update(BMEditMesh *em);
+void BKE_editmesh_ensure_autosmooth(BMEditMesh *em);
 
 /* editderivedmesh.c */
 /* should really be defined in editmesh.c, but they use 'EditDerivedBMesh' */
index 130f4ae88f1c7255f9444b6e413eb36c3bd1413c..264054266eba57370425268bd04a2ac32d7fd480 100644 (file)
@@ -248,3 +248,13 @@ void BKE_editmesh_lnorspace_update(BMEditMesh *em)
 
   BM_lnorspace_update(bm);
 }
+
+/* If autosmooth not already set, set it */
+void BKE_editmesh_ensure_autosmooth(BMEditMesh *em)
+{
+  Mesh *me = em->ob->data;
+  if (!(me->flag & ME_AUTOSMOOTH)) {
+    me->flag |= ME_AUTOSMOOTH;
+    BKE_editmesh_lnorspace_update (em);
+  }
+}
index 91e931115f44f1b0126a0a63d3101d1e66d5d51e..a871bd35f16ef08ea48cf0af1373ba516b8321e3 100644 (file)
@@ -7687,6 +7687,7 @@ static int point_normals_init(bContext *C, wmOperator *op, const wmEvent *UNUSED
   BMEditMesh *em = BKE_editmesh_from_object(obedit);
   BMesh *bm = em->bm;
 
+  BKE_editmesh_ensure_autosmooth(em);
   BKE_editmesh_lnorspace_update(em);
   BMLoopNorEditDataArray *lnors_ed_arr = BM_loop_normal_editdata_array_init(bm);
 
@@ -8076,7 +8077,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_auto_smooth;
+  ot->poll = ED_operator_editmesh;
   ot->ui = edbm_point_normals_ui;
   ot->cancel = point_normals_free;
 
@@ -8242,6 +8243,7 @@ static int normals_split_merge(bContext *C, const bool do_merge)
   BMEdge *e;
   BMIter eiter;
 
+  BKE_editmesh_ensure_autosmooth(em);
   BKE_editmesh_lnorspace_update(em);
 
   BMLoopNorEditDataArray *lnors_ed_arr = do_merge ? BM_loop_normal_editdata_array_init(bm) : NULL;
@@ -8287,7 +8289,7 @@ void MESH_OT_merge_normals(struct wmOperatorType *ot)
 
   /* api callbacks */
   ot->exec = edbm_merge_normals_exec;
-  ot->poll = ED_operator_editmesh_auto_smooth;
+  ot->poll = ED_operator_editmesh;
 
   /* flags */
   ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
@@ -8307,7 +8309,7 @@ void MESH_OT_split_normals(struct wmOperatorType *ot)
 
   /* api callbacks */
   ot->exec = edbm_split_normals_exec;
-  ot->poll = ED_operator_editmesh_auto_smooth;
+  ot->poll = ED_operator_editmesh;
 
   /* flags */
   ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
@@ -8345,6 +8347,7 @@ static int edbm_average_normals_exec(bContext *C, wmOperator *op)
   BMLoop *l, *l_curr, *l_first;
   BMIter fiter;
 
+  BKE_editmesh_ensure_autosmooth(em);
   bm->spacearr_dirty |= BM_SPACEARR_DIRTY_ALL;
   BKE_editmesh_lnorspace_update(em);
 
@@ -8505,7 +8508,7 @@ void MESH_OT_average_normals(struct wmOperatorType *ot)
 
   /* api callbacks */
   ot->exec = edbm_average_normals_exec;
-  ot->poll = ED_operator_editmesh_auto_smooth;
+  ot->poll = ED_operator_editmesh;
   ot->ui = edbm_average_normals_ui;
 
   /* flags */
@@ -8568,6 +8571,7 @@ static int edbm_normals_tools_exec(bContext *C, wmOperator *op)
   const int mode = RNA_enum_get(op->ptr, "mode");
   const bool absolute = RNA_boolean_get(op->ptr, "absolute");
 
+  BKE_editmesh_ensure_autosmooth(em);
   BKE_editmesh_lnorspace_update(em);
   BMLoopNorEditDataArray *lnors_ed_arr = BM_loop_normal_editdata_array_init(bm);
   BMLoopNorEditData *lnor_ed = lnors_ed_arr->lnor_editdata;
@@ -8724,7 +8728,7 @@ void MESH_OT_normals_tools(struct wmOperatorType *ot)
 
   /* api callbacks */
   ot->exec = edbm_normals_tools_exec;
-  ot->poll = ED_operator_editmesh_auto_smooth;
+  ot->poll = ED_operator_editmesh;
   ot->ui = edbm_normals_tools_ui;
 
   /* flags */
@@ -8764,6 +8768,7 @@ static int edbm_set_normals_from_faces_exec(bContext *C, wmOperator *op)
 
     const bool keep_sharp = RNA_boolean_get(op->ptr, "keep_sharp");
 
+    BKE_editmesh_ensure_autosmooth(em);
     BKE_editmesh_lnorspace_update(em);
 
     float(*vnors)[3] = MEM_callocN(sizeof(*vnors) * bm->totvert, __func__);
@@ -8842,7 +8847,7 @@ void MESH_OT_set_normals_from_faces(struct wmOperatorType *ot)
 
   /* api callbacks */
   ot->exec = edbm_set_normals_from_faces_exec;
-  ot->poll = ED_operator_editmesh_auto_smooth;
+  ot->poll = ED_operator_editmesh;
 
   /* flags */
   ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
@@ -8859,6 +8864,7 @@ static int edbm_smoothen_normals_exec(bContext *C, wmOperator *op)
   BMLoop *l;
   BMIter fiter, liter;
 
+  BKE_editmesh_ensure_autosmooth(em);
   BKE_editmesh_lnorspace_update(em);
   BMLoopNorEditDataArray *lnors_ed_arr = BM_loop_normal_editdata_array_init(bm);
 
@@ -8934,7 +8940,7 @@ void MESH_OT_smoothen_normals(struct wmOperatorType *ot)
 
   /* api callbacks */
   ot->exec = edbm_smoothen_normals_exec;
-  ot->poll = ED_operator_editmesh_auto_smooth;
+  ot->poll = ED_operator_editmesh;
 
   /* flags */
   ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
@@ -9017,7 +9023,7 @@ void MESH_OT_mod_weighted_strength(struct wmOperatorType *ot)
 
   /* api callbacks */
   ot->exec = edbm_mod_weighted_strength_exec;
-  ot->poll = ED_operator_editmesh_auto_smooth;
+  ot->poll = ED_operator_editmesh;
 
   /* flags */
   ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
index 09f198ff14c861e45e356db51e9482b13e7a61c7..c3acd604ee130e7c550776ebd1811a7580cffdff 100644 (file)
@@ -4835,6 +4835,7 @@ static void initNormalRotation(TransInfo *t)
     BMEditMesh *em = BKE_editmesh_from_object(tc->obedit);
     BMesh *bm = em->bm;
 
+    BKE_editmesh_ensure_autosmooth(em);
     BKE_editmesh_lnorspace_update(em);
 
     storeCustomLNorValue(tc, bm);
index 8606cd19c964e935a885225e60e17b96369bd244..cdd0896ab660612f62436a87ac2fe87210c4a792 100644 (file)
@@ -1170,7 +1170,7 @@ static void TRANSFORM_OT_rotate_normal(struct wmOperatorType *ot)
   ot->exec = transform_exec;
   ot->modal = transform_modal;
   ot->cancel = transform_cancel;
-  ot->poll = ED_operator_editmesh_auto_smooth;
+  ot->poll = ED_operator_editmesh;
 
   RNA_def_float_rotation(
       ot->srna, "value", 0, NULL, -FLT_MAX, FLT_MAX, "Angle", "", -M_PI * 2, M_PI * 2);