[Bf-blender-cvs] [526e2291ff9] greasepencil-object: WIP: New parameters for brushes

Antonio Vazquez noreply at git.blender.org
Thu Nov 9 16:41:29 CET 2017


Commit: 526e2291ff93f3f4c18c341ec6518e52fb4c9b17
Author: Antonio Vazquez
Date:   Thu Nov 9 16:41:10 2017 +0100
Branches: greasepencil-object
https://developer.blender.org/rB526e2291ff93f3f4c18c341ec6518e52fb4c9b17

WIP: New parameters for brushes

More parameters to define how the stroke is stabilized.

This parameters maybe are not necessary on UI, but we need them now for testing different values.

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

M	release/scripts/startup/bl_ui/properties_grease_pencil_common.py
M	source/blender/blenkernel/intern/gpencil.c
M	source/blender/editors/gpencil/gpencil_data.c
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/properties_grease_pencil_common.py b/release/scripts/startup/bl_ui/properties_grease_pencil_common.py
index 46b3cf60405..b9c4cbe26d1 100644
--- a/release/scripts/startup/bl_ui/properties_grease_pencil_common.py
+++ b/release/scripts/startup/bl_ui/properties_grease_pencil_common.py
@@ -418,6 +418,9 @@ class GreasePencilBrushOptionsPanel:
             col.prop(brush, "pen_smooth_factor")
             col.prop(brush, "pen_smooth_steps")
             col.prop(brush, "pen_stabilize_factor")
+            row = col.row(align=True)
+            row.prop(brush, "pen_density")
+            row.prop(brush, "pen_noise_factor")
             col.separator()
             row = col.row(align=False)
             row.prop(brush, "pen_subdivision_steps")
diff --git a/source/blender/blenkernel/intern/gpencil.c b/source/blender/blenkernel/intern/gpencil.c
index f4ade77db5f..d8a0c4c8025 100644
--- a/source/blender/blenkernel/intern/gpencil.c
+++ b/source/blender/blenkernel/intern/gpencil.c
@@ -538,6 +538,10 @@ void BKE_gpencil_brush_init_presets(ToolSettings *ts)
 	brush->draw_random_sub = 0.0f;
 	copy_v3_v3(brush->curcolor, curcolor);
 
+	brush->draw_stabifac = 1.0f;
+	brush->draw_pxdensity = GP_MIN_STROKE_SEGMENT_PX;
+	brush->draw_stabangle = GP_MIN_STROKE_SEGMENT_ANGLE;
+
 	/* Pencil brush */
 	brush = BKE_gpencil_brush_addnew(ts, "Pencil", true);
 	brush->thickness = 15.0f;
@@ -564,6 +568,10 @@ void BKE_gpencil_brush_init_presets(ToolSettings *ts)
 	brush->draw_random_sub = 0.0f;
 	copy_v3_v3(brush->curcolor, curcolor);
 
+	brush->draw_stabifac = 1.0f;
+	brush->draw_pxdensity = GP_MIN_STROKE_SEGMENT_PX;
+	brush->draw_stabangle = GP_MIN_STROKE_SEGMENT_ANGLE;
+
 	/* Ink brush */
 	brush = BKE_gpencil_brush_addnew(ts, "Ink", false);
 	brush->thickness = 7.0f;
@@ -590,6 +598,10 @@ void BKE_gpencil_brush_init_presets(ToolSettings *ts)
 	brush->draw_random_sub = 0.0f;
 	copy_v3_v3(brush->curcolor, curcolor);
 
+	brush->draw_stabifac = 1.0f;
+	brush->draw_pxdensity = GP_MIN_STROKE_SEGMENT_PX;
+	brush->draw_stabangle = GP_MIN_STROKE_SEGMENT_ANGLE;
+
 	/* Ink Noise brush */
 	brush = BKE_gpencil_brush_addnew(ts, "Ink noise", false);
 	brush->thickness = 6.0f;
@@ -616,6 +628,10 @@ void BKE_gpencil_brush_init_presets(ToolSettings *ts)
 	brush->draw_random_sub = 0.0f;
 	copy_v3_v3(brush->curcolor, curcolor);
 
+	brush->draw_stabifac = 1.0f;
+	brush->draw_pxdensity = GP_MIN_STROKE_SEGMENT_PX;
+	brush->draw_stabangle = GP_MIN_STROKE_SEGMENT_ANGLE;
+
 	/* Marker brush */
 	brush = BKE_gpencil_brush_addnew(ts, "Marker", false);
 	brush->thickness = 10.0f;
@@ -642,6 +658,10 @@ void BKE_gpencil_brush_init_presets(ToolSettings *ts)
 	brush->draw_random_sub = 0.0f;
 	copy_v3_v3(brush->curcolor, curcolor);
 
