[Bf-blender-cvs] [908dfbf6182] greasepencil-object: GPencil: Modifier: Change Noise Modifier behavior

Clément Foucault noreply at git.blender.org
Thu Mar 5 17:36:11 CET 2020


Commit: 908dfbf61824444ff7e024084c1634c9cbdacdd3
Author: Clément Foucault
Date:   Thu Mar 5 17:32:21 2020 +0100
Branches: greasepencil-object
https://developer.blender.org/rB908dfbf61824444ff7e024084c1634c9cbdacdd3

GPencil: Modifier: Change Noise Modifier behavior

- Noise is applied using a different factor for each property.
- Move Extremes is replaced by a custom curve profile
- Each modifier will create a different result, making stacking possible.
- The result of the position noise will not make the stroke curl.
- Noise default instensity has been tweaked for every property type.

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

M	release/scripts/startup/bl_ui/properties_data_modifier.py
M	source/blender/blenloader/intern/readfile.c
M	source/blender/blenloader/intern/versioning_280.c
M	source/blender/blenloader/intern/writefile.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 98193f66315..10a3cddaec9 100644
--- a/release/scripts/startup/bl_ui/properties_data_modifier.py
+++ b/release/scripts/startup/bl_ui/properties_data_modifier.py
@@ -1791,7 +1791,10 @@ class DATA_PT_gpencil_modifiers(ModifierButtonsPanel, Panel):
 
         col = split.column()
         row = col.row(align=True)
-        row.prop(md, "factor")
+        row.prop(md, "factor", text="Position" )
+        row.prop(md, "factor_strength", text="Strength")
+        row.prop(md, "factor_thickness", text="Thickness")
+        row.prop(md, "factor_uvs", text="UV")
         row.prop(md, "random", text="", icon='TIME', toggle=True)
         row = col.row()
         row.enabled = md.random
@@ -1799,16 +1802,12 @@ class DATA_PT_gpencil_modifiers(ModifierButtonsPanel, Panel):
         row = col.row()
         row.enabled = md.random
         row.prop(md, "seed")
+
         col.prop(md, "full_stroke")
-        col.prop(md, "move_extreme")
+        col.prop(md, "use_custom_curve")
 
-        row = layout.row(align=True)
-        row.label(text="Affect:")
-        row = layout.row(align=True)
-        row.prop(md, "use_edit_position", text="Position", toggle=True)
-        row.prop(md, "use_edit_strength", text="Strength", toggle=True)
-        row.prop(md, "use_edit_thickness", text="Thickness", toggle=True)
-        row.prop(md, "use_edit_uv", text="UV", toggle=True)
+        if md.use_custom_curve:
+            col.template_curve_mapping(md, "curve")
 
         self.gpencil_masking(layout, ob, md, True)
 
diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c
index 6e8f8e48a12..9532468cf86 100644
--- a/source/blender/blenloader/intern/readfile.c
+++ b/source/blender/blenloader/intern/readfile.c
@@ -5752,6 +5752,16 @@ static void direct_link_gpencil_modifiers(FileData *fd, ListBase *lb)
         direct_link_curvemapping(fd, hmd->curfalloff);
       }
     }
+    else if (md->type == eGpencilModifierType_Noise) {
+      NoiseGpencilModifierData *gpmd = (NoiseGpencilModifierData *)md;
+
+      gpmd->curve_intensity = newdataadr(fd, gpmd->curve_intensity);
+      if (gpmd->curve_intensity) {
+        direct_link_curvemapping(fd, gpmd->curve_intensity);
+        /* initialize the curve. Maybe this could be moved to modififer logic */
+        BKE_curvemapping_initialize(gpmd->curve_intensity);
+      }
+    }
     else if (md->type == eGpencilModifierType_Thick) {
       ThickGpencilModifierData *gpmd = (ThickGpencilModifierData *)md;
 
diff --git a/source/blender/blenloader/intern/versioning_280.c b/source/blender/blenloader/intern/versioning_280.c
index 1d0ac204080..2a35084f876 100644
--- a/source/blender/blenloader/intern/versioning_280.c
+++ b/source/blender/blenloader/intern/versioning_280.c
@@ -661,6 +661,27 @@ static void do_versions_area_ensure_tool_region(Main *bmain,
         }
       }
     }
