[Bf-blender-cvs] [84a9e2836ca] greasepencil-object: GPencil: Primitive: Polyline tool

Charlie Jolly noreply at git.blender.org
Fri Oct 18 11:49:24 CEST 2019


Commit: 84a9e2836ca08fae846f2cc27b62857f79ea834d
Author: Charlie Jolly
Date:   Thu Oct 17 16:57:35 2019 +0100
Branches: greasepencil-object
https://developer.blender.org/rB84a9e2836ca08fae846f2cc27b62857f79ea834d

GPencil: Primitive: Polyline tool

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

M	release/scripts/presets/keyconfig/keymap_data/blender_default.py
M	release/scripts/startup/bl_ui/properties_paint_common.py
M	release/scripts/startup/bl_ui/space_toolsystem_toolbar.py
M	release/scripts/startup/bl_ui/space_view3d.py
M	source/blender/editors/datafiles/CMakeLists.txt
M	source/blender/editors/gpencil/gpencil_intern.h
M	source/blender/editors/gpencil/gpencil_primitive.c

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

diff --git a/release/scripts/presets/keyconfig/keymap_data/blender_default.py b/release/scripts/presets/keyconfig/keymap_data/blender_default.py
index d5f20fe18f9..4d8ccae88e3 100644
--- a/release/scripts/presets/keyconfig/keymap_data/blender_default.py
+++ b/release/scripts/presets/keyconfig/keymap_data/blender_default.py
@@ -5793,6 +5793,21 @@ def km_3d_view_tool_paint_gpencil_line(params):
         ]},
     )
 
+def km_3d_view_tool_paint_gpencil_polyline(params):
+    return (
+        "3D View Tool: Paint Gpencil, Polyline",
+        {"space_type": 'VIEW_3D', "region_type": 'WINDOW'},
+        {"items": [
+            ("gpencil.primitive", {"type": params.tool_tweak, "value": 'ANY'},
+             {"properties": [("type", 'POLYLINE'), ("wait_for_input", False)]}),
+            ("gpencil.primitive", {"type": 'LEFTMOUSE', "value": 'PRESS', "shift": True},
+             {"properties": [("type", 'POLYLINE'), ("wait_for_input", False)]}),
+            ("gpencil.primitive", {"type": 'LEFTMOUSE', "value": 'PRESS', "alt": True},
+             {"properties": [("type", 'POLYLINE'), ("wait_for_input", False)]}),
+            # Lasso select
+            ("gpencil.select_lasso", {"type": params.action_tweak, "value": 'ANY', "ctrl": True, "alt": True}, None),
+        ]},
+    )
 
 def km_3d_view_tool_paint_gpencil_box(params):
     return (
@@ -6225,6 +6240,7 @@ def generate_keymaps(params=None):
         km_3d_view_tool_paint_weight_sample_vertex_group(params),
         km_3d_view_tool_paint_weight_gradient(params),
         km_3d_view_tool_paint_gpencil_line(params),
+        km_3d_view_tool_paint_gpencil_polyline(params),
         km_3d_view_tool_paint_gpencil_box(params),
         km_3d_view_tool_paint_gpencil_circle(params),
         km_3d_view_tool_paint_gpencil_arc(params),
diff --git a/release/scripts/startup/bl_ui/properties_paint_common.py b/release/scripts/startup/bl_ui/properties_paint_common.py
index 83f7cb710ff..dc0ad1dcac3 100644
--- a/release/scripts/startup/bl_ui/properties_paint_common.py
+++ b/release/scripts/startup/bl_ui/properties_paint_common.py
@@ -420,7 +420,7 @@ def brush_basic_gpencil_paint_settings(layout, _context, brush, tool, *, compact
         row.prop(gp_settings, "pen_strength", slider=True)
         row.prop(gp_settings, "use_strength_pressure", text="", icon='STYLUS_PRESSURE')
 
-    if tool.idname in {"builtin.arc", "builtin.curve", "builtin.line", "builtin.box", "builtin.circle"}:
+    if tool.idname in {"builtin.arc", "builtin.curve", "builtin.line", "builtin.box", "builtin.circle", "builtin.polyline"}:
         settings = _context.tool_settings.gpencil_sculpt
         if is_toolbar:
             row = layout.row(align=True)
diff --git a/release/scripts/startup/bl_ui/space_toolsystem_toolbar.py b/release/scripts/startup/bl_ui/space_toolsystem_toolbar.py
index 6dea258014c..65dc3235e38 100644
--- a/release/scripts/startup/bl_ui/space_toolsystem_toolbar.py
+++ b/release/scripts/startup/bl_ui/space_toolsystem_toolbar.py
@@ -1348,6 +1348,17 @@ class _defs_gpencil_paint:
             keymap=(),
         )
 
+    @ToolDef.from_fn
+    def polyline():
+        return dict(
+            idname="builtin.polyline",
+            label="Polyline",
+            icon="ops.gpencil.primitive_polyline",
+            cursor='CROSSHAIR',
+            widget=None,
+            keymap=(),
+        )        
+
     @ToolDef.from_fn
     def box():
         return dict(
@@ -1390,7 +1401,7 @@ class _defs_gpencil_paint:
             cursor='CROSSHAIR',
             widget=None,
             keymap=(),
-        )
+        )    
 
     @ToolDef.from_fn
     def eyedropper():
