Commit: 68683f2d4a4714f0c517e68a74c3bc9c02482dfd
Author: Antonio Vazquez
Date:   Fri Mar 2 23:19:40 2018 +0100
Branches: greasepencil-object
https://developer.blender.org/rB68683f2d4a4714f0c517e68a74c3bc9c02482dfd

Add new Eraser modes to UI panel

Now there are 3 types of Eraser in UI panel:

Soft: Need several passes to clean stroke.
Hard: One pass, clean points.
Stroke: Clean all stroke when touch any point.

This modes were available before using modifier keys, but it was not easy to 
discover.

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

M       release/scripts/startup/bl_ui/space_view3d_toolbar.py
M       source/blender/editors/gpencil/gpencil_paint.c
M       source/blender/makesdna/DNA_gpencil_types.h
M       source/blender/makesrna/intern/rna_scene.c

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

diff --git a/release/scripts/startup/bl_ui/space_view3d_toolbar.py 
b/release/scripts/startup/bl_ui/space_view3d_toolbar.py
index 775d2a7ccb1..54bb5261f55 100644
--- a/release/scripts/startup/bl_ui/space_view3d_toolbar.py
+++ b/release/scripts/startup/bl_ui/space_view3d_toolbar.py
@@ -2124,8 +2124,9 @@ class VIEW3D_PT_tools_grease_pencil_brush(Panel):
             if brush.type == 'ERASE':
                 col = layout.column(align=True)
                 col.prop(brush, "line_width", text="Radius")
-                # col.prop(context.user_preferences.edit, 
"grease_pencil_eraser_radius", text="Radius")
-                # TODO: Hard/Soft mode, sensitivity factors, etc.
+                col.separator()
+                row = col.row()
+                row.prop(brush, "eraser_mode", expand=True)
 
             if brush.type != 'ERASE':
                 layout.separator()
diff --git a/source/blender/editors/gpencil/gpencil_paint.c 
b/source/blender/editors/gpencil/gpencil_paint.c
index d1232fce3a3..91a9d362e5e 100644
--- a/source/blender/editors/gpencil/gpencil_paint.c
+++ b/source/blender/editors/gpencil/gpencil_paint.c
@@ -1171,6 +1171,7 @@ static void gp_stroke_eraser_dostroke(tGPsdata *p,
                                       const int radius, const rcti *rect)
 {
        Object *obact = (Object *)p->ownerPtr.data;
+       bGPDbrush *brush = p->brush;
        bGPDspoint *pt1, *pt2;
        int pc1[2] = {0};
        int pc2[2] = {0};
@@ -1200,7 +1201,7 @@ static void gp_stroke_eraser_dostroke(tGPsdata *p,
                        }
                }
        }
