[Bf-blender-cvs] [75e17be7e76] lineart-shadow: LineArt: UI and correct logic for shadow region chaining

YimingWu noreply at git.blender.org
Mon Apr 11 09:09:01 CEST 2022


Commit: 75e17be7e7603458f7a5d09da42dcac34b629db1
Author: YimingWu
Date:   Mon Apr 11 15:08:21 2022 +0800
Branches: lineart-shadow
https://developer.blender.org/rB75e17be7e7603458f7a5d09da42dcac34b629db1

LineArt: UI and correct logic for shadow region chaining

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

M	source/blender/blenkernel/BKE_gpencil_modifier.h
M	source/blender/blenkernel/intern/gpencil_modifier.c
M	source/blender/gpencil_modifiers/intern/MOD_gpencillineart.c
M	source/blender/gpencil_modifiers/intern/lineart/MOD_lineart.h
M	source/blender/gpencil_modifiers/intern/lineart/lineart_chain.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
M	source/blender/makesdna/DNA_lineart_types.h
M	source/blender/makesrna/intern/rna_gpencil_modifier.c

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

diff --git a/source/blender/blenkernel/BKE_gpencil_modifier.h b/source/blender/blenkernel/BKE_gpencil_modifier.h
index 96c405e46ec..ff8b2a92f75 100644
--- a/source/blender/blenkernel/BKE_gpencil_modifier.h
+++ b/source/blender/blenkernel/BKE_gpencil_modifier.h
@@ -383,6 +383,7 @@ typedef struct GpencilLineartLimitInfo {
   char min_level;
   char max_level;
   short edge_types;
+  char shadow_selection;
 } GpencilLineartLimitInfo;
 
 GpencilLineartLimitInfo BKE_gpencil_get_lineart_modifier_limits(const struct Object *ob);
diff --git a/source/blender/blenkernel/intern/gpencil_modifier.c b/source/blender/blenkernel/intern/gpencil_modifier.c
index faafd1e1040..dc95816be75 100644
--- a/source/blender/blenkernel/intern/gpencil_modifier.c
+++ b/source/blender/blenkernel/intern/gpencil_modifier.c
@@ -221,6 +221,7 @@ GpencilLineartLimitInfo BKE_gpencil_get_lineart_modifier_limits(const Object *ob
         info.max_level = MAX2(info.max_level,
                               (lmd->use_multiple_levels ? lmd->level_end : lmd->level_start));
         info.edge_types |= lmd->edge_types;
+        info.shadow_selection = MAX2(lmd->shadow_selection, info.shadow_selection);
       }
     }
   }
@@ -237,11 +238,13 @@ void BKE_gpencil_set_lineart_modifier_limits(GpencilModifierData *md,
     lmd->level_start_override = info->min_level;
     lmd->level_end_override = info->max_level;
     lmd->edge_types_override = info->edge_types;
+    lmd->shadow_selection_override = info->shadow_selection;
   }
   else {
     lmd->level_start_override = lmd->level_start;
     lmd->level_end_override = lmd->level_end;
     lmd->edge_types_override = lmd->edge_types;
+    lmd->shadow_selection_override = lmd->shadow_selection;
   }
 }
 
diff --git a/source/blender/gpencil_modifiers/intern/MOD_gpencillineart.c b/source/blender/gpencil_modifiers/intern/MOD_gpencillineart.c
index 6b9c3c3c543..9ff7d0defb9 100644
--- a/source/blender/gpencil_modifiers/intern/MOD_gpencillineart.c
+++ b/source/blender/gpencil_modifiers/intern/MOD_gpencillineart.c
@@ -91,6 +91,7 @@ static void generate_strokes_actual(
       lmd->intersection_mask,
       lmd->thickness,
       lmd->opacity,
+      lmd->shadow_selection,
       lmd->source_vertex_group,
       lmd->vgname,
       lmd->flags);