@@ -2075,6 +2086,7 @@ class VIEW3D_PT_tools_active(ToolSelectPanelHelper, Panel):
             _defs_gpencil_paint.eyedropper,
             None,
             _defs_gpencil_paint.line,
+            _defs_gpencil_paint.polyline,
             _defs_gpencil_paint.arc,
             _defs_gpencil_paint.curve,
             _defs_gpencil_paint.box,
diff --git a/release/scripts/startup/bl_ui/space_view3d.py b/release/scripts/startup/bl_ui/space_view3d.py
index 28e0afd13e0..e0fc30efb3b 100644
--- a/release/scripts/startup/bl_ui/space_view3d.py
+++ b/release/scripts/startup/bl_ui/space_view3d.py
@@ -298,7 +298,7 @@ class _draw_tool_settings_context_mode:
 
         # is_paint = True
         # FIXME: tools must use their own UI drawing!
-        if tool.idname in {"builtin.line", "builtin.box", "builtin.circle", "builtin.arc", "builtin.curve"}:
+        if tool.idname in {"builtin.line", "builtin.box", "builtin.circle", "builtin.arc", "builtin.curve","builtin.polyline"}:
             # is_paint = False
             pass
         elif tool.idname == "Cutter":
diff --git a/source/blender/editors/datafiles/CMakeLists.txt b/source/blender/editors/datafiles/CMakeLists.txt
index 8a3a078bdd2..2027ae6490a 100644
--- a/source/blender/editors/datafiles/CMakeLists.txt
+++ b/source/blender/editors/datafiles/CMakeLists.txt
@@ -693,6 +693,7 @@ set_property(GLOBAL PROPERTY ICON_GEOM_NAMES
   ops.gpencil.primitive_circle
   ops.gpencil.primitive_curve
   ops.gpencil.primitive_line
+  ops.gpencil.primitive_polyline
   ops.gpencil.radius
   ops.gpencil.sculpt_clone
   ops.gpencil.sculpt_grab
diff --git a/source/blender/editors/gpencil/gpencil_intern.h b/source/blender/editors/gpencil/gpencil_intern.h
index bd79bdfe681..4122141eca3 100644
--- a/source/blender/editors/gpencil/gpencil_intern.h
+++ b/source/blender/editors/gpencil/gpencil_intern.h
@@ -465,6 +465,7 @@ enum {
   GP_STROKE_CIRCLE = 2,
   GP_STROKE_ARC = 3,
   GP_STROKE_CURVE = 4,
+  GP_STROKE_POLYLINE = 5,
 };
 
 enum {
diff --git a/source/blender/editors/gpencil/gpencil_primitive.c b/source/blender/editors/gpencil/gpencil_primitive.c
index f8423d09811..795cf8ba15d 100644
--- a/source/blender/editors/gpencil/gpencil_primitive.c
+++ b/source/blender/editors/gpencil/gpencil_primitive.c
@@ -90,6 +90,7 @@
 #define IN_MOVE 3
 #define IN_BRUSH_SIZE 4
 #define IN_BRUSH_STRENGTH 5
+#define IN_POLYLINE 6
 
 #define SELECT_NONE 0
 #define SELECT_START 1
@@ -184,6 +185,29 @@ static void gpencil_primitive_to_square(tGPDprimitive *tgpi, const float x, cons
   }
 }
 
+/* Helper to constrain a primitive */
+static void gpencil_primitive_constrain(tGPDprimitive *tgpi, bool line_mode)
+{
+  float x = tgpi->end[0] - tgpi->origin[0];
+  float y = tgpi->end[1] - tgpi->origin[1];
+
+  if (line_mode) {
+    float angle = fabsf(atan2f(y, x));
+    if (angle < 0.4f || angle > (M_PI - 0.4f)) {
+      tgpi->end[1] = tgpi->origin[1];
+    }
+    else if (angle > (M_PI_2 - 0.4f) && angle < (M_PI_2 + 0.4f)) {
+      tgpi->end[0] = tgpi->origin[0];
+    }
+    else {
+      gpencil_primitive_to_square(tgpi, x, y);
+    }
+  }
+  else {
+    gpencil_primitive_to_square(tgpi, x, y);
+  }
+ }
+
 /* Helper to rotate point around origin */
 static void gp_rotate_v2_v2v2fl(float v[2],
                                 const float p[2],
@@ -405,6 +429,12 @@ static void gpencil_primitive_status_indicators(bContext *C, tGPDprimitive *tgpi
                      "adjust subdivision number, Shift to align, Alt to center, E: extrude"),
                 UI_MAX_DRAW_STR);
   }
