GP: Primitive: Fix flickering when using a noise brush
[blender.git] / source / blender / editors / gpencil / gpencil_primitive.c
index c88d0a346ddee1675fa8682fd826dcc73f3136e6..f13235926f10f1547a3ae9c0e36effe58e80a174 100644 (file)
@@ -356,7 +356,8 @@ static void gp_primitive_set_initdata(bContext *C, tGPDprimitive *tgpi)
        gpencil_primitive_allocate_memory(tgpi);
 
        /* Random generator, only init once. */
-       tgpi->rng = BLI_rng_new((uint)0);
+       uint rng_seed = (uint)(PIL_check_seconds_timer_i() & UINT_MAX);
+       tgpi->rng = BLI_rng_new(rng_seed);
 }
 
 /* add new segment to curve */
@@ -782,6 +783,13 @@ static void gp_primitive_update_strokes(bContext *C, tGPDprimitive *tgpi)
                bGPDspoint *pt = &gps->points[i];
                tGPspoint *p2d = &points2D[i];
 
+               /* set rnd value for reuse */
+               if (p2d->rnd_dirty != true) {
+                       p2d->rnd[0] = BLI_rng_get_float(tgpi->rng);
+                       p2d->rnd[1] = BLI_rng_get_float(tgpi->rng);
+                       p2d->rnd_dirty = true;
+               }
+
                /* Copy points to buffer */
                tGPspoint *tpt = ((tGPspoint *)(gpd->runtime.sbuffer) + gpd->runtime.sbuffer_size);
 
@@ -817,9 +825,8 @@ static void gp_primitive_update_strokes(bContext *C, tGPDprimitive *tgpi)
 
                        /* exponential value */
                        const float exfactor = SQUARE(brush->gpencil_settings->draw_jitter + 2.0f);
-                       const float rnd = BLI_rng_get_float(tgpi->rng);
-                       const float fac = rnd * exfactor * jitter;
-                       if (rnd > 0.5f) {
+                       const float fac = p2d->rnd[0] * exfactor * jitter;
+                       if (p2d->rnd[0] > 0.5f) {
                                add_v2_fl(&p2d->x, -fac);
                        }
                        else {
@@ -831,12 +838,11 @@ static void gp_primitive_update_strokes(bContext *C, tGPDprimitive *tgpi)
                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) {
-                               pressure -= brush->gpencil_settings->draw_random_press * rnd;
+                       if (p2d->rnd[0] > 0.5f) {
+                               pressure -= brush->gpencil_settings->draw_random_press * p2d->rnd[0];
                        }
                        else {
-                               pressure += brush->gpencil_settings->draw_random_press * rnd;
+                               pressure += brush->gpencil_settings->draw_random_press * p2d->rnd[0];
                        }
                }
 
@@ -853,12 +859,11 @@ static void gp_primitive_update_strokes(bContext *C, tGPDprimitive *tgpi)
                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;
+                       if (p2d->rnd[1] > 0.5f) {
+                               strength -= strength * brush->gpencil_settings->draw_random_strength * p2d->rnd[1];
                        }
                        else {
-                               strength += strength * brush->gpencil_settings->draw_random_strength * rnd;
+                               strength += strength * brush->gpencil_settings->draw_random_strength * p2d->rnd[1];
                        }
                        CLAMP(strength, GPENCIL_STRENGTH_MIN, 1.0f);
                }