[Bf-blender-cvs] [84b7624b804] greasepencil-object: GP: Primitive: Add support for brush jitter and random strength
Charlie Jolly
noreply at git.blender.org
Thu Dec 13 20:06:15 CET 2018
Commit: 84b7624b80491fcb6f772d99eb0ae4a040e7354a
Author: Charlie Jolly
Date: Thu Dec 13 16:56:06 2018 +0000
Branches: greasepencil-object
https://developer.blender.org/rB84b7624b80491fcb6f772d99eb0ae4a040e7354a
GP: Primitive: Add support for brush jitter and random strength
Also fix extra point bug.
===================================================================
M source/blender/editors/gpencil/gpencil_primitive.c
===================================================================
diff --git a/source/blender/editors/gpencil/gpencil_primitive.c b/source/blender/editors/gpencil/gpencil_primitive.c
index dd18c1da632..8eda301e2df 100644
--- a/source/blender/editors/gpencil/gpencil_primitive.c
+++ b/source/blender/editors/gpencil/gpencil_primitive.c
@@ -297,7 +297,7 @@ static void gp_primitive_set_initdata(bContext *C, tGPDprimitive *tgpi)
/* add new segment to curve */
static void gpencil_primitive_add_segment(tGPDprimitive *tgpi)
{
- if(tgpi->tot_stored_edges)
+ if(tgpi->tot_stored_edges > 0)
tgpi->tot_stored_edges += (tgpi->tot_edges - 1);
else
tgpi->tot_stored_edges += tgpi->tot_edges;
@@ -572,11 +572,15 @@ static void gp_primitive_update_strokes(bContext *C, tGPDprimitive *tgpi)
else
gps->totpoints = (tgpi->tot_edges + tgpi->tot_stored_edges);
+ if (tgpi->tot_stored_edges)
+ gps->totpoints--;
+
tgpi->gpd->runtime.tot_cp_points = 0;
/* compute screen-space coordinates for points */
tGPspoint *points2D = tgpi->points;
+
switch (tgpi->type) {
case GP_STROKE_BOX:
gp_primitive_rectangle(tgpi, points2D);
@@ -602,6 +606,10 @@ static void gp_primitive_update_strokes(bContext *C, tGPDprimitive *tgpi)
if (gset->flag & GP_SCULPT_SETT_FLAG_PRIMITIVE_CURVE) {
curvemapping_initialize(ts->gp_sculpt.cur_primitive);
}
+ if(tgpi->brush->gpencil_settings->flag & GP_BRUSH_USE_JITTER_PRESSURE)
+ curvemapping_initialize(tgpi->brush->gpencil_settings->curve_jitter);
+ if(tgpi->brush->gpencil_settings->flag & GP_BRUSH_USE_STENGTH_PRESSURE)
+ curvemapping_initialize(tgpi->brush->gpencil_settings->curve_strength);
/* get an array of depths, far depths are blended */
float *depth_arr = NULL;
@@ -698,14 +706,53 @@ static void gp_primitive_update_strokes(bContext *C, tGPDprimitive *tgpi)
/* Copy points to buffer */
tGPspoint *tpt = ((tGPspoint *)(gpd->runtime.sbuffer) + gpd->runtime.sbuffer_size);
- tpt->x = p2d->x;
- tpt->y = p2d->y;
+
+ /* Store original points */
+ float tmp_xyp[2];
+ copy_v2_v2(tmp_xyp, &p2d->x);
/* calc pressure */
+ float curve_pressure = 1.0;
float pressure = 1.0;
+ float strength = brush->gpencil_settings->draw_strength;
+
+ /* normalize value to evaluate curve */
+ if (gset->flag & GP_SCULPT_SETT_FLAG_PRIMITIVE_CURVE) {
+ float value = (float)i / (gps->totpoints - 1);
+ curve_pressure = curvemapping_evaluateF(gset->cur_primitive, 0, value);
+ pressure = curve_pressure;
+ }
+
+ /* apply jitter to position */
+ if ((brush->gpencil_settings->flag & GP_BRUSH_GROUP_RANDOM) &&
+ (brush->gpencil_settings->draw_jitter > 0.0f))
+ {
+ float jitter;
+
+ if (brush->gpencil_settings->flag & GP_BRUSH_USE_JITTER_PRESSURE) {
+ jitter = curvemapping_evaluateF(brush->gpencil_settings->curve_jitter, 0, curve_pressure);
+ jitter *= brush->gpencil_settings->draw_sensitivity;
+ }
+ else {
+ jitter = brush->gpencil_settings->draw_jitter;
+ }
+
+ const float exfactor = (brush->gpencil_settings->draw_jitter + 2.0f) * (brush->gpencil_settings->draw_jitter + 2.0f); /* exponential value */
+ const float rnd = BLI_rng_get_float(tgpi->rng);
+ const float fac = rnd * exfactor * jitter;
+ if (rnd > 0.5f) {
+ add_v2_fl(&p2d->x, -fac);
+ }
+ else {
+ add_v2_fl(&p2d->x, fac);
+ }
+
+
+ }
/* apply randomness to pressure */
- if ((brush->gpencil_settings->flag & GP_BRUSH_GROUP_RANDOM))
+ if ((brush->gpencil_settings->flag & GP_BRUSH_GROUP_RANDOM) &&
+ (brush->gpencil_settings->draw_random_press > 0.0f))
{
float rnd = BLI_rng_get_float(tgpi->rng);
if (rnd > 0.5f) {
@@ -715,17 +762,36 @@ static void gp_primitive_update_strokes(bContext *C, tGPDprimitive *tgpi)
pressure += brush->gpencil_settings->draw_random_press * rnd;
}
}
- /* normalize value to evaluate curve */
- if (gset->flag & GP_SCULPT_SETT_FLAG_PRIMITIVE_CURVE) {
- float value = (float)i / (gps->totpoints - 1);
- float curvef = curvemapping_evaluateF(gset->cur_primitive, 0, value);
- pressure *= curvef;
+
+ /* color strength */
+ if (brush->gpencil_settings->flag & GP_BRUSH_USE_STENGTH_PRESSURE) {
+ float curvef = curvemapping_evaluateF(brush->gpencil_settings->curve_strength, 0, curve_pressure);
+ strength *= curvef * brush->gpencil_settings->draw_sensitivity;
+ strength *= brush->gpencil_settings->draw_strength;
}
+
+ CLAMP(strength, GPENCIL_STRENGTH_MIN, 1.0f);
+
+ /* apply randomness to color strength */
+ if ((brush->gpencil_settings->flag & GP_BRUSH_GROUP_RANDOM) &&
+ (brush->gpencil_settings->draw_random_strength > 0.0f))
+ {
+ const float rnd = BLI_rng_get_float(tgpi->rng);
+ if (rnd > 0.5f) {
+ strength -= strength * brush->gpencil_settings->draw_random_strength * rnd;
+ }
+ else {
+ strength += strength * brush->gpencil_settings->draw_random_strength * rnd;
+ }
+ CLAMP(strength, GPENCIL_STRENGTH_MIN, 1.0f);
+ }
+
+ copy_v2_v2(&tpt->x, &p2d->x);
+
CLAMP_MIN(pressure, 0.1f);
tpt->pressure = pressure;
- tpt->strength = tgpi->brush->gpencil_settings->draw_strength;
-
+ tpt->strength = strength;
tpt->time = p2d->time;
tpt->uv_fac = 1.0f;
tpt->uv_rot = p2d->uv_rot;
@@ -744,7 +810,7 @@ static void gp_primitive_update_strokes(bContext *C, tGPDprimitive *tgpi)
&pt->x);
pt->pressure = pressure;
- pt->strength = tgpi->brush->gpencil_settings->draw_strength;
+ pt->strength = strength;
pt->time = 0.0f;
pt->flag = 0;
pt->uv_fac = 1.0f;
@@ -754,6 +820,9 @@ static void gp_primitive_update_strokes(bContext *C, tGPDprimitive *tgpi)
dvert->totweight = 0;
dvert->dw = NULL;
}
+
+ /* Restore original points */
+ copy_v2_v2(&p2d->x, tmp_xyp);
}
/* store cps and convert coords */
More information about the Bf-blender-cvs
mailing list