@@ -196,6 +197,7 @@ static void bakeModifier(Main *UNUSED(bmain),
      * modifiers in the stack. */
     lmd->edge_types_override = lmd->edge_types;
     lmd->level_end_override = lmd->level_end;
+    lmd->shadow_selection_override = lmd->shadow_selection;
 
     MOD_lineart_compute_feature_lines(
         depsgraph, lmd, &gpd->runtime.lineart_cache, (!(ob->dtx & OB_DRAW_IN_FRONT)));
@@ -363,7 +365,8 @@ static void edge_types_panel_draw(const bContext *UNUSED(C), Panel *panel)
   uiLayoutSetActive(sub, RNA_pointer_get(ptr, "light_contour_object").data != NULL);
 
   uiItemR(sub, ptr, "use_light_contour", 0, NULL, ICON_NONE);
-  uiItemR(sub, ptr, "use_shadow", 0, IFACE_("Casted Shadow"), ICON_NONE);
+  uiItemR(sub, ptr, "use_shadow", 0, IFACE_("Cast Shadow"), ICON_NONE);
+  uiItemR(sub, ptr, "shadow_region_filtering", 0, NULL, ICON_NONE);
 
   uiItemR(layout, ptr, "use_overlap_edge_type_support", 0, IFACE_("Allow Overlap"), ICON_NONE);
 }
diff --git a/source/blender/gpencil_modifiers/intern/lineart/MOD_lineart.h b/source/blender/gpencil_modifiers/intern/lineart/MOD_lineart.h
index b9e05e3639c..22fa1517202 100644
--- a/source/blender/gpencil_modifiers/intern/lineart/MOD_lineart.h
+++ b/source/blender/gpencil_modifiers/intern/lineart/MOD_lineart.h
@@ -213,6 +213,7 @@ typedef struct LineartEdgeChain {
   int loop_id;
   unsigned char material_mask_bits;
   unsigned char intersection_mask;
+  unsigned char shadow_mask_bits;
 
   struct Object *object_ref;
 } LineartEdgeChain;
@@ -228,6 +229,7 @@ typedef struct LineartEdgeChainItem {
   char occlusion;
   unsigned char material_mask_bits;
   unsigned char intersection_mask;
+  unsigned char shadow_mask_bits;
   size_t index;
 } LineartEdgeChainItem;
 
