[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