[Bf-blender-cvs] [eb5a25f4bcc] greasepencil-object: GPencil: Modifier: Cleanup Multiple Stroke modifier UI & code

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


Commit: eb5a25f4bcc7417f9e97dc902b0af99099f32a01
Author: Clément Foucault
Date:   Thu Mar 5 23:48:51 2020 +0100
Branches: greasepencil-object
https://developer.blender.org/rBeb5a25f4bcc7417f9e97dc902b0af99099f32a01

GPencil: Modifier: Cleanup Multiple Stroke modifier UI & code

- Reverse Opacity influence.
- Use BLI_listbase function to merge list (fixing a memleak)
- Some minor codestyle changes

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

M	source/blender/blenloader/intern/versioning_280.c
M	source/blender/gpencil_modifiers/intern/MOD_gpencilmultiply.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 97339ea2aea..64528129e9b 100644
--- a/source/blender/blenloader/intern/versioning_280.c
+++ b/source/blender/blenloader/intern/versioning_280.c
@@ -4634,6 +4634,11 @@ void blo_do_versions_280(FileData *fd, Library *UNUSED(lib), Main *bmain)
               }
               break;
             }
+            case eGpencilModifierType_Multiply: {
+              MultiplyGpencilModifierData *mmd = (MultiplyGpencilModifierData *)md;
+              mmd->fading_opacity = 1.0 - mmd->fading_opacity;
+              break;
+            }
             case eGpencilModifierType_Subdiv: {
               const short simple = (1 << 0);
               SubdivGpencilModifierData *mmd = (SubdivGpencilModifierData *)md;
diff --git a/source/blender/gpencil_modifiers/intern/MOD_gpencilmultiply.c b/source/blender/gpencil_modifiers/intern/MOD_gpencilmultiply.c
index aad0bad2f07..4f78bf8216a 100644
--- a/source/blender/gpencil_modifiers/intern/MOD_gpencilmultiply.c
+++ b/source/blender/gpencil_modifiers/intern/MOD_gpencilmultiply.c
@@ -67,7 +67,9 @@ static void initData(GpencilModifierData *md)
   mmd->duplications = 3;
   mmd->distance = 0.1f;
   mmd->split_angle = DEG2RADF(1.0f);
-  mmd->fading_opacity = 1.0f;
+  mmd->fading_center = 0.5f;
+  mmd->fading_thickness = 0.5f;
+  mmd->fading_opacity = 0.5f;
 }
 
 static void copyData(const GpencilModifierData *md, GpencilModifierData *target)
