[Bf-blender-cvs] [f4c22820f04] lanpr-under-gp: LineArt: Line cut reduction
YimingWu
noreply at git.blender.org
Wed Oct 14 16:42:38 CEST 2020
Commit: f4c22820f0442aeb728aef0d774ad8fbeb27abc0
Author: YimingWu
Date: Wed Oct 14 20:53:14 2020 +0800
Branches: lanpr-under-gp
https://developer.blender.org/rBf4c22820f0442aeb728aef0d774ad8fbeb27abc0
LineArt: Line cut reduction
===================================================================
M source/blender/editors/include/ED_lineart.h
M source/blender/editors/lineart/lineart_cpu.c
===================================================================
diff --git a/source/blender/editors/include/ED_lineart.h b/source/blender/editors/include/ED_lineart.h
index 7d30b082f7d..524ec7ba2b0 100644
--- a/source/blender/editors/include/ED_lineart.h
+++ b/source/blender/editors/include/ED_lineart.h
@@ -201,6 +201,8 @@ typedef struct LineartRenderBuffer {
ListBase intersecting_vertex_buffer;
/** Use the one comes with Line Art. */
LineartStaticMemPool render_data_pool;
+ ListBase wasted_cuts;
+ SpinLock lock_cuts;
struct Material *material_pointers[2048];
diff --git a/source/blender/editors/lineart/lineart_cpu.c b/source/blender/editors/lineart/lineart_cpu.c
index 34cd33f553b..9800ff6231e 100644
--- a/source/blender/editors/lineart/lineart_cpu.c
+++ b/source/blender/editors/lineart/lineart_cpu.c
@@ -130,13 +130,36 @@ static int lineart_triangle_line_imagespace_intersection_v2(SpinLock *spl,
int use_smooth_contour_modifier_contour = 0; /* debug purpose */
+static void lineart_render_line_discard_segment(LineartRenderBuffer* rb, LineartRenderLineSegment* rls){
+ BLI_spin_lock(&rb->lock_cuts);
+
+ memset(rls,0,sizeof(LineartRenderLineSegment));
+ BLI_addtail(&rb->wasted_cuts, rls);
+
+ BLI_spin_unlock(&rb->lock_cuts);
+}
+
+static LineartRenderLineSegment* lineart_render_line_give_segment(LineartRenderBuffer* rb){
+ BLI_spin_lock(&rb->lock_cuts);
+
+ if(rb->wasted_cuts.first){
+ LineartRenderLineSegment* rls = (LineartRenderLineSegment*)BLI_pophead(&rb->wasted_cuts);
+ BLI_spin_unlock(&rb->lock_cuts);
+ memset(rls,0,sizeof(LineartRenderLineSegment));
+ return rls;
+ }else{
+ BLI_spin_unlock(&rb->lock_cuts);
+ return (LineartRenderLineSegment*)lineart_mem_aquire_thread(&rb->render_data_pool, sizeof(LineartRenderLineSegment));
+ }
+}
+
static void lineart_render_line_cut(LineartRenderBuffer *rb,
LineartRenderLine *rl,
double start,
double end,
unsigned char transparency_mask)
{
- LineartRenderLineSegment *rls, *irls;
+ LineartRenderLineSegment *rls, *irls, *next_rls, *prev_rls;
LineartRenderLineSegment *start_segment = 0, *end_segment = 0;
LineartRenderLineSegment *ns = 0, *ns2 = 0;
int untouched = 0;
@@ -198,13 +221,13 @@ static void lineart_render_line_cut(LineartRenderBuffer *rb,
}
else if (rls->at > end) {
end_segment = rls;
- ns2 = lineart_mem_aquire_thread(&rb->render_data_pool, sizeof(LineartRenderLineSegment));
+ ns2 = lineart_render_line_give_segment(rb);
break;
}
}
if (ns == NULL) {
- ns = lineart_mem_aquire_thread(&rb->render_data_pool, sizeof(LineartRenderLineSegment));
+ ns = lineart_render_line_give_segment(rb);
}
if (ns2 == NULL) {
if (untouched) {
@@ -212,7 +235,7 @@ static void lineart_render_line_cut(LineartRenderBuffer *rb,
end_segment = ns2;
}
else
- ns2 = lineart_mem_aquire_thread(&rb->render_data_pool, sizeof(LineartRenderLineSegment));
+ ns2 = lineart_render_line_give_segment(rb);
}
if (start_segment) {
@@ -250,8 +273,19 @@ static void lineart_render_line_cut(LineartRenderBuffer *rb,
}
char min_occ = 127;
- LISTBASE_FOREACH (LineartRenderLineSegment *, iirls, &rl->segments) {
- min_occ = MIN2(min_occ, iirls->occlusion);
+ prev_rls = NULL;
+ for (rls = rl->segments.first; rls; rls = next_rls) {
+ next_rls = rls->next;
+
+ if(prev_rls && prev_rls->occlusion == rls->occlusion && prev_rls->transparency_mask == rls->transparency_mask){
+ BLI_remlink(&rl->segments, rls);
+ lineart_render_line_discard_segment(rb, rls);
+ continue;
+ }
+
+ min_occ = MIN2(min_occ, rls->occlusion);
+
+ prev_rls = rls;
}
rl->min_occ = min_occ;
}
@@ -2575,12 +2609,14 @@ static void lineart_destroy_render_data(void)
BLI_listbase_clear(&rb->edge_marks);
BLI_listbase_clear(&rb->all_render_lines);
BLI_listbase_clear(&rb->chains);
+ BLI_listbase_clear(&rb->wasted_cuts);
BLI_listbase_clear(&rb->vertex_buffer_pointers);
BLI_listbase_clear(&rb->line_buffer_pointers);
BLI_listbase_clear(&rb->triangle_buffer_pointers);
BLI_spin_end(&rb->lock_task);
+ BLI_spin_end(&rb->lock_cuts);
BLI_spin_end(&rb->render_data_pool.lock_mem);
lineart_mem_destroy(&rb->render_data_pool);
@@ -2685,6 +2721,7 @@ LineartRenderBuffer *ED_lineart_create_render_buffer(Scene *scene)
rb->use_intersections = (scene->lineart.line_types & LRT_EDGE_FLAG_INTERSECTION) != 0;
BLI_spin_init(&rb->lock_task);
+ BLI_spin_init(&rb->lock_cuts);
BLI_spin_init(&rb->render_data_pool.lock_mem);
lineart_share.allow_overlapping_edges = (scene->lineart.flags & LRT_ALLOW_OVERLAPPING_EDGES) !=
More information about the Bf-blender-cvs
mailing list