+
+    /* Grease pencil noise modifier curve. */
+    if (!DNA_struct_elem_find(fd->filesdna, "NoiseGpencilModifierData", "float", "factor_uvs")) {
+      LISTBASE_FOREACH (Object *, ob, &bmain->objects) {
+        LISTBASE_FOREACH (ModifierData *, md, &ob->greasepencil_modifiers) {
+          if (md->type == eGpencilModifierType_Noise) {
+            NoiseGpencilModifierData *gpmd = (NoiseGpencilModifierData *)md;
+            gpmd->factor_thickness = gpmd->factor;
+            gpmd->factor_strength = gpmd->factor;
+            gpmd->factor_uvs = gpmd->factor;
+
+            if (gpmd->curve_intensity) {
+              gpmd->curve_intensity = BKE_curvemapping_add(1, 0.0f, 0.0f, 1.0f, 1.0f);
+              if (gpmd->curve_intensity) {
+                BKE_curvemapping_initialize(gpmd->curve_intensity);
+              }
+            }
+          }
+        }
+      }
+    }
   }
 }
 
@@ -1061,6 +1082,13 @@ static void do_version_curvemapping_walker(Main *bmain, void (*callback)(CurveMa
           callback(gpmd->curfalloff);
         }
       }
+      else if (md->type == eGpencilModifierType_Noise) {
+        NoiseGpencilModifierData *gpmd = (NoiseGpencilModifierData *)md;
+
+        if (gpmd->curve_intensity) {
+          callback(gpmd->curve_intensity);
+        }
+      }
     }
   }
 
diff --git a/source/blender/blenloader/intern/writefile.c b/source/blender/blenloader/intern/writefile.c
index f9fedfd061f..90c29fbaaad 100644
--- a/source/blender/blenloader/intern/writefile.c
+++ b/source/blender/blenloader/intern/writefile.c
@@ -1801,6 +1801,13 @@ static void write_gpencil_modifiers(WriteData *wd, ListBase *modbase)
         write_curvemapping(wd, gpmd->curve_thickness);
       }
     }
+    else if (md->type == eGpencilModifierType_Noise) {
+      NoiseGpencilModifierData *gpmd = (NoiseGpencilModifierData *)md;
+
+      if (gpmd->curve_intensity) {
+        write_curvemapping(wd, gpmd->curve_intensity);
+      }
+    }
     else if (md->type == eGpencilModifierType_Hook) {
       HookGpencilModifierData *gpmd = (HookGpencilModifierData *)md;
 
diff --git a/source/blender/gpencil_modifiers/intern/MOD_gpencilnoise.c b/source/blender/gpencil_modifiers/intern/MOD_gpencilnoise.c
index a6e50362b34..ab39cbce709 100644
--- a/source/blender/gpencil_modifiers/intern/MOD_gpencilnoise.c
+++ b/source/blender/gpencil_modifiers/intern/MOD_gpencilnoise.c
@@ -27,6 +27,7 @@
 #include "BLI_utildefines.h"
 
 #include "BLI_math_vector.h"
+#include "BLI_ghash.h"
 #include "BLI_hash.h"
 #include "BLI_rand.h"
 
@@ -36,6 +37,7 @@
 #include "DNA_gpencil_types.h"
 #include "DNA_gpencil_modifier_types.h"
 
+#include "BKE_colortools.h"
 #include "BKE_deform.h"
 #include "BKE_gpencil.h"
 #include "BKE_gpencil_modifier.h"
@@ -60,11 +62,35 @@ static void initData(GpencilModifierData *md)
   gpmd->vgname[0] = '\0';
   gpmd->step = 1;
   gpmd->seed = 0;
+  gpmd->curve_intensity = BKE_curvemapping_add(1, 0.0f, 0.0f, 1.0f, 1.0f);
+  if (gpmd->curve_intensity) {
+    /* TODO better default profile. */
+    BKE_curvemapping_initialize(gpmd->curve_intensity);
+  }
+}
+
+static void freeData(GpencilModifierData *md)
+{
+  NoiseGpencilModifierData *gpmd = (NoiseGpencilModifierData *)md;
+
+  if (gpmd->curve_intensity) {
+    BKE_curvemapping_free(gpmd->curve_intensity);
+  }
 }
 
 static void copyData(const GpencilModifierData *md, GpencilModifierData *target)
 {
+  NoiseGpencilModifierData *gmd = (NoiseGpencilModifierData *)md;
+  NoiseGpencilModifierData *tgmd = (NoiseGpencilModifierData *)target;
+
+  if (tgmd->curve_intensity != NULL) {
+    BKE_curvemapping_free(tgmd->curve_intensity);
+    tgmd->curve_intensity = NULL;
+  }
+
   BKE_gpencil_modifier_copyData_generic(md, target);
+
+  tgmd->curve_intensity = BKE_curvemapping_copy(gmd->curve_intensity);
 }
 
 static bool dependsOnTime(GpencilModifierData *md)
