[Bf-blender-cvs] [333e32e0e13] greasepencil-object: WIP: Smooth Thickness and Strength
Antonio Vazquez
noreply at git.blender.org
Sat Nov 11 16:15:54 CET 2017
Commit: 333e32e0e13171eb2bb3672fd44c531a81d50e11
Author: Antonio Vazquez
Date: Sat Nov 11 16:13:55 2017 +0100
Branches: greasepencil-object
https://developer.blender.org/rB333e32e0e13171eb2bb3672fd44c531a81d50e11
WIP: Smooth Thickness and Strength
This mooth the thickness of the strokes using points before and after. The same for strength (alpha)
Some cleanup too.
===================================================================
M release/scripts/startup/bl_ui/properties_grease_pencil_common.py
M source/blender/blenkernel/intern/gpencil.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 b9c4cbe26d1..d45c42f0f05 100644
--- a/release/scripts/startup/bl_ui/properties_grease_pencil_common.py
+++ b/release/scripts/startup/bl_ui/properties_grease_pencil_common.py
@@ -421,6 +421,10 @@ class GreasePencilBrushOptionsPanel:
row = col.row(align=True)
row.prop(brush, "pen_density")
row.prop(brush, "pen_noise_factor")
+ row = col.row(align=True)
+ row.prop(brush, "pen_smooth_thickness_factor")
+ row.prop(brush, "pen_smooth_strength_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 d8a0c4c8025..a710bd344eb 100644
--- a/source/blender/blenkernel/intern/gpencil.c
+++ b/source/blender/blenkernel/intern/gpencil.c
@@ -541,6 +541,8 @@ void BKE_gpencil_brush_init_presets(ToolSettings *ts)
brush->draw_stabifac = 1.0f;
brush->draw_pxdensity = GP_MIN_STROKE_SEGMENT_PX;
brush->draw_stabangle = GP_MIN_STROKE_SEGMENT_ANGLE;
+ brush->draw_thicknesfac = GP_DEFAULT_SMOOTH_THICKNESS;
+ brush->draw_strengthfac = GP_DEFAULT_SMOOTH_STRENGTH;
/* Pencil brush */
brush = BKE_gpencil_brush_addnew(ts, "Pencil", true);
@@ -571,6 +573,8 @@ void BKE_gpencil_brush_init_presets(ToolSettings *ts)
brush->draw_stabifac = 1.0f;
brush->draw_pxdensity = GP_MIN_STROKE_SEGMENT_PX;
brush->draw_stabangle = GP_MIN_STROKE_SEGMENT_ANGLE;
+ brush->draw_thicknesfac = GP_DEFAULT_SMOOTH_THICKNESS;
+ brush->draw_strengthfac = GP_DEFAULT_SMOOTH_STRENGTH;
/* Ink brush */
brush = BKE_gpencil_brush_addnew(ts, "Ink", false);
@@ -601,6 +605,8 @@ void BKE_gpencil_brush_init_presets(ToolSettings *ts)
brush->draw_stabifac = 1.0f;
brush->draw_pxdensity = GP_MIN_STROKE_SEGMENT_PX;
brush->draw_stabangle = GP_MIN_STROKE_SEGMENT_ANGLE;
+ brush->draw_thicknesfac = GP_DEFAULT_SMOOTH_THICKNESS;
+ brush->draw_strengthfac = GP_DEFAULT_SMOOTH_STRENGTH;
/* Ink Noise brush */
brush = BKE_gpencil_brush_addnew(ts, "Ink noise", false);
@@ -631,6 +637,8 @@ void BKE_gpencil_brush_init_presets(ToolSettings *ts)
brush->draw_stabifac = 1.0f;
brush->draw_pxdensity = GP_MIN_STROKE_SEGMENT_PX;
brush->draw_stabangle = GP_MIN_STROKE_SEGMENT_ANGLE;
+ brush->draw_thicknesfac = GP_DEFAULT_SMOOTH_THICKNESS;
+ brush->draw_strengthfac = GP_DEFAULT_SMOOTH_STRENGTH;
/* Marker brush */
brush = BKE_gpencil_brush_addnew(ts, "Marker", false);
@@ -661,6 +669,8 @@ void BKE_gpencil_brush_init_presets(ToolSettings *ts)
brush->draw_stabifac = 1.0f;
brush->draw_pxdensity = GP_MIN_STROKE_SEGMENT_PX;
brush->draw_stabangle = GP_MIN_STROKE_SEGMENT_ANGLE;
+ brush->draw_thicknesfac = GP_DEFAULT_SMOOTH_THICKNESS;
+ brush->draw_strengthfac = GP_DEFAULT_SMOOTH_STRENGTH;
/* Crayon brush */
brush = BKE_gpencil_brush_addnew(ts, "Crayon", false);
@@ -691,6 +701,8 @@ void BKE_gpencil_brush_init_presets(ToolSettings *ts)
brush->draw_stabifac = 1.0f;
brush->draw_pxdensity = GP_MIN_STROKE_SEGMENT_PX;
brush->draw_stabangle = GP_MIN_STROKE_SEGMENT_ANGLE;
+ brush->draw_thicknesfac = GP_DEFAULT_SMOOTH_THICKNESS;
+ brush->draw_strengthfac = GP_DEFAULT_SMOOTH_STRENGTH;
}
/* add a new gp-brush and make it the active */
@@ -722,6 +734,8 @@ bGPDbrush *BKE_gpencil_brush_addnew(ToolSettings *ts, const char *name, bool set
brush->draw_stabifac = 1.0f;
brush->draw_pxdensity = GP_MIN_STROKE_SEGMENT_PX;
brush->draw_stabangle = GP_MIN_STROKE_SEGMENT_ANGLE;
+ brush->draw_thicknesfac = GP_DEFAULT_SMOOTH_THICKNESS;
+ brush->draw_strengthfac = GP_DEFAULT_SMOOTH_STRENGTH;
/* curves */
brush->cur_sensitivity = curvemapping_add(1, 0.0f, 0.0f, 1.0f, 1.0f);
diff --git a/source/blender/editors/gpencil/gpencil_paint.c b/source/blender/editors/gpencil/gpencil_paint.c
index 255db410148..e989e01ecac 100644
--- a/source/blender/editors/gpencil/gpencil_paint.c
+++ b/source/blender/editors/gpencil/gpencil_paint.c
@@ -488,13 +488,12 @@ static void copy_v2float_v2int(float r[2], const int a[2])
* reduces the stroke changes when apply the post stroke smooth.
*
* \param gpd Current gp datablock
-* \param inf Amount of smoothing to apply
+* \param brush Current brush
*/
static void gp_smooth_buffer_point(bGPdata *gpd, bGPDbrush *brush)
{
-
- tGPspoint *pt, *pta, *ptb;
- float fpt[2], fpta[2], fptb[2], vab[2], vac[2], vba[2], vbc[2];
+ tGPspoint *ptc, *pta, *ptb;
+ float fptc[2], fpta[2], fptb[2], vab[2], vac[2], vba[2], vbc[2];
float estimated_co[2] = { 0.0f };
float sco[3] = { 0.0f };
float inf = brush->draw_stabifac;
@@ -524,20 +523,20 @@ static void gp_smooth_buffer_point(bGPdata *gpd, bGPDbrush *brush)
ptb = (tGPspoint *)gpd->sbuffer + i - 1;
/* current point */
- pt = (tGPspoint *)gpd->sbuffer + i;
+ ptc = (tGPspoint *)gpd->sbuffer + i;
/* compute estimated position projecting over last two points vector the
* vector to new point.
*/
copy_v2float_v2int(fpta, &pta->x);
copy_v2float_v2int(fptb, &ptb->x);
- copy_v2float_v2int(fpt, &pt->x);
+ copy_v2float_v2int(fptc, &ptc->x);
/* verify the new point is not changing in oposite direction and return to avoid
* that sharp corners can be cleared by smooth process
*/
sub_v2_v2v2(vba, fpta, fptb);
- sub_v2_v2v2(vbc, fpt, fptb);
+ sub_v2_v2v2(vbc, fptc, fptb);
normalize_v2(vba);
normalize_v2(vbc);
float angle_ba_bc = dot_v2v2(vba, vbc);
@@ -545,13 +544,13 @@ static void gp_smooth_buffer_point(bGPdata *gpd, bGPDbrush *brush)
return;
}
- float sqsize_ac = len_squared_v2v2(fpta, fpt);
- float lambda = closest_to_line_v2(estimated_co, fpt, fpta, fptb);
+ float sqsize_ac = len_squared_v2v2(fpta, fptc);
+ float lambda = closest_to_line_v2(estimated_co, fptc, fpta, fptb);
/* need a minimum space between points to apply */
if ((lambda > 0.0f) && (sqsize_ac > draw_pxdensity)) {
/* blend between original and optimal smoothed coordinate */
- interp_v2_v2v2(fpt, fpt, estimated_co, inf);
- copy_v2int_v2float(&pt->x, fpt);
+ interp_v2_v2v2(fptc, fptc, estimated_co, inf);
+ copy_v2int_v2float(&ptc->x, fptc);
}
/* smooth point-1 (previous) using an average of 20%-50%-30% between point-2,
@@ -560,7 +559,7 @@ static void gp_smooth_buffer_point(bGPdata *gpd, bGPDbrush *brush)
*/
madd_v2_v2fl(sco, fpta, 0.20f);
madd_v2_v2fl(sco, fptb, 0.50f);
- madd_v2_v2fl(sco, fpt, 0.30f);
+ madd_v2_v2fl(sco, fptc, 0.30f);
interp_v2_v2v2(fptb, fptb, sco, inf);
copy_v2int_v2float(&ptb->x, fptb);
@@ -568,7 +567,7 @@ static void gp_smooth_buffer_point(bGPdata *gpd, bGPDbrush *brush)
* to verify if the angle is too small and can be noise
*/
sub_v2_v2v2(vab, fptb, fpta);
- sub_v2_v2v2(vac, fpt, fpta);
+ sub_v2_v2v2(vac, fptc, fpta);
float sqsize_ab = len_squared_v2v2(fptb, fpta);
normalize_v2(vab);
normalize_v2(vac);
@@ -577,23 +576,61 @@ static void gp_smooth_buffer_point(bGPdata *gpd, bGPDbrush *brush)
float angle = fabs(dot_v2v2(vab, vac));
/* if the angle is below minimun, means the point can be removed, so rollback one point */
if ((angle > draw_stabangle) && (sqsize_ab < draw_pxdensity * 3.0f)) {
- ptb->x = pt->x;
- ptb->y = pt->y;
- ptb->pressure = pt->pressure;
- ptb->strength = pt->strength;
- ptb->time = pt->time;
+ ptb->x = ptc->x;
+ ptb->y = ptc->y;
+ ptb->pressure = ptc->pressure;
+ ptb->strength = ptc->strength;
+ ptb->time = ptc->time;
gpd->sbuffer_size--;
}
- /* smooth the thickness 20%-60%-20% */
- float press = pta->pressure * 0.20f;
- press += ptb->pressure * 0.60f;
- press += pt->pressure * 0.20f;
- ptb->pressure = interpf(ptb->pressure, press, 0.5f);
-
return;
}
+/**
+* Apply smooth while drawing for thickness and strength (alpha)
+*
+* \param gpd Current gp datablock
+* \param brush Current brush
+*/
+static void gp_smooth_buffer_thickness(bGPdata *gpd, bGPDbrush *brush)
+{
+ tGPspoint *ptc, *pta, *ptb;
+ float fptc[2], fpta[2], fptb[2];
+
+ /* Do nothing if not enough points to smooth out */
+ if (gpd->sbuffer_size < 3) {
+ return;
+ }
+
+ int i = gpd->sbuffer_size - 1;
+
+ /* points used as reference */
+ pta = (tGPspoint *)gpd->sbuffer + i - 2;
+ ptb = (tGPspoint *)gpd->sbuffer + i - 1;
+
+ /* current point */
+ ptc = (tGPspoint *)gpd->sbuffer + i;
+
+ /* compute estimated thickness and strength */
+ copy_v2float_v2int(fpta, &pta->x);
+ copy_v2float_v2int(fptb, &ptb->x);
+ copy_v2float_v2int(fptc, &ptc->x);
+
+ float sqsize_ab = len_squared_v2v2(fpta, fptb);
+ float sqsize_bc = len_squared_v2v2(fptb, fptc);
+ float factor = sqsize_ab / (sqsize_ab + sqsize_bc);
+
+ /* estimate values in the point B using points A and C interpolation */
+ float optimal_pressure = interpf(pta->pressure, ptc->pressure, factor);
+ float optimal_strength = interpf(pta->strength, ptc->strength, factor);
+
+ /* blend between original and optimal to smooth */
+ ptb->pressure = interpf(ptb->pressure, optimal_pressure, brush->draw_thicknesfac);
+ ptb->strength = interpf(ptb->strength, optimal_strength, brush->draw_strengthfac);
+
+ return;
+}
/* add current stroke-point to buffer (returns whether point was successfully added) */
static short gp_stroke_addpoint(
@@ -714,8 +751,9 @@ static short gp_stroke_addpoint(
/* increment counters */
gpd->sbuffer_size++;
- /* apply dynamic smooth to point */
+ /* apply dynamic smooths to point */
gp_smooth_buffer_point(gpd, brush);
+ gp_smooth_buffer_thickness(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 dd061031391..0d9111cee0e 100644
--- a/source/blender/makesdna/DNA_gpencil_types.h
+++ b/source/blender/makesdna/DNA_gpencil_types.h
@@ -44,6 +44,8 @@ struct GHash;
#define GP_MIN_STROKE_SEGMENT_PX 8.0f
#define GP_MIN_STROKE_SEGMENT_ANGLE DEG2RAD(2.0f)
+#define GP_DEFAULT_SMOOTH_THICKNESS 0.5f;
+#define GP_DEFAULT_SMOOTH_STRENGTH 0.5f;
/* ************************************
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list