[Bf-blender-cvs] [53dc52c83d8] lineart-shadow: LineArt: split shadow functions into separate files.

YimingWu noreply at git.blender.org
Thu Jun 2 05:17:20 CEST 2022


Commit: 53dc52c83d88652503b78cd1ca3660c197b60d3d
Author: YimingWu
Date:   Tue May 31 19:27:43 2022 +0800
Branches: lineart-shadow
https://developer.blender.org/rB53dc52c83d88652503b78cd1ca3660c197b60d3d

LineArt: split shadow functions into separate files.

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

M	source/blender/gpencil_modifiers/CMakeLists.txt
M	source/blender/gpencil_modifiers/intern/lineart/MOD_lineart.h
M	source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c
M	source/blender/gpencil_modifiers/intern/lineart/lineart_intern.h
A	source/blender/gpencil_modifiers/intern/lineart/lineart_shadow.c

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

diff --git a/source/blender/gpencil_modifiers/CMakeLists.txt b/source/blender/gpencil_modifiers/CMakeLists.txt
index c45209661f6..46d1ea2c094 100644
--- a/source/blender/gpencil_modifiers/CMakeLists.txt
+++ b/source/blender/gpencil_modifiers/CMakeLists.txt
@@ -69,6 +69,7 @@ set(SRC
   intern/lineart/lineart_cpp_bridge.cc
   intern/lineart/lineart_cpu.c
   intern/lineart/lineart_ops.c
+  intern/lineart/lineart_shadow.c
   intern/lineart/lineart_util.c
 
   intern/lineart/MOD_lineart.h
diff --git a/source/blender/gpencil_modifiers/intern/lineart/MOD_lineart.h b/source/blender/gpencil_modifiers/intern/lineart/MOD_lineart.h
index 5e17839e262..38bc230fa7d 100644
--- a/source/blender/gpencil_modifiers/intern/lineart/MOD_lineart.h
+++ b/source/blender/gpencil_modifiers/intern/lineart/MOD_lineart.h
@@ -460,6 +460,13 @@ typedef enum eLineartTriangleFlags {
   LRT_TRIANGLE_MAT_BACK_FACE_CULLING = (1 << 5),
 } eLineartTriangleFlags;
 
+#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)
+#define LRT_SHADOW_SILHOUETTE_ERASED (1 << 4)
+
 /**
  * Controls how many edges a worker thread is processing at one request.
  * There's no significant performance impact on choosing different values.
diff --git a/source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c b/source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c
index e922a8b9163..df94e285d4c 100644
--- a/source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c
+++ b/source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c
@@ -85,25 +85,10 @@ typedef struct LineartIsecData {
   int thread_count;
 } LineartIsecData;
 
-static LineartBoundingArea *lineart_edge_first_bounding_area(LineartRenderBuffer *rb,
-                                                             double *fbcoord1,
-                                                             double *fbcoord2);
-
 static void lineart_bounding_area_link_edge(LineartRenderBuffer *rb,
                                             LineartBoundingArea *root_ba,
                                             LineartEdge *e);
 
-static LineartBoundingArea *lineart_bounding_area_next(LineartBoundingArea *this,
-                                                       double *fbcoord1,
-                                                       double *fbcoord2,
-                                                       double x,
-                                                       double y,
-                                                       double k,
-                                                       int positive_x,
-                                                       int positive_y,
-                                                       double *next_x,
-                                                       double *next_y);
-
 static bool lineart_get_edge_bounding_areas(LineartRenderBuffer *rb,
                                             LineartEdge *e,
                                             int *rowbegin,
@@ -124,8 +109,6 @@ static bool lineart_triangle_edge_image_space_occlusion(SpinLock *spl,
                                                         double *from,
                                                         double *to);
 
-static void lineart_add_edge_to_array(LineartPendingEdges *pe, LineartEdge *e);
-
 static void lineart_bounding_area_link_triangle_cas(LineartRenderBuffer *rb,
                                                     LineartBoundingArea *root_ba,
                                                     LineartTriangle *tri,
@@ -141,8 +124,6 @@ static void lineart_free_bounding_area_memories(LineartRenderBuffer *rb);
 
 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);
@@ -174,23 +155,16 @@ 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)
-#define LRT_SHADOW_SILHOUETTE_ERASED (1 << 4)
-
 /**
  * Cuts the edge in image space and mark occlusion level for each segment.
  */
-static void lineart_edge_cut(LineartRenderBuffer *rb,
-                             LineartEdge *e,
-                             double start,
-                             double end,
-                             uchar material_mask_bits,
-                             uchar mat_occlusion,
-                             uchar shadow_bits)
+void lineart_edge_cut(LineartRenderBuffer *rb,
+                      LineartEdge *e,
+                      double start,
+                      double end,
+                      uchar material_mask_bits,
+                      uchar mat_occlusion,
+                      uchar shadow_bits)
 {
   LineartEdgeSegment *es, *ies, *next_es, *prev_es;
   LineartEdgeSegment *cut_start_before = 0, *cut_end_before = 0;
@@ -415,21 +389,6 @@ static void lineart_bounding_area_line_add(LineartBoundingArea *ba, LineartEdge
   ba->line_count++;
 }
 
-#define LRT_EDGE_BA_MARCHING_BEGIN(fb1, fb2) \
-  double x = fb1[0], y = fb1[1]; \
-  LineartBoundingArea *ba = lineart_edge_first_bounding_area(rb, fb1, fb2); \
-  LineartBoundingArea *nba = ba; \
-  double k = (fb2[1] - fb1[1]) / (fb2[0] - fb1[0] + 1e-30); \
-  int positive_x = (fb2[0] - fb1[0]) > 0 ? 1 : (fb2[0] == fb1[0] ? 0 : -1); \
-  int positive_y = (fb2[1] - fb1[1]) > 0 ? 1 : (fb2[1] == fb1[1] ? 0 : -1); \
-  while (nba)
-
-#define LRT_EDGE_BA_MARCHING_NEXT(fb1, fb2) \
-  /* Marching along `e->v1` to `e->v2`, searching each possible bounding areas it may touch. */ \
-  nba = lineart_bounding_area_next(nba, fb1, fb2, x, y, k, positive_x, positive_y, &x, &y);
-
-#define LRT_EDGE_BA_MARCHING_END
-
 static void lineart_occlusion_single_line(LineartRenderBuffer *rb, LineartEdge *e, int thread_id)
 {
   LineartTriangleThread *tri;
@@ -516,7 +475,7 @@ static void lineart_occlusion_worker(TaskPool *__restrict UNUSED(pool), LineartR
  * #MOD_lineart_compute_feature_lines function.
  * This function handles all occlusion calculation.
  */
-static void lineart_main_occlusion_begin(LineartRenderBuffer *rb)
+void lineart_main_occlusion_begin(LineartRenderBuffer *rb)
 {
   int thread_count = rb->thread_count;
   LineartRenderTaskInfo *rti = MEM_callocN(sizeof(LineartRenderTaskInfo) * thread_count,
@@ -1259,7 +1218,7 @@ static void lineart_triangle_cull_single(LineartRenderBuffer *rb,
  * new topology that represents the trimmed triangle. (which then became a triangle or a square
  * formed by two triangles)
  */
-static void lineart_main_cull_triangles(LineartRenderBuffer *rb, bool clip_far)
+void lineart_main_cull_triangles(LineartRenderBuffer *rb, bool clip_far)
 {
   LineartTriangle *tri;
   LineartElementLinkNode *v_eln, *t_eln, *e_eln;
@@ -1394,7 +1353,7 @@ static void lineart_main_cull_triangles(LineartRenderBuffer *rb, bool clip_far)
  * Adjacent data is only used during the initial stages of computing.
  * So we can free it using this function when it is not needed anymore.
  */
-static void lineart_main_free_adjacent_data(LineartRenderBuffer *rb)
+void lineart_main_free_adjacent_data(LineartRenderBuffer *rb)
 {
   LinkData *ld;
   while ((ld = BLI_pophead(&rb->triangle_adjacent_pointers)) != NULL) {
@@ -1412,7 +1371,7 @@ static void lineart_main_free_adjacent_data(LineartRenderBuffer *rb)
   }
 }
 
-static void lineart_main_perspective_division(LineartRenderBuffer *rb)
+void lineart_main_perspective_division(LineartRenderBuffer *rb)
 {
   LineartVert *vt;
   int i;
@@ -1437,7 +1396,7 @@ static void lineart_main_perspective_division(LineartRenderBuffer *rb)
   }
 }
 
-static void lineart_main_discard_out_of_frame_edges(LineartRenderBuffer *rb)
+void lineart_main_discard_out_of_frame_edges(LineartRenderBuffer *rb)
 {
   LineartEdge *e;
   int i;
@@ -1807,7 +1766,7 @@ static void loose_data_sum_reduce(const void *__restrict UNUSED(userdata),
   lineart_join_loose_edge_arr(final, loose_chunk);
 }
 
-static void lineart_add_edge_to_array(LineartPendingEdges *pe, LineartEdge *e)
+void lineart_add_edge_to_array(LineartPendingEdges *pe, LineartEdge *e)
 {
   if (pe->next >= pe->max || !pe->max) {
     if (!pe->max) {
@@ -1834,7 +1793,7 @@ static void lineart_add_edge_to_array_thread(LineartObjectInfo *obi, LineartEdge
 
 /* Note: For simplicity, this function doesn't actually do anything if you already have data in
  * #pe.  */
-static void lineart_finalize_object_edge_array_reserve(LineartPendingEdges *pe, int count)
+void lineart_finalize_object_edge_array_reserve(LineartPendingEdges *pe, int count)
 {
   if (pe->max || pe->array) {
     return;
@@ -2012,78 +1971,6 @@ static LineartEdgeNeighbor *lineart_build_edge_neighbor(Mesh *me, int total_edge
   return edge_nabr;
 }
 
-static LineartElementLinkNode *lineart_find_matching_eln(ListBase *shadow_elns, int obindex)
-{
-  LISTBASE_FOREACH (LineartElementLinkNode *, eln, shadow_elns) {
-    if (eln->obindex == obindex) {
-      return eln;
-    }
-  }
-  return NULL;
-}
-
-static LineartEdge *lineart_find_matching_edge(LineartElementLinkNode *shadow_eln,
-                                               uint64_t edge_identifier)
-{
-  LineartEdge *elist = (LineartEdge *)shadow_eln->pointer;
-  for (int i = 0; i < shadow_eln->element_count; i++) {
-    if (elist[i].from_shadow == (LineartEdge *)edge_identifier) {
-      return &elist[i];
-    }
-  }
-  return NULL;
-}
-
-static void lineart_register_shadow_cuts(LineartRenderBuffer *rb,
-                                         LineartEdge *e,
-                                         LineartEdge *shadow_edge)
-{
-  LISTBASE_FOREACH (LineartEdgeSegment *, es, &shadow_edge->segments) {
-    /* Convert to view space cutting points. */
-    double la1 = es->at;
-    double la2 = es->next ? es->next->at : 1.0f;
-    la1 = l

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list