[Bf-blender-cvs] [b6025e1a0b7] greasepencil-object: GPencil: Improve Array random offset calculation

Antonio Vazquez noreply at git.blender.org
Fri Feb 28 16:36:38 CET 2020


Commit: b6025e1a0b70027cc73d5f47c4b13596e8eba332
Author: Antonio Vazquez
Date:   Fri Feb 28 16:36:21 2020 +0100
Branches: greasepencil-object
https://developer.blender.org/rBb6025e1a0b70027cc73d5f47c4b13596e8eba332

GPencil: Improve Array random offset calculation

Now the randomness cannot be greater that the segment (constant or bounding box).

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

M	source/blender/blenloader/intern/versioning_280.c
M	source/blender/gpencil_modifiers/intern/MOD_gpencilarray.c
M	source/blender/makesrna/intern/rna_gpencil_modifier.c

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

diff --git a/source/blender/blenloader/intern/versioning_280.c b/source/blender/blenloader/intern/versioning_280.c
index a09c29c29a2..81d69ca474e 100644
--- a/source/blender/blenloader/intern/versioning_280.c
+++ b/source/blender/blenloader/intern/versioning_280.c
@@ -4479,6 +4479,7 @@ void blo_do_versions_280(FileData *fd, Library *UNUSED(lib), Main *bmain)
           switch (mti->type) {
             case eGpencilModifierType_Array: {
               ArrayGpencilModifierData *mmd = (ArrayGpencilModifierData *)md;
+              mmd->seed = 1;
               if ((mmd->offset[0] != 0.0f) || (mmd->offset[1] != 0.0f) ||
                   (mmd->offset[2] != 0.0f)) {
                 mmd->flag |= GP_ARRAY_USE_OFFSET;
diff --git a/source/blender/gpencil_modifiers/intern/MOD_gpencilarray.c b/source/blender/gpencil_modifiers/intern/MOD_gpencilarray.c
index 123a5f90b2d..185f0dc21bc 100644
--- a/source/blender/gpencil_modifiers/intern/MOD_gpencilarray.c
+++ b/source/blender/gpencil_modifiers/intern/MOD_gpencilarray.c
@@ -107,13 +107,6 @@ static void BKE_gpencil_instance_modifier_instance_tfm(Object *ob,
     zero_v3(offset);
   }
 
-  /* Random constant offset */
-  if (mmd->flag & GP_ARRAY_RANDOM_OFFSET) {
-    float rnd_offset[3];
-    mul_v3_v3fl(rnd_offset, mmd->offset, mmd->rnd_offset * mmd->rnd[ri]);
-    add_v3_v3(offset, rnd_offset);
-  }
-
   /* rotation */
   if (mmd->flag & GP_ARRAY_RANDOM_ROT) {
     factor = mmd->rnd_rot * mmd->rnd[ri];
@@ -175,6 +168,8 @@ static void generate_geometry(GpencilModifierData *md,
   bool found = false;
   int ri = 1;
 
+  float max_offset[3], max_shift[3];
+
   /* Get bounbox for relative offset. */
   float size[3] = {0.0f, 0.0f, 0.0f};
   if (mmd->flag & GP_ARRAY_USE_RELATIVE) {
@@ -184,8 +179,13 @@ static void generate_geometry(GpencilModifierData *md,
       BKE_boundbox_init_from_minmax(bb, min, max);
     }
     BKE_boundbox_calc_size_aabb(bb, size);
+    /* Calc relative random maximum size. */
+    mul_v3_v3v3(max_shift, size, mmd->shift);
+
     mul_v3_fl(size, 2.0f);
   }
+  /* Save constant random maximum size. */
+  mul_v3_v3fl(max_offset, mmd->offset, 1.0f);
 
   LISTBASE_FOREACH (bGPDlayer *, gpl, &gpd->layers) {
     bGPDframe *gpf = BKE_gpencil_frame_retime_get(depsgraph, scene, ob, gpl);
@@ -241,6 +241,18 @@ static void generate_geometry(GpencilModifierData *md,
       else {
         copy_m4_m4(current_offset, mat);
       }
+
+      /* Apply constant random offset. */
+      if ((mmd->flag & GP_ARRAY_USE_OFFSET) && (mmd->flag & GP_ARRAY_RANDOM_OFFSET)) {
+        float off[3];
+        mul_v3_v3fl(off, max_offset, clamp_f(mmd->rnd_offset * mmd->rnd[ri], 0.0f, 1.0f));
+        /* For adding more randomness, check direction. */
+        if (mmd->rnd[20 - ri] < 0.5f) {
+          mul_v3_fl(off, -1.0f);
+        }
+        add_v3_v3(current_offset[3], off);
+      }
+
       /* Apply relative offset. */
       if (mmd->flag & GP_ARRAY_USE_RELATIVE) {
         float relative[3];
@@ -249,9 +261,13 @@ static void generate_geometry(GpencilModifierData *md,
 
         /* Random relative offset. */
         if (mmd->flag & GP_ARRAY_RANDOM_RELATIVE) {
-          float rnd_shift[3];
-          mul_v3_v3fl(rnd_shift, mmd->shift, mmd->rnd_relative * mmd->rnd[ri]);
-          add_v3_v3(current_offset[3], rnd_shift);
+          float off[3];
+          mul_v3_v3fl(off, max_shift, clamp_f(mmd->rnd_relative * mmd->rnd[ri], 0.0f, 1.0f));
+          /* For adding more randomness, check direction. */
+          if (mmd->rnd[20 - ri] < 0.5f) {
+            mul_v3_fl(off, -1.0f);
+          }
+          add_v3_v3(current_offset[3], off);
         }
       }
 
diff --git a/source/blender/makesrna/intern/rna_gpencil_modifier.c b/source/blender/makesrna/intern/rna_gpencil_modifier.c
index a45c9fbd1e8..161367b2335 100644
--- a/source/blender/makesrna/intern/rna_gpencil_modifier.c
+++ b/source/blender/makesrna/intern/rna_gpencil_modifier.c
@@ -1336,7 +1336,7 @@ static void rna_def_modifier_gpencilarray(BlenderRNA *brna)
   prop = RNA_def_property(srna, "rot_factor", PROP_FLOAT, PROP_NONE);
   RNA_def_property_float_sdna(prop, NULL, "rnd_rot");
   RNA_def_property_ui_text(prop, "Rotation Factor", "Random factor for rotation");
-  RNA_def_property_range(prop, -10.0, 10.0);
+  RNA_def_property_range(prop, -FLT_MAX, FLT_MAX);
   RNA_def_property_update(prop, 0, "rna_GpencilModifier_update");
 
   prop = RNA_def_property(srna, "use_random_scale", PROP_BOOLEAN, PROP_NONE);
@@ -1347,18 +1347,18 @@ static void rna_def_modifier_gpencilarray(BlenderRNA *brna)
   prop = RNA_def_property(srna, "scale_factor", PROP_FLOAT, PROP_NONE);
   RNA_def_property_float_sdna(prop, NULL, "rnd_size");
   RNA_def_property_ui_text(prop, "Scale Factor", "Random factor for scale");
-  RNA_def_property_range(prop, -10.0, 10.0);
+  RNA_def_property_range(prop, -FLT_MAX, FLT_MAX);
   RNA_def_property_update(prop, 0, "rna_GpencilModifier_update");
 
   prop = RNA_def_property(srna, "random_offset_factor", PROP_FLOAT, PROP_NONE);
   RNA_def_property_float_sdna(prop, NULL, "rnd_offset");
   RNA_def_property_ui_text(prop, "Random Factor", "Random factor for constant offset");
-  RNA_def_property_range(prop, -10.0, 10.0);
+  RNA_def_property_range(prop, 0, FLT_MAX);
   RNA_def_property_update(prop, 0, "rna_GpencilModifier_update");
 
   prop = RNA_def_property(srna, "random_relative_factor", PROP_FLOAT, PROP_NONE);
   RNA_def_property_float_sdna(prop, NULL, "rnd_relative");
-  RNA_def_property_range(prop, -10.0, 10.0);
+  RNA_def_property_range(prop, 0, FLT_MAX);
   RNA_def_property_ui_text(prop, "Random Factor", "Random factor for relative offset");
   RNA_def_property_update(prop, 0, "rna_GpencilModifier_update");



More information about the Bf-blender-cvs mailing list