[Bf-blender-cvs] [668dd146f64] master: Annotations: Add different arrow styles for line tool

Juanfran Matheu noreply at git.blender.org
Wed May 6 15:58:16 CEST 2020


Commit: 668dd146f6475f97339aff3d80d019af4d816ee1
Author: Juanfran Matheu
Date:   Wed May 6 11:38:32 2020 +0200
Branches: master
https://developer.blender.org/rB668dd146f6475f97339aff3d80d019af4d816ee1

Annotations: Add different arrow styles for line tool

This patch adds different kind of shapes/styles for the line extremes while using the annotation line tool.

Current Styles: (following @mendio mockup)
  - Arrow (closed arrow)
  - Open Arrow
  - Segment
  - Square
For future it would be great to have icons, it would be more intuitive (and less space) with previews of what each end / start of line does, like the google slides one as reference:

{F8511116}

Reviewed By: #grease_pencil, antoniov, HooglyBoogly

Differential Revision: https://developer.blender.org/D7608

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

M	release/scripts/startup/bl_ui/space_toolsystem_toolbar.py
M	source/blender/editors/gpencil/annotate_draw.c
M	source/blender/editors/gpencil/annotate_paint.c
M	source/blender/makesdna/DNA_gpencil_types.h

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

diff --git a/release/scripts/startup/bl_ui/space_toolsystem_toolbar.py b/release/scripts/startup/bl_ui/space_toolsystem_toolbar.py
index 8638f1a2a27..b10b451c7f8 100644
--- a/release/scripts/startup/bl_ui/space_toolsystem_toolbar.py
+++ b/release/scripts/startup/bl_ui/space_toolsystem_toolbar.py
@@ -148,6 +148,8 @@ class _defs_annotate:
 
     def draw_settings_common(context, layout, tool):
         gpd = context.annotation_data
+        region_type = context.region.type
+
         if gpd is not None:
             if gpd.layers.active_note is not None:
                 text = gpd.layers.active_note
@@ -160,17 +162,24 @@ class _defs_annotate:
             gpl = context.active_annotation_layer
             if gpl is not None:
                 layout.label(text="Annotation:")
-                sub = layout.row(align=True)
-                sub.ui_units_x = 8
-
-                sub.prop(gpl, "color", text="")
-                sub.popover(
-                    panel="TOPBAR_PT_annotation_layers",
-                    text=text,
-                )
+                if context.space_data.type == 'VIEW_3D':
+                    if region_type == 'TOOL_HEADER':
+                        sub = layout.split(align=True, factor=0.5)
+                        sub.ui_units_x = 6.5
+                        sub.prop(gpl, "color", text="")
+                    else:
+                        sub = layout.row(align=True)
+                        sub.prop(gpl, "color", text="")
+                    sub.popover(
+                        panel="TOPBAR_PT_annotation_layers",
+                        text=text,
+                    )
+                else:
+                    layout.prop(gpl, "color", text="")
 
-        tool_settings = context.tool_settings
         space_type = tool.space_type
+        tool_settings = context.tool_settings
+
         if space_type == 'VIEW_3D':
             layout.separator()
 
@@ -181,6 +190,21 @@ class _defs_annotate:
             elif tool_settings.gpencil_stroke_placement_view3d in {'SURFACE', 'STROKE'}:
                 row.prop(tool_settings, "use_gpencil_stroke_endpoints")
 