@@ -82,15 +108,13 @@ static void deformStroke(GpencilModifierData *md,
                          bGPDstroke *gps)
 {
   NoiseGpencilModifierData *mmd = (NoiseGpencilModifierData *)md;
-  bGPDspoint *pt0, *pt1;
   MDeformVert *dvert = NULL;
-  float shift, vran, vdir;
+  /* Noise value in range [-1..1] */
   float normal[3];
   float vec1[3], vec2[3];
-  int sc_frame = 0;
-  int stroke_seed = 0;
   const int def_nr = defgroup_name_index(ob, mmd->vgname);
-  const float unit_v3[3] = {1.0f, 1.0f, 1.0f};
+  const bool invert_group = (mmd->flag & GP_NOISE_INVERT_VGROUP) != 0;
+  const bool use_curve = (mmd->flag & GP_NOISE_CUSTOM_CURVE) != 0 && mmd->curve_intensity;
 
   if (!is_stroke_affected_by_modifier(ob,
                                       mmd->layername,
@@ -107,132 +131,80 @@ static void deformStroke(GpencilModifierData *md,
     return;
   }
 
-  sc_frame = (int)DEG_get_ctime(depsgraph);
+  int seed = mmd->seed;
+  /* TODO Find a better seed for stroke. Ideally their position in the strokelist. */
+  int stroke_seed = gps->totpoints;
+  seed += stroke_seed;
+
+  /* FIXME Seed is the same for all modifier currently.
+   * This is a workaround to make sure different modifiers get different seeds. */
+  seed += BLI_hash_string(md->name);
 
-  zero_v3(vec2);
+  if (mmd->flag & GP_NOISE_USE_RANDOM) {
+    seed += ((int)DEG_get_ctime(depsgraph)) / mmd->step;
+  }
 
   /* calculate stroke normal*/
   if (gps->totpoints > 2) {
     BKE_gpencil_stroke_normal(gps, normal);
   }
   else {
-    copy_v3_v3(normal, unit_v3);
+    copy_v3_fl(normal, 1.0f);
   }
 
   /* move points */
   for (int i = 0; i < gps->totpoints; i++) {
-    if (((i == 0) || (i == gps->totpoints - 1)) && ((mmd->flag & GP_NOISE_MOVE_EXTREME) == 0)) {
+    bGPDspoint *pt = &gps->points[i];
+    /* verify vertex group */
+    dvert = &gps->dvert[i];
+    float weight = get_modifier_point_weight(dvert, invert_group, def_nr);
+    if (weight < 0.0f) {
       continue;
     }
 
-    /* first point is special */
-    if (i == 0) {
-      if (gps->dvert) {
-        dvert = &gps->dvert[0];
-      }
-      pt0 = (gps->totpoints > 1) ? &gps->points[1] : &gps->points[0];
-      pt1 = &gps->points[0];
-    }
-    else {
-      int prev_idx = i - 1;
-      CLAMP_MIN(prev_idx, 0);
-      if (gps->dvert) {
-        dvert = &gps->dvert[prev_idx];
-      }
-      pt0 = &gps->points[prev_idx];
-      pt1 = &gps->points[i];
+    if (use_curve) {
+      float value = (float)i / (gps->totpoints - 1);
+      weight *= BKE_curvemapping_evaluateF(mmd->curve_intensity, 0, value);
     }
 
-    /* verify vertex group */
-    const float weight = get_modifier_point_weight(
-        dvert, (mmd->flag & GP_NOISE_INVERT_VGROUP) != 0, def_nr);
-    if (weight < 0.0f) {
-      continue;
-    }
+    int point_seed = (mmd->flag & GP_NOISE_FULL_STROKE) ? seed : BLI_hash_int_2d(seed, i + 1);
 
-    /* initial vector (p0 -> p1) */
-    if (i == 0) {
+    if (mmd->factor > 0.0f) {
+      /* Offset point randomly around the normal vector. */
+      bGPDspoint *pt0 = (gps->totpoints > 1 && i < gps->totpoints - 1) ? &gps->points[i] :
+                                                                         &gps->points[i - 1];
+      bGPDspoint *pt1 = (gps->totpoints > 1 && i < gps->totpoints - 1) ? &gps->points[i + 1] :
+                                                                  

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list