[Bf-blender-cvs] [a7ae8379f24] lineart-shadow: LineArt: Enclosed light/shadow shape support

YimingWu noreply at git.blender.org
Mon Apr 11 17:10:11 CEST 2022


Commit: a7ae8379f245eecd23cfba22e493ec6d7115ac20
Author: YimingWu
Date:   Mon Apr 11 23:09:45 2022 +0800
Branches: lineart-shadow
https://developer.blender.org/rBa7ae8379f245eecd23cfba22e493ec6d7115ac20

LineArt: Enclosed light/shadow shape support

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

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_cpu.c
M	source/blender/makesdna/DNA_lineart_types.h
M	source/blender/makesrna/intern/rna_gpencil_modifier.c

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

diff --git a/source/blender/blenkernel/intern/gpencil_modifier.c b/source/blender/blenkernel/intern/gpencil_modifier.c
index dc95816be75..91ef830edcc 100644
--- a/source/blender/blenkernel/intern/gpencil_modifier.c
+++ b/source/blender/blenkernel/intern/gpencil_modifier.c
@@ -222,6 +222,7 @@ GpencilLineartLimitInfo BKE_gpencil_get_lineart_modifier_limits(const Object *ob
                               (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);
+        is_first = false;
       }
     }
   }
diff --git a/source/blender/gpencil_modifiers/intern/MOD_gpencillineart.c b/source/blender/gpencil_modifiers/intern/MOD_gpencillineart.c
index 9ff7d0defb9..caa247c0d94 100644
--- a/source/blender/gpencil_modifiers/intern/MOD_gpencillineart.c
+++ b/source/blender/gpencil_modifiers/intern/MOD_gpencillineart.c
@@ -366,7 +366,7 @@ static void edge_types_panel_draw(const bContext *UNUSED(C), Panel *panel)
 
   uiItemR(sub, ptr, "use_light_contour", 0, NULL, ICON_NONE);
   uiItemR(sub, ptr, "use_shadow", 0, IFACE_("Cast Shadow"), ICON_NONE);
-  uiItemR(sub, ptr, "shadow_region_filtering", 0, NULL, ICON_NONE);
+  uiItemR(sub, ptr, "shadow_region_filtering", 0, IFACE_("Regions"), ICON_NONE);
 
   uiItemR(layout, ptr, "use_overlap_edge_type_support", 0, IFACE_("Allow Overlap"), ICON_NONE);
 }
@@ -400,6 +400,8 @@ static void options_light_reference_draw(const bContext *UNUSED(C), Panel *panel
   uiLayout *col = uiLayoutColumn(remaining, true);
   uiItemR(col, ptr, "shadow_camera_near", 0, "Near", ICON_NONE);
   uiItemR(col, ptr, "shadow_camera_far", 0, "Far", ICON_NONE);
+
+  uiItemR(layout, ptr, "shadow_enclosed_shapes", 0, IFACE_("Eclosed Shapes"), ICON_NONE);
 }
 
 static void options_panel_draw(const bContext *UNUSED(C), Panel *panel)
diff --git a/source/blender/gpencil_modifiers/intern/lineart/MOD_lineart.h b/source/blender/gpencil_modifiers/intern/lineart/MOD_lineart.h
index 22fa1517202..3135cf142c3 100644
--- a/source/blender/gpencil_modifiers/intern/lineart/MOD_lineart.h
+++ b/source/blender/gpencil_modifiers/intern/lineart/MOD_lineart.h
@@ -116,6 +116,7 @@ typedef struct LineartShadowSegmentContainer {
   double fbc1[4], fbc2[4];
   double g1[3], g2[3];
   struct LineartEdge *e_ref;
+  struct LineartEdgeSegment *es_ref; /* Only for 3rd stage casting. */
   ListBase shadow_segments;
 } LineartShadowSegmentContainer;
 
