[Bf-blender-cvs] [2ac36130844] lanpr-under-gp: LineArt: Fixed clipping line data link for new iteration path in contour detection.
YimingWu
noreply at git.blender.org
Fri Sep 11 05:48:37 CEST 2020
Commit: 2ac361308440ed282d0815661887a04abd0beb00
Author: YimingWu
Date: Fri Sep 11 11:37:51 2020 +0800
Branches: lanpr-under-gp
https://developer.blender.org/rB2ac361308440ed282d0815661887a04abd0beb00
LineArt: Fixed clipping line data link for new iteration path in contour detection.
===================================================================
M source/blender/editors/lineart/lineart_cpu.c
===================================================================
diff --git a/source/blender/editors/lineart/lineart_cpu.c b/source/blender/editors/lineart/lineart_cpu.c
index 7a8955b96d1..851a3075c5f 100644
--- a/source/blender/editors/lineart/lineart_cpu.c
+++ b/source/blender/editors/lineart/lineart_cpu.c
@@ -664,6 +664,23 @@ static LineartRenderElementLinkNode *lineart_memory_get_vert_space(LineartRender
return reln;
}
+static LineartRenderElementLinkNode *lineart_memory_get_line_space(LineartRenderBuffer *rb)
+{
+ LineartRenderElementLinkNode *reln;
+
+ LineartRenderLine *render_lines = lineart_mem_aquire(&rb->render_data_pool,
+ sizeof(LineartRenderLine) * 64);
+
+ reln = lineart_list_append_pointer_static_sized(&rb->line_buffer_pointers,
+ &rb->render_data_pool,
+ render_lines,
+ sizeof(LineartRenderElementLinkNode));
+ reln->element_count = 64;
+ reln->flags |= LRT_ELEMENT_IS_ADDITIONAL;
+
+ return reln;
+}
+
static void lineart_render_line_assign_with_triangle(LineartRenderTriangle *rt)
{
if (rt->rl[0]->tl == NULL) {
@@ -741,15 +758,15 @@ static bool lineart_triangle_adjacent_line_set(LineartRenderTriangle *rt,
*/
static void lineart_main_cull_triangles(LineartRenderBuffer *rb, bool clip_far)
{
- LineartRenderLine *rl;
+ LineartRenderLine *rl, *new_rl;
LineartRenderTriangle *rt, *rt1, *rt2, *rt_next_to;
LineartRenderVert *rv;
- LineartRenderElementLinkNode *veln, *teln;
+ LineartRenderElementLinkNode *veln, *teln, *leln;
LineartRenderLineSegment *rls;
double(*vp)[4] = rb->view_projection;
int i;
double a;
- int v_count = 0, t_count = 0;
+ int v_count = 0, t_count = 0, l_count = 0;
Object *ob;
bool added;
double cam_pos[3];
@@ -775,8 +792,18 @@ static void lineart_main_cull_triangles(LineartRenderBuffer *rb, bool clip_far)
veln = lineart_memory_get_vert_space(rb);
teln = lineart_memory_get_triangle_space(rb);
+ leln = lineart_memory_get_line_space(rb);
+
rv = &((LineartRenderVert *)veln->pointer)[v_count];
rt1 = (void *)(((unsigned char *)teln->pointer) + rb->triangle_size * t_count);
+ new_rl = &((LineartRenderLine *)leln->pointer)[l_count];
+
+#define INCREASE_RL \
+ l_count++; \
+ new_rl = &((LineartRenderLine *)leln->pointer)[l_count]; \
+ rl = new_rl; \
+ rls = lineart_mem_aquire(&rb->render_data_pool, sizeof(LineartRenderLineSegment)); \
+ BLI_addtail(&rl->segments, rls);
LISTBASE_FOREACH (LineartRenderElementLinkNode *, reln, &rb->triangle_buffer_pointers) {
if (reln->flags & LRT_ELEMENT_IS_ADDITIONAL) {
@@ -827,6 +854,11 @@ static void lineart_main_cull_triangles(LineartRenderBuffer *rb, bool clip_far)
teln = lineart_memory_get_triangle_space(rb);
t_count = 0;
}
+ if (l_count > 60) {
+ leln->element_count = l_count;
+ leln = lineart_memory_get_line_space(rb);
+ l_count = 0;
+ }
rv = &((LineartRenderVert *)veln->pointer)[v_count];
rt1 = (void *)(((unsigned char *)teln->pointer) + rb->triangle_size * t_count);
@@ -834,6 +866,14 @@ static void lineart_main_cull_triangles(LineartRenderBuffer *rb, bool clip_far)
double vv1[3], vv2[3], dot1, dot2;
+#define REMOVE_ORIGINAL_LINES \
+ BLI_remlink(&rb->all_render_lines, (void *)rt->rl[0]); \
+ rt->rl[0]->next = rt->rl[0]->prev = 0; \
+ BLI_remlink(&rb->all_render_lines, (void *)rt->rl[1]); \
+ rt->rl[1]->next = rt->rl[1]->prev = 0; \
+ BLI_remlink(&rb->all_render_lines, (void *)rt->rl[2]); \
+ rt->rl[2]->next = rt->rl[2]->prev = 0;
+
switch (in0 + in1 + in2) {
case 0: /* ignore this triangle. */
continue;
@@ -842,12 +882,9 @@ static void lineart_main_cull_triangles(LineartRenderBuffer *rb, bool clip_far)
* also remove render lines form being computed.
*/
lineart_triangle_set_cull_flag(rt, LRT_CULL_DISCARD);
- BLI_remlink(&rb->all_render_lines, (void *)rt->rl[0]);
- rt->rl[0]->next = rt->rl[0]->prev = 0;
- BLI_remlink(&rb->all_render_lines, (void *)rt->rl[1]);
- rt->rl[1]->next = rt->rl[1]->prev = 0;
- BLI_remlink(&rb->all_render_lines, (void *)rt->rl[2]);
- rt->rl[2]->next = rt->rl[2]->prev = 0;
+
+ REMOVE_ORIGINAL_LINES
+
continue;
case 2:
/** Two points behind near plane, cut those and
@@ -892,18 +929,10 @@ static void lineart_main_cull_triangles(LineartRenderBuffer *rb, bool clip_far)
interp_v3_v3v3_db(rv[1].gloc, rt->v[0]->gloc, rt->v[1]->gloc, a);
mul_v4_m4v3_db(rv[1].fbcoord, vp, rv[1].gloc);
- /* remove all original render lines */
- BLI_remlink(&rb->all_render_lines, (void *)rt->rl[0]);
- rt->rl[0]->next = rt->rl[0]->prev = 0;
- BLI_remlink(&rb->all_render_lines, (void *)rt->rl[1]);
- rt->rl[1]->next = rt->rl[1]->prev = 0;
- BLI_remlink(&rb->all_render_lines, (void *)rt->rl[2]);
- rt->rl[2]->next = rt->rl[2]->prev = 0;
+ REMOVE_ORIGINAL_LINES
/* New line connecting two new points */
- rl = lineart_mem_aquire(&rb->render_data_pool, sizeof(LineartRenderLine));
- rls = lineart_mem_aquire(&rb->render_data_pool, sizeof(LineartRenderLineSegment));
- BLI_addtail(&rl->segments, rls);
+ INCREASE_RL
BLI_addtail(&rb->all_render_lines, rl);
/** note: inverting rl->l/r (left/right point) doesn't matter as long as
* rt->rl and rt->v has the same sequence. and the winding direction
@@ -918,9 +947,7 @@ static void lineart_main_cull_triangles(LineartRenderBuffer *rb, bool clip_far)
rl->object_ref = ob;
/* new line connecting original point 0 and a new point */
- rl = lineart_mem_aquire(&rb->render_data_pool, sizeof(LineartRenderLine));
- rls = lineart_mem_aquire(&rb->render_data_pool, sizeof(LineartRenderLineSegment));
- BLI_addtail(&rl->segments, rls);
+ INCREASE_RL
rl->l = &rv[1];
rl->r = rt->v[0];
rl->flags |= LRT_EDGE_FLAG_CLIPPED;
@@ -936,9 +963,7 @@ static void lineart_main_cull_triangles(LineartRenderBuffer *rb, bool clip_far)
}
/* new line connecting original point 0 and another new point */
- rl = lineart_mem_aquire(&rb->render_data_pool, sizeof(LineartRenderLine));
- rls = lineart_mem_aquire(&rb->render_data_pool, sizeof(LineartRenderLineSegment));
- BLI_addtail(&rl->segments, rls);
+ INCREASE_RL
rl->l = rt->v[0];
rl->r = &rv[0];
rl->flags |= LRT_EDGE_FLAG_CLIPPED;
@@ -981,16 +1006,9 @@ static void lineart_main_cull_triangles(LineartRenderBuffer *rb, bool clip_far)
interp_v3_v3v3_db(rv[1].gloc, rt->v[2]->gloc, rt->v[1]->gloc, a);
mul_v4_m4v3_db(rv[1].fbcoord, vp, rv[1].gloc);
- BLI_remlink(&rb->all_render_lines, (void *)rt->rl[0]);
- rt->rl[0]->next = rt->rl[0]->prev = 0;
- BLI_remlink(&rb->all_render_lines, (void *)rt->rl[1]);
- rt->rl[1]->next = rt->rl[1]->prev = 0;
- BLI_remlink(&rb->all_render_lines, (void *)rt->rl[2]);
- rt->rl[2]->next = rt->rl[2]->prev = 0;
+ REMOVE_ORIGINAL_LINES
- rl = lineart_mem_aquire(&rb->render_data_pool, sizeof(LineartRenderLine));
- rls = lineart_mem_aquire(&rb->render_data_pool, sizeof(LineartRenderLineSegment));
- BLI_addtail(&rl->segments, rls);
+ INCREASE_RL
BLI_addtail(&rb->all_render_lines, rl);
rl->l = &rv[0];
rl->r = &rv[1];
@@ -998,9 +1016,7 @@ static void lineart_main_cull_triangles(LineartRenderBuffer *rb, bool clip_far)
rt1->rl[0] = rl;
rl->object_ref = ob;
- rl = lineart_mem_aquire(&rb->render_data_pool, sizeof(LineartRenderLine));
- rls = lineart_mem_aquire(&rb->render_data_pool, sizeof(LineartRenderLineSegment));
- BLI_addtail(&rl->segments, rls);
+ INCREASE_RL
rl->l = &rv[1];
rl->r = rt->v[2];
rl->flags |= LRT_EDGE_FLAG_CLIPPED;
@@ -1014,9 +1030,7 @@ static void lineart_main_cull_triangles(LineartRenderBuffer *rb, bool clip_far)
BLI_addtail(&rb->all_render_lines, rl);
}
- rl = lineart_mem_aquire(&rb->render_data_pool, sizeof(LineartRenderLine));
- rls = lineart_mem_aquire(&rb->render_data_pool, sizeof(LineartRenderLineSegment));
- BLI_addtail(&rl->segments, rls);
+ INCREASE_RL
rl->l = rt->v[2];
rl->r = &rv[0];
rl->flags |= LRT_EDGE_FLAG_CLIPPED;
@@ -1057,16 +1071,9 @@ static void lineart_main_cull_triangles(LineartRenderBuffer *rb, bool clip_far)
interp_v3_v3v3_db(rv[1].gloc, rt->v[1]->gloc, rt->v[0]->gloc, a);
mul_v4_m4v3_db(rv[1].fbcoord, vp, rv[1].gloc);
- BLI_remlink(&rb->all_render_lines, (void *)rt->rl[0]);
- rt->rl[0]->next = rt->rl[0]->prev = 0;
- BLI_remlink(&rb->all_render_lines, (void *)rt->rl[1]);
- rt->rl[1]->next = rt->rl[1]->prev = 0;
- BLI_remlink(&rb->all_render_lines, (void *)rt->rl[2]);
- rt->rl[2]->next = rt->rl[2]->prev = 0;
+ REMOVE_ORIGINAL_LINES
- rl = lineart_mem_aquire(&rb->render_data_pool, sizeof(LineartRenderLine));
- rls = lineart_mem_aquire(&rb->render_data_pool, sizeof(LineartRenderLineSegment));
- BLI_addtail(&rl->segments, rls);
+ INCREASE_RL
BLI_addtail(&rb->all_render_lines, rl);
rl->l = &rv[1];
rl->r = &rv[0];
@@ -1074,9 +1081,7 @@ static void lineart_main_cull_triangles(LineartRenderBuffer *rb, bool clip_far)
rt1->rl[2] = rl;
rl->object_ref = ob;
- rl = lineart_mem_aquire(&rb->render_data_pool, sizeof(LineartRenderLine));
- rls = lineart_mem_aquire(&rb->render_data_pool, size
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list