Commit: 328b28cf064cfd6eb130b64faa63eb9d93cfe939
Author: YimingWu
Date: Fri Aug 28 11:34:28 2020 +0800
Branches: lanpr-under-gp
https://developer.blender.org/rB328b28cf064cfd6eb130b64faa63eb9d93cfe939
LineArt: Feature line compatible clipping.
===================================================================
M source/blender/editors/include/ED_lineart.h
M source/blender/editors/lineart/lineart_cpu.c
M source/blender/makesdna/DNA_lineart_types.h
===================================================================
diff --git a/source/blender/editors/include/ED_lineart.h
b/source/blender/editors/include/ED_lineart.h
index 31aa811e5bd..332d794d3ca 100644
--- a/source/blender/editors/include/ED_lineart.h
+++ b/source/blender/editors/include/ED_lineart.h
@@ -122,7 +122,7 @@ typedef struct LineartRenderLine {
char min_occ;
/** Also for line type determination on chainning */
- char flags;
+ unsigned char flags;
/** Still need this entry because culled lines will not add to object reln
node */
struct Object *object_ref;
diff --git a/source/blender/editors/lineart/lineart_cpu.c
b/source/blender/editors/lineart/lineart_cpu.c
index e3cfa995474..b9a0fb91ac2 100644
--- a/source/blender/editors/lineart/lineart_cpu.c
+++ b/source/blender/editors/lineart/lineart_cpu.c
@@ -687,6 +687,40 @@ static void
lineart_triangle_set_cull_flag(LineartRenderTriangle *rt, unsigned c
rt->flags |= intersection_only;
}
+static bool lineart_triangle_adjacent_line_set(LineartRenderTriangle *rt,
+ LineartRenderTriangle
*search_in,
+ LineartRenderTriangle
*replace_with)
+{
+ if (!search_in) {
+ return false;
+ }
+ if (search_in->rl[0]->tl == rt) {
+ search_in->rl[0]->tl = replace_with;
+ return (search_in->rl[0]->flags & LRT_EDGE_FLAG_CLIPPED) != 0;
+ }
+ if (search_in->rl[0]->tr == rt) {
+ search_in->rl[0]->tr = replace_with;
+ return (search_in->rl[0]->flags & LRT_EDGE_FLAG_CLIPPED) != 0;
+ }
+ if (search_in->rl[1]->tl == rt) {
+ search_in->rl[1]->tl = replace_with;
+ return (search_in->rl[1]->flags & LRT_EDGE_FLAG_CLIPPED) != 0;
+ }
+ if (search_in->rl[1]->tr == rt) {
+ search_in->rl[1]->tr = replace_with;
+ return (search_in->rl[1]->flags & LRT_EDGE_FLAG_CLIPPED) != 0;
+ }
+ if (search_in->rl[2]->tl == rt) {
+ search_in->rl[2]->tl = replace_with;
+ return (search_in->rl[2]->flags & LRT_EDGE_FLAG_CLIPPED) != 0;
+ }
+ if (search_in->rl[2]->tr == rt) {
+ search_in->rl[2]->tr = replace_with;
+ return (search_in->rl[2]->flags & LRT_EDGE_FLAG_CLIPPED) != 0;
+ }
+ return false;
+}
+
/** This function cuts triangles that are (partially or fully) behind near
clipping plane.
* for triangles that crossing the near plane, it will generate new 1 or 2
triangles with
* new topology that represents the trimmed triangle. (which then became a
triangle or square)
@@ -694,7 +728,7 @@ static void
lineart_triangle_set_cull_flag(LineartRenderTriangle *rt, unsigned c
static void lineart_main_cull_triangles(LineartRenderBuffer *rb)
{
LineartRenderLine *rl;
- LineartRenderTriangle *rt, *rt1, *rt2;
+ LineartRenderTriangle *rt, *rt1, *rt2, *rt_next_to;
LineartRenderVert *rv;
LineartRenderElementLinkNode *veln, *teln;
LineartRenderLineSegment *rls;
@@ -703,6 +737,7 @@ static void lineart_main_cull_triangles(LineartRenderBuffer
*rb)
double a;
int v_count = 0, t_count = 0;
Object *ob;
+ bool added;
double view_dir[3], clip_advance[3];
copy_v3_v3_db(view_dir, rb->view_vector);
@@ -854,27 +889,37 @@ static void
lineart_main_cull_triangles(LineartRenderBuffer *rb)
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);
- BLI_addtail(&rb->all_render_lines, rl);
rl->l = &rv[1];
rl->r = rt->v[0];
+ rl->flags |= LRT_EDGE_FLAG_CLIPPED;
/* restore adjacent triangle data. */
rl->tl = rt->rl[0]->tl == rt ? rt1 : rt->rl[0]->tl;
rl->tr = rt->rl[0]->tr == rt ? rt1 : rt->rl[0]->tr;
rt1->rl[0] = rl;
rl->object_ref = ob;
+ rt_next_to = rt->rl[0]->tl == rt ? rt->rl[0]->tr : rt->rl[0]->tl;
+ added = lineart_triangle_adjacent_line_set(rt, rt_next_to, rt1);
+ if (!added) {
+ BLI_addtail(&rb->all_render_lines, rl);
+ }
/* 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);
- BLI_addtail(&rb->all_render_lines, rl);
rl->l = rt->v[0];
rl->r = &rv[0];
+ rl->flags |= LRT_EDGE_FLAG_CLIPPED;
/* restore adjacent triangle data. */
rl->tl = rt->rl[2]->tl == rt ? rt1 : rt->rl[2]->tl;
rl->tr = rt->rl[2]->tr == rt ? rt1 : rt->rl[2]->tr;
rt1->rl[2] = rl;
rl->object_ref = ob;
+ rt_next_to = rt->rl[2]->tl == rt ? rt->rl[2]->tr : rt->rl[2]->tl;
+ added = lineart_triangle_adjacent_line_set(rt, rt_next_to, rt1);
+ if (!added) {
+ BLI_addtail(&rb->all_render_lines, rl);
+ }
/* re-assign triangle point array to two new points. */
rt1->v[0] = rt->v[0];
@@ -924,24 +969,34 @@ static void
lineart_main_cull_triangles(LineartRenderBuffer *rb)
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);
- BLI_addtail(&rb->all_render_lines, rl);
rl->l = &rv[1];
rl->r = rt->v[2];
+ rl->flags |= LRT_EDGE_FLAG_CLIPPED;
rl->tl = rt->rl[1]->tl == rt ? rt1 : rt->rl[1]->tl;
rl->tr = rt->rl[1]->tr == rt ? rt1 : rt->rl[1]->tr;
rt1->rl[1] = rl;
rl->object_ref = ob;
+ rt_next_to = rt->rl[1]->tl == rt ? rt->rl[1]->tr : rt->rl[1]->tl;
+ added = lineart_triangle_adjacent_line_set(rt, rt_next_to, rt1);
+ if (!added) {
+ 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);
- BLI_addtail(&rb->all_render_lines, rl);
rl->l = rt->v[2];
rl->r = &rv[0];
+ rl->flags |= LRT_EDGE_FLAG_CLIPPED;
rl->tl = rt->rl[2]->tl == rt ? rt1 : rt->rl[2]->tl;
rl->tr = rt->rl[2]->tr == rt ? rt1 : rt->rl[2]->tr;
rt1->rl[2] = rl;
rl->object_ref = ob;
+ rt_next_to = rt->rl[2]->tl == rt ? rt->rl[2]->tr : rt->rl[2]->tl;
+ added = lineart_triangle_adjacent_line_set(rt, rt_next_to, rt1);
+ if (!added) {
+ BLI_addtail(&rb->all_render_lines, rl);
+ }
rt1->v[0] = &rv[0]; /*&rv[1];*/
rt1->v[1] = &rv[1]; /*rt->v[2];*/
@@ -990,24 +1045,34 @@ static void
lineart_main_cull_triangles(LineartRenderBuffer *rb)
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);
- BLI_addtail(&rb->all_render_lines, rl);
rl->l = &rv[0];
rl->r = rt->v[1];
+ rl->flags |= LRT_EDGE_FLAG_CLIPPED;
rl->tl = rt->rl[1]->tl == rt ? rt1 : rt->rl[1]->tl;
rl->tr = rt->rl[1]->tr == rt ? rt1 : rt->rl[1]->tr;
rt1->rl[0] = rl;
rl->object_ref = ob;
+ rt_next_to = rt->rl[1]->tl == rt ? rt->rl[1]->tr : rt->rl[1]->tl;
+ added = lineart_triangle_adjacent_line_set(rt, rt_next_to, rt1);
+ if (!added) {
+ 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);
- BLI_addtail(&rb->all_render_lines, rl);
rl->l = rt->v[1];
rl->r = &rv[1];
+ rl->flags |= LRT_EDGE_FLAG_CLIPPED;
rl->tl = rt->rl[0]->tl == rt ? rt1 : rt->rl[0]->tl;
rl->tr = rt->rl[0]->tr == rt ? rt1 : rt->rl[0]->tr;
rt1->rl[1] = rl;
rl->object_ref = ob;
+ rt_next_to = rt->rl[0]->tl == rt ? rt->rl[0]->tr : rt->rl[0]->tl;
+ added = lineart_triangle_adjacent_line_set(rt, rt_next_to, rt1);
+ if (!added) {
+ BLI_addtail(&rb->all_render_lines, rl);
+ }
rt1->v[0] = &rv[0]; /*rt->v[1];*/
rt1->v[1] = rt->v[1]; /*&rv[1];*/
@@ -1089,13 +1154,18 @@ static void
lineart_main_cull_triangles(LineartRenderBuffer *rb)
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);
- BLI_addtail(&rb->all_render_lines, rl);
rl->l = &rv[0];
rl->r = rt->v[1];
+ rl->flags |= LRT_EDGE_FLAG_CLIPPED;
rl->tl = rt1;
rl->tr = rt->rl[0]->tr == rt ? rt->rl[0]->tl : rt->rl[0]->tr;
rt1->rl[2] = rl;
rl->object_ref = ob;
+ rt_next_to = rt->rl[0]->tl == rt ? rt->rl[0]->tr : rt->rl[0]->tl;
+ added = lineart_triangle_adjacent_line_set(rt, rt_next_to, rt1);
+ if (!added) {
+ BLI_addtail(&rb->all_render_lines, rl);
+ }
/** New line connects new point 1 and old point 1,
* this is a inner line separating newly generated triangles.
@@ -1106,6 +1176,7 @@ static void
lineart_main_cull_triangles(LineartRenderBuffer *rb)
BLI_addtail(&rb->all_render_lines, rl);
rl->l = rt->v[1];
rl->r = &rv[1];
+ rl->flags |= LRT_EDGE_FLAG_CLIPPED;
rl->tl = rt1;
rl->tr = rt2;
rt1->rl[0] = rl;
@@ -1123
@@ Diff output truncated at 10240 characters. @@
_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs