[Bf-blender-cvs] [0c1ca281750] temp-lineart-contained: LineArt: Respect cache override limits.

YimingWu noreply at git.blender.org
Tue Jun 15 15:49:25 CEST 2021


Commit: 0c1ca28175065b9af6423e0e37abfad79ffca2ce
Author: YimingWu
Date:   Tue Jun 15 21:39:47 2021 +0800
Branches: temp-lineart-contained
https://developer.blender.org/rB0c1ca28175065b9af6423e0e37abfad79ffca2ce

LineArt: Respect cache override limits.

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

M	source/blender/blenkernel/BKE_gpencil_modifier.h
M	source/blender/blenkernel/intern/gpencil_modifier.c
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 80d632ca9e2..c8ee21a6770 100644
--- a/source/blender/blenkernel/BKE_gpencil_modifier.h
+++ b/source/blender/blenkernel/BKE_gpencil_modifier.h
@@ -303,8 +303,9 @@ typedef struct GpencilLineartLimitInfo {
 void BKE_gpencil_get_lineart_modifier_limits(struct Object *ob,
                                              struct GpencilLineartLimitInfo *info);
 
-void BKE_gpencil_set_lineart_global_limits(struct GpencilModifierData *md,
-                                           struct GpencilLineartLimitInfo *info);
+void BKE_gpencil_set_lineart_modifier_limits(struct GpencilModifierData *md,
+                                             struct GpencilLineartLimitInfo *info,
+                                             bool is_first_lineart);
 bool BKE_gpencil_is_first_lineart_in_stack(struct Object *ob, struct GpencilModifierData *md);
 
 void BKE_gpencil_lattice_init(struct Object *ob);
diff --git a/source/blender/blenkernel/intern/gpencil_modifier.c b/source/blender/blenkernel/intern/gpencil_modifier.c
index f9a91268e09..900fcbb0781 100644
--- a/source/blender/blenkernel/intern/gpencil_modifier.c
+++ b/source/blender/blenkernel/intern/gpencil_modifier.c
@@ -216,14 +216,22 @@ void BKE_gpencil_get_lineart_modifier_limits(Object *ob, struct GpencilLineartLi
   }
 }
 
-void BKE_gpencil_set_lineart_global_limits(GpencilModifierData *md,
-                                           struct GpencilLineartLimitInfo *info)
+void BKE_gpencil_set_lineart_modifier_limits(GpencilModifierData *md,
+                                             struct GpencilLineartLimitInfo *info,
+                                             bool is_first_lineart)
 {
   BLI_assert(md->type == eGpencilModifierType_Lineart);
   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;
+  if (is_first_lineart || lmd->flags & LRT_GPENCIL_USE_CACHE) {
+    lmd->level_start_override = info->min_level;
+    lmd->level_end_override = info->max_level;
+    lmd->edge_types_override = info->edge_types;
+  }
+  else {
+    lmd->level_start_override = lmd->level_start;
+    lmd->level_end_override = lmd->level_end;
+    lmd->edge_types_override = lmd->edge_types;
+  }
 }
 
 bool BKE_gpencil_is_first_lineart_in_stack(Object *ob, GpencilModifierData *md)
@@ -813,6 +821,7 @@ 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);
+  bool is_first_lineart = true;
   GpencilLineartLimitInfo info = {0};
   BKE_gpencil_get_lineart_modifier_limits(ob, &info);
 
@@ -826,7 +835,8 @@ void BKE_gpencil_modifiers_calc(Depsgraph *depsgraph, Scene *scene, Object *ob)
       }
 
       if (md->type == eGpencilModifierType_Lineart) {
-        BKE_gpencil_set_lineart_global_limits(md, &info);
+        BKE_gpencil_set_lineart_modifier_limits(md, &info, is_first_lineart);
+        is_first_lineart = false;
       }
 
       /* Apply geometry modifiers (add new geometry). */
