[Bf-blender-cvs] [dc1c820b2b0] blender2.8: Cleanup: remove BLI_frand from GreasePencil code.

Bastien Montagne noreply at git.blender.org
Sat Jun 16 18:02:29 CEST 2018


Commit: dc1c820b2b007302e37dd97bb244737d7351ae89
Author: Bastien Montagne
Date:   Sat Jun 16 18:02:02 2018 +0200
Branches: blender2.8
https://developer.blender.org/rBdc1c820b2b007302e37dd97bb244737d7351ae89

Cleanup: remove BLI_frand from GreasePencil code.

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

M	source/blender/editors/gpencil/gpencil_brush.c
M	source/blender/editors/gpencil/gpencil_intern.h
M	source/blender/editors/gpencil/gpencil_paint.c
M	source/blender/editors/gpencil/gpencil_utils.c

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

diff --git a/source/blender/editors/gpencil/gpencil_brush.c b/source/blender/editors/gpencil/gpencil_brush.c
index c2e532be0b3..f9284d71db3 100644
--- a/source/blender/editors/gpencil/gpencil_brush.c
+++ b/source/blender/editors/gpencil/gpencil_brush.c
@@ -44,6 +44,8 @@
 #include "BLI_rand.h"
 #include "BLI_utildefines.h"
 
+#include "PIL_time.h"
+
 #include "BLT_translation.h"
 
 #include "DNA_scene_types.h"
@@ -138,6 +140,8 @@ typedef struct tGP_BrushEditData {
 	/* Timer for in-place accumulation of brush effect */
 	wmTimer *timer;
 	bool timerTick; /* is this event from a timer */
+
+	RNG *rng;
 } tGP_BrushEditData;
 
 
