[Bf-blender-cvs] [eacb3de0f73] greasepencil-object: GPencil: Change evaluation order for modifiers

Antonio Vazquez noreply at git.blender.org
Tue Feb 25 11:55:25 CET 2020


Commit: eacb3de0f73dce7db849d00230d13b5837a91999
Author: Antonio Vazquez
Date:   Tue Feb 25 11:10:07 2020 +0100
Branches: greasepencil-object
https://developer.blender.org/rBeacb3de0f73dce7db849d00230d13b5837a91999

GPencil: Change evaluation order for modifiers

Now the loop of modifiers is done before the loop of layers. This will be required to make changes in array modifier and it's more logic.

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

M	source/blender/blenkernel/BKE_gpencil_modifier.h
M	source/blender/blenkernel/intern/gpencil_modifier.c
M	source/blender/gpencil_modifiers/intern/MOD_gpencilarray.c
M	source/blender/gpencil_modifiers/intern/MOD_gpencilbuild.c
M	source/blender/gpencil_modifiers/intern/MOD_gpencilmirror.c
M	source/blender/gpencil_modifiers/intern/MOD_gpencilmultiply.c

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

diff --git a/source/blender/blenkernel/BKE_gpencil_modifier.h b/source/blender/blenkernel/BKE_gpencil_modifier.h
index 4ab884ff5de..10bc4aef40b 100644
--- a/source/blender/blenkernel/BKE_gpencil_modifier.h
+++ b/source/blender/blenkernel/BKE_gpencil_modifier.h
@@ -137,20 +137,10 @@ typedef struct GpencilModifierTypeInfo {
   /**
    * Callback for GP "geometry" modifiers that create extra geometry
    * in the frame (e.g. Array)
-   *
-   * The gpf parameter contains the GP frame/strokes to operate on. This is
-   * usually a copy of the original (unmodified and saved to files) stroke data.
-   * Modifiers should only add any generated strokes to this frame (and not one accessed
-   * via the gpl parameter).
-   *
-   * The modifier_index parameter indicates where the modifier is
-   * in the modifier stack in relation to other modifiers.
    */
   void (*generateStrokes)(struct GpencilModifierData *md,
                           struct Depsgraph *depsgraph,
-                          struct Object *ob,
-                          struct bGPDlayer *gpl,
-                          struct bGPDframe *gpf);
+                          struct Object *ob);
 
   /**
    * Bake-down GP modifier's effects into the GP data-block.
@@ -303,4 +293,10 @@ void BKE_gpencil_modifiers_calc(struct Depsgraph *depsgraph,
 void BKE_gpencil_prepare_eval_data(struct Depsgraph *depsgraph,
                                    struct Scene *scene,
                                    struct Object *ob);
+
+struct bGPDframe *BKE_gpencil_frame_retime_get(struct Depsgraph *depsgraph,
+                                               struct Scene *scene,
+                                               struct Object *ob,
+                                               struct bGPDlayer *gpl);
+
 #endif /* __BKE_GPENCIL_MODIFIER_H__ */
diff --git a/source/blender/blenkernel/intern/gpencil_modifier.c b/source/blender/blenkernel/intern/gpencil_modifier.c
index 5a257dd5304..878f1933e8f 100644
--- a/source/blender/blenkernel/intern/gpencil_modifier.c
+++ b/source/blender/blenkernel/intern/gpencil_modifier.c
@@ -748,6 +748,18 @@ static int gpencil_remap_time_get(Depsgraph *depsgraph, Scene *scene, Object *ob
   return remap_cfra;
 }
 