+        if tool.idname == "builtin.annotate_line":
+            layout.separator()
+
+            props = tool.operator_properties("gpencil.annotate")
+            if region_type == 'TOOL_HEADER':
+                row = layout.row()
+                row.ui_units_x = 15
+                row.prop(props, "arrowstyle_start", text="Start")
+                row.separator()
+                row.prop(props, "arrowstyle_end", text="End")
+            else:
+                col = layout.row().column(align=True)
+                col.prop(props, "arrowstyle_start", text="Style Start")
+                col.prop(props, "arrowstyle_end", text="End")
+
     @ToolDef.from_fn.with_args(draw_settings=draw_settings_common)
     def scribble(*, draw_settings):
         return dict(
diff --git a/source/blender/editors/gpencil/annotate_draw.c b/source/blender/editors/gpencil/annotate_draw.c
index 86423d907b5..22df7bbbf31 100644
--- a/source/blender/editors/gpencil/annotate_draw.c
+++ b/source/blender/editors/gpencil/annotate_draw.c
@@ -90,14 +90,54 @@ typedef enum eDrawStrokeFlags {
 
 /* ----- Tool Buffer Drawing ------ */
 
+static void annotation_draw_stroke_arrow_buffer(uint pos,
+                                                const float *corner_point,
+                                                const float *arrow_coords,
+                                                const int arrow_style)
+{
+  immBeginAtMost(GPU_PRIM_LINE_STRIP, arrow_style);
+
+  switch (arrow_style) {
+    case GP_STROKE_ARROWSTYLE_SEGMENT:
+      immVertex2f(pos, arrow_coords[0], arrow_coords[1]);
+      immVertex2f(pos, arrow_coords[2], arrow_coords[3]);
+      break;
+    case GP_STROKE_ARROWSTYLE_CLOSED:
+      immVertex2f(pos, arrow_coords[0], arrow_coords[1]);
+      immVertex2f(pos, arrow_coords[2], arrow_coords[3]);
+      immVertex2f(pos, arrow_coords[4], arrow_coords[5]);
+      immVertex2f(pos, arrow_coords[0], arrow_coords[1]);
+      break;
+    case GP_STROKE_ARROWSTYLE_OPEN:
+      immVertex2f(pos, arrow_coords[0], arrow_coords[1]);
+      immVertex2f(pos, corner_point[0], corner_point[1]);
+      immVertex2f(pos, arrow_coords[2], arrow_coords[3]);
+      break;
+    case GP_STROKE_ARROWSTYLE_SQUARE:
+      immVertex2f(pos, corner_point[0], corner_point[1]);
+      immVertex2f(pos, arrow_coords[0], arrow_coords[1]);
+      immVertex2f(pos, arrow_coords[4], arrow_coords[5]);
+      immVertex2f(pos, arrow_coords[6], arrow_coords[7]);
+      immVertex2f(pos, arrow_coords[2], arrow_coords[3]);
+      immVertex2f(pos, corner_point[0], corner_point[1]);
+      break;
+    default:
+      break;
+  }
+  immEnd();
+}
+
 /* draw stroke defined in buffer (simple ogl lines/points for now, as dotted lines) */
-static void annotation_draw_stroke_buffer(const tGPspoint *points,
-                                          int totpoints,
+static void annotation_draw_stroke_buffer(bGPdata *gps,
                                           short thickness,
                                           short dflag,
-                                          short sflag,
                                           const float ink[4])
 {
+  bGPdata_Runtime runtime = gps->runtime;
+  const tGPspoint *points = runtime.sbuffer;
+  int totpoints = runtime.sbuffer_used;
+  short sflag = runtime.sbuffer_sflag;
+
   int draw_points = 0;
 
   /* error checking */
@@ -176,6 +216,26 @@ static void annotation_draw_stroke_buffer(const tGPspoint *points,
   }
 
   immEnd();
+
+  /* Draw arrow stroke. */
+  if (totpoints > 1) {
+    /* Draw ending arrow stroke. */
+    if ((sflag & GP_STROKE_USE_ARROW_END) &&
+        (runtime.arrow_end_style != GP_STROKE_ARROWSTYLE_NONE)) {
+      float end[2];
+      copy_v2_fl2(end, points[1].x, points[1].y);
+      annotation_draw_stroke_arrow_buffer(pos, end, runtime.arrow_end, runtime.arrow_end_style);
+    }
+    /* Draw starting arrow stroke. */
+    if ((sflag & GP_STROKE_USE_ARROW_START) &&
+        (runtime.arrow_start_style != GP_STROKE_ARROWSTYLE_NONE)) {
+      float start[2];
+      copy_v2_fl2(start, points[0].x, points[0].y);
+      annotation_draw_stroke_arrow_buffer(
+          pos, start, runtime.arrow_start, runtime.arrow_start_style);
+    }
+  }
+
   immUnbindProgram();
 }
 
@@ -653,12 +713,7 @@ static void annotation_draw_data_layers(
        * It should also be noted that sbuffer contains temporary point types
        * i.e. tGPspoints NOT bGPDspoints
        */
-      annotation_draw_stroke_buffer(gpd->runtime.sbuffer,
-                                    gpd->runtime.sbuffer_used,
-                                    lthick,
-                                    dflag,
-                                    gpd->runtime.sbuffer_sflag,
-                                    ink);
+      annotation_draw_stroke_buffer(gpd, lthick, dflag, ink);
     }
   }
 }
diff --git a/source/blender/editors/gpencil/annotate_paint.c b/source/blender/editors/gpencil/annotate_paint.c
index 8d50e24b7f0..8bbac80445a 100644
--- a/source/blender/editors/gpencil/annotate_paint.c
+++ b/source/blender/editors/gpencil/annotate_paint.c
@@ -418,6 +418,85 @@ static void gp_smooth_buffer(tGPsdata *p, float inf, int idx)
   copy_v2_v2(&ptc->x, c);
 }
 
