[Bf-blender-cvs] [5860d4e2403] temp-lineart-contained: LineArt: Use array instead of array for ba->linked_edge

YimingWu noreply at git.blender.org
Fri May 14 13:17:00 CEST 2021


Commit: 5860d4e240396a3a16d9b2b7f940214a8444c48a
Author: YimingWu
Date:   Fri May 14 19:15:48 2021 +0800
Branches: temp-lineart-contained
https://developer.blender.org/rB5860d4e240396a3a16d9b2b7f940214a8444c48a

LineArt: Use array instead of array for ba->linked_edge

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

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

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

diff --git a/source/blender/gpencil_modifiers/intern/lineart/MOD_lineart.h b/source/blender/gpencil_modifiers/intern/lineart/MOD_lineart.h
index d3e3aa5ce92..7e980669a33 100644
--- a/source/blender/gpencil_modifiers/intern/lineart/MOD_lineart.h
+++ b/source/blender/gpencil_modifiers/intern/lineart/MOD_lineart.h
@@ -216,6 +216,7 @@ enum eLineArtTileRecursiveLimit {
 };
 
 #define LRT_TILE_SPLITTING_TRIANGLE_LIMIT 100
+#define LRT_TILE_EDGE_COUNT_INITIAL 32
 
 typedef struct LineartRenderBuffer {
   struct LineartRenderBuffer *prev, *next;
@@ -470,11 +471,12 @@ typedef struct LineartBoundingArea {
 
   short triangle_count;
   short max_triangle_count;
+  short line_count;
+  short max_line_count;
 
   /* Use array for speeding up multiple accesses. */
   struct LineartTriangle **linked_triangles;
-
-  ListBase linked_lines;
+  struct LineartEdge **linked_lines;
 
   /** Reserved for image space reduction && multi-thread chaining. */
   ListBase linked_chains;
diff --git a/source/blender/gpencil_modifiers/intern/lineart/lineart_chain.c b/source/blender/gpencil_modifiers/intern/lineart/lineart_chain.c
index 53fb0b7333d..9b1f6becde5 100644
--- a/source/blender/gpencil_modifiers/intern/lineart/lineart_chain.c
+++ b/source/blender/gpencil_modifiers/intern/lineart/lineart_chain.c
@@ -41,8 +41,8 @@ static LineartEdge *lineart_line_get_connected(LineartBoundingArea *ba,
                                                int match_flag,
                                                unsigned char match_isec_mask)
 {
-  LISTBASE_FOREACH (LinkData *, lip, &ba->linked_lines) {
-    LineartEdge *n_e = lip->data;
+  for (int i = 0; i < ba->line_count; i++) {
+    LineartEdge *n_e = ba->linked_lines[i];
 
     if ((!(n_e->flags & LRT_EDGE_FLAG_ALL_TYPE)) || (n_e->flags & LRT_EDGE_FLAG_CHAIN_PICKED)) {
       continue;
diff --git a/source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c b/source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c
index 3abf5b0bb20..ed951ca43b8 100644
--- a/source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c
+++ b/source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c
@@ -335,6 +335,21 @@ static void lineart_bounding_area_triangle_add(LineartRenderBuffer *rb,
   ba->triangle_count++;
 }
 
+static void lineart_bounding_area_line_add(LineartRenderBuffer *rb,
+                                           LineartBoundingArea *ba,
+                                           LineartEdge *rl)
+{
+  if (ba->line_count >= ba->max_line_count) {
+    LineartEdge **new_array = lineart_mem_aquire(&rb->render_data_pool,
+                                                 sizeof(LineartEdge *) * ba->max_line_count * 2);
+    memcpy(new_array, ba->linked_lines, sizeof(LineartEdge *) * ba->max_line_count);
+    ba->max_line_count *= 2;
+    ba->linked_lines = new_array;
+  }
+  ba->linked_lines[ba->line_count] = rl;
+  ba->line_count++;
+}
+
 static void lineart_occlusion_single_line(LineartRenderBuffer *rb, LineartEdge *e, int thread_id)
 {
   double x = e->v1->fbcoord[0], y = e->v1->fbcoord[1];
@@ -3094,8 +3109,11 @@ static void lineart_main_bounding_area_make_initial(LineartRenderBuffer *rb)
 
       /* Init linked_triangles array. */
       ba->max_triangle_count = LRT_TILE_SPLITTING_TRIANGLE_LIMIT;
+      ba->max_line_count = LRT_TILE_EDGE_COUNT_INITIAL;
       ba->linked_triangles = lineart_mem_aquire(
-          &rb->render_data_pool, sizeof(LineartTriangle *) * LRT_TILE_SPLITTING_TRIANGLE_LIMIT);
+          &rb->render_data_pool, sizeof(LineartTriangle *) * ba->max_triangle_count);
+      ba->linked_lines = lineart_mem_aquire(&rb->render_data_pool,
+                                            sizeof(LineartEdge *) * ba->max_line_count);
 
       /* Link adjacent ones. */
       if (row) {
@@ -3314,8 +3332,11 @@ static void lineart_bounding_area_split(LineartRenderBuffer *rb,
   /* Init linked_triangles array. */
   for (int i = 0; i < 4; i++) {
     ba[i].max_triangle_count = LRT_TILE_SPLITTING_TRIANGLE_LIMIT;
+    ba[i].max_line_count = LRT_TILE_EDGE_COUNT_INITIAL;
     ba[i].linked_triangles = lineart_mem_aquire(
         &rb->render_data_pool, sizeof(LineartTriangle *) * LRT_TILE_SPLITTING_TRIANGLE_LIMIT);
+    ba[i].linked_lines = lineart_mem_aquire(&rb->render_data_pool,
+                                            sizeof(LineartEdge *) * LRT_TILE_EDGE_COUNT_INITIAL);
   }
 
   for (int i = 0; i < root->triangle_count; i++) {
@@ -3340,7 +3361,8 @@ static void lineart_bounding_area_split(LineartRenderBuffer *rb,
     }
   }
 
-  while ((e = lineart_list_pop_pointer_no_free(&root->linked_lines)) != NULL) {
+  for (int i = 0; i < root->line_count; i++) {
+    e = root->linked_lines[i];
     lineart_bounding_area_link_line(rb, root, e);
   }
 
@@ -3488,7 +3510,7 @@ static void lineart_bounding_area_link_line(LineartRenderBuffer *rb,
                                             LineartEdge *e)
 {
   if (root_ba->child == NULL) {
-    lineart_list_append_pointer_pool(&root_ba->linked_lines, &rb->render_data_pool, e);
+    lineart_bounding_area_line_add(rb, root_ba, e);
   }
   else {
     if (lineart_bounding_area_line_intersect(



More information about the Bf-blender-cvs mailing list