[Bf-blender-cvs] [3086602f70d] temp-lineart-contained: LineArt: Global overrides for cached calculation.

YimingWu noreply at git.blender.org
Thu Apr 22 05:45:36 CEST 2021


Commit: 3086602f70d5a0759ff0cda5f65abf93d6d35a21
Author: YimingWu
Date:   Thu Apr 22 11:45:08 2021 +0800
Branches: temp-lineart-contained
https://developer.blender.org/rB3086602f70d5a0759ff0cda5f65abf93d6d35a21

LineArt: Global overrides for cached calculation.

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

M	source/blender/blenkernel/BKE_gpencil_modifier.h
M	source/blender/blenkernel/intern/gpencil_modifier.c
M	source/blender/gpencil_modifiers/MOD_gpencil_lineart.h
M	source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c
M	source/blender/gpencil_modifiers/intern/lineart/lineart_ops.c
M	source/blender/makesdna/DNA_gpencil_modifier_types.h

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

diff --git a/source/blender/blenkernel/BKE_gpencil_modifier.h b/source/blender/blenkernel/BKE_gpencil_modifier.h
index c6406c8478c..25fd3b18234 100644
--- a/source/blender/blenkernel/BKE_gpencil_modifier.h
+++ b/source/blender/blenkernel/BKE_gpencil_modifier.h
@@ -294,6 +294,18 @@ bool BKE_gpencil_has_geometry_modifiers(struct Object *ob);
 bool BKE_gpencil_has_time_modifiers(struct Object *ob);
 bool BKE_gpencil_has_transform_modifiers(struct Object *ob);
 
+typedef struct GpencilLineartLimitInfo {
+  char min_level;
+  char max_level;
+  short edge_types;
+} GpencilLineartLimitInfo;
+
+void BKE_gpencil_get_lineart_global_limits(struct Object *ob,
+                                           struct GpencilLineartLimitInfo *info);
+
+void BKE_gpencil_assign_lineart_global_limits(struct GpencilModifierData *md,
+                                              struct GpencilLineartLimitInfo *info);
+
 void BKE_gpencil_lattice_init(struct Object *ob);
 void BKE_gpencil_lattice_clear(struct Object *ob);
 
diff --git a/source/blender/blenkernel/intern/gpencil_modifier.c b/source/blender/blenkernel/intern/gpencil_modifier.c
index cf0c792f079..723e41557a5 100644
--- a/source/blender/blenkernel/intern/gpencil_modifier.c
+++ b/source/blender/blenkernel/intern/gpencil_modifier.c
@@ -166,21 +166,6 @@ bool BKE_gpencil_has_geometry_modifiers(Object *ob)
   return false;
 }
 
-/**
- * Check if object has grease pencil Geometry modifiers.
- * \param ob: Grease pencil object
- * \return True if exist
- */
-bool BKE_gpencil_has_lineart_modifiers(Object *ob)
-{
-  LISTBASE_FOREACH (GpencilModifierData *, md, &ob->greasepencil_modifiers) {
-    if (md->type == eGpencilModifierType_Lineart) {
-      return true;
-    }
-  }
-  return false;
-}
-
 /**
  * Check if object has grease pencil Time modifiers.
  * \param ob: Grease pencil object
@@ -218,6 +203,28 @@ bool BKE_gpencil_has_transform_modifiers(Object *ob)
   return false;
 }
 
+void BKE_gpencil_get_lineart_global_limits(Object *ob, struct GpencilLineartLimitInfo *info)
+{
+  LISTBASE_FOREACH (GpencilModifierData *, md, &ob->greasepencil_modifiers) {
+    if (md->type == eGpencilModifierType_Lineart) {
+      LineartGpencilModifierData *lmd = (LineartGpencilModifierData *)md;
+      info->min_level = MIN2(info->min_level, lmd->level_start);
+      info->max_level = MAX2(info->max_level,
+                             (lmd->use_multiple_levels ? lmd->level_end : lmd->level_start));
+      info->edge_types |= lmd->edge_types;
+    }
+  }
+}
+
+void BKE_gpencil_assign_lineart_global_limits(GpencilModifierData *md,
+                                              struct GpencilLineartLimitInfo *info)
+{
+  LineartGpencilModifierData *lmd = (LineartGpencilModifierData *)md;
+  lmd->level_start_override = info->min_level;
+  lmd->level_end_override = info->max_level;
+  lmd->edge_types_override = info->edge_types;
+}
+
 /* apply time modifiers */
 static int gpencil_time_modifier(
     Depsgraph *depsgraph, Scene *scene, Object *ob, bGPDlayer *gpl, int cfra, bool is_render)