+static void gp_stroke_arrow_calc_points_segment(float stroke_points[8],
+                                                const float ref_point[2],
+                                                const float dir_cw[2],
+                                                const float dir_ccw[2],
+                                                const float lenght,
+                                                const float sign)
+{
+  stroke_points[0] = ref_point[0] + dir_cw[0] * lenght * sign;
+  stroke_points[1] = ref_point[1] + dir_cw[1] * lenght * sign;
+  stroke_points[2] = ref_point[0] + dir_ccw[0] * lenght * sign;
+  stroke_points[3] = ref_point[1] + dir_ccw[1] * lenght * sign;
+}
+
+static void gp_stroke_arrow_calc_points(tGPspoint *point,
+                                        const float stroke_dir[2],
+                                        float corner[2],
+                                        float stroke_points[8],
+                                        const int arrow_style)
+{
+  const int arrow_lenght = 8;
+  float norm_dir[2];
+  copy_v2_v2(norm_dir, stroke_dir);
+  normalize_v2(norm_dir);
+  const float inv_norm_dir_clockwise[2] = {norm_dir[1], -norm_dir[0]};
+  const float inv_norm_dir_counterclockwise[2] = {-norm_dir[1], norm_dir[0]};
+
+  switch (arrow_style) {
+    case GP_STROKE_ARROWSTYLE_OPEN:
+      mul_v2_fl(norm_dir, arrow_lenght);
+      stroke_points[0] = corner[0] + inv_norm_dir_clockwise[0] * arrow_lenght + norm_dir[0];
+      stroke_points[1] = corner[1] + inv_norm_dir_clockwise[1] * arrow_lenght + norm_dir[1];
+      stroke_points[2] = corner[0] + inv_norm_dir_counterclockwise[0] * arrow_lenght + norm_dir[0];
+      stroke_points[3] = corner[1] + inv_norm_dir_counterclockwise[1] * arrow_lenght + norm_dir[1];
+      break;
+    case GP_STROKE_ARROWSTYLE_SEGMENT:
+      gp_stroke_arrow_calc_points_segment(stroke_points,
+                                          corner,
+                                          inv_norm_dir_clockwise,
+                                          inv_norm_dir_counterclockwise,
+                                          arrow_lenght,
+                                          1.0f);
+      break;
+    case GP_STROKE_ARROWSTYLE_CLOSED:
+      mul_v2_fl(norm_dir, arrow_lenght);
+      if (point != NULL) {
+        add_v2_v2(&point->x, norm_dir);
+        copy_v2_v2(corner, &point->x);
+      }
+      gp_stroke_arrow_calc_points_segment(stroke_points,
+                                          corner,
+                                          inv_norm_dir_clockwise,
+                                          inv_norm_dir_counterclockwise,
+                                          arrow_lenght,
+                                          -1.0f);
+      stroke_points[4] = corner[0] - norm_dir[0];
+      stroke_points[5] = corner[1] - norm_dir[1];
+      break;
+    case GP_STROKE_ARROWSTYL

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list