-       else if (p->flags & GP_PAINTFLAG_STROKE_ERASER) {
+       else if ((p->flags & GP_PAINTFLAG_STROKE_ERASER) || (brush->eraser_mode 
== GP_BRUSH_ERASER_STROKE)) {
                for (i = 0; (i + 1) < gps->totpoints; i++) {
 
                        /* only process if it hasn't been masked out... */
@@ -1290,11 +1291,11 @@ static void gp_stroke_eraser_dostroke(tGPsdata *p,
                                                pt2->pressure -= 
gp_stroke_eraser_calc_influence(p, mval, radius, pc2) * strength / 2.0f;
                                                
                                                /* 2) Tag any point with overly 
low influence for removal in the next pass */
-                                               if ((pt1->pressure < 
cull_thresh) || (p->flags & GP_PAINTFLAG_HARD_ERASER)) {
+                                               if ((pt1->pressure < 
cull_thresh) || (p->flags & GP_PAINTFLAG_HARD_ERASER) || (brush->eraser_mode == 
GP_BRUSH_ERASER_HARD)) {
                                                        pt1->flag |= 
GP_SPOINT_TAG;
                                                        do_cull = true;
                                                }
-                                               if ((pt2->pressure < 
cull_thresh) || (p->flags & GP_PAINTFLAG_HARD_ERASER)) {
+                                               if ((pt2->pressure < 
cull_thresh) || (p->flags & GP_PAINTFLAG_HARD_ERASER) || (brush->eraser_mode == 
GP_BRUSH_ERASER_HARD)) {
                                                        pt2->flag |= 
GP_SPOINT_TAG;
                                                        do_cull = true;
                                                }
diff --git a/source/blender/makesdna/DNA_gpencil_types.h 
b/source/blender/makesdna/DNA_gpencil_types.h
index ed6ff4be7c7..702f6051d3e 100644
--- a/source/blender/makesdna/DNA_gpencil_types.h
+++ b/source/blender/makesdna/DNA_gpencil_types.h
@@ -140,6 +140,8 @@ typedef struct bGPDbrush {
        float uv_random;          /* random factor for UV rotation */
        int   input_samples;      /* maximum distance before generate new point 
for very fast mouse movements */
        int   type;               /* type of brush (draw, fill, erase, etc..) */
+       int   eraser_mode;        /* soft, hard or stroke */
+       char  pad[4];
 } bGPDbrush;
 
 /* bGPDbrush->flag */
@@ -546,6 +548,13 @@ typedef enum eGP_BrushType {
        GP_BRUSH_TYPE_ERASE = 2,
 } eGP_BrushType;
 
+/* bGPDbrush->eraser_mode */
+typedef enum eGP_BrushEraserMode {
+       GP_BRUSH_ERASER_SOFT = 0,
+       GP_BRUSH_ERASER_HARD = 1,
+       GP_BRUSH_ERASER_STROKE = 2,
+} eGP_BrushEraserMode;
+
 /* xray modes (Depth Ordering) */
 typedef enum eGP_DepthOrdering {
        GP_XRAY_FRONT = 0,
diff --git a/source/blender/makesrna/intern/rna_scene.c 
b/source/blender/makesrna/intern/rna_scene.c
index 40bebaaac30..bc42f237088 100644
--- a/source/blender/makesrna/intern/rna_scene.c
+++ b/source/blender/makesrna/intern/rna_scene.c
@@ -451,6 +451,12 @@ static EnumPropertyItem 
rna_enum_gpencil_fill_draw_modes_items[] = {
        { GP_FILL_DMODE_BOTH, "BOTH", 0, "Both", "Use visible strokes and 
control lines as fill boundary limits" },
        { 0, NULL, 0, NULL, NULL }
 };
+static EnumPropertyItem rna_enum_gpencil_brush_eraser_modes_items[] = {
+       { GP_BRUSH_ERASER_SOFT, "SOFT", 0, "Soft", "Use soft eraser" },
+       { GP_BRUSH_ERASER_HARD, "HARD", 0, "Hard", "Use hard eraser" },
+       { GP_BRUSH_ERASER_STROKE, "STROKE", 0, "Stroke", "Use stroke eraser" },
+       { 0, NULL, 0, NULL, NULL }
+};
 static EnumPropertyItem rna_enum_gpencil_brush_types_items[] = {
        { GP_BRUSH_TYPE_DRAW, "DRAW", 0, "Draw", "The brush is of type used for 
drawing strokes" },
        { GP_BRUSH_TYPE_FILL, "FILL", 0, "Fill", "The brush is of type used for 
filling areas" },
@@ -2458,13 +2464,16 @@ static void rna_def_gpencil_brush(BlenderRNA *brna)
        RNA_def_property_enum_sdna(prop, NULL, "fill_draw_mode");
        RNA_def_property_enum_items(prop, 
rna_enum_gpencil_fill_draw_modes_items);
        RNA_def_property_ui_text(prop, "Mode", "Mode to draw boundary limits");
-       RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, 
"rna_GPencil_update");
 
        prop = RNA_def_property(srna, "type", PROP_ENUM, PROP_NONE);
        RNA_def_property_enum_sdna(prop, NULL, "type");
        RNA_def_property_enum_items(prop, rna_enum_gpencil_brush_types_items);
        RNA_def_property_ui_text(prop, "Type", "Category of the brush");
-       RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, 
"rna_GPencil_update");
+
+       prop = RNA_def_property(srna, "eraser_mode", PROP_ENUM, PROP_NONE);
+       RNA_def_property_enum_sdna(prop, NULL, "eraser_mode");
+       RNA_def_property_enum_items(prop, 
rna_enum_gpencil_brush_eraser_modes_items);
+       RNA_def_property_ui_text(prop, "Mode", "Eraser Mode");
 
        prop = RNA_def_property(srna, "fill_show_boundary", PROP_BOOLEAN, 
PROP_NONE);
        RNA_def_property_boolean_sdna(prop, NULL, "flag", 
GP_BRUSH_FILL_SHOW_HELPLINES);

_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to