@@ -787,7 +794,8 @@ void BKE_gpencil_modifiers_calc(Depsgraph *depsgraph, Scene *scene, Object *ob)
   BKE_gpencil_lattice_init(ob);
 
   const bool time_remap = BKE_gpencil_has_time_modifiers(ob);
-  const bool has_lineart = BKE_gpencil_has_lineart_modifiers(ob);
+  GpencilLineartLimitInfo info = {0};
+  BKE_gpencil_get_lineart_global_limits(ob, &info);
 
   LISTBASE_FOREACH (GpencilModifierData *, md, &ob->greasepencil_modifiers) {
 
@@ -798,6 +806,10 @@ void BKE_gpencil_modifiers_calc(Depsgraph *depsgraph, Scene *scene, Object *ob)
         continue;
       }
 
+      if (md->type == eGpencilModifierType_Lineart) {
+        BKE_gpencil_assign_lineart_global_limits(md, &info);
+      }
+
       /* Apply geometry modifiers (add new geometry). */
       if (mti && mti->generateStrokes) {
         mti->generateStrokes(md, depsgraph, ob);
@@ -824,10 +836,7 @@ void BKE_gpencil_modifiers_calc(Depsgraph *depsgraph, Scene *scene, Object *ob)
   /* Clear any lattice data. */
   BKE_gpencil_lattice_clear(ob);
 
-  // if (has_lineart) {
-  MOD_lineart_clear_cache(gpd->runtime.lineart_cache);
-  gpd->runtime.lineart_cache = NULL;
-  //}
+  MOD_lineart_clear_cache(&gpd->runtime.lineart_cache);
 }
 
 void BKE_gpencil_modifier_blend_write(BlendWriter *writer, ListBase *modbase)
diff --git a/source/blender/gpencil_modifiers/MOD_gpencil_lineart.h b/source/blender/gpencil_modifiers/MOD_gpencil_lineart.h
index 417e65e9d3f..7d75ed5804e 100644
--- a/source/blender/gpencil_modifiers/MOD_gpencil_lineart.h
+++ b/source/blender/gpencil_modifiers/MOD_gpencil_lineart.h
@@ -32,4 +32,4 @@ void WM_operatortypes_lineart(void);
 
 struct LineartCache;
 
-void MOD_lineart_clear_cache(struct LineartCache *lc);
+void MOD_lineart_clear_cache(struct LineartCache **lc);
diff --git a/source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c b/source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c
index 81dec324bb8..e6b3bd3ee5b 100644
--- a/source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c
+++ b/source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c
@@ -2830,13 +2830,14 @@ static LineartCache *lineart_init_cache()
   return lc;
 }
 