@@ -169,7 +170,10 @@ typedef enum eLineArtVertFlags {
 typedef struct LineartEdge {
   struct LineartVert *v1, *v2;
 
+  /** These two variables are also used to specify original edge and segment during 3rd stage
+   * reprojection, So we can easily find out the line which results come from. */
   struct LineartTriangle *t1, *t2;
+
   ListBase segments;
   char min_occ;
 
@@ -369,7 +373,8 @@ typedef struct LineartRenderBuffer {
   bool use_shadow;
   bool use_contour_secondary; /* From viewing camera, during shadow calculation. */
 
-  char shadow_selection;
+  int shadow_selection; /* Needs to be numeric because it's not just on/off. */
+  bool shadow_enclose_shapes;
 
   bool fuzzy_intersections;
   bool fuzzy_everything;
diff --git a/source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c b/source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c
index c28ea6c769f..244e600df8d 100644
--- a/source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c
+++ b/source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c
@@ -135,6 +135,8 @@ static void lineart_add_edge_to_list(LineartPendingEdges *pe, LineartEdge *e);
 
 static LineartCache *lineart_init_cache(void);
 
+static void lineart_clear_linked_edges(LineartRenderBuffer *rb);
+
 static void lineart_discard_segment(LineartRenderBuffer *rb, LineartEdgeSegment *es)
 {
   BLI_spin_lock(&rb->lock_cuts);
@@ -166,6 +168,12 @@ static LineartEdgeSegment *lineart_give_segment(LineartRenderBuffer *rb)
                                                           sizeof(LineartEdgeSegment));
 }
 
+#define LRT_SHADOW_MASK_UNDEFINED 0
+#define LRT_SHADOW_MASK_LIT (1 << 0)
+#define LRT_SHADOW_MASK_SHADED (1 << 1)
+#define LRT_SHADOW_MASK_ENCLOSED_SHAPE (1 << 2)
+#define LRT_SHADOW_MASK_INHIBITED (1 << 3)
+
 /**
  * Cuts the edge in image space and mark occlusion level for each segment.
  */
@@ -317,7 +325,17 @@ static void lineart_edge_cut(LineartRenderBuffer *rb,
     es->occlusion += mat_occlusion;
     es->material_mask_bits |= material_mask_bits;
     /* Currently only register lit/shade, see LineartEdgeSegment::shadow_mask_bits for details. */
-    es->shadow_mask_bits |= shadow_bits;
+    if (shadow_bits == LRT_SHADOW_MASK_ENCLOSED_SHAPE) {
+      if (es->shadow_mask_bits == LRT_SHADOW_MASK_LIT) {
+        es->shadow_mask_bits = LRT_SHADOW_MASK_INHIBITED;
+      }
+      else if (es->shadow_mask_bits == LRT_SHADOW_MASK_SHADED) {
+        es->shadow_mask_bits = LRT_SHADOW_MASK_LIT;
+      }
+    }
+    else {
+      es->shadow_mask_bits |= shadow_bits;
+    }
   }
 
   /* Reduce adjacent cutting points of the same level, which saves memory. */
@@ -2148,10 +2166,6 @@ static LineartEdge *lineart_find_matching_edge(LineartElementLinkNode *shadow_el
   return NULL;
 }
 
-#define LRT_SHADOW_MASK_UNDEFINED 0
-#define LRT_SHADOW_MASK_LIT (1 << 0)
-#define LRT_SHADOW_MASK_SHADED (1 << 1)
-
 static void lineart_register_shadow_cuts(LineartRenderBuffer *rb,
                                          LineartEdge *e,
                                          LineartEdge *shadow_edge)
@@ -3936,21 +3950,12 @@ static void lineart_main_get_view_vector(LineartRenderBuffer *rb)
   }
 }
 