+  else if (tgpi->type == GP_STROKE_POLYLINE) {
+    BLI_strncpy(msg_str,
+                TIP_("Line: ESC to cancel, LMB set origin, Enter/MMB to confirm, WHEEL/+- to "
+                     "adjust subdivision number, Shift to align"),
+                UI_MAX_DRAW_STR);
+  }
   else if (tgpi->type == GP_STROKE_BOX) {
     BLI_strncpy(msg_str,
                 TIP_("Rectangle: ESC to cancel, LMB set origin, Enter/MMB to confirm, WHEEL/+- "
@@ -430,7 +460,7 @@ static void gpencil_primitive_status_indicators(bContext *C, tGPDprimitive *tgpi
                 UI_MAX_DRAW_STR);
   }
 
-  if (ELEM(tgpi->type, GP_STROKE_CIRCLE, GP_STROKE_ARC, GP_STROKE_LINE, GP_STROKE_BOX)) {
+  if (ELEM(tgpi->type, GP_STROKE_CIRCLE, GP_STROKE_ARC, GP_STROKE_LINE, GP_STROKE_BOX, GP_STROKE_POLYLINE)) {
     if (hasNumInput(&tgpi->num)) {
       char str_offs[NUM_STR_REP_LEN];
 
@@ -529,7 +559,7 @@ static void gp_primitive_rectangle(tGPDprimitive *tgpi, tGPspoint *points2D)
 }
 
 /* create a line */
-static void gp_primitive_line(tGPDprimitive *tgpi, tGPspoint *points2D)
+static void gp_primitive_line(tGPDprimitive *tgpi, tGPspoint *points2D, bool control_points)
 {
   const int totpoints = (tgpi->tot_edges + tgpi->tot_stored_edges);
   const float step = 1.0f / (float)(tgpi->tot_edges - 1);
@@ -541,15 +571,17 @@ static void gp_primitive_line(tGPDprimitive *tgpi, tGPspoint *points2D)
     a += step;
   }
 
-  float color[4];
-  UI_GetThemeColor4fv(TH_GIZMO_PRIMARY, color);
-  gp_primitive_set_cp(tgpi, tgpi->end, color, BIG_SIZE_CTL);
-  if (tgpi->tot_stored_edges) {
-    UI_GetThemeColor4fv(TH_REDALERT, color);
-    gp_primitive_set_cp(tgpi, tgpi->start, color, SMALL_SIZE_CTL);
-  }
-  else {
-    gp_primitive_set_cp(tgpi, tgpi->start, color, BIG_SIZE_CTL);
+  if (control_points) {
+    float color[4];
+    UI_GetThemeColor4fv(TH_GIZMO_PRIMARY, color);
+    gp_primitive_set_cp(tgpi, tgpi->end, color, BIG_SIZE_CTL);
+    if (tgpi->tot_stored_edges) {
+      UI_GetThemeColor4fv(TH_REDALERT, color);
+      gp_primitive_set_cp(tgpi, tgpi->start, color, SMALL_SIZE_CTL);
+    }
+    else {
+      gp_primitive_set_cp(tgpi, tgpi->start, color, BIG_SIZE_CTL);
+    }
   }
 }
 
@@ -592,6 +624,7 @@ static void gp_primitive_arc(tGPDprimitive *tgpi, tGPspoint *points2D)
   }
   UI_GetThemeColor4fv(TH_GIZMO_SECONDARY, color);
   gp_primitive_set_cp(tgpi, tgpi->cp1, color, BIG_SIZE_CTL * 0.9f);
+  gp_primitive_set_cp(tgpi, corner, color, BIG_SIZE_CTL * 0.9f);
 }
 
 /* create a bezier */
@@ -694,7 +727,10 @@ static void gp_primitive_update_strokes(bContext *C, tGPDprimitive *tgpi)
         gp_primitive_rectangle(tgpi, points2D);
         break;
       case GP_STROKE_LINE:
-        gp_primitive_line(tgpi, points2D);
+        gp_primitive_line(tgpi, points2D, true);
+        break;
+      case GP_STROKE_POLYLINE:
+        gp_primitive_line(tgpi, points2D, false);
         break;
       case GP_STROKE_CIRCLE:
         gp_primitive_circle(tgpi, points2D);
@@ -1041,6 +1077,7 @@ static void gpencil_primitive_update(bContext *C, wmOperator *op, tGPDprimitive


@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list