-void MOD_lineart_clear_cache(struct LineartCache *lc)
+void MOD_lineart_clear_cache(struct LineartCache **lc)
 {
-  if (!lc) {
+  if (!(*lc)) {
     return;
   }
-  lineart_mem_destroy(&lc->chain_data_pool);
-  MEM_freeN(lc);
+  lineart_mem_destroy(&((*lc)->chain_data_pool));
+  MEM_freeN(*lc);
+  (*lc) = NULL;
 }
 
 static LineartRenderBuffer *lineart_create_render_buffer(Scene *scene,
@@ -2891,11 +2892,11 @@ static LineartRenderBuffer *lineart_create_render_buffer(Scene *scene,
   /* See lineart_edge_from_triangle() for how this option may impact performance. */
   rb->allow_overlapping_edges = (lmd->calculation_flags & LRT_ALLOW_OVERLAPPING_EDGES) != 0;
 
-  rb->use_contour = (lmd->edge_types & LRT_EDGE_FLAG_CONTOUR) != 0;
-  rb->use_crease = (lmd->edge_types & LRT_EDGE_FLAG_CREASE) != 0;
-  rb->use_material = (lmd->edge_types & LRT_EDGE_FLAG_MATERIAL) != 0;
-  rb->use_edge_marks = (lmd->edge_types & LRT_EDGE_FLAG_EDGE_MARK) != 0;
-  rb->use_intersections = (lmd->edge_types & LRT_EDGE_FLAG_INTERSECTION) != 0;
+  rb->use_contour = (lmd->edge_types_override & LRT_EDGE_FLAG_CONTOUR) != 0;
+  rb->use_crease = (lmd->edge_types_override & LRT_EDGE_FLAG_CREASE) != 0;
+  rb->use_material = (lmd->edge_types_override & LRT_EDGE_FLAG_MATERIAL) != 0;
+  rb->use_edge_marks = (lmd->edge_types_override & LRT_EDGE_FLAG_EDGE_MARK) != 0;
+  rb->use_intersections = (lmd->edge_types_override & LRT_EDGE_FLAG_INTERSECTION) != 0;
 
   rb->chain_data_pool = &lc->chain_data_pool;
 
@@ -3898,7 +3899,7 @@ bool MOD_lineart_compute_feature_lines(Depsgraph *depsgraph,
 
   /* This is used to limit calculation to a certain level to save time, lines who have higher
    * occlusion levels will get ignored. */
-  rb->max_occlusion_level = MAX2(lmd->level_start, lmd->level_end);
+  rb->max_occlusion_level = lmd->level_end_override;
 
   /* FIXME(Yiming): See definition of int #LineartRenderBuffer::_source_type for detailed. */
   rb->_source_type = lmd->source_type;
diff --git a/source/blender/gpencil_modifiers/intern/lineart/lineart_ops.c b/source/blender/gpencil_modifiers/intern/lineart/lineart_ops.c
index ce0001fe4d2..4b99452b264 100644
--- a/source/blender/gpencil_modifiers/intern/lineart/lineart_ops.c
+++ b/source/blender/gpencil_modifiers/intern/lineart/lineart_ops.c
@@ -179,16 +179,20 @@ static bool lineart_gpencil_bake_single_target(LineartBakeJob *bj, Object *ob, i
     }
   }
 
+  GpencilLineartLimitInfo info = {0};
+  BKE_gpencil_get_lineart_global_limits(ob, &info);
+
   LineartCache *lc;
   LISTBASE_FOREACH (GpencilModifierData *, md, &ob->greasepencil_modifiers) {
     if (md->type != eGpencilModifierType_Lineart) {
       continue;
     }
+    BKE_gpencil_assign_lineart_global_limits(md, &info);
     if (bake_strokes(ob, bj->dg, &lc, md, frame)) {
       touched = true;
     }
   }
-  MOD_lineart_clear_cache(lc);
+  MOD_lineart_clear_cache(&lc);
 
   return touched;
 }
diff --git a/source/blender/makesdna/DNA_gpencil_modifier_types.h b/source/blender/makesdna/DNA_gpencil_modifier_types.h
index 7dd7396fdb3..7848d2cd2a3 100644
--- a/source/blender/makesdna/DNA_gpencil_modifier_types.h
+++ b/source/blender/makesdna/DNA_gpencil_modifier_types.h
@@ -884,14 +884,20 @@ typedef struct LineartGpencilModifierData {
   /* CPU mode */
   float chaining_image_threshold;
 
-  int _pad;
-
   /* Ported from SceneLineArt flags. */
   int calculation_flags;
 
   /* Additional Switches. */
   int flags;
 
+  /* Runtime data. */
+
+  /* Because we only do calculation once per modifier stack, so we need global override values for
+   * line art to compute as much data as possible. */
+  char level_start_override;
+  char level_end_override;
+  short edge_types_override;
+
   struct LineartCache *cache;
   /* Keep render buffer so we can call destroy from ModifierData. */
   struct LineartRenderBuffer *render_buffer_onetime;



More information about the Bf-blender-cvs mailing list