[Bf-blender-cvs] [7f20c4c885b] temp-lineart-contained: LineArt: Cleaning up edge list names.
YimingWu
noreply at git.blender.org
Tue May 25 14:09:25 CEST 2021
Commit: 7f20c4c885be524ba41b8cfa29f0a71ac8ee06af
Author: YimingWu
Date: Tue May 25 20:09:11 2021 +0800
Branches: temp-lineart-contained
https://developer.blender.org/rB7f20c4c885be524ba41b8cfa29f0a71ac8ee06af
LineArt: Cleaning up edge list names.
===================================================================
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
M source/blender/gpencil_modifiers/intern/lineart/lineart_util.c
===================================================================
diff --git a/source/blender/gpencil_modifiers/intern/lineart/MOD_lineart.h b/source/blender/gpencil_modifiers/intern/lineart/MOD_lineart.h
index 77bde8ed485..66ec8b85f16 100644
--- a/source/blender/gpencil_modifiers/intern/lineart/MOD_lineart.h
+++ b/source/blender/gpencil_modifiers/intern/lineart/MOD_lineart.h
@@ -260,24 +260,15 @@ typedef struct LineartRenderBuffer {
int triangle_size;
- LineartEdge *contour_managed;
- /** A single linked list (cast to #LinkNode). */
- LineartEdge *contours;
-
- LineartEdge *intersection_managed;
- LineartEdge *intersection_lines;
-
- LineartEdge *crease_managed;
- LineartEdge *crease_lines;
-
- LineartEdge *material_managed;
- LineartEdge *material_lines;
-
- LineartEdge *edge_mark_managed;
- LineartEdge *edge_marks;
-
- LineartEdge *floating_managed;
- LineartEdge *floating_lines;
+ /* Although using ListBase here, LineartEdge is single linked list.
+ * list.last is used to store worker progress along the list.
+ * See lineart_main_occlusion_begin() for more info. */
+ ListBase contour;
+ ListBase intersection;
+ ListBase crease;
+ ListBase material;
+ ListBase edge_mark;
+ ListBase floating;
ListBase chains;
@@ -374,23 +365,13 @@ typedef struct LineartRenderTaskInfo {
int thread_id;
- LineartEdge *contour;
- LineartEdge *contour_end;
-
- LineartEdge *intersection;
- LineartEdge *intersection_end;
-
- LineartEdge *crease;
- LineartEdge *crease_end;
-
- LineartEdge *material;
- LineartEdge *material_end;
-
- LineartEdge *edge_mark;
- LineartEdge *edge_mark_end;
-
- LineartEdge *floating;
- LineartEdge *floating_end;
+ /* In these list, list->last doesn't end overall, it only ends for the specific task thread. */
+ ListBase contour;
+ ListBase intersection;
+ ListBase crease;
+ ListBase material;
+ ListBase edge_mark;
+ ListBase floating;
} LineartRenderTaskInfo;
@@ -410,18 +391,13 @@ typedef struct LineartObjectInfo {
/* Threads will add lines inside here, when all threads are done, we combine those into the ones
* in LineartRenderBuffer. */
- LineartEdge *contour;
- LineartEdge *contour_last;
- LineartEdge *crease;
- LineartEdge *crease_last;
- LineartEdge *material;
- LineartEdge *material_last;
- LineartEdge *edge_mark;
- LineartEdge *edge_mark_last;
- LineartEdge *intersection;
- LineartEdge *intersection_last;
- LineartEdge *floating;
- LineartEdge *floating_last;
+ ListBase contour;
+ ListBase intersection;
+ ListBase crease;
+ ListBase material;
+ ListBase edge_mark;
+ ListBase floating;
+
} LineartObjectInfo;
typedef struct LineartObjectLoadTaskInfo {
diff --git a/source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c b/source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c
index 1071f91e5a8..5a7b40cc937 100644
--- a/source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c
+++ b/source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c
@@ -416,18 +416,18 @@ static int lineart_occlusion_make_task_info(LineartRenderBuffer *rb, LineartRend
BLI_spin_lock(&rb->lock_task);
#define LRT_ASSIGN_OCCLUSION_TASK(name) \
- if (rb->name##_managed) { \
- data = rb->name##_managed; \
- rti->name = (void *)data; \
+ if (rb->name.last) { \
+ data = rb->name.last; \
+ rti->name.first = (void *)data; \
for (i = 0; i < LRT_THREAD_EDGE_COUNT && data; i++) { \
data = data->next; \
} \
- rti->name##_end = data; \
- rb->name##_managed = data; \
+ rti->name.last = data; \
+ rb->name.last = data; \
res = 1; \
} \
else { \
- rti->name = NULL; \
+ rti->name.first = rti->name.last = NULL; \
}
LRT_ASSIGN_OCCLUSION_TASK(contour);
@@ -451,27 +451,27 @@ static void lineart_occlusion_worker(TaskPool *__restrict UNUSED(pool), LineartR
while (lineart_occlusion_make_task_info(rb, rti)) {
- for (eip = rti->contour; eip && eip != rti->contour_end; eip = eip->next) {
+ for (eip = rti->contour.first; eip && eip != rti->contour.last; eip = eip->next) {
lineart_occlusion_single_line(rb, eip, rti->thread_id);
}
- for (eip = rti->crease; eip && eip != rti->crease_end; eip = eip->next) {
+ for (eip = rti->crease.first; eip && eip != rti->crease.last; eip = eip->next) {
lineart_occlusion_single_line(rb, eip, rti->thread_id);
}
- for (eip = rti->intersection; eip && eip != rti->intersection_end; eip = eip->next) {
+ for (eip = rti->intersection.first; eip && eip != rti->intersection.last; eip = eip->next) {
lineart_occlusion_single_line(rb, eip, rti->thread_id);
}
- for (eip = rti->material; eip && eip != rti->material_end; eip = eip->next) {
+ for (eip = rti->material.first; eip && eip != rti->material.last; eip = eip->next) {
lineart_occlusion_single_line(rb, eip, rti->thread_id);
}
- for (eip = rti->edge_mark; eip && eip != rti->edge_mark_end; eip = eip->next) {
+ for (eip = rti->edge_mark.first; eip && eip != rti->edge_mark.last; eip = eip->next) {
lineart_occlusion_single_line(rb, eip, rti->thread_id);
}
- for (eip = rti->floating; eip && eip != rti->floating_end; eip = eip->next) {
+ for (eip = rti->floating.first; eip && eip != rti->floating.last; eip = eip->next) {
lineart_occlusion_single_line(rb, eip, rti->thread_id);
}
}
@@ -489,12 +489,14 @@ static void lineart_main_occlusion_begin(LineartRenderBuffer *rb)
"Task Pool");
int i;
- rb->contour_managed = rb->contours;
- rb->crease_managed = rb->crease_lines;
- rb->intersection_managed = rb->intersection_lines;
- rb->material_managed = rb->material_lines;
- rb->edge_mark_managed = rb->edge_marks;
- rb->floating_managed = rb->floating_lines;
+ /* The "last" entry is used to store worker progress in the whole list.
+ * These list themselves are single-direction linked, with list.first being the head. */
+ rb->contour.last = rb->contour.first;
+ rb->crease.last = rb->crease.first;
+ rb->intersection.last = rb->intersection.first;
+ rb->material.last = rb->material.first;
+ rb->edge_mark.last = rb->edge_mark.first;
+ rb->floating.last = rb->floating.first;
TaskPool *tp = BLI_task_pool_create(NULL, TASK_PRIORITY_HIGH);
@@ -915,7 +917,7 @@ static void lineart_triangle_cull_single(LineartRenderBuffer *rb,
INCREASE_RL
if (allow_boundaries) {
e->flags = LRT_EDGE_FLAG_CONTOUR;
- lineart_prepend_edge_direct(&rb->contours, e);
+ lineart_prepend_edge_direct(&rb->contour.first, e);
}
/* NOTE: inverting `e->v1/v2` (left/right point) doesn't matter as long as
* `tri->edge` and `tri->v` has the same sequence. and the winding direction
@@ -964,7 +966,7 @@ static void lineart_triangle_cull_single(LineartRenderBuffer *rb,
INCREASE_RL
if (allow_boundaries) {
e->flags = LRT_EDGE_FLAG_CONTOUR;
- lineart_prepend_edge_direct(&rb->contours, e);
+ lineart_prepend_edge_direct(&rb->contour.first, e);
}
e->v1 = &vt[0];
e->v2 = &vt[1];
@@ -1005,7 +1007,7 @@ static void lineart_triangle_cull_single(LineartRenderBuffer *rb,
INCREASE_RL
if (allow_boundaries) {
e->flags = LRT_EDGE_FLAG_CONTOUR;
- lineart_prepend_edge_direct(&rb->contours, e);
+ lineart_prepend_edge_direct(&rb->contour.first, e);
}
e->v1 = &vt[1];
e->v2 = &vt[0];
@@ -1080,7 +1082,7 @@ static void lineart_triangle_cull_single(LineartRenderBuffer *rb,
INCREASE_RL
if (allow_boundaries) {
e->flags = LRT_EDGE_FLAG_CONTOUR;
- lineart_prepend_edge_direct(&rb->contours, e);
+ lineart_prepend_edge_direct(&rb->contour.first, e);
}
e->v1 = &vt[1];
e->v2 = &vt[0];
@@ -1132,7 +1134,7 @@ static void lineart_triangle_cull_single(LineartRenderBuffer *rb,
INCREASE_RL
if (allow_boundaries) {
e->flags = LRT_EDGE_FLAG_CONTOUR;
- lineart_prepend_edge_direct(&rb->contours, e);
+ lineart_prepend_edge_direct(&rb->contour.first, e);
}
e->v1 = &vt[1];
e->v2 = &vt[0];
@@ -1180,7 +1182,7 @@ static void lineart_triangle_cull_single(LineartRenderBuffer *rb,
INCREASE_RL
if (allow_boundaries) {
e->flags = LRT_EDGE_FLAG_CONTOUR;
- lineart_prepend_edge_direct(&rb->contours, e);
+ lineart_prepend_edge_direct(&rb->contour.first, e);
}
e->v1 = &vt[1];
e->v2 = &vt[0];
@@ -1539,94 +1541,71 @@ static void lineart_add_edge_to_list(LineartRenderBuffer *rb, LineartEdge *e)
{
switch (e->flags) {
case LRT_EDGE_FLAG_CONTOUR:
- lineart_prepend_edge_direct(&rb->contours, e);
+ lineart_prepend_edge_direct(&rb->contour.first, e);
break;
case LRT_EDGE_FLAG_CREASE:
- lineart_prepend_edge_direct(&rb->crease_lines, e);
+ lineart_prepend_edge_direct(&rb->crease.first, e);
break;
case LRT_EDGE_FLAG_MATERIAL:
- lineart_prepend_edge_direct(&rb->material_lines, e);
+ lineart_prepend_edge_direct(&rb->material.first, e);
break;
case LRT_EDGE_FLAG_EDGE_MARK:
- lineart_prepend_edge_direct(&rb->edge_marks, e);
+ lineart_prepend_edge_direct(&rb->edge_mark.first, e);
break;
case LRT_EDGE_FLAG_INTERSECTION:
- lineart_prepend_edge_direct(&rb->intersection_lines, e);
+ lineart_prepend_edge_direct(&rb->intersection.first, e);
break;
case LRT_EDGE_FLAG_FLOATING:
- lineart_prepend_edge_direct(&rb->floating_lines, e);
+ lineart_prepend_edge_direct(&rb->floating.first, e);
break;
}
}
static void lineart_add_edge_to_list_thread(LineartObjectInfo *obi, LineartEdge *e)
{
+
+#define LRT_ASSIGN_EDGE(name) \
+ lineart_prepend_edge_direct(&obi->name.first, e); \
+ if (!obi->name.last) { \
+ obi->name.last = e; \
+ }
switch (e->flags) {
case LRT_EDGE_FLAG_CONTOUR:
- lineart_prepend_edge_direct(&obi->contour, e);
- if (!obi->contour_last) {
- obi->contour_last = e;
- }
+ LRT_ASSIGN_EDGE(contour);
break;
case LRT_EDGE_FLAG_
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list