@@ -658,7 +662,7 @@ static bool gp_brush_randomize_apply(tGP_BrushEditData *gso, bGPDstroke *gps, in
 	 * as well as the strength of the brush
 	 */
 	const float inf = gp_brush_influence_calc(gso, radius, co) / 2.0f;
-	const float fac = BLI_frand() * inf;
+	const float fac = BLI_rng_get_float(gso->rng) * inf;
 	/* need one flag enabled by default */
 	if ((gso->settings->flag & (GP_BRUSHEDIT_FLAG_APPLY_POSITION |
 	                            GP_BRUSHEDIT_FLAG_APPLY_STRENGTH |
@@ -685,7 +689,7 @@ static bool gp_brush_randomize_apply(tGP_BrushEditData *gso, bGPDstroke *gps, in
 		svec[1] =  mvec[0];
 
 		/* scale the displacement by the random displacement, and apply */
-		if (BLI_frand() > 0.5f) {
+		if (BLI_rng_get_float(gso->rng) > 0.5f) {
 			mul_v2_fl(svec, -fac);
 		}
 		else {
@@ -724,7 +728,7 @@ static bool gp_brush_randomize_apply(tGP_BrushEditData *gso, bGPDstroke *gps, in
 	}
 	/* apply random to strength */
 	if (gso->settings->flag & GP_BRUSHEDIT_FLAG_APPLY_STRENGTH) {
-		if (BLI_frand() > 0.5f) {
+		if (BLI_rng_get_float(gso->rng) > 0.5f) {
 			pt->strength += fac;
 		}
 		else {
@@ -735,7 +739,7 @@ static bool gp_brush_randomize_apply(tGP_BrushEditData *gso, bGPDstroke *gps, in
 	}
 	/* apply random to thickness (use pressure) */
 	if (gso->settings->flag & GP_BRUSHEDIT_FLAG_APPLY_THICKNESS) {
-		if (BLI_frand() > 0.5f) {
+		if (BLI_rng_get_float(gso->rng) > 0.5f) {
 			pt->pressure += fac;
 		}
 		else {
@@ -1061,6 +1065,10 @@ static bool gpsculpt_brush_init(bContext *C, wmOperator *op)
 
 	gso->brush_type = gso->settings->brushtype;
 
+	/* Random generator, only init once. */
+	uint rng_seed = (uint)(PIL_check_seconds_timer_i() & UINT_MAX);
+	rng_seed ^= GET_UINT_FROM_POINTER(gso);
+	gso->rng = BLI_rng_new(rng_seed);
 
 	gso->is_painting = false;
 	gso->first = true;
@@ -1163,6 +1171,10 @@ static void gpsculpt_brush_exit(bContext *C, wmOperator *op)
 		WM_event_remove_timer(CTX_wm_manager(C), win, gso->timer);
 	}
 
+	if (gso->rng != NULL) {
+		BLI_rng_free(gso->rng);
+	}
+
 	/* disable cursor and headerprints */
 	ED_area_headerprint(CTX_wm_area(C), NULL);
 	WM_cursor_modal_restore(win);
diff --git a/source/blender/editors/gpencil/gpencil_intern.h b/source/blender/editors/gpencil/gpencil_intern.h
index 33af6cab915..67b88efa285 100644
--- a/source/blender/editors/gpencil/gpencil_intern.h
+++ b/source/blender/editors/gpencil/gpencil_intern.h
@@ -41,6 +41,7 @@ struct bGPDstroke;
 struct bGPDspoint;
 
 struct GHash;
+struct RNG;
 
 struct ARegion;
 struct View2D;
@@ -117,7 +118,7 @@ bool gp_smooth_stroke(bGPDstroke *gps, int i, float inf, bool affect_pressure);
 bool gp_smooth_stroke_strength(bGPDstroke *gps, int i, float inf);
 bool gp_smooth_stroke_thickness(bGPDstroke *gps, int i, float inf);
 void gp_subdivide_stroke(bGPDstroke *gps, const int new_totpoints);
-void gp_randomize_stroke(bGPDstroke *gps, bGPDbrush *brush);
+void gp_randomize_stroke(bGPDstroke *gps, bGPDbrush *brush, struct RNG *rng);
 
 /* Layers Enums -------------------------------------- */
 
diff --git a/source/blender/editors/gpencil/gpencil_paint.c b/source/blender/editors/gpencil/gpencil_paint.c
index 6afa6f41828..d536721936d 100644
--- a/source/blender/editors/gpencil/gpencil_paint.c
+++ b/source/blender/editors/gpencil/gpencil_paint.c
@@ -169,6 +169,8 @@ typedef struct tGPsdata {
 	short straight[2];   /* 1: line horizontal, 2: line vertical, other: not defined, second element position */
 	int lock_axis;       /* lock drawing to one axis */
 
+	RNG *rng;
+
 	short keymodifier;   /* key used for invoking the operator */
 } tGPsdata;
 
@@ -408,7 +410,8 @@ static void gp_stroke_convertcoords(tGPsdata *p, const int mval[2], float out[3]
 }
 
 /* apply jitter to stroke */
-static void gp_brush_jitter(bGPdata *gpd, bGPDbrush *brush, tGPspoint *pt, const int mval[2], int r_mval[2])
+static void gp_brush_jitter(
+        bGPdata *gpd, bGPDbrush *brush, tGPspoint *pt, const int mval[2], int r_mval[2], RNG *rng)
 {
 	float pressure = pt->pressure;
 	float tmp_pressure = pt->pressure;
@@ -417,7 +420,7 @@ static void gp_brush_jitter(bGPdata *gpd, bGPDbrush *brush, tGPspoint *pt, const
 		tmp_pressure = curvef * brush->draw_sensitivity;
 	}
 	const float exfactor = (brush->draw_jitter + 2.0f) * (brush->draw_jitter + 2.0f); /* exponential value */
-	const float fac = BLI_frand() * exfactor * tmp_pressure;
+	const float fac = BLI_rng_get_float(rng) * exfactor * tmp_pressure;
 	/* Jitter is applied perpendicular to the mouse movement vector (2D space) */
 	float mvec[2], svec[2];
 	/* mouse movement in ints -> floats */
@@ -434,7 +437,7 @@ static void gp_brush_jitter(bGPdata *gpd, bGPDbrush *brush, tGPspoint *pt, const
 	svec[0] = -mvec[1];
 	svec[1] = mvec[0];
 	/* scale the displacement by the random, and apply */
-	if (BLI_frand() > 0.5f) {
+	if (BLI_rng_get_float(rng) > 0.5f) {
 		mul_v2_fl(svec, -fac);
 	}
 	else {
@@ -550,7 +553,7 @@ static short gp_stroke_addpoint(
 		/* Apply jitter to position */
 		if (brush->draw_jitter > 0.0f) {
 			int r_mval[2];
-			gp_brush_jitter(gpd, brush, pt, mval, r_mval);
+			gp_brush_jitter(gpd, brush, pt, mval, r_mval, p->rng);
 			copy_v2_v2_int(&pt->x, r_mval);
 		}
 		else {
@@ -560,11 +563,11 @@ static short gp_stroke_addpoint(
 		if ((brush->draw_random_press > 0.0f) && (brush->flag & GP_BRUSH_USE_RANDOM_PRESSURE)) {
 			float curvef = curvemapping_evaluateF(brush->cur_sensitivity, 0, pressure);
 			float tmp_pressure = curvef * brush->draw_sensitivity;
-			if (BLI_frand() > 0.5f) {
-				pt->pressure -= tmp_pressure * brush->draw_random_press * BLI_frand();
+			if (BLI_rng_get_float(p->rng) > 0.5f) {
+				pt->pressure -= tmp_pressure * brush->draw_random_press * BLI_rng_get_float(p->rng);
 			}
 			else {
-				pt->pressure += tmp_pressure * brush->draw_random_press * BLI_frand();
+				pt->pressure += tmp_pressure * brush->draw_random_press * BLI_rng_get_float(p->rng);
 			}
 			CLAMP(pt->pressure, GPENCIL_STRENGTH_MIN, 1.0f);
 		}
@@ -588,11 +591,11 @@ static short gp_stroke_addpoint(
 
 		/* apply randomness to color strength */
 		if ((brush->draw_random_press > 0.0f) && (brush->flag & GP_BRUSH_USE_RANDOM_STRENGTH)) {
-			if (BLI_frand() > 0.5f) {
-				pt->strength -= pt->strength * brush->draw_random_press * BLI_frand();
+			if (BLI_rng_get_float(p->rng) > 0.5f) {
+				pt->strength -= pt->strength * brush->draw_random_press * BLI_rng_get_float(p->rng);
 			}
 			else {
-				pt->strength += pt->strength * brush->draw_random_press * BLI_frand();
+				pt->strength += pt->strength * brush->draw_random_press * BLI_rng_get_float(p->rng);
 			}
 			CLAMP(pt->strength, GPENCIL_STRENGTH_MIN, 1.0f);
 		}
@@ -978,7 +981,7 @@ static void gp_stroke_newfrombuffer(tGPsdata *p)
 		}
 		/* apply randomness to stroke */
 		if (brush->draw_random_sub > 0.0f) {
-			gp_randomize_stroke(gps, brush);
+			gp_randomize_stroke(gps, brush, p->rng);
 		}
 
 		/* smooth stroke after subdiv - only if there's something to do
@@ -1583,6 +1586,11 @@ static tGPsdata *gp_session_initpaint(bContext *C)
 	 */
 	p->radius = U.gp_eraser;
 
+	/* Random generator, only init once. */
+	uint rng_seed = (uint)(PIL_check_seconds_timer_i() & UINT_MAX);
+	rng_seed ^= GET_UINT_FROM_POINTER(p);
+	p->rng = BLI_rng_new(rng_seed);
+
 	/* return context data for running paint operator */
 	return p;
 }
@@ -1609,6 +1617,14 @@ static void gp_session_cleanup(tGPsdata *p)
 	p->inittime = 0.0;
 }
 
+static void gp_session_free(tGPsdata *p) {
+	if (p->rng != NULL) {
+		BLI_rng_free(p->rng);
+	}
+	MEM_freeN(p);
+}
+
+
 /* init new stroke */
 static void gp_paint_initstroke(tGPsdata *p, eGPencil_PaintModes paintmode, Depsgraph *depsgraph)
 {
@@ -1949,9 +1965,7 @@ static void gpencil_draw_exit(bContext *C, wmOperator *op)
 		/* cleanup */
 		gp_paint_cleanup(p);
 		gp_session_cleanup(p);
-
-		/* finally, free the temp data */
-		MEM_freeN(p);
+		gp_session_free(p);
 	}
 
 	op->customdata = NULL;
diff --git a/source/blender/editors/gpencil/gpencil_utils.c b/source/blender/editors/gpencil/gpencil_utils.c
index f6d72d9e575..4ee3bdd587e 100644
--- a/source/blender/editors/gpencil/gpencil_utils.c
+++ b/source/blender/editors/gpencil/gpencil_utils.c
@@ -965,7 +965,7 @@ void gp_subdivide_stroke(bGPDstroke *gps, const int new_totpoints)
  * \param gps           Stroke data
  * \param brush         Brush data
  */
-void gp_randomize_stroke(bGPDstroke *gps, bGPDbrush *brush)
+void gp_randomize_stroke(bGPDstroke *gps, bGPDbrush *brush, RNG *rng)
 {
 	bGPDspoint *pt1, *pt2, *pt3;
 	float v1[3];
@@ -998,10 +998,10 @@ void gp_randomize_stroke(bGPDstroke *gps, bGPDbrush *brush)
 	for (int i = 1; i < gps->totpoints - 1; ++i) {
 		bGPDspoint *pt = &gps->points[i];
 		/* get vector with shift (apply a division because random is too sensitive */
-		const float fac = BLI_frand() * (brush->draw_random_sub / 10.0f);
+		const float fac = BLI_rng_get_float(rng) * (brush->draw_random_sub / 10.0f);
 		float svec[3];
 		copy_v3_v3(svec, ortho);
-		if (BLI_frand() > 0.5f) {
+		if (BLI_rng_get_float(rng) > 0.5f) {
 			mul_v3_fl(svec, -fac);
 		}
 		else {



More information about the Bf-blender-cvs mailing list