[Bf-blender-cvs] [09f72c5dba3] lanpr-under-gp: LANPR: Auto update for modifier now works in dg.

YimingWu noreply at git.blender.org
Sun Jun 28 11:26:58 CEST 2020


Commit: 09f72c5dba3a80be26fb36a8aefebdb2dd593868
Author: YimingWu
Date:   Sun Jun 28 17:26:43 2020 +0800
Branches: lanpr-under-gp
https://developer.blender.org/rB09f72c5dba3a80be26fb36a8aefebdb2dd593868

LANPR: Auto update for modifier now works in dg.

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

M	source/blender/editors/include/ED_lineart.h
M	source/blender/editors/lineart/lineart_cpu.c
M	source/blender/gpencil_modifiers/intern/MOD_gpencillineart.c
M	source/blender/makesrna/intern/rna_gpencil_modifier.c

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

diff --git a/source/blender/editors/include/ED_lineart.h b/source/blender/editors/include/ED_lineart.h
index 524bc9f5bdb..39ae8ce8033 100644
--- a/source/blender/editors/include/ED_lineart.h
+++ b/source/blender/editors/include/ED_lineart.h
@@ -261,6 +261,12 @@ typedef enum eLineartInitStatus {
   LRT_INIT_LOCKS = (1 << 1),
 } eLineartInitStatus;
 