@@ -367,7 +369,7 @@ typedef struct LineartRenderBuffer {
   bool use_shadow;
   bool use_contour_secondary; /* From viewing camera, during shadow calculation. */
 
-  bool needs_shadow_separation;
+  char shadow_selection;
 
   bool fuzzy_intersections;
   bool fuzzy_everything;
@@ -925,6 +927,7 @@ void MOD_lineart_gpencil_generate(LineartCache *cache,
                                   unsigned char intersection_mask,
                                   short thickness,
                                   float opacity,
+                                  unsigned char shadow_selection,
                                   const char *source_vgname,
                                   const char *vgname,
                                   int modifier_flags);
diff --git a/source/blender/gpencil_modifiers/intern/lineart/lineart_chain.c b/source/blender/gpencil_modifiers/intern/lineart/lineart_chain.c
index 1b56fe1fb33..be45a112fd0 100644
--- a/source/blender/gpencil_modifiers/intern/lineart/lineart_chain.c
+++ b/source/blender/gpencil_modifiers/intern/lineart/lineart_chain.c
@@ -93,6 +93,7 @@ static LineartEdgeChainItem *lineart_chain_append_point(LineartRenderBuffer *rb,
                                                         char type,
                                                         int level,
                                                         unsigned char material_mask_bits,
+                                                        unsigned char shadow_mask_bits,
                                                         size_t index)
 {
   LineartEdgeChainItem *eci;
@@ -105,6 +106,7 @@ static LineartEdgeChainItem *lineart_chain_append_point(LineartRenderBuffer *rb,
     old_eci->line_type = type;
     old_eci->occlusion = level;
     old_eci->material_mask_bits = material_mask_bits;
+    old_eci->shadow_mask_bits = shadow_mask_bits;
     return old_eci;
   }
 
@@ -117,6 +119,7 @@ static LineartEdgeChainItem *lineart_chain_append_point(LineartRenderBuffer *rb,
   eci->line_type = type & LRT_EDGE_FLAG_ALL_TYPE;
   eci->occlusion = level;
   eci->material_mask_bits = material_mask_bits;
+  eci->shadow_mask_bits = shadow_mask_bits;
   BLI_addtail(&ec->chain, eci);
 
   return eci;
@@ -130,6 +133,7 @@ static LineartEdgeChainItem *lineart_chain_prepend_point(LineartRenderBuffer *rb
                                                          char type,
                                                          int level,
                                                          unsigned char material_mask_bits,
+                                                         unsigned char shadow_mask_bits,
                                                          size_t index)
 {
   LineartEdgeChainItem *eci;
@@ -147,6 +151,7 @@ static LineartEdgeChainItem *lineart_chain_prepend_point(LineartRenderBuffer *rb
   eci->line_type = type & LRT_EDGE_FLAG_ALL_TYPE;
   eci->occlusion = level;
   eci->material_mask_bits = material_mask_bits;
+  eci->shadow_mask_bits = shadow_mask_bits;
   BLI_addhead(&ec->chain, eci);
 
   return eci;
@@ -160,6 +165,7 @@ void MOD_lineart_chain_feature_lines(LineartRenderBuffer *rb)
   LineartEdgeSegment *es;
   int last_occlusion;
   unsigned char last_transparency;
+  unsigned char last_shadow;
   /* Used when converting from double. */
   float use_fbcoord[4];
   float use_gpos[3];
@@ -219,6 +225,7 @@ void MOD_lineart_chain_feature_lines(LineartRenderBuffer *rb)
                                 e->flags,
                                 es->occlusion,
                                 es->material_mask_bits,
+                                es->shadow_mask_bits,
                                 e->v1->index);
     while (ba && (new_e = lineart_line_get_connected(
                       ba, new_vt, &new_vt, e->flags, ec->intersection_mask))) {
@@ -256,15 +263,18 @@ void MOD_lineart_chain_feature_lines(LineartRenderBuffer *rb)
                                       new_e->flags,
                                       es->occlusion,
                                       es->material_mask_bits,
+                                      es->shadow_mask_bits,
                                       new_e->v1->index);
           last_occlusion = es->occlusion;
           last_transparency = es->material_mask_bits;
+          last_shadow = es->shadow_mask_bits;
         }
       }
       else if (new_vt == new_e->v2) {
         es = new_e->segments.first;
         last_occlusion = es->occlusion;
         last_transparency = es->material_mask_bits;
+        last_shadow = es->shadow_mask_bits;
         es = es->next;
         for (; es; es = es->next) {
           double gpos[3], lpos[3];
@@ -282,9 +292,11 @@ void MOD_lineart_chain_feature_lines(LineartRenderBuffer *rb)
                                       new_e->flags,
                                       last_occlusion,
                                       last_transparency,
+                                      last_shadow,
                                       new_e->v2->index);
           last_occlusion = es->occlusion;
           last_transparency = es->material_mask_bits;
+          last_shadow = es->shadow_mask_bits;
         }
         VERT_COORD_TO_FLOAT(new_e->v2);
         lineart_chain_prepend_point(rb,
@@ -295,6 +307,7 @@ void MOD_lineart_chain_feature_lines(LineartRenderBuffer *rb)
                                     new_e->flags,
                                     last_occlusion,
                                     last_transparency,
+                                    last_shadow,
                                     new_e->v2->index);
       }
       ba = MOD_lineart_get_bounding_area(rb, new_vt->fbcoord[0], new_vt->fbcoord[1]);
@@ -320,6 +333,7 @@ void MOD_lineart_chain_feature_lines(LineartRenderBuffer *rb)
     es = e->segments.first;
     last_occlusion = ((LineartEdgeSegment *)es)->occlusion;
     last_transparency = ((LineartEdgeSegment *)es)->material_mask_bits;
+    last_shadow = ((LineartEdgeSegment *)es)->shadow_mask_bits;
     for (es = es->next; es; es = es->next) {
       double gpos[3], lpos[3];
       double *lfb = e->v1->fbcoord, *rfb = e->v2->fbcoord;
@@ -336,9 +350,11 @@ void MOD_lineart_chain_feature_lines(LineartRen

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list