[Bf-blender-cvs] [cbd15d1452a] greasepencil-object: WIP: More work to get better drawing feeling

Antonio Vazquez noreply at git.blender.org
Fri Nov 10 19:15:21 CET 2017


Commit: cbd15d1452a41de91e33a29f50aaf8b750fd9964
Author: Antonio Vazquez
Date:   Fri Nov 10 19:14:58 2017 +0100
Branches: greasepencil-object
https://developer.blender.org/rBcbd15d1452a41de91e33a29f50aaf8b750fd9964

WIP: More work to get better drawing feeling

Thre was some problems in previous commits

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

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/source/blender/editors/gpencil/gpencil_paint.c b/source/blender/editors/gpencil/gpencil_paint.c
index c65d0d6feab..8d74748f447 100644
--- a/source/blender/editors/gpencil/gpencil_paint.c
+++ b/source/blender/editors/gpencil/gpencil_paint.c
@@ -490,19 +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, bGPDbrush *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];
+	float fpt[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;
-	const float draw_stabangle = 1.0f - brush->draw_stabangle;
+	const float draw_stabangle = cos(brush->draw_stabangle);
 	const float draw_pxdensity = brush->draw_pxdensity * brush->draw_pxdensity;
 	/* if no stabilization, return */
 	if (brush->draw_stabifac == 0) {
-		return false;
+		return;
 	}
 
 	/* the influence never can be 1. We keep the range between 0 and 1 on the UI for 
@@ -514,7 +514,7 @@ static bool gp_smooth_buffer_point(bGPdata *gpd, bGPDbrush *brush)
 
 	/* Do nothing if not enough points to smooth out */
 	if (gpd->sbuffer_size < 3) {
-		return false;
+		return;
 	}
 
 	int i = gpd->sbuffer_size - 1;
@@ -533,6 +533,18 @@ static bool gp_smooth_buffer_point(bGPdata *gpd, bGPDbrush *brush)
 	copy_v2float_v2int(fptb, &ptb->x);
 	copy_v2float_v2int(fpt, &pt->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);
+	normalize_v2(vba);
+	normalize_v2(vbc);
+	float angle_ba_bc = dot_v2v2(vba, vbc);
+	if (angle_ba_bc >= 0.0f) {
+		return;
+	}
+
 	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 */
@@ -562,8 +574,8 @@ static bool gp_smooth_buffer_point(bGPdata *gpd, bGPDbrush *brush)
 	normalize_v2(vac);
 
 	/* 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 */
+	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;
@@ -573,7 +585,7 @@ static bool gp_smooth_buffer_point(bGPdata *gpd, bGPDbrush *brush)
 		gpd->sbuffer_size--;
 	}
 
-	return true;
+	return;
 }
 
 
diff --git a/source/blender/makesdna/DNA_gpencil_types.h b/source/blender/makesdna/DNA_gpencil_types.h
index 1d1619ec493..dd061031391 100644
--- a/source/blender/makesdna/DNA_gpencil_types.h
+++ b/source/blender/makesdna/DNA_gpencil_types.h
@@ -43,7 +43,7 @@ struct GHash;
 #define GP_DEFAULT_PIX_FACTOR 500 
 
 #define GP_MIN_STROKE_SEGMENT_PX 8.0f 
-#define GP_MIN_STROKE_SEGMENT_ANGLE 0.005f 
+#define GP_MIN_STROKE_SEGMENT_ANGLE DEG2RAD(2.0f) 
 
 /* ***************************************** */
 /* GP Point Weights */
diff --git a/source/blender/makesrna/intern/rna_scene.c b/source/blender/makesrna/intern/rna_scene.c
index 6778dc4f8ef..cf51f045d5b 100644
--- a/source/blender/makesrna/intern/rna_scene.c
+++ b/source/blender/makesrna/intern/rna_scene.c
@@ -2341,9 +2341,9 @@ static void rna_def_gpencil_brush(BlenderRNA *brna)
 	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);
+	prop = RNA_def_property(srna, "pen_noise_factor", PROP_FLOAT, PROP_ANGLE);
 	RNA_def_property_float_sdna(prop, NULL, "draw_stabangle");
-	RNA_def_property_range(prop, 0.0, 1.0f);
+	RNA_def_property_range(prop, DEG2RAD(0.0f), DEG2RAD(180.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");



More information about the Bf-blender-cvs mailing list