[Bf-blender-cvs] [1f3607a8f71] soc-2021-knife-tools: Knife: Implemented D10853 - Constrained angle mode improvements

cianjinks noreply at git.blender.org
Sat Jun 5 15:24:01 CEST 2021


Commit: 1f3607a8f71791d3f97bd28a5a5cdf31f246b158
Author: cianjinks
Date:   Sat Jun 5 14:21:01 2021 +0100
Branches: soc-2021-knife-tools
https://developer.blender.org/rB1f3607a8f71791d3f97bd28a5a5cdf31f246b158

Knife: Implemented D10853 - Constrained angle mode improvements

This is the first commit for the GSOC 2021 Knife Tool Improvements project. It implements D10853 which adds more control over constrained angle mode through new UI elements and number key input.

===================================================================

M	release/datafiles/locale
M	release/scripts/addons
M	release/scripts/addons_contrib
M	release/scripts/presets/keyconfig/keymap_data/blender_default.py
M	release/scripts/startup/bl_ui/space_toolsystem_toolbar.py
M	source/blender/editors/mesh/editmesh_knife.c
M	source/tools

===================================================================

diff --git a/release/datafiles/locale b/release/datafiles/locale
index 2cef4877edc..5ab29b1331d 160000
--- a/release/datafiles/locale
+++ b/release/datafiles/locale
@@ -1 +1 @@
-Subproject commit 2cef4877edc40875978c4e95322bb5193f5815bf
+Subproject commit 5ab29b1331d2103dae634b987f121c4599459d7f
diff --git a/release/scripts/addons b/release/scripts/addons
index 27fe7f3a4f9..4fcdbfe7c20 160000
--- a/release/scripts/addons
+++ b/release/scripts/addons
@@ -1 +1 @@
-Subproject commit 27fe7f3a4f964b53af436c4da4ddea337eff0c7e
+Subproject commit 4fcdbfe7c20edfc1204c0aa46c98ea25354abcd9
diff --git a/release/scripts/addons_contrib b/release/scripts/addons_contrib
index 5a82baad9f9..7d78c8a63f2 160000
--- a/release/scripts/addons_contrib
+++ b/release/scripts/addons_contrib
@@ -1 +1 @@
-Subproject commit 5a82baad9f986722104280e8354a4427d8e9eab1
+Subproject commit 7d78c8a63f2f4b146f9327ddc0d567a5921b94ea
diff --git a/release/scripts/presets/keyconfig/keymap_data/blender_default.py b/release/scripts/presets/keyconfig/keymap_data/blender_default.py
index dbc7ce650a3..c3d47ad0b8c 100644
--- a/release/scripts/presets/keyconfig/keymap_data/blender_default.py
+++ b/release/scripts/presets/keyconfig/keymap_data/blender_default.py
@@ -4711,9 +4711,9 @@ def km_mesh(params):
         ("mesh.dissolve_mode", {"type": 'X', "value": 'PRESS', "ctrl": True}, None),
         ("mesh.dissolve_mode", {"type": 'DEL', "value": 'PRESS', "ctrl": True}, None),
         ("mesh.knife_tool", {"type": 'K', "value": 'PRESS'},
-         {"properties": [("use_occlude_geometry", True), ("only_selected", False)]}),
+         {"properties": [("use_occlude_geometry", True), ("only_selected", False), ("angle_snapping_increment", 5.0)]}),
         ("mesh.knife_tool", {"type": 'K', "value": 'PRESS', "shift": True},
-         {"properties": [("use_occlude_geometry", False), ("only_selected", True)]}),
+         {"properties": [("use_occlude_geometry", False), ("only_selected", True), ("angle_snapping_increment", 5.0)]}),
         ("object.vertex_parent_set", {"type": 'P', "value": 'PRESS', "ctrl": True}, None),
         # Menus.
         op_menu("VIEW3D_MT_edit_mesh_faces", {"type": 'F', "value": 'PRESS', "ctrl": True}),
diff --git a/release/scripts/startup/bl_ui/space_toolsystem_toolbar.py b/release/scripts/startup/bl_ui/space_toolsystem_toolbar.py
index ce1c401b14b..016aeb9fef7 100644
--- a/release/scripts/startup/bl_ui/space_toolsystem_toolbar.py
+++ b/release/scripts/startup/bl_ui/space_toolsystem_toolbar.py
@@ -1067,11 +1067,25 @@ class _defs_edit_mesh:
 
     @ToolDef.from_fn
     def knife():
