[Bf-blender-cvs] [bbcc73607c8] lanpr-under-gp: LineArt: Change RenderLine to a single-way link list.

YimingWu noreply at git.blender.org
Wed Oct 21 11:11:55 CEST 2020


Commit: bbcc73607c832e02a6356ba201a7e5329e0f17d4
Author: YimingWu
Date:   Wed Oct 21 17:11:42 2020 +0800
Branches: lanpr-under-gp
https://developer.blender.org/rBbbcc73607c832e02a6356ba201a7e5329e0f17d4

LineArt: Change RenderLine to a single-way link list.

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

M	source/blender/editors/include/ED_lineart.h
M	source/blender/editors/lineart/lineart_chain.c
M	source/blender/editors/lineart/lineart_cpu.c
M	source/blender/editors/lineart/lineart_intern.h
M	source/blender/editors/lineart/lineart_util.c

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

diff --git a/source/blender/editors/include/ED_lineart.h b/source/blender/editors/include/ED_lineart.h
index 0f14b63e917..a0267e5ba96 100644
--- a/source/blender/editors/include/ED_lineart.h
+++ b/source/blender/editors/include/ED_lineart.h
@@ -126,7 +126,8 @@ typedef struct LineartRenderVert {
 } LineartRenderVert;
 
 typedef struct LineartRenderLine {
-  struct LineartRenderLine *next, *prev; /* Maybe we won't need this anymore, just use another flag. */
+  /* We only need link node kind of list here. */
+  struct LineartRenderLine* next;
   struct LineartRenderVert *l, *r;
   struct LineartRenderTriangle *tl, *tr;
   ListBase segments;
@@ -202,7 +203,6 @@ typedef struct LineartRenderBuffer {
   ListBase vertex_buffer_pointers;
   ListBase line_buffer_pointers;
   ListBase triangle_buffer_pointers;
-  ListBase all_render_lines;
 
   ListBase intersecting_vertex_buffer;
   /** Use the one comes with Line Art. */
@@ -219,28 +219,29 @@ typedef struct LineartRenderBuffer {
 
   unsigned int contour_count;
   unsigned int contour_processed;
-  LinkData *contour_managed;
-  ListBase contours;
+  LineartRenderLine *contour_managed;
+  /* Now changed to linknodes. */
+  LineartRenderLine *contours;
 
   unsigned int intersection_count;
   unsigned int intersection_processed;
-  LinkData *intersection_managed;
-  ListBase intersection_lines;
+  LineartRenderLine *intersection_managed;
+  LineartRenderLine *intersection_lines;
 
   unsigned int crease_count;
   unsigned int crease_processed;
-  LinkData *crease_managed;
-  ListBase crease_lines;
+  LineartRenderLine *crease_managed;
+  LineartRenderLine *crease_lines;
 
   unsigned int material_line_count;
   unsigned int material_processed;
-  LinkData *material_managed;
-  ListBase material_lines;
+  LineartRenderLine *material_managed;
+  LineartRenderLine *material_lines;
 
   unsigned int edge_mark_count;
   unsigned int edge_mark_processed;
-  LinkData *edge_mark_managed;
-  ListBase edge_marks;
+  LineartRenderLine *edge_mark_managed;
+  LineartRenderLine *edge_marks;
 
   ListBase chains;
 
@@ -382,20 +383,20 @@ typedef enum eLineartTriangleFlags {
 typedef struct LineartRenderTaskInfo {
   int thread_id;
 
-  LinkData *contour;
-  ListBase contour_pointers;
+  LineartRenderLine *contour;
+  LineartRenderLine *contour_end;
 
-  LinkData *intersection;
-  ListBase intersection_pointers;
+  LineartRenderLine *intersection;
+  LineartRenderLine *intersection_end;
 
-  LinkData *crease;
-  ListBase crease_pointers;
+  LineartRenderLine *crease;
+  LineartRenderLine *crease_end;
 
-  LinkData *material;
-  ListBase material_pointers;
+  LineartRenderLine *material;
+  LineartRenderLine *material_end;
 
-  LinkData *edge_mark;
-  ListBase edge_mark_pointers;
+  LineartRenderLine *edge_mark;
+  LineartRenderLine *edge_mark_end;
 
 } LineartRenderTaskInfo;
 
diff --git a/source/blender/editors/lineart/lineart_chain.c b/source/blender/editors/lineart/lineart_chain.c
index 289b2cc0b10..cdcea8d0037 100644
--- a/source/blender/editors/lineart/lineart_chain.c
+++ b/source/blender/editors/lineart/lineart_chain.c
@@ -199,6 +199,7 @@ static LineartRenderLineChainItem *lineart_chain_push_point(LineartRenderBuffer
 
 void ED_lineart_chain_feature_lines(LineartRenderBuffer *rb)
 {
+  LineartRenderLine* rl, *next_rl, *current_list;
   LineartRenderLineChain *rlc;
   LineartRenderLineChainItem *rlci;
   LineartBoundingArea *ba;
@@ -206,7 +207,9 @@ void ED_lineart_chain_feature_lines(LineartRenderBuffer *rb)
   int last_occlusion;
   unsigned char last_transparency;
 
-  LISTBASE_FOREACH (LineartRenderLine *, rl, &rb->all_render_lines) {
+  rl = rb->contours;
+  for (current_list = rb->contours; rl; rl = next_rl) {
+    next_rl = rl->next;
 
     if ((!(rl->flags & LRT_EDGE_FLAG_ALL_TYPE)) || (rl->flags & LRT_EDGE_FLAG_CHAIN_PICKED)) {
       continue;
@@ -489,6 +492,14 @@ void ED_lineart_chain_feature_lines(LineartRenderBuffer *rb)
     else {
       rlc->type = (rl->flags & LRT_EDGE_FLAG_ALL_TYPE);
     }
+    if(!next_rl){
+      if(current_list == rb->contours){current_list = rb->crease_lines;}
+      else if(current_list == rb->crease_lines){current_list = rb->material_lines;}
+      else if(current_list == rb->material_lines){current_list = rb->edge_marks;}
+      else if(current_list == rb->edge_marks){current_list = rb->intersection_lines;}
+      else {current_list=NULL;}
+      next_rl = current_list;
+    }
   }
 }
 
diff --git a/source/blender/editors/lineart/lineart_cpu.c b/source/blender/editors/lineart/lineart_cpu.c
index 58add1a99b3..688d37bf518 100644
--- a/source/blender/editors/lineart/lineart_cpu.c
+++ b/source/blender/editors/lineart/lineart_cpu.c
@@ -299,91 +299,32 @@ static void lineart_render_line_cut(LineartRenderBuffer *rb,
 
 static int lineart_occlusion_make_task_info(LineartRenderBuffer *rb, LineartRenderTaskInfo *rti)
 {
-  LinkData *data;
+  LineartRenderLine *data;
   int i;
   int res = 0;
 
   BLI_spin_lock(&rb->lock_task);
 
-  if (rb->contour_managed) {
-    data = rb->contour_managed;
-    rti->contour = (void *)data;
-    rti->contour_pointers.first = data;
-    for (i = 0; i < LRT_THREAD_LINE_COUNT && data; i++) {
-      data = data->next;
-    }
-    rb->contour_managed = data;
-    rti->contour_pointers.last = data ? data->prev : rb->contours.last;
-    res = 1;
-  }
-  else {
-    BLI_listbase_clear(&rti->contour_pointers);
-    rti->contour = 0;
-  }
-
-  if (rb->intersection_managed) {
-    data = rb->intersection_managed;
-    rti->intersection = (void *)data;
-    rti->intersection_pointers.first = data;
-    for (i = 0; i < LRT_THREAD_LINE_COUNT && data; i++) {
-      data = data->next;
-    }
-    rb->intersection_managed = data;
-    rti->intersection_pointers.last = data ? data->prev : rb->intersection_lines.last;
-    res = 1;
-  }
-  else {
-    BLI_listbase_clear(&rti->intersection_pointers);
-    rti->intersection = 0;
-  }
-
-  if (rb->crease_managed) {
-    data = rb->crease_managed;
-    rti->crease = (void *)data;
-    rti->crease_pointers.first = data;
-    for (i = 0; i < LRT_THREAD_LINE_COUNT && data; i++) {
-      data = data->next;
-    }
-    rb->crease_managed = data;
-    rti->crease_pointers.last = data ? data->prev : rb->crease_lines.last;
-    res = 1;
-  }
-  else {
-    BLI_listbase_clear(&rti->crease_pointers);
-    rti->crease = 0;
-  }
-
-  if (rb->material_managed) {
-    data = rb->material_managed;
-    rti->material = (void *)data;
-    rti->material_pointers.first = data;
-    for (i = 0; i < LRT_THREAD_LINE_COUNT && data; i++) {
-      data = data->next;
-    }
-    rb->material_managed = data;
-    rti->material_pointers.last = data ? data->prev : rb->material_lines.last;
-    res = 1;
-  }
-  else {
-    BLI_listbase_clear(&rti->material_pointers);
-    rti->material = 0;
-  }
-
-  if (rb->edge_mark_managed) {
-    data = rb->edge_mark_managed;
-    rti->edge_mark = (void *)data;
-    rti->edge_mark_pointers.first = data;
-    for (i = 0; i < LRT_THREAD_LINE_COUNT && data; i++) {
-      data = data->next;
-    }
-    rb->edge_mark_managed = data;
-    rti->edge_mark_pointers.last = data ? data->prev : rb->edge_marks.last;
-    res = 1;
-  }
-  else {
-    BLI_listbase_clear(&rti->edge_mark_pointers);
-    rti->edge_mark = 0;
-  }
+#define LRT_ASSIGN_OCCLUSION_TASK(name)\
+  if (rb->name##_managed) {\
+    data = rb->name##_managed;\
+    rti->name = (void *)data;\
+    for (i = 0; i < LRT_THREAD_LINE_COUNT && data; i++) {\
+      data = data->next;\
+    }\
+    rti->name##_end = data;\
+    rb->name##_managed = data;\
+    res = 1;\
+  }\
+  else {\
+    rti->name = NULL;\
+  }
+
+  LRT_ASSIGN_OCCLUSION_TASK(contour);
+  LRT_ASSIGN_OCCLUSION_TASK(intersection);
+  LRT_ASSIGN_OCCLUSION_TASK(crease);
+  LRT_ASSIGN_OCCLUSION_TASK(material);
+  LRT_ASSIGN_OCCLUSION_TASK(edge_mark);
 
   BLI_spin_unlock(&rb->lock_task);
 
@@ -443,13 +384,13 @@ static void lineart_occlusion_single_line(LineartRenderBuffer *rb,
 static void lineart_occlusion_worker(TaskPool *__restrict UNUSED(pool), LineartRenderTaskInfo *rti)
 {
   LineartRenderBuffer *rb = lineart_share.render_buffer_shared;
-  LinkData *lip;
+  LineartRenderLine *lip;
 
   while (lineart_occlusion_make_task_info(rb, rti)) {
 
-    for (lip = (void *)rti->contour; lip && lip->prev != rti->contour_pointers.last;
+    for (lip = (void *)rti->contour; lip && lip != rti->contour_end;
          lip = lip->next) {
-      lineart_occlusion_single_line(rb, lip->data, rti->thread_id);
+      lineart_occlusion_single_line(rb, lip, rti->thread_id);
     }
 
     /* Monitoring cancelation flag every once a while. */
@@ -457,35 +398,35 @@ static void lineart_occlusion_worker(TaskPool *__restrict UNUSED(pool), LineartR
       return;
     }
 
-    for (lip = (void *)rti->crease; lip && lip->prev != rti->crease_pointers.last;
+    for (lip = (void *)rti->crease; lip && lip != rti->crease_end;
          lip = lip->next) {
-      lineart_occlusion_single_line(rb, lip->data, rti->thread_id);
+      lineart_occlusion_single_line(rb, lip, rti->thread_id);
     }
 
     if (ED_lineart_calculation_flag_check(LRT_RENDER_CANCELING)) {
       return;
     }
 
-    for (lip = (void *)rti->intersection; lip && lip->prev != rti->intersection_pointers.last;
+    for (lip = (void *)rti->intersection; lip && lip != rti->intersection_end;
          lip = lip->next) {
-      lineart_occlusion_single_line(rb, lip->data, rti->thread_id);
+      lineart_occlusion_single_line(rb, lip, rti->thread_id);
     }
 
     if (ED_lineart_calculation_flag_check(LRT_RENDER_CANCELING)) {
       return;
     }
 
-    for (lip = (void *)rti->material; lip && lip->prev != rti->material_pointers.last;
+    for (lip = (void *)rti->material; lip && lip != rti->material_end;
          lip = lip->next) {
-      lineart_occlusion_single_line(rb, lip->data, rti->thread_id);
+      lineart_occlusion_single_line(rb, lip, rti->thread_id);
     }
     if (ED_lineart_calculation_flag_check(LRT_RENDER_CANCELING)) {
       return;
     }
 
-    for (lip = (void *)rti->edge_mark; lip && lip->prev != rti->edge_mark_pointers.last;
+    for (lip = (void *)rti->edge_mark; lip && lip != rti->edge_mark_end;
          lip = lip->next) {
-      lineart_occlusion

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list