[Bf-blender-cvs] [661fa309f19] lanpr-under-gp: LineArt: Use separate adjacent info for clipping

YimingWu noreply at git.blender.org
Fri Oct 23 02:57:31 CEST 2020


Commit: 661fa309f1916307d5a60ba7efea57b290e772f5
Author: YimingWu
Date:   Fri Oct 23 08:57:23 2020 +0800
Branches: lanpr-under-gp
https://developer.blender.org/rB661fa309f1916307d5a60ba7efea57b290e772f5

LineArt: Use separate adjacent info for clipping

===================================================================

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 e4dc22af926..7c30aec5ef2 100644
--- a/source/blender/editors/include/ED_lineart.h
+++ b/source/blender/editors/include/ED_lineart.h
@@ -50,6 +50,10 @@ typedef struct LineartStaticMemPool {
   SpinLock lock_mem;
 } LineartStaticMemPool;
 
+typedef struct LineartRenderTriangleAdjacent {
+  struct LineartRenderLine *rl[3];
+} LineartRenderTriangleAdjacent;
+
 typedef struct LineartRenderTriangle {
   struct LineartRenderVert *v[3];
   // struct LineartRenderLine *rl[3];
@@ -214,6 +218,9 @@ typedef struct LineartRenderBuffer {
   ListBase line_buffer_pointers;
   ListBase triangle_buffer_pointers;
 
+  /* This one's memory is not from main pool and is free()ed after culling stage. */
+  ListBase triangle_adjacent_pointers;
+
   ListBase intersecting_vertex_buffer;
   /** Use the one comes with Line Art. */
   LineartStaticMemPool render_data_pool;
diff --git a/source/blender/editors/lineart/lineart_cpu.c b/source/blender/editors/lineart/lineart_cpu.c
index 0ecb35a2910..7f4c44497fa 100644
--- a/source/blender/editors/lineart/lineart_cpu.c
+++ b/source/blender/editors/lineart/lineart_cpu.c
@@ -691,7 +691,6 @@ static void lineart_triangle_cull_single(LineartRenderBuffer *rb,
                                          double *view_dir,
                                          bool allow_boundaries,
                                          double (*vp)[4],
-                                         LineartRenderLine *given_line,
                                          Object *ob,
                                          int *r_v_count,
                                          int *r_l_count,
@@ -707,13 +706,17 @@ static void lineart_triangle_cull_single(LineartRenderBuffer *rb,
   int t_count = *r_t_count;
   char new_flag = 0;
 
-  LineartRenderLine *new_rl, *rl;
+  LineartRenderLine *new_rl, *rl, *old_rl;
   LineartRenderLineSegment *rls;
+  LineartRenderTriangleAdjacent *rta;
 
   if (rt->flags & (LRT_CULL_USED | LRT_CULL_GENERATED | LRT_CULL_DISCARD)) {
     return;
   }
 
+  /* See header and object_load() for details. */
+  rta = (void *)rt->intersecting_verts;
+
   LineartRenderVert *rv = &((LineartRenderVert *)veln->pointer)[v_count];
   LineartRenderTriangle *rt1 = (void *)(((unsigned char *)teln->pointer) +
                                         rb->triangle_size * t_count);
@@ -729,18 +732,26 @@ static void lineart_triangle_cull_single(LineartRenderBuffer *rb,
   rls = lineart_mem_aquire(&rb->render_data_pool, sizeof(LineartRenderLineSegment)); \
   BLI_addtail(&rl->segments, rls);
 
-#define SELECT_RL(v1, v2, llink, rlink) \
-  if (given_line) { \
-    if (lineart_line_match(rt, given_line, v1, v2)) { \
-      new_flag = given_line->flags; \
-      given_line->flags = LRT_EDGE_FLAG_CHAIN_PICKED; \
-      INCREASE_RL \
-      rl->l = (llink); \
-      rl->r = (rlink); \
-      rl->flags = new_flag; \
-      rl->object_ref = ob; \
-      lineart_add_line_to_list(rb, rl); \
-    } \
+#define SELECT_RL(rl_num, llink, rlink, newrt) \
+  if (rta->rl[rl_num]) { \
+    old_rl = rta->rl[rl_num]; \
+    new_flag = old_rl->flags; \
+    old_rl->flags = LRT_EDGE_FLAG_CHAIN_PICKED; \
+    INCREASE_RL \
+    rl->l = (llink); \
+    rl->r = (rlink); \
+    rl->flags = new_flag; \
+    rl->object_ref = ob; \
+    rl->tl = ((old_rl->tl == rt) ? (newrt) : (old_rl->tl)); \
+    rl->tr = ((old_rl->tr == rt) ? (newrt) : (old_rl->tr)); \
+    lineart_add_line_to_list(rb, rl); \
+  }
+
+#define RELINK_RL(rl_num, newrt) \
+  if (rta->rl[rl_num]) { \
+    old_rl = rta->rl[rl_num]; \
+    old_rl->tl = ((old_rl->tl == rt) ? (newrt) : (old_rl->tl)); \
+    old_rl->tr = ((old_rl->tr == rt) ? (newrt) : (old_rl->tr)); \
   }
 
   switch (in0 + in1 + in2) {
@@ -816,10 +827,9 @@ static void lineart_triangle_cull_single(LineartRenderBuffer *rb,
         rl->object_ref = ob;
 
         /* new line connecting original point 0 and a new point, only when it's a selected line */
-        SELECT_RL(0, 1, &rv[1], rt->v[0])
-
+        SELECT_RL(2, rt->v[0], &rv[0], rt1)
         /* new line connecting original point 0 and another new point */
-        SELECT_RL(0, 2, rt->v[0], &rv[0])
+        SELECT_RL(0, rt->v[0], &rv[1], rt1)
 
         /* re-assign triangle point array to two new points. */
         rt1->v[0] = rt->v[0];
@@ -860,17 +870,8 @@ static void lineart_triangle_cull_single(LineartRenderBuffer *rb,
         rl->tl = rt1;
         rl->object_ref = ob;
 
-        INCREASE_RL
-        rl->l = &rv[1];
-        rl->r = rt->v[2];
-        rl->flags |= LRT_EDGE_FLAG_CLIPPED;
-        rl->object_ref = ob;
-
-        INCREASE_RL
-        rl->l = rt->v[2];
-        rl->r = &rv[0];
-        rl->flags |= LRT_EDGE_FLAG_CLIPPED;
-        rl->object_ref = ob;
+        SELECT_RL(2, rt->v[2], &rv[0], rt1)
+        SELECT_RL(1, rt->v[2], &rv[1], rt1)
 
         rt1->v[0] = &rv[0];   /*&rv[1];*/
         rt1->v[1] = &rv[1];   /*rt->v[2];*/
@@ -910,17 +911,8 @@ static void lineart_triangle_cull_single(LineartRenderBuffer *rb,
         rl->tl = rt1;
         rl->object_ref = ob;
 
-        INCREASE_RL
-        rl->l = &rv[0];
-        rl->r = rt->v[1];
-        rl->flags |= LRT_EDGE_FLAG_CLIPPED;
-        rl->object_ref = ob;
-
-        INCREASE_RL
-        rl->l = rt->v[1];
-        rl->r = &rv[1];
-        rl->flags |= LRT_EDGE_FLAG_CLIPPED;
-        rl->object_ref = ob;
+        SELECT_RL(1, rt->v[1], &rv[0], rt1)
+        SELECT_RL(0, rt->v[1], &rv[1], rt1)
 
         rt1->v[0] = &rv[0];   /*rt->v[1];*/
         rt1->v[1] = rt->v[1]; /*&rv[1];*/
@@ -994,28 +986,15 @@ static void lineart_triangle_cull_single(LineartRenderBuffer *rb,
         /** New line connects new point 0 and old point 1,
          * this is a border line.
          */
-        INCREASE_RL
-        rl->l = &rv[0];
-        rl->r = rt->v[1];
-        rl->flags |= LRT_EDGE_FLAG_CLIPPED;
-        rl->tl = rt1;
-        rl->object_ref = ob;
+
+        SELECT_RL(0, rt->v[1], &rv[0], rt1)
+        SELECT_RL(2, rt->v[2], &rv[1], rt2)
+        RELINK_RL(1, rt2)
 
         /* We now have one triangle closed. */
         rt1->v[0] = rt->v[1];
         rt1->v[1] = &rv[1];
         rt1->v[2] = &rv[0];
-
-        /** New line connects new point 1 and old point 2,
-         * this is also a border line.
-         */
-        INCREASE_RL
-        rl->l = rt->v[2];
-        rl->r = &rv[1];
-        rl->flags |= LRT_EDGE_FLAG_CLIPPED;
-        rl->tl = rt2;
-        rl->object_ref = ob;
-
         /* Close the second triangle. */
         rt2->v[0] = &rv[1];
         rt2->v[1] = rt->v[1];
@@ -1057,24 +1036,14 @@ static void lineart_triangle_cull_single(LineartRenderBuffer *rb,
         rl->tl = rt1;
         rl->object_ref = ob;
 
-        INCREASE_RL
-        rl->l = &rv[0];
-        rl->r = rt->v[2];
-        rl->flags |= LRT_EDGE_FLAG_CLIPPED;
-        rl->tl = rt1;
-        rl->object_ref = ob;
+        SELECT_RL(1, rt->v[2], &rv[0], rt1)
+        SELECT_RL(0, rt->v[0], &rv[1], rt2)
+        RELINK_RL(2, rt2)
 
         rt1->v[0] = rt->v[2];
         rt1->v[1] = &rv[1];
         rt1->v[2] = &rv[0];
 
-        INCREASE_RL
-        rl->l = rt->v[0];
-        rl->r = &rv[1];
-        rl->flags |= LRT_EDGE_FLAG_CLIPPED;
-        rl->tl = rt2;
-        rl->object_ref = ob;
-
         rt2->v[0] = &rv[1];
         rt2->v[1] = rt->v[2];
         rt2->v[2] = rt->v[0];
@@ -1115,24 +1084,14 @@ static void lineart_triangle_cull_single(LineartRenderBuffer *rb,
         rl->tl = rt1;
         rl->object_ref = ob;
 
-        INCREASE_RL
-        rl->l = &rv[0];
-        rl->r = rt->v[0];
-        rl->flags |= LRT_EDGE_FLAG_CLIPPED;
-        rl->tl = rt1;
-        rl->object_ref = ob;
+        SELECT_RL(2, rt->v[0], &rv[0], rt1)
+        SELECT_RL(1, rt->v[1], &rv[1], rt2)
+        RELINK_RL(0, rt2)
 
         rt1->v[0] = rt->v[0];
         rt1->v[1] = &rv[1];
         rt1->v[2] = &rv[0];
 
-        INCREASE_RL
-        rl->l = rt->v[1];
-        rl->r = &rv[1];
-        rl->flags |= LRT_EDGE_FLAG_CLIPPED;
-        rl->tl = rt2;
-        rl->object_ref = ob;
-
         rt2->v[0] = &rv[1];
         rt2->v[1] = rt->v[0];
         rt2->v[2] = rt->v[1];
@@ -1243,64 +1202,6 @@ static void lineart_main_cull_triangles(LineartRenderBuffer *rb, bool clip_far)
     use_w = 2;
   }
 
-  /* Cull line-adjacent triangles first, because triangles now doesn't have adjacent line info. */
-  LRT_ITER_ALL_LINES_BEGIN
-  {
-
-    rt = rl->tl;
-    if (rt) {
-      LRT_CULL_DECIDE_INSIDE
-      LRT_CULL_ENSURE_MEMORY
-      lineart_triangle_cull_single(rb,
-                                   rt,
-                                   in0,
-                                   in1,
-                                   in2,
-                                   cam_pos,
-                                   view_dir,
-                                   allow_boundaries,
-                                   vp,
-                                   rl,
-                                   ob,
-                                   &v_count,
-                                   &l_count,
-                                   &t_count,
-                                   veln,
-                                   leln,
-                                   teln);
-    }
-
-    teln->element_count = t_count;
-    veln->element_count = v_count;
-
-    rt = rl->tr;
-    if (rt) {
-      LRT_CULL_DECIDE_INSIDE
-      LRT_CULL_ENSURE_MEMORY
-      lineart_triangle_cull_single(rb,
-                                   rt,
-                                   in0,
-                                   in1,
-                                   in2,
-                                   cam_pos,
-                                   view_dir,
-                                   allow_boundaries,
-                                   vp,
-                                   rl,
-                                   ob,
-                                   &v_count,
-                                   &l_count,
-                                   &t_count,
-                                   veln,
-                                   leln,
-                                   teln);
-    }
-
-    teln->element_

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list