+	brush->draw_stabifac = 1.0f;
+	brush->draw_pxdensity = GP_MIN_STROKE_SEGMENT_PX;
+	brush->draw_stabangle = GP_MIN_STROKE_SEGMENT_ANGLE;
+
 	/* Crayon brush */
 	brush = BKE_gpencil_brush_addnew(ts, "Crayon", false);
 	brush->thickness = 10.0f;
@@ -667,6 +687,10 @@ void BKE_gpencil_brush_init_presets(ToolSettings *ts)
 	brush->sublevel = 2;
 	brush->draw_random_sub = 0.5f;
 	copy_v3_v3(brush->curcolor, curcolor);
+
+	brush->draw_stabifac = 1.0f;
+	brush->draw_pxdensity = GP_MIN_STROKE_SEGMENT_PX;
+	brush->draw_stabangle = GP_MIN_STROKE_SEGMENT_ANGLE;
 }
 
 /* add a new gp-brush and make it the active */
@@ -695,6 +719,10 @@ bGPDbrush *BKE_gpencil_brush_addnew(ToolSettings *ts, const char *name, bool set
 	brush->draw_jitter = 0.0f;
 	brush->flag |= GP_BRUSH_USE_JITTER_PRESSURE;
 
+	brush->draw_stabifac = 1.0f;
+	brush->draw_pxdensity = GP_MIN_STROKE_SEGMENT_PX;
+	brush->draw_stabangle = GP_MIN_STROKE_SEGMENT_ANGLE;
+
 	/* curves */
 	brush->cur_sensitivity = curvemapping_add(1, 0.0f, 0.0f, 1.0f, 1.0f);
 	brush->cur_strength = curvemapping_add(1, 0.0f, 0.0f, 1.0f, 1.0f);
diff --git a/source/blender/editors/gpencil/gpencil_data.c b/source/blender/editors/gpencil/gpencil_data.c
index 13f4256da6d..bd83826ce43 100644
--- a/source/blender/editors/gpencil/gpencil_data.c
+++ b/source/blender/editors/gpencil/gpencil_data.c
@@ -1467,6 +1467,10 @@ static int gp_brush_copy_exec(bContext *C, wmOperator *op)
 	newbrush->draw_random_press = brush->draw_random_press;
 	newbrush->draw_random_sub = brush->draw_random_sub;
 
+	newbrush->draw_stabifac = brush->draw_stabifac;
+	newbrush->draw_pxdensity = brush->draw_pxdensity;
+	newbrush->draw_stabangle = brush->draw_stabangle;
+
 	/* free automatic curves created by default (replaced by copy) */
 	curvemapping_free(newbrush->cur_sensitivity);
 	curvemapping_free(newbrush->cur_strength);
diff --git a/source/blender/editors/gpencil/gpencil_paint.c b/source/blender/editors/gpencil/gpencil_paint.c
index 7d3fd57d133..bc6263d5691 100644
--- a/source/blender/editors/gpencil/gpencil_paint.c
+++ b/source/blender/editors/gpencil/gpencil_paint.c
@@ -191,10 +191,6 @@ typedef struct tGPsdata {
 /* minimum length of new segment before new point can be added */
 #define MIN_EUCLIDEAN_PX    (U.gp_euclideandist)
 
-/* TODO: Make user prefs parameters? (antoniov) */
-#define MIN_STROKE_SEGMENT_SQUARE 60.0f
-#define MIN_STROKE_SEGMENT_ANGLE 0.9995f
-
 static bool gp_stroke_added_check(tGPsdata *p)
 {
 	return (p->gpf && p->gpf->strokes.last && p->flags & GP_PAINTFLAG_STROKEADDED);
@@ -494,13 +490,19 @@ static void copy_v2float_v2int(float r[2], const int a[2])
 * \param gpd              Current gp datablock
 * \param inf              Amount of smoothing to apply
 */
-static bool gp_smooth_buffer_point(bGPdata *gpd, float inf)
+static bool gp_smooth_buffer_point(bGPdata *gpd, bGPDbrush *brush)
 {
 
 	tGPspoint *pt, *pta, *ptb;
 	float fpt[2], fpta[2], fptb[2], vab[2], vac[2];
 	float estimated_co[2] = { 0.0f };
 	float sco[3] = { 0.0f };
+	float inf = brush->draw_stabifac;
+	const float draw_stabangle = 1.0f - brush->draw_stabangle;
+	/* if no stabilization, return */
+	if (brush->draw_stabifac == 0) {
+		return false;
+	}
 
 	/* the influence never can be 1. We keep the range between 0 and 1 on the UI for 
 	 * consistency, but internally never can be 1 because then the estimated position 
@@ -533,7 +535,7 @@ static bool gp_smooth_buffer_point(bGPdata *gpd, float inf)
 	float sqsize_ac = len_squared_v2v2(fpta, fpt);
 	float lambda = closest_to_line_v2(estimated_co, fpt, fpta, fptb);
 	/* need a minimum space between points to apply */
-	if ((lambda > 0.0f) && (sqsize_ac > MIN_STROKE_SEGMENT_SQUARE)) {
+	if ((lambda > 0.0f) && (sqsize_ac > brush->draw_pxdensity)) {
 		/* blend between original and optimal smoothed coordinate */
 		interp_v2_v2v2(fpt, fpt, estimated_co, inf);
 		copy_v2int_v2float(&pt->x, fpt);
@@ -561,7 +563,7 @@ static bool gp_smooth_buffer_point(bGPdata *gpd, float inf)
 	/* as the vectors are normalized, we can use dot product to calculate cosine */
 	float angle = dot_v2v2(vab, vac);
 	/* if the angle is minimun, means the point can be removed, so rollback one point */
-	if ((angle > MIN_STROKE_SEGMENT_ANGLE) && (sqsize_ab < MIN_STROKE_SEGMENT_SQUARE * 3.0f)) {
+	if ((angle > draw_stabangle) && (sqsize_ab < brush->draw_pxdensity * 3.0f)) {
 		ptb->x = pt->x;
 		ptb->y = pt->y;
 		ptb->pressure = pt->pressure;
@@ -694,7 +696,7 @@ static short gp_stroke_addpoint(
 		gpd->sbuffer_size++;
 
 		/* apply dynamic smooth to point */
-		gp_smooth_buffer_point(gpd, brush->draw_stabifac);
+		gp_smooth_buffer_point(gpd, brush);
 
 		/* check if another operation can still occur */
 		if (gpd->sbuffer_size == GP_STROKE_BUFFER_MAX)
diff --git a/source/blender/makesdna/DNA_gpencil_types.h b/source/blender/makesdna/DNA_gpencil_types.h
index c19d6e366f3..0234e50ab95 100644
--- a/source/blender/makesdna/DNA_gpencil_types.h
+++ b/source/blender/makesdna/DNA_gpencil_types.h
@@ -42,6 +42,9 @@ struct GHash;
 #define GP_OBGPENCIL_DEFAULT_SIZE  0.2f 
 #define GP_DEFAULT_PIX_FACTOR 500 
 
+#define GP_MIN_STROKE_SEGMENT_PX 60.0f 
+#define GP_MIN_STROKE_SEGMENT_ANGLE 0.005f 
+
 /* ***************************************** */
 /* GP Point Weights */
 
@@ -121,6 +124,8 @@ typedef struct bGPDbrush {
 
 	float curcolor[3];
 	float draw_stabifac;      /* amount of stabilization while drawing */
+	int   draw_pxdensity;     /* maximum number of pixel between control points while drawing */
+	float draw_stabangle;     /* factor to determine if the point is noise or not */
 } bGPDbrush;
 
 /* bGPDbrush->flag */
diff --git a/source/blender/makesrna/intern/rna_scene.c b/source/blender/makesrna/intern/rna_scene.c
index 2e510091725..59cfa2118f2 100644
--- a/source/blender/makesrna/intern/rna_scene.c
+++ b/source/blender/makesrna/intern/rna_scene.c
@@ -2331,6 +2331,24 @@ static void rna_def_gpencil_brush(BlenderRNA *brna)
 		"Amount of smoothing while drawing to reduce jitter/noise");
 	RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, NULL);
 
+	/* maximum distance between control points  for new strokes while drawing */
+	prop = RNA_def_property(srna, "pen_density", PROP_INT, PROP_PIXEL);
+	RNA_def_property_int_sdna(prop, NULL, "draw_pxdensity");
+	RNA_def_property_range(prop, 1, 2000);
+	RNA_def_property_int_default(prop, GP_MIN_STROKE_SEGMENT_PX);
+	RNA_def_property_ui_text(prop, "Density",
+		"Maximum space in pixels between control points while drawing");
+	RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, NULL);
+
+	/* Noise factor for new strokes while drawing */
+	prop = RNA_def_property(srna, "pen_noise_factor", PROP_FLOAT, PROP_NONE);
+	RNA_def_property_float_sdna(prop, NULL, "draw_stabangle");
+	RNA_def_property_range(prop, 0.0, 1.0f);
+	RNA_def_property_float_default(prop, GP_MIN_STROKE_SEGMENT_ANGLE);
+	RNA_def_property_ui_text(prop, "Noise",
+		"Factor to determine below what noise the point must not be used to define stroke shape");
+	RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, NULL);
+
 	/* Subdivision level for new strokes */
 	prop = RNA_def_property(srna, "pen_subdivision_steps", PROP_INT, PROP_NONE);
 	RNA_def_property_int_sdna(prop, NULL, "sublevel");



More information about the Bf-blender-cvs mailing list