[Bf-blender-cvs] [c64c5185d50] greasepencil-object: GPencil: Modifier: Noise: Replace Full Stroke option by Noise Scale

Clément Foucault noreply at git.blender.org
Fri Mar 6 01:21:03 CET 2020


Commit: c64c5185d509172d83908eb08df073a409b9122f
Author: Clément Foucault
Date:   Fri Mar 6 01:04:37 2020 +0100
Branches: greasepencil-object
https://developer.blender.org/rBc64c5185d509172d83908eb08df073a409b9122f

GPencil: Modifier: Noise: Replace Full Stroke option by Noise Scale

This means the noise can ba scaled along the strokes to create more
varied effects.

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

M	release/scripts/startup/bl_ui/properties_data_modifier.py
M	source/blender/blenloader/intern/versioning_280.c
M	source/blender/gpencil_modifiers/intern/MOD_gpencilnoise.c
M	source/blender/makesdna/DNA_gpencil_modifier_types.h
M	source/blender/makesrna/intern/rna_gpencil_modifier.c

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

diff --git a/release/scripts/startup/bl_ui/properties_data_modifier.py b/release/scripts/startup/bl_ui/properties_data_modifier.py
index 10a3cddaec9..f8caeba307e 100644
--- a/release/scripts/startup/bl_ui/properties_data_modifier.py
+++ b/release/scripts/startup/bl_ui/properties_data_modifier.py
@@ -1803,7 +1803,7 @@ class DATA_PT_gpencil_modifiers(ModifierButtonsPanel, Panel):
         row.enabled = md.random
         row.prop(md, "seed")
 
-        col.prop(md, "full_stroke")
+        col.prop(md, "noise_scale")
         col.prop(md, "use_custom_curve")
 
         if md.use_custom_curve:
diff --git a/source/blender/blenloader/intern/versioning_280.c b/source/blender/blenloader/intern/versioning_280.c
index 64528129e9b..cc00a641225 100644
--- a/source/blender/blenloader/intern/versioning_280.c
+++ b/source/blender/blenloader/intern/versioning_280.c
@@ -4612,6 +4612,7 @@ void blo_do_versions_280(FileData *fd, Library *UNUSED(lib), Main *bmain)
               gpmd->factor_thickness = gpmd->factor;
               gpmd->factor_strength = gpmd->factor;
               gpmd->factor_uvs = gpmd->factor;
+              gpmd->noise_scale = (gpmd->flag & GP_NOISE_FULL_STROKE) ? 0.0f : 1.0f;
 
               if (gpmd->curve_intensity == NULL) {
                 gpmd->curve_intensity = BKE_curvemapping_add(1, 0.0f, 0.0f, 1.0f, 1.0f);
diff --git a/source/blender/gpencil_modifiers/intern/MOD_gpencilnoise.c b/source/blender/gpencil_modifiers/intern/MOD_gpencilnoise.c
index 96a4019812a..f1b468bfdf7 100644
--- a/source/blender/gpencil_modifiers/intern/MOD_gpencilnoise.c
+++ b/source/blender/gpencil_modifiers/intern/MOD_gpencilnoise.c
@@ -31,6 +31,8 @@
 #include "BLI_hash.h"
 #include "BLI_rand.h"
 
+#include "MEM_guardedalloc.h"
+
 #include "DNA_meshdata_types.h"
 #include "DNA_scene_types.h"
 #include "DNA_object_types.h"
@@ -100,6 +102,20 @@ static bool dependsOnTime(GpencilModifierData *md)
   return (mmd->flag & GP_NOISE_USE_RANDOM) != 0;
 }
 