-static void lineart_destroy_render_data(LineartRenderBuffer *rb)
+static void lineart_destroy_render_data_keep_init(LineartRenderBuffer *rb)
 {
   if (rb == NULL) {
     return;
   }
 
-  memset(&rb->contour, 0, sizeof(ListBase));
-  memset(&rb->crease, 0, sizeof(ListBase));
-  memset(&rb->intersection, 0, sizeof(ListBase));
-  memset(&rb->edge_mark, 0, sizeof(ListBase));
-  memset(&rb->material, 0, sizeof(ListBase));
-  memset(&rb->floating, 0, sizeof(ListBase));
-  memset(&rb->light_contour, 0, sizeof(ListBase));
-  memset(&rb->shadow, 0, sizeof(ListBase));
-
   BLI_listbase_clear(&rb->chains);
   BLI_listbase_clear(&rb->wasted_cuts);
 
@@ -3958,44 +3963,26 @@ static void lineart_destroy_render_data(LineartRenderBuffer *rb)
   BLI_listbase_clear(&rb->line_buffer_pointers);
   BLI_listbase_clear(&rb->triangle_buffer_pointers);
 
-  BLI_spin_end(&rb->lock_task);
-  BLI_spin_end(&rb->lock_cuts);
-  BLI_spin_end(&rb->render_data_pool.lock_mem);
-
-  for (int i = 0; i < rb->bounding_area_initial_count; i++) {
-    BLI_spin_end(&rb->lock_bounding_areas[i]);
+  if (rb->pending_edges.array) {
+    MEM_freeN(rb->pending_edges.array);
   }
-
-  MEM_freeN(rb->pending_edges.array);
-
   lineart_mem_destroy(&rb->render_data_pool);
 }
-
-static void lineart_destroy_render_data_keep_init(LineartRenderBuffer *rb)
+static void lineart_destroy_render_data(LineartRenderBuffer *rb)
 {
   if (rb == NULL) {
     return;
   }
 
-  memset(&rb->contour, 0, sizeof(ListBase));
-  memset(&rb->crease, 0, sizeof(ListBase));
-  memset(&rb->intersection, 0, sizeof(ListBase));
-  memset(&rb->edge_mark, 0, sizeof(ListBase));
-  memset(&rb->material, 0, sizeof(ListBase));
-  memset(&rb->floating, 0, sizeof(ListBase));
-  memset(&rb->light_contour, 0, sizeof(ListBase));
-  memset(&rb->shadow, 0, sizeof(ListBase));
-
-  BLI_listbase_clear(&rb->chains);
-  BLI_listbase_clear(&rb->wasted_cuts);
-
-  BLI_listbase_clear(&rb->vertex_buffer_pointers);
-  BLI_listbase_clear(&rb->line_buffer_pointers);
-  BLI_listbase_clear(&rb->triangle_buffer_pointers);
+  BLI_spin_end(&rb->lock_task);
+  BLI_spin_end(&rb->lock_cuts);
+  BLI_spin_end(&rb->render_data_pool.lock_mem);
 
-  MEM_freeN(rb->pending_edges.array);
+  for (int i = 0; i < rb->bounding_area_initial_count; i++) {
+    BLI_spin_end(&rb->lock_bounding_areas[i]);
+  }
 
-  lineart_mem_destroy(&rb->render_data_pool);
+  lineart_destroy_render_data_keep_init(rb);
 }
 
 void MOD_lineart_destroy_render_data(LineartGpencilModifierData *lmd)
@@ -4145,6 +4132,7 @@ static LineartRenderBuffer *lineart_create_render_buffer(Scene *scene,
                     (lmd->light_contour_object != NULL));
 
   rb->shadow_selection = lmd->shadow_selection_override;
+  rb->shadow_enclose_shapes = (lmd->calculation_flags & LRT_SHADOW_ENCLOSED_SHAPES) != 0;
 
   rb->use_back_face_culling = (lmd->calculation_flags & LRT_USE_BACK_FACE_CULLING) != 0;
 
@@ -4680,6 +4668,31 @@ static void lineart_bounding_area_link_edge(LineartRenderBuffer *rb,
   }
 }
 
+static void lineart_clear_linked_edges_recursive(LineartRenderBuffer *rb,
+                                                 LineartBoundingArea *root_ba)
+{
+  if (root_ba->child) {
+    for (int i = 0; i < 4; i++) {
+      lineart_clear_linked_edges_recursive(rb, &root_ba->child[i]);
+    }
+  }
+  else {
+    root_ba->line_count = 0;
+    root_ba->max_line_count = 128;
+    root_ba->linked_lines = lineart_mem_acquire(&rb->render_data_pool,
+                                                sizeof(LineartEdge *) * root_ba->max_line_count);
+  }
+}
+static void lineart_clear_linked_edges(LineartRenderBuffer *rb)
+{
+  LineartBoundingArea *ba = rb->initial_bounding_areas;
+  for (int i = 0; i < rb->tile_count_x; i++) {
+    for (int j = 0; j < rb->tile_count_x; j++) {
+      lineart_clear_linked_edges_recursive(rb, &ba[i * LRT_BA_ROWS + j]);
+    }
+  }
+}
+
 /**
  * Link lines to their respective bounding areas.
  */
@@ -5376,7 +5389,8 @@ static bool lineart_do_closest_segment(bool is_persp,
   return true;
 }
 
-static void lineart_shadow_create_container_array(LineartRenderBuffer *rb)
+static void lineart_shadow_create_container_array(LineartRenderBuffer *rb,
+                                                  bool transform_edge_cuts)
 {
 #define DISCARD_NONSENSE_SEGMENTS \
   if (es->occlusion != 0 || \
@@ -5444,6 +5458,7 @@ static void lineart_shadow_create_container_array(LineartRenderBuffer *rb)
       BLI_addtail(&ssc[i].shadow_segments, &ss[i * 2 + 1]);
 
       ssc[i].e_ref = e;
+      ssc[i].es_ref = es;
       BLI_addtail(&rb->shadow_

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list