+typedef enum eLineartModifierSyncStatus {
+  LRT_SYNC_IDLE = 0,
+  LRT_SYNC_WAITING = 1,
+  LRT_SYNC_FRESH = 2,
+} eLineartModifierSyncStatus;
+
 typedef struct LineartSharedResource {
 
   /* We only allocate once for all */
@@ -282,6 +288,7 @@ typedef struct LineartSharedResource {
    */
   SpinLock lock_render_status;
   eLineartRenderStatus flag_render_status;
+  eLineartModifierSyncStatus fflag_sync_staus;
 
   /** Geometry loading is done in the worker thread,
    * Lock the render thread until loading is done, so that
@@ -490,6 +497,9 @@ void *ED_lineart_make_leveled_edge_vertex_array(struct LineartRenderBuffer *rb,
 void ED_lineart_calculation_set_flag(eLineartRenderStatus flag);
 bool ED_lineart_calculation_flag_check(eLineartRenderStatus flag);
 
+void ED_lineart_modifier_sync_set_flag(eLineartModifierSyncStatus flag, bool is_from_modifier);
+bool ED_lineart_modifier_sync_flag_check(eLineartModifierSyncStatus flag);
+
 int ED_lineart_compute_feature_lines_internal(struct Depsgraph *depsgraph,
                                               const int instersections_only);
 
diff --git a/source/blender/editors/lineart/lineart_cpu.c b/source/blender/editors/lineart/lineart_cpu.c
index 253f58d5fb2..078a9e0ff52 100644
--- a/source/blender/editors/lineart/lineart_cpu.c
+++ b/source/blender/editors/lineart/lineart_cpu.c
@@ -35,6 +35,7 @@
 #include "BKE_context.h"
 #include "BKE_customdata.h"
 #include "BKE_gpencil.h"
+#include "BKE_gpencil_modifier.h"
 #include "BKE_object.h"
 #include "BKE_report.h"
 #include "BKE_scene.h"
@@ -2651,6 +2652,24 @@ bool ED_lineart_calculation_flag_check(eLineartRenderStatus flag)
   return match;
 }
 
+void ED_lineart_modifier_sync_set_flag(eLineartModifierSyncStatus flag, bool is_from_modifier)
+{
+  BLI_spin_lock(&lineart_share.lock_render_status);
+
+  lineart_share.fflag_sync_staus = flag;
+
+  BLI_spin_unlock(&lineart_share.lock_render_status);
+}
+
+bool ED_lineart_modifier_sync_flag_check(eLineartModifierSyncStatus flag)
+{
+  bool match;
+  BLI_spin_lock(&lineart_share.lock_render_status);
+  match = (lineart_share.fflag_sync_staus == flag);
+  BLI_spin_unlock(&lineart_share.lock_render_status);
+  return match;
+}
+
 static int lineart_max_occlusion_in_collections(Collection *c)
 {
   CollectionChild *cc;
@@ -3824,11 +3843,17 @@ typedef struct LRT_FeatureLineWorker {
 } LRT_FeatureLineWorker;
 
 static void lineart_update_gp_strokes_actual(Scene *scene, Depsgraph *dg);
+static void lineart_notify_gpencil_targets(Depsgraph *dg);
 
 static void lineart_compute_feature_lines_worker(TaskPool *__restrict UNUSED(pool),
                                                  LRT_FeatureLineWorker *worker_data)
 {
   ED_lineart_compute_feature_lines_internal(worker_data->dg, worker_data->intersection_only);
+
+  /* Calculation is done, give fresh data. */
+  ED_lineart_modifier_sync_set_flag(LRT_SYNC_FRESH, false);
+
+  lineart_notify_gpencil_targets(worker_data->dg);
   // lineart_update_gp_strokes_actual(DEG_get_evaluated_scene(worker_data->dg), worker_data->dg);
   ED_lineart_calculation_set_flag(LRT_RENDER_FINISHED);
 }
@@ -3842,7 +3867,7 @@ void ED_lineart_compute_feature_lines_background(Depsgraph *dg, const int inters
 
   /* If the calculation is already started then bypass it. */
   if (ED_lineart_calculation_flag_check(LRT_RENDER_RUNNING)) {
-    /* Release lock when early return. */
+    /* Release lock when early return. TODO: Canceling */
     BLI_spin_unlock(&lineart_share.lock_loader);
     return;
   }
@@ -3922,6 +3947,22 @@ void SCENE_OT_lineart_calculate_feature_lines(wmOperatorType *ot)
 
 /* Grease Pencil bindings */
 
+static void lineart_notify_gpencil_targets(Depsgraph *dg)
+{
+  DEG_OBJECT_ITER_BEGIN (dg,
+                         o,
+                         DEG_ITER_OBJECT_FLAG_LINKED_DIRECTLY | DEG_ITER_OBJECT_FLAG_VISIBLE |
+                             DEG_ITER_OBJECT_FLAG_DUPLI | DEG_ITER_OBJECT_FLAG_LINKED_VIA_SET) {
+    if (o->type == OB_GPENCIL) {
+      if (BKE_gpencil_modifiers_findby_type(o, eGpencilModifierType_Lineart)) {
+        bGPdata *gpd = ((Object *)o->id.orig_id)->data;
+        DEG_id_tag_update(&gpd->id, ID_RECALC_GEOMETRY);
+      }
+    }
+  }
+  DEG_OBJECT_ITER_END;
+}
+
 /* returns flags from LineartEdgeFlag */
 static int lineart_object_line_types(Object *ob)
 {
@@ -3961,13 +4002,15 @@ void ED_lineart_generate_gpencil_from_chain(Depsgraph *depsgraph,
 
   if ((!lineart_share.init_complete) || !ED_lineart_calculation_flag_check(LRT_RENDER_FINISHED)) {
     /* cache not ready */
+    printf("Line art cache not ready.\n");
     return;
   }
   else {
     /* lock the cache, prevent rendering job from starting */
     BLI_spin_lock(&lineart_share.lock_render_status);
   }
-
+  static int tempnum = 0;
+  tempnum++;
   int color_idx = 0;
   short thickness = 100;
 
@@ -3991,7 +4034,7 @@ void ED_lineart_generate_gpencil_from_chain(Depsgraph *depsgraph,
     if (rlc->level > level_end || rlc->level < level_start) {
       continue;
     }
-    if (ob && &ob->id != rlc->object_ref) {
+    if (ob && ob->id.orig_id != rlc->object_ref->id.orig_id) {
       /* Note: not object_ref and ob are both (same?) copy on write data, if legacy mode, use
        * object_ref->id.orig_id. Same below.
        * TODO? Should we always use orig_id in the future? */
@@ -4485,12 +4528,19 @@ void ED_lineart_post_frame_update_external(Scene *s, Depsgraph *dg)
   if ((s->lineart.flags & LRT_ENABLED) == 0 || !(s->lineart.flags & LRT_AUTO_UPDATE)) {
     return;
   }
-  if (s->lineart.flags & LRT_AUTO_UPDATE) {
-    ED_lineart_compute_feature_lines_background(dg, 0);
+  if (ED_lineart_modifier_sync_flag_check(LRT_SYNC_WAITING)) {
+    /* Modifier is waiting for data, trigger update (will wait/cancel if already running) */
+    if (s->lineart.flags & LRT_AUTO_UPDATE) {
+      ED_lineart_compute_feature_lines_background(dg, 0);
 
-    /* Wait for loading finish */
-    BLI_spin_lock(&lineart_share.lock_loader);
-    BLI_spin_unlock(&lineart_share.lock_loader);
+      /* Wait for loading finish */
+      BLI_spin_lock(&lineart_share.lock_loader);
+      BLI_spin_unlock(&lineart_share.lock_loader);
+    }
+  }
+  else if (ED_lineart_modifier_sync_flag_check(LRT_SYNC_FRESH)) {
+    /* At this stage GP should have all the data. We clear the flag */
+    ED_lineart_modifier_sync_set_flag(LRT_SYNC_IDLE, false);
   }
 }
 
diff --git a/source/blender/gpencil_modifiers/intern/MOD_gpencillineart.c b/source/blender/gpencil_modifiers/intern/MOD_gpencillineart.c
index e6eae85829d..82436a7720f 100644
--- a/source/blender/gpencil_modifiers/intern/MOD_gpencillineart.c
+++ b/source/blender/gpencil_modifiers/intern/MOD_gpencillineart.c
@@ -65,6 +65,7 @@
 static void initData(GpencilModifierData *md)
 {
   LineartGpencilModifierData *lmd = (LineartGpencilModifierData *)md;
+  lmd->line_types = LRT_EDGE_FLAG_ALL_TYPE;
 }
 
 static void copyData(const GpencilModifierData *md, GpencilModifierData *target)
@@ -85,6 +86,23 @@ static void generate_strokes_actual(
     return;
   }
 
+  if (ED_lineart_modifier_sync_flag_check(LRT_SYNC_IDLE)) {
+    /* Update triggered when nothing's happening, means DG update, so we request a refresh on line
+     * art cache, meanwhile waiting for result. Update will trigger agian */
+    ED_lineart_modifier_sync_set_flag(LRT_SYNC_WAITING, true);
+    printf("Set waiting.\n");
+    return;
+  }
+  else if (ED_lineart_modifier_sync_flag_check(LRT_SYNC_WAITING)) {
+    printf("Still waiting.\n");
+    /* Calculation in process */
+    return;
+  }
+
+  printf("Using data.\n");
+  /* If we reach here, means calculation is finished (LRT_SYNC_FRESH), we grab cache. flag reset is
+   * done by calculation function.*/
+
   if (lmd->source_type == LRT_SOURCE_OBJECT) {
     Object *source_object = lmd->source_object;
     if (!source_object) {
@@ -156,18 +174,41 @@ static void bakeModifier(Main *UNUSED(bmain),
   }
 }
 
+static void updateDepsgraph(GpencilModifierData *md, const ModifierUpdateDepsgraphContext *ctx)
+{
+  LineartGpencilModifierData *lmd = (LineartGpencilModifierData *)md;
+  if (lmd->source_type == LRT_SOURCE_OBJECT) {
+    DEG_add_object_relation(
+        ctx->node, lmd->source_object, DEG_OB_COMP_GEOMETRY, "Line Art Modifier");
+    DEG_add_object_relation(
+        ctx->node, lmd->source_object, DEG_OB_COMP_TRANSFORM, "Line Art Modifier");
+  }
+}
+
 static void freeData(GpencilModifierData *md)
 {
   LineartGpencilModifierData *lmd = (LineartGpencilModifierData *)md;
 }
 
+static void foreachObjectLink(GpencilModifierData *md,
+                              Object *ob,
+                              ObjectWalkFunc walk,
+                              void *userData)
+{
+  LineartGpencilModifierData *lmd = (LineartGpencilModifierData *)md;
+
+  walk(userData, ob, &lmd->source_object, IDWALK_CB_NOP);
+}
+
 static void foreachIDLink(GpencilModifierData *md, Object *ob, IDWalkFunc walk, void *userData)
 {
   LineartGpencilModifierData *lmd = (LineartGpencilModifierData *)md;
 
   walk(userData, ob, (ID **)&lmd->target_gp_material, IDWALK_CB_USER);
-  walk(userData, ob, (ID **)&lmd->source_object, IDWALK_CB_USER);
+  // walk(userData, ob, (ID **)&lmd->source_object, IDWALK_CB_USER);
   walk(userData, ob, (ID **)&lmd->source_collection, IDWALK_CB_USER);
+
+  foreachObjectLink(md, ob, (ObjectWalkFunc)walk, userData);
 }
 
 static void panel_draw(const bContext *C, Panel *panel)
@@ -253,9 +294,9 @@ GpencilModifierTypeInfo modifierType_Gpencil_Lineart = {
     /* initData */ initData,
     /* freeData */ freeData,
     /* isDisabled */ NULL,
-    /* updateDepsgraph */ NULL,
+    /* updateDepsgraph */ updateDepsgraph,
     /* dependsOnTime */ NULL,
-    /* foreachObjectLink */ NULL,
+    /* foreachObjectLink */ foreachObjectLink,
     /* foreachIDLink */ foreachIDLink,
     /* foreachTexLink */ NULL,
     /* panelRegister */ panelRegister,
di

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list