+static float *noise_table(int len, int seed)
+{
+  float *table = MEM_callocN(sizeof(float) * len, __func__);
+  for (int i = 0; i < len; i++) {
+    table[i] = BLI_hash_int_01(BLI_hash_int_2d(seed, i + 1));
+  }
+  return table;
+}
+
+BLI_INLINE float table_sample(float *table, float x)
+{
+  return interpf(table[(int)ceilf(x)], table[(int)floor(x)], fractf(x));
+}
+
 /* aply noise effect based on stroke direction */
 static void deformStroke(GpencilModifierData *md,
                          Depsgraph *depsgraph,
@@ -145,6 +161,15 @@ static void deformStroke(GpencilModifierData *md,
     seed += ((int)DEG_get_ctime(depsgraph)) / mmd->step;
   }
 
+  /* Sanitize as it can create out of bound reads. */
+  float noise_scale = clamp_f(mmd->noise_scale, 0.0f, 1.0f);
+
+  int len = ceilf(gps->totpoints * noise_scale) + 1;
+  float *noise_table_position = (mmd->factor > 0.0f) ? noise_table(len, seed + 2) : NULL;
+  float *noise_table_strength = (mmd->factor_strength > 0.0f) ? noise_table(len, seed + 3) : NULL;
+  float *noise_table_thickness = (mmd->factor_thickness > 0.0f) ? noise_table(len, seed) : NULL;
+  float *noise_table_uvs = (mmd->factor_uvs > 0.0f) ? noise_table(len, seed + 4) : NULL;
+
   /* calculate stroke normal*/
   if (gps->totpoints > 2) {
     BKE_gpencil_stroke_normal(gps, normal);
@@ -168,47 +193,54 @@ static void deformStroke(GpencilModifierData *md,
       weight *= BKE_curvemapping_evaluateF(mmd->curve_intensity, 0, value);
     }
 
-    int point_seed = (mmd->flag & GP_NOISE_FULL_STROKE) ? seed : BLI_hash_int_2d(seed, i + 1);
-
     if (mmd->factor > 0.0f) {
-      /* Offset point randomly around the normal vector. */
-      const bool is_last_point = (i == gps->totpoints - 1);
-      bGPDspoint *pt0 = (gps->totpoints > 1 && is_last_point) ? &gps->points[i - 1] :
-                                                                &gps->points[i];
-      bGPDspoint *pt1 = (gps->totpoints > 1 && !is_last_point) ? &gps->points[i + 1] :
-                                                                 &gps->points[i];
-      /* Initial vector (p1 -> p0). */
-      sub_v3_v3v3(vec1, &pt0->x, &pt1->x);
-      /* if vec2 is zero, set to something */
-      if (len_squared_v3(vec1) < 1e-8f) {
+      /* Offset point randomly around the bi-normal vector. */
+      if (gps->totpoints == 1) {
         copy_v3_fl3(vec1, 1.0f, 0.0f, 0.0f);
       }
+      else if (i != gps->totpoints - 1) {
+        /* Initial vector (p1 -> p0). */
+        sub_v3_v3v3(vec1, &gps->points[i].x, &gps->points[i + 1].x);
+        /* if vec2 is zero, set to something */
+        if (len_squared_v3(vec1) < 1e-8f) {
+          copy_v3_fl3(vec1, 1.0f, 0.0f, 0.0f);
+        }
+      }
+      else {
+        /* Last point reuse the penultimate normal (still stored in vec1)
+         * because the previous point is already modified. */
+      }
       /* Vector orthogonal to normal. */
       cross_v3_v3v3(vec2, vec1, normal);
       normalize_v3(vec2);
 
-      float noise = BLI_hash_int_01(point_seed);
+      float noise = table_sample(noise_table_position, i * noise_scale);
       madd_v3_v3fl(&pt->x, vec2, (noise * 2.0f - 1.0f) * weight * mmd->factor * 0.1f);
     }
 
     if (mmd->factor_thickness > 0.0f) {
-      float noise = BLI_hash_int_01(point_seed + 2);
+      float noise = table_sample(noise_table_position, i * noise_scale);
       pt->pressure *= max_ff(1.0f + (noise * 2.0f - 1.0f) * weight * mmd->factor_thickness, 0.0f);
       CLAMP_MIN(pt->pressure, GPENCIL_STRENGTH_MIN);
     }
 
     if (mmd->factor_strength > 0.0f) {
-      float noise = BLI_hash_int_01(point_seed + 3);
+      float noise = table_sample(noise_table_position, i * noise_scale);
       pt->strength *= max_ff(1.0f - noise * weight * mmd->factor_strength, 0.0f);
       CLAMP(pt->strength, GPENCIL_STRENGTH_MIN, 1.0f);
     }
 
     if (mmd->factor_uvs > 0.0f) {
-      float noise = BLI_hash_int_01(point_seed + 4);
+      float noise = table_sample(noise_table_position, i * noise_scale);
       pt->uv_rot += (noise * 2.0f - 1.0f) * weight * mmd->factor_uvs * M_PI_2;
       CLAMP(pt->uv_rot, -M_PI_2, M_PI_2);
     }
   }
+
+  MEM_SAFE_FREE(noise_table_position);
+  MEM_SAFE_FREE(noise_table_strength);
+  MEM_SAFE_FREE(noise_table_thickness);
+  MEM_SAFE_FREE(noise_table_uvs);
 }
 
 static void bakeModifier(struct Main *UNUSED(bmain),
diff --git a/source/blender/makesdna/DNA_gpencil_modifier_types.h b/source/blender/makesdna/DNA_gpencil_modifier_types.h
index cb288832c4d..d99a2d9455c 100644
--- a/source/blender/makesdna/DNA_gpencil_modifier_types.h
+++ b/source/blender/makesdna/DNA_gpencil_modifier_types.h
@@ -93,13 +93,14 @@ typedef struct NoiseGpencilModifierData {
   float factor_strength;
   float factor_thickness;
   float factor_uvs;
+  /** Noise Frequency scaling */
+  float noise_scale;
   /** How many frames before recalculate randoms. */
   int step;
   /** Custom index for passes. */
   int layer_pass;
   /** Random seed */
   int seed;
-  char _pad[4];
   struct CurveMapping *curve_intensity;
 } NoiseGpencilModifierData;
 
diff --git a/source/blender/makesrna/intern/rna_gpencil_modifier.c b/source/blender/makesrna/intern/rna_gpencil_modifier.c
index 631544ae182..95f342f3b21 100644
--- a/source/blender/makesrna/intern/rna_gpencil_modifier.c
+++ b/source/blender/makesrna/intern/rna_gpencil_modifier.c
@@ -450,10 +450,10 @@ static void rna_def_modifier_gpencilnoise(BlenderRNA *brna)
       prop, "Affect Position", "The modifier affects the position of the point");
   RNA_def_property_update(prop, 0, "rna_GpencilModifier_update");
 
-  prop = RNA_def_property(srna, "full_stroke", PROP_BOOLEAN, PROP_NONE);
-  RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_NOISE_FULL_STROKE);
-  RNA_def_property_ui_text(
-      prop, "Full Stroke", "The noise affects the stroke as a whole, not point by point");
+  prop = RNA_def_property(srna, "noise_scale", PROP_FLOAT, PROP_FACTOR);
+  RNA_def_property_float_sdna(prop, NULL, "noise_scale");
+  RNA_def_property_range(prop, 0.0, 1.0);
+  RNA_def_property_ui_text(prop, "Noise Scale", "Scale the noise frequency");
   RNA_def_property_update(prop, 0, "rna_GpencilModifier_update");
 
   prop = RNA_def_property(srna, "use_custom_curve", PROP_BOOLEAN, PROP_NONE);



More information about the Bf-blender-cvs mailing list