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

Reply via email to