@@ -99,36 +101,35 @@ static void splitStroke(bGPDframe *gpf, bGPDstroke *gps, float split_angle)
 }
 
 static void minter_v3_v3v3v3_ref(
-    float *result, float *left, float *middle, float *right, float *stroke_normal)
+    float *result, float *prev, float *curr, float *next, float *stroke_normal)
 {
-  float left_arm[3], right_arm[3], inter1[3], inter2[3];
+  float vec[3], inter1[3], inter2[3];
   float minter[3];
-  if (left) {
-    sub_v3_v3v3(left_arm, middle, left);
-    cross_v3_v3v3(inter1, stroke_normal, left_arm);
+  if (prev) {
+    sub_v3_v3v3(vec, curr, prev);
+    cross_v3_v3v3(inter1, stroke_normal, vec);
   }
-  if (right) {
-    sub_v3_v3v3(right_arm, right, middle);
-    cross_v3_v3v3(inter2, stroke_normal, right_arm);
+  if (next) {
+    sub_v3_v3v3(vec, next, curr);
+    cross_v3_v3v3(inter2, stroke_normal, vec);
   }
-  if (!left) {
+  if (!prev) {
     normalize_v3(inter2);
     copy_v3_v3(result, inter2);
     return;
   }
-
-  if (!right) {
+  if (!next) {
     normalize_v3(inter1);
     copy_v3_v3(result, inter1);
     return;
   }
-
   interp_v3_v3v3(minter, inter1, inter2, 0.5);
   normalize_v3(minter);
   copy_v3_v3(result, minter);
 }
 
-static void duplicateStroke(bGPDstroke *gps,
+static void duplicateStroke(Object *ob,
+                            bGPDstroke *gps,
                             int count,
                             float dist,
                             float offset,
@@ -141,12 +142,13 @@ static void duplicateStroke(bGPDstroke *gps,
   int i;
   bGPDstroke *new_gps;
   float stroke_normal[3];
-  float minter[3];
   bGPDspoint *pt;
-  float offset_factor;
   float thickness_factor;
   float opacity_factor;
 
+  /* Apply object scale to offset distance. */
+  offset *= mat4_to_scale(ob->obmat);
+
   BKE_gpencil_stroke_normal(gps, stroke_normal);
   if (len_v3(stroke_normal) < FLT_EPSILON) {
     add_v3_fl(stroke_normal, 1);
@@ -161,6 +163,7 @@ static void duplicateStroke(bGPDstroke *gps,
   pt = gps->points;
 
   for (int j = 0; j < gps->totpoints; j++) {
+    float minter[3];
     if (j == 0) {
       minter_v3_v3v3v3_ref(minter, NULL, &pt[j].x, &pt[j + 1].x, stroke_normal);
     }
@@ -175,11 +178,11 @@ static void duplicateStroke(bGPDstroke *gps,
     sub_v3_v3v3(&t2_array[j * 3], &pt[j].x, minter);
   }
 
-  /* This ensures the original stroke is the last one to be processed. */
+  /* This ensures the original stroke is the last one
+   * to be processed, since we duplicate its data. */
   for (i = count - 1; i >= 0; i--) {
     if (i != 0) {
       new_gps = BKE_gpencil_stroke_duplicate(gps, true);
-
       BLI_addtail(results, new_gps);
     }
     else {
@@ -188,28 +191,16 @@ static void duplicateStroke(bGPDstroke *gps,
 
     pt = new_gps->points;
 
-    if (count == 1) {
-      offset_factor = 0;
-    }
-    else {
-      offset_factor = (float)i / (float)(count - 1);
-    }
+    float offset_fac = (count == 1) ? 0.5f : (i / (float)(count - 1));
 
     if (fading) {
-      thickness_factor = (offset_factor > fading_center) ?
-                             (interpf(1 - fading_thickness, 1.0f, offset_factor - fading_center)) :
-                             (interpf(
-                                 1.0f, 1 - fading_thickness, offset_factor - fading_center + 1));
-      opacity_factor = (offset_factor > fading_center) ?
-                           (interpf(fading_opacity, 1.0f, offset_factor - fading_center)) :
-                           (interpf(1.0f, fading_opacity, offset_factor - fading_center + 1));
+      thickness_factor = interpf(1.0f - fading_thickness, 1.0f, fabsf(offset_fac - fading_center));
+      opacity_factor = interpf(1.0f - fading_opacity, 1.0f, fabsf(offset_fac - fading_center));
     }
 
     for (int j = 0; j < new_gps->totpoints; j++) {
-      interp_v3_v3v3(&pt[j].x,
-                     &t1_array[j * 3],
-                     &t2_array[j * 3],
-                     interpf(1 + offset, offset, offset_factor));
+      float fac = interpf(1 + offset, offset, offset_fac);
+      interp_v3_v3v3(&pt[j].x, &t1_array[j * 3], &t2_array[j * 3], fac);
       if (fading) {
         pt[j].pressure = gps->points[j].pressure * thickness_factor;
         pt[j].strength = gps->points[j].strength * opacity_factor;
@@ -228,7 +219,6 @@ static void bakeModifier(Main *UNUSED(bmain),
                          GpencilModifierData *md,
                          Object *ob)
 {
-
   bGPdata *gpd = ob->data;
 
   LISTBASE_FOREACH (bGPDlayer *, gpl, &gpd->layers) {
@@ -255,7 +245,8 @@ static void bakeModifier(Main *UNUSED(bmain),
           splitStroke(gpf, gps, mmd->split_angle);
         }
         if (mmd->duplications > 0) {
-          duplicateStroke(gps,
+          duplicateStroke(ob,
+                          gps,
                           mmd->duplications,
                           mmd->distance,
                           mmd->offset,
@@ -266,10 +257,8 @@ static void bakeModifier(Main *UNUSED(bmain),
                           mmd->fading_opacity);
         }
       }
-      if (duplicates.first) {
-        ((bGPDstroke *)gpf->strokes.last)->next = duplicates.first;
-        ((bGPDstroke *)duplicates.first)->prev = gpf->strokes.last;
-        gpf->strokes.last = duplicates.first;
+      if (!BLI_listbase_is_empty(&duplicates)) {
+        BLI_movelisttolist(&gpf->strokes, &duplicates);
       }
     }
   }
@@ -300,7 +289,8 @@ static void generate_geometry(GpencilModifierData *md, Object *ob, bGPDlayer *gp
       splitStroke(gpf, gps, mmd->split_angle);
     }
     if (mmd->duplications > 0) {
-      duplicateStroke(gps,
+      duplicateStroke(ob,
+                      gps,
                       mmd->duplications,
                       mmd->distance,
                       mmd->offset,
@@ -311,10 +301,8 @@ static void generate_geometry(GpencilModifierData *md, Object *ob, bGPDlayer *gp
                       mmd->fading_opacity);
     }
   }
-  if (duplicates.first) {
-    ((bGPDstroke *)gpf->strokes.last)->next = duplicates.first;
-    ((bGPDstroke *)duplicates.first)->prev = gpf->strokes.last;
-    gpf->strokes.last = duplicates.first;
+  if (!BLI_listbase_is_empty(&duplicates)) {
+    BLI_movelisttolist(&gpf->strokes, &duplicates);
   }
 }
 
diff --git a/source/blender/makesrna/intern/rna_gpencil_modifier.c b/source/blender/makesrna/intern/rna_gpencil_modifier.c
index e43f2fd68ec..631544ae182 100644
--- a/source/blender/makesrna/intern/rna_gpencil_modifier.c
+++ b/source/blender/makesrna/intern/rna_gpencil_modifier.c
@@ -1943,7 +1943,8 @@ static void rna_def_modifier_gpencilmultiply(BlenderRNA *brna)
 
   prop = RNA_def_property(srna, "use_fade", PROP_BOOLEAN, PROP_NONE);
   RNA_def_property_boolean_sdna(prop, NULL, "flags", GP_MULTIPLY_ENABLE_FADING);
-  RNA_def_property_ui_text(prop, "Enable Fade", "Enable fade");
+  RNA_def_property_ui_text(
+      prop, "Enable Fade", "Fade the stroke thickness for each generated stroke");
   RNA_def_property_update(prop, 0, "rna_GpencilModifier_update");
 
   prop = RNA_def_property(srna, "split_angle", PROP_FLOAT, PROP_ANGLE);
@@ -1954,17 +1955,19 @@ static void rna_def_modifier_gpencilmultiply(BlenderRNA *brna)
 
   prop = RNA_def_property(srna, "duplicates", PROP_INT, PROP_NONE);
   RNA_def_property_int_sdna(prop, NULL, "duplications");
-  RNA_def_property_range(prop, 0, 10);
+  RNA_def_property_range(prop, 0, 999);
+  RNA_def_property_ui_range(prop, 1, 10, 1, 1);
   RNA_def_property_ui_text(prop, "Duplicates", "How many copies of strokes be displayed");
   RNA_def_property_update(prop, 0, "rna_GpencilModifier_update");
 
-  prop = RNA_def_property(srna, "distance", PROP_FLOAT, PROP_NONE);
-  RNA_def_property_range(prop, 0, M_PI);
+  prop = RNA_def_property(srna, "distance", PROP_FLOAT, PROP_DISTANCE);
+  RNA_def_property_range(prop, -FLT_MAX, FLT_MAX);
+  RNA_def_property_ui_range(prop, 0.0, 1.0, 0.01, 3);
   RNA_def_property_ui_text(prop, "Distance", "Distance of duplications");
   RNA_def_property_update(prop, 0, "rna_GpencilModifier_update");
 
   prop = RNA_def_property(srna, "offset", PROP_FLOAT, PROP_NONE);
-  RNA_def_property_ui_range(prop, -1, 1, 0.1, 3);
+  RNA_def_property_ui_range(prop, -1, 1, 0.01, 3);
   RNA_def_property_ui_text(prop, "Offset", "Offset of duplicates. -1 to 1: inner to outer");
   RNA_def_property_update(prop, 0, "rna_GpencilModifier_update");
 
@@ -1980,8 +1983,9 @@ static void rna_def_modifier_gpencilmultiply(BlenderRNA *brna)
   RNA_def_property_ui_text(prop, "Opacity", "Fade influence of stroke's opacity");
   RNA_def_property_update(prop, 0, "rna_GpencilModifier_update");
 
-  prop = RNA_def_property(srna, "fading_center", PROP_FLOAT, PROP_NONE);
+  prop = RNA_def_property(srna, "fading_center", PROP_FLOAT, PROP_FACTOR);
 

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list