-        def draw_settings(_context, layout, tool):
+        def draw_settings(_context, layout, tool, *, extra=False):
+            show_extra = False
             props = tool.operator_properties("mesh.knife_tool")
-            layout.prop(props, "use_occlude_geometry")
-            layout.prop(props, "only_selected")
-
+            if not extra:
+                row = layout.row()
+                layout.prop(props, "use_occlude_geometry")
+                row = layout.row()
+                layout.prop(props, "only_selected")
+                region_is_header = bpy.context.region.type == 'TOOL_HEADER'
+                if region_is_header:
+                    show_extra = True
+                else:
+                    extra = True
+            if extra:
+                layout.use_property_split = True
+                layout.label(text="Angle Snapping")
+                layout.row().prop(props, "angle_snapping_increment", text="", expand=True)
+            if show_extra:
+                layout.popover("TOPBAR_PT_tool_settings_extra", text="...")
         return dict(
             idname="builtin.knife",
             label="Knife",
diff --git a/source/blender/editors/mesh/editmesh_knife.c b/source/blender/editors/mesh/editmesh_knife.c
index 825b7d11aef..dee5d433f42 100644
--- a/source/blender/editors/mesh/editmesh_knife.c
+++ b/source/blender/editors/mesh/editmesh_knife.c
@@ -45,12 +45,14 @@
 #include "BKE_editmesh.h"
 #include "BKE_editmesh_bvh.h"
 #include "BKE_report.h"
+#include "BKE_unit.h"
 
 #include "GPU_immediate.h"
 #include "GPU_matrix.h"
 #include "GPU_state.h"
 
 #include "ED_mesh.h"
+#include "ED_numinput.h"
 #include "ED_screen.h"
 #include "ED_space_api.h"
 #include "ED_view3d.h"
@@ -87,6 +89,10 @@
 #define KNIFE_FLT_EPS_PX_EDGE 0.05f
 #define KNIFE_FLT_EPS_PX_FACE 0.05f
 
+#define KNIFE_DEFAULT_ANGLE_SNAPPING_INCREMENT 5.0f
+#define KNIFE_MIN_ANGLE_SNAPPING_INCREMENT 0.0f
+#define KNIFE_MAX_ANGLE_SNAPPING_INCREMENT 90.0f
+
 typedef struct KnifeColors {
   uchar line[3];
   uchar edge[3];
@@ -240,6 +246,9 @@ typedef struct KnifeTool_OpData {
   bool ignore_edge_snapping;
   bool ignore_vert_snapping;
 
+  NumInput num;
+  float angle_snapping_increment; /* degrees */
+
   /* use to check if we're currently dragging an angle snapped line */
   bool is_angle_snapping;
   bool angle_snapping;
@@ -538,7 +547,7 @@ static void knife_update_header(bContext *C, wmOperator *op, KnifeTool_OpData *k
                TIP_("%s: confirm, %s: cancel, "
                     "%s: start/define cut, %s: close cut, %s: new cut, "
                     "%s: midpoint snap (%s), %s: ignore snap (%s), "
-                    "%s: angle constraint (%s), %s: cut through (%s), "
+                    "%s: angle constraint %.2f (%s), %s: cut through (%s), "
                     "%s: panning"),
                WM_MODALKEY(KNF_MODAL_CONFIRM),
                WM_MODALKEY(KNF_MODAL_CANCEL),
@@ -550,6 +559,10 @@ static void knife_update_header(bContext *C, wmOperator *op, KnifeTool_OpData *k
                WM_MODALKEY(KNF_MODAL_IGNORE_SNAP_ON),
                WM_bool_as_string(kcd->ignore_edge_snapping),
                WM_MODALKEY(KNF_MODAL_ANGLE_SNAP_TOGGLE),
+               (kcd->angle_snapping_increment > KNIFE_MIN_ANGLE_SNAPPING_INCREMENT &&
+                kcd->angle_snapping_increment < KNIFE_MAX_ANGLE_SNAPPING_INCREMENT) ?
+                   kcd->angle_snapping_increment :
+                   KNIFE_DEFAULT_ANGLE_SNAPPING_INCREMENT,
                WM_bool_as_string(kcd->angle_snapping),
                WM_MODALKEY(KNF_MODAL_CUT_THROUGH_TOGGLE),
                WM_bool_as_string(kcd->cut_through),
@@ -2518,7 +2531,16 @@ static bool knife_snap_angle(KnifeTool_OpData *kcd)
 {
   const float dvec_ref[2] = {0.0f, 1.0f};
   float dvec[2], dvec_snap[2];
-  float snap_step = DEG2RADF(45);
+
+  float snap_step;
+  /* Currently user can input any float between 0 and 90 */
+  if (kcd->angle_snapping_increment > KNIFE_MIN_ANGLE_SNAPPING_INCREMENT &&
+      kcd->angle_snapping_increment < KNIFE_MAX_ANGLE_SNAPPING_INCREMENT) {
+    snap_step = DEG2RADF(kcd->angle_snapping_increment);
+  }
+  else {
+    snap_step = DEG2RADF(KNIFE_DEFAULT_ANGLE_SNAPPING_INCREMENT);
+  }
 
   sub_v2_v2v2(dvec, kcd->curr.mval, kcd->prev.mval);
   if (is_zero_v2(dvec)) {
@@ -2534,6 +2556,16 @@ static bool knife_snap_angle(KnifeTool_OpData *kcd)
   return true;
 }
 
+/* Reset the snapping angle num input */
+static void knife_reset_snap_angle_input(KnifeTool_OpData *kcd)
+{
+  kcd->num.val[0] = 0;
+  while (kcd->num.str_cur > 0) {
+    kcd->num.str[kcd->num.str_cur - 1] = '\0';
+    kcd->num.str_cur--;
+  }
+}
+
 /**
  * \return true when `kcd->curr.co` & `kcd->curr.cage` are set.
  *
@@ -2637,6 +2669,7 @@ static void knifetool_init(bContext *C,
                            KnifeTool_OpData *kcd,
                            const bool only_select,
                            const bool cut_through,
+                           const float angle_snapping_increment,
                            const bool is_interactive)
 {
   Scene *scene = CTX_data_scene(C);
@@ -2657,6 +2690,7 @@ static void knifetool_init(bContext *C,
   kcd->is_interactive = is_interactive;
   kcd->cut_through = cut_through;
   kcd->only_select = only_select;
+  kcd->angle_snapping_increment = angle_snapping_increment;
 
   knifetool_init_bmbvh(kcd);
 
@@ -2885,6 +2919,15 @@ static int knifetool_modal(bContext *C, wmOperator *op, const wmEvent *event)
     kcd->mode = kcd->prevmode;
   }
 
+  bool handled = false;
+  if (kcd->angle_snapping) {
+    if (event->val == KM_PRESS && hasNumInput(&kcd->num) && handleNumInput(C, &kcd->num, event)) {
+      applyNumInput(&kcd->num, &kcd->angle_snapping_increment);
+      knife_update_header(C, op, kcd);
+      handled = true;
+    }
+  }
+
   /* handle modal keymap */
   if (event->type == EVT_MODAL_MAP) {
     switch (event->val) {
@@ -2913,6 +2956,7 @@ static int knifetool_modal(bContext *C, wmOperator *op, const wmEvent *event)
         knife_update_header(C, op, kcd);
         ED_region_tag_redraw(kcd->region);
         do_refresh = true;
+        handled = true;
         break;
       case KNF_MODAL_MIDPOINT_OFF:
         kcd->snap_midpoints = false;
@@ -2922,33 +2966,42 @@ static int knifetool_modal(bContext *C, wmOperator *op, const wmEvent *event)
         knife_update_header(C, op, kcd);
         ED_region_tag_redraw(kcd->region);
         do_refresh = true;
+        handled = true;
         break;
       case KNF_MODAL_IGNORE_SNAP_ON:
         ED_region_tag_redraw(kcd->region);
         kcd->ignore_vert_snapping = kcd->ignore_edge_snapping = true;
         knife_update_header(C, op, kcd);
         do_refresh = true;
+        handled = true;
         break;
       case KNF_MODAL_IGNORE_SNAP_OFF:
         ED_region_tag_redraw(kcd->region);
         kcd->ignore_vert_snapping = kcd->ignore_edge_snapping = false;
         knife_update_header(C, op, kcd);
         do_refresh = true;
+        handled = true;
         break;
       case KNF_MODAL_ANGLE_SNAP_TOGGLE:
         kcd->angle_snapping = !kcd->angle_snapping;
+        kcd->angle_snapping_increment = RAD2DEGF(
+            RNA_float_get(op->ptr, "angle_snapping_increment"));
+        knife_reset_snap_angle_input(kcd);
         knife_update_header(C, op, kcd);
         do_refresh = true;
+        handled = true;
         break;
       case KNF_MODAL_CUT_THROUGH_TOGGLE:
         kcd->cut_through = !kcd->cut_through;
         knife_update_header(C, op, kcd);
         do_refresh = true;
+        handled = true;
         break;
       case KNF_MODAL_NEW_CUT:
         ED_regio

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list