+/* Get the current frame retimed with time modifiers. */
+bGPDframe *BKE_gpencil_frame_retime_get(Depsgraph *depsgraph,
+                                        Scene *scene,
+                                        Object *ob,
+                                        bGPDlayer *gpl)
+{
+  int remap_cfra = gpencil_remap_time_get(depsgraph, scene, ob, gpl);
+  bGPDframe *gpf = BKE_gpencil_layer_frame_get(gpl, remap_cfra, GP_GETFRAME_USE_PREV);
+
+  return gpf;
+}
+
 static void gpencil_assign_object_eval(Object *object)
 {
   BLI_assert(object->id.tag & LIB_TAG_COPIED_ON_WRITE);
@@ -862,32 +874,28 @@ void BKE_gpencil_modifiers_calc(Depsgraph *depsgraph, Scene *scene, Object *ob)
   /* Init general modifiers data. */
   BKE_gpencil_lattice_init(ob);
 
-  /* Loop all layers and apply modifiers. */
-  LISTBASE_FOREACH (bGPDlayer *, gpl, &gpd->layers) {
-    /* Remap frame (Time modifier) */
-    int remap_cfra = gpencil_remap_time_get(depsgraph, scene, ob, gpl);
-    bGPDframe *gpf = BKE_gpencil_layer_frame_get(gpl, remap_cfra, GP_GETFRAME_USE_PREV);
-
-    if (gpf == NULL) {
-      continue;
-    }
+  LISTBASE_FOREACH (GpencilModifierData *, md, &ob->greasepencil_modifiers) {
 
-    LISTBASE_FOREACH (GpencilModifierData *, md, &ob->greasepencil_modifiers) {
+    if (GPENCIL_MODIFIER_ACTIVE(md, is_render)) {
+      const GpencilModifierTypeInfo *mti = BKE_gpencil_modifierType_getInfo(md->type);
 
-      if (GPENCIL_MODIFIER_ACTIVE(md, is_render)) {
-        const GpencilModifierTypeInfo *mti = BKE_gpencil_modifierType_getInfo(md->type);
+      if ((GPENCIL_MODIFIER_EDIT(md, is_edit)) && (!is_render)) {
+        continue;
+      }
 
-        if ((GPENCIL_MODIFIER_EDIT(md, is_edit)) && (!is_render)) {
-          continue;
-        }
+      /* Apply geometry modifiers (add new geometry). */
+      if (mti && mti->generateStrokes) {
+        mti->generateStrokes(md, depsgraph, ob);
+      }
 
-        /* Apply geometry modifiers (add new geometry). */
-        if (mti->generateStrokes) {
-          mti->generateStrokes(md, depsgraph, ob, gpl, gpf);
-        }
+      /* Apply deform modifiers (only change geometry). */
+      if (mti && mti->deformStroke) {
+        LISTBASE_FOREACH (bGPDlayer *, gpl, &gpd->layers) {
+          bGPDframe *gpf = BKE_gpencil_frame_retime_get(depsgraph, scene, ob, gpl);
+          if (gpf == NULL) {
+            continue;
+          }
 
-        /* Apply deform modifiers (only change geometry). */
-        if (mti && mti->deformStroke) {
           LISTBASE_FOREACH (bGPDstroke *, gps, &gpf->strokes) {
             mti->deformStroke(md, depsgraph, ob, gpl, gpf, gps);
           }
diff --git a/source/blender/gpencil_modifiers/intern/MOD_gpencilarray.c b/source/blender/gpencil_modifiers/intern/MOD_gpencilarray.c
index a0aa2169cd6..cceec9740d9 100644
--- a/source/blender/gpencil_modifiers/intern/MOD_gpencilarray.c
+++ b/source/blender/gpencil_modifiers/intern/MOD_gpencilarray.c
@@ -142,11 +142,7 @@ static void BKE_gpencil_instance_modifier_instance_tfm(Object *ob,
 }
 
 /* array modifier - generate geometry callback (for viewport/rendering) */
-static void generate_geometry(GpencilModifierData *md,
-                              Depsgraph *UNUSED(depsgraph),
-                              Object *ob,
-                              bGPDlayer *gpl,
-                              bGPDframe *gpf)
+static void generate_geometry(GpencilModifierData *md, Object *ob, bGPDlayer *gpl, bGPDframe *gpf)
 {
   ArrayGpencilModifierData *mmd = (ArrayGpencilModifierData *)md;
   ListBase stroke_cache = {NULL, NULL};
@@ -276,7 +272,7 @@ static void bakeModifier(Main *UNUSED(bmain),
 
   LISTBASE_FOREACH (bGPDlayer *, gpl, &gpd->layers) {
     LISTBASE_FOREACH (bGPDframe *, gpf, &gpl->frames) {
-      generate_geometry(md, depsgraph, ob, gpl, gpf);
+      generate_geometry(md, ob, gpl, gpf);
     }
   }
 }
@@ -284,10 +280,18 @@ static void bakeModifier(Main *UNUSED(bmain),
 /* -------------------------------- */
 
 /* Generic "generateStrokes" callback */
-static void generateStrokes(
-    GpencilModifierData *md, Depsgraph *depsgraph, Object *ob, bGPDlayer *gpl, bGPDframe *gpf)
+static void generateStrokes(GpencilModifierData *md, Depsgraph *depsgraph, Object *ob)
 {
-  generate_geometry(md, depsgraph, ob, gpl, gpf);
+  Scene *scene = DEG_get_evaluated_scene(depsgraph);
+  bGPdata *gpd = (bGPdata *)ob->data;
+
+  LISTBASE_FOREACH (bGPDlayer *, gpl, &gpd->layers) {
+    bGPDframe *gpf = BKE_gpencil_frame_retime_get(depsgraph, scene, ob, gpl);
+    if (gpf == NULL) {
+      continue;
+    }
+    generate_geometry(md, ob, gpl, gpf);
+  }
 }
 
 static void updateDepsgraph(GpencilModifierData *md, const ModifierUpdateDepsgraphContext *ctx)
diff --git a/source/blender/gpencil_modifiers/intern/MOD_gpencilbuild.c b/source/blender/gpencil_modifiers/intern/MOD_gpencilbuild.c
index 2437beb1992..396ef627c50 100644
--- a/source/blender/gpencil_modifiers/intern/MOD_gpencilbuild.c
+++ b/source/blender/gpencil_modifiers/intern/MOD_gpencilbuild.c
@@ -398,19 +398,13 @@ static void build_concurrent(BuildGpencilModifierData *mmd, bGPDframe *gpf, floa
 }
 
 /* --------------------------------------------- */
-
-/* Entry-point for Build Modifier */
-static void generateStrokes(GpencilModifierData *md,
-                            Depsgraph *depsgraph,
-                            Object *UNUSED(ob),
-                            bGPDlayer *gpl,
-                            bGPDframe *gpf)
+static void generate_geometry(
+    GpencilModifierData *md, Depsgraph *depsgraph, Object *ob, bGPDlayer *gpl, bGPDframe *gpf)
 {
   BuildGpencilModifierData *mmd = (BuildGpencilModifierData *)md;
   const bool reverse = (mmd->transition != GP_BUILD_TRANSITION_GROW);
 
   const float ctime = DEG_get_ctime(depsgraph);
-  // printf("GP Build Modifier - %f\n", ctime);
 
   /* Early exit if it's an empty frame */
   if (gpf->strokes.first == NULL) {
@@ -504,7 +498,6 @@ static void generateStrokes(GpencilModifierData *md,
 
   /* Determine how far along we are between the keyframes */
   float fac = (ctime - start_frame) / (end_frame - start_frame);
-  // printf("  Progress on %d = %f (%f - %f)\n", gpf->framenum, fac, start_frame, end_frame);
 
   /* Time management mode */
   switch (mmd->mode) {
@@ -524,6 +517,21 @@ static void generateStrokes(GpencilModifierData *md,
   }
 }
 
+/* Entry-point for Build Modifier */
+static void generateStrokes(GpencilModifierData *md, Depsgraph *depsgraph, Object *ob)
+{
+  Scene *scene = DEG_get_evaluated_scene(depsgraph);
+  bGPdata *gpd = (bGPdata *)ob->data;
+
+  LISTBASE_FOREACH (bGPDlayer *, gpl, &gpd->layers) {
+    bGPDframe *gpf = BKE_gpencil_frame_retime_get(depsgraph, scene, ob, gpl);
+    if (gpf == NULL) {
+      continue;
+    }
+    generate_geometry(md, depsgraph, ob, gpl, gpf);
+  }
+}
+
 /* ******************************************** */
 
 GpencilModifierTypeInfo modifierType_Gpencil_Build = {
diff --git a/source/blender/gpencil_modifiers/intern/MOD_gpencilmirror.c b/source/blender/gpencil_modifiers/intern/MOD_gpencilmirror.c
index 75d160cd833..0f9b1034352 100644
--- a/source/blender/gpencil_modifiers/intern/MOD_gpencilmirror.c
+++ b/source/blender/gpencil_modifiers/intern/MOD_gpencilmirror.c
@@ -113,12 +113,7 @@ static void update_position(Object *ob, MirrorGpencilModifierData *mmd, bGPDstro
   }
 }
 
-/* Generic "generateStrokes" callback */
-static void generateStrokes(GpencilModifierData *md,
-                            Depsgraph *UNUSED(depsgraph),
-                            Object *ob,
-                            bGPDlayer *gpl,
-                            bGPDframe *gpf)
+static void generate_geometry(GpencilModifierData *md, Object *ob, bGPDlayer *gpl, bGPDframe *gpf)
 {
   MirrorGpencilModifierData *mmd = (MirrorGpencilModifierData *)md;
   bGPDstroke *gps, *gps_new = NULL;
@@ -154,6 +149,21 @@ static void generateStrokes(GpencilModifierData *md,
   }
 }
 
+/* Generic "generateStrokes" callback */
+static void generateStrokes(Gpenc

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list