[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