diff --git a/source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c b/source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c
index cee93b11d26..b7efafe29d3 100644
--- a/source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c
+++ b/source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c
@@ -3008,13 +3008,13 @@ static void lineart_destroy_render_data(LineartRenderBuffer *rb)
 
 void MOD_lineart_destroy_render_data(LineartGpencilModifierData *lmd)
 {
-  LineartRenderBuffer *rb = lmd->render_buffer_onetime;
+  LineartRenderBuffer *rb = lmd->render_buffer_ptr;
 
   lineart_destroy_render_data(rb);
 
   if (rb) {
     MEM_freeN(rb);
-    lmd->render_buffer_onetime = NULL;
+    lmd->render_buffer_ptr = NULL;
   }
 
   if (G.debug_value == 4000) {
@@ -3047,8 +3047,8 @@ static LineartRenderBuffer *lineart_create_render_buffer(Scene *scene,
   LineartRenderBuffer *rb = MEM_callocN(sizeof(LineartRenderBuffer), "Line Art render buffer");
 
   lmd->cache = lc;
-  lmd->render_buffer_onetime = rb;
-  lc->rb_edge_types = LRT_EDGE_FLAG_ALL_TYPE;
+  lmd->render_buffer_ptr = rb;
+  lc->rb_edge_types = lmd->edge_types_override;
 
   if (!scene || !camera || !lc) {
     return NULL;
@@ -3120,14 +3120,16 @@ static LineartRenderBuffer *lineart_create_render_buffer(Scene *scene,
 
   rb->allow_duplicated_types = (lmd->calculation_flags & LRT_ALLOW_MULTIPLE_EDGE_TYPES) != 0;
 
+  int16_t edge_types = lmd->edge_types_override;
+
   /* lmd->edge_types_override contains all used flags in the modifier stack. */
-  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->use_floating = (lmd->edge_types_override & LRT_EDGE_FLAG_FLOATING) != 0;
-  rb->use_light_contour = (lmd->edge_types_override & LRT_EDGE_FLAG_LIGHT_CONTOUR) != 0;
+  rb->use_contour = (edge_types & LRT_EDGE_FLAG_CONTOUR) != 0;
+  rb->use_crease = (edge_types & LRT_EDGE_FLAG_CREASE) != 0;
+  rb->use_material = (edge_types & LRT_EDGE_FLAG_MATERIAL) != 0;
+  rb->use_edge_marks = (edge_types & LRT_EDGE_FLAG_EDGE_MARK) != 0;
+  rb->use_intersections = (edge_types & LRT_EDGE_FLAG_INTERSECTION) != 0;
+  rb->use_floating = (edge_types & LRT_EDGE_FLAG_FLOATING) != 0;
+  rb->use_light_contour = (edge_types & LRT_EDGE_FLAG_LIGHT_CONTOUR) != 0;
 
   rb->filter_face_mark_invert = (lmd->calculation_flags & LRT_FILTER_FACE_MARK_INVERT) != 0;
   rb->filter_face_mark = (lmd->calculation_flags & LRT_FILTER_FACE_MARK) != 0;
diff --git a/source/blender/gpencil_modifiers/intern/lineart/lineart_ops.c b/source/blender/gpencil_modifiers/intern/lineart/lineart_ops.c
index 778aec98e48..2831e2b0f21 100644
--- a/source/blender/gpencil_modifiers/intern/lineart/lineart_ops.c
+++ b/source/blender/gpencil_modifiers/intern/lineart/lineart_ops.c
@@ -208,7 +208,7 @@ static bool lineart_gpencil_bake_single_target(LineartBakeJob *bj, Object *ob, i
     if (md->type != eGpencilModifierType_Lineart) {
       continue;
     }
-    BKE_gpencil_set_lineart_global_limits(md, &info);
+    BKE_gpencil_set_lineart_modifier_limits(md, &info, is_first);
     if (bake_strokes(ob, bj->dg, &lc, md, frame, is_first)) {
       touched = true;
       is_first = false;
diff --git a/source/blender/makesdna/DNA_gpencil_modifier_types.h b/source/blender/makesdna/DNA_gpencil_modifier_types.h
index 1b266f1ec28..785c6078bbe 100644
--- a/source/blender/makesdna/DNA_gpencil_modifier_types.h
+++ b/source/blender/makesdna/DNA_gpencil_modifier_types.h
@@ -966,7 +966,7 @@ typedef struct LineartGpencilModifierData {
 
   struct LineartCache *cache;
   /* Keep render buffer so we can call destroy from ModifierData. */
-  struct LineartRenderBuffer *render_buffer_onetime;
+  struct LineartRenderBuffer *render_buffer_ptr;
 
 } LineartGpencilModifierData;



More information about the Bf-blender-cvs mailing list