[Bf-blender-cvs] [7b6e6ef977f] lanpr-under-gp: LineArt: Splitting limit for dense triangle situations.

YimingWu noreply at git.blender.org
Thu Aug 27 15:14:21 CEST 2020


Commit: 7b6e6ef977f516771c8bd6d3a7e229383628f319
Author: YimingWu
Date:   Thu Aug 27 21:13:33 2020 +0800
Branches: lanpr-under-gp
https://developer.blender.org/rB7b6e6ef977f516771c8bd6d3a7e229383628f319

LineArt: Splitting limit for dense triangle situations.

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

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 b2b47c4ebdd..31aa811e5bd 100644
--- a/source/blender/editors/include/ED_lineart.h
+++ b/source/blender/editors/include/ED_lineart.h
@@ -409,7 +409,8 @@ typedef struct LineartBoundingArea {
   ListBase up;
   ListBase bp;
 
-  int triangle_count;
+  short triangle_count;
+
   ListBase linked_triangles;
   ListBase linked_lines;
 
diff --git a/source/blender/editors/lineart/lineart_cpu.c b/source/blender/editors/lineart/lineart_cpu.c
index 2291701b3f6..e3cfa995474 100644
--- a/source/blender/editors/lineart/lineart_cpu.c
+++ b/source/blender/editors/lineart/lineart_cpu.c
@@ -108,7 +108,8 @@ static void lineart_bounding_area_link_triangle(LineartRenderBuffer *rb,
                                                 LineartBoundingArea *root_ba,
                                                 LineartRenderTriangle *rt,
                                                 double *LRUB,
-                                                int recursive);
+                                                int recursive,
+                                                int recursive_level);
 
 static int lineart_triangle_line_imagespace_intersection_v2(SpinLock *spl,
                                                             const LineartRenderTriangle *rt,
@@ -2786,17 +2787,15 @@ static void lineart_bounding_areas_connect_new(LineartRenderBuffer *rb, LineartB
   }
 
   /* Finally clear parent'scene adjacent list. */
-  while (lineart_list_pop_pointer_no_free(&root->lp))
-    ;
-  while (lineart_list_pop_pointer_no_free(&root->rp))
-    ;
-  while (lineart_list_pop_pointer_no_free(&root->up))
-    ;
-  while (lineart_list_pop_pointer_no_free(&root->bp))
-    ;
+  BLI_listbase_clear(&root->lp);
+  BLI_listbase_clear(&root->rp);
+  BLI_listbase_clear(&root->up);
+  BLI_listbase_clear(&root->bp);
 }
 
-static void lineart_bounding_area_split(LineartRenderBuffer *rb, LineartBoundingArea *root)
+static void lineart_bounding_area_split(LineartRenderBuffer *rb,
+                                        LineartBoundingArea *root,
+                                        int recursive_level)
 {
   LineartBoundingArea *ba = lineart_mem_aquire(&rb->render_data_pool,
                                                sizeof(LineartBoundingArea) * 4);
@@ -2843,16 +2842,16 @@ static void lineart_bounding_area_split(LineartRenderBuffer *rb, LineartBounding
     b[2] = MAX3(rt->v[0]->fbcoord[1], rt->v[1]->fbcoord[1], rt->v[2]->fbcoord[1]);
     b[3] = MIN3(rt->v[0]->fbcoord[1], rt->v[1]->fbcoord[1], rt->v[2]->fbcoord[1]);
     if (LRT_BOUND_AREA_CROSSES(b, &cba[0].l)) {
-      lineart_bounding_area_link_triangle(rb, &cba[0], rt, b, 0);
+      lineart_bounding_area_link_triangle(rb, &cba[0], rt, b, 0, recursive_level + 1);
     }
     if (LRT_BOUND_AREA_CROSSES(b, &cba[1].l)) {
-      lineart_bounding_area_link_triangle(rb, &cba[1], rt, b, 0);
+      lineart_bounding_area_link_triangle(rb, &cba[1], rt, b, 0, recursive_level + 1);
     }
     if (LRT_BOUND_AREA_CROSSES(b, &cba[2].l)) {
-      lineart_bounding_area_link_triangle(rb, &cba[2], rt, b, 0);
+      lineart_bounding_area_link_triangle(rb, &cba[2], rt, b, 0, recursive_level + 1);
     }
     if (LRT_BOUND_AREA_CROSSES(b, &cba[3].l)) {
-      lineart_bounding_area_link_triangle(rb, &cba[3], rt, b, 0);
+      lineart_bounding_area_link_triangle(rb, &cba[3], rt, b, 0, recursive_level + 1);
     }
   }
 
@@ -2948,7 +2947,8 @@ static void lineart_bounding_area_link_triangle(LineartRenderBuffer *rb,
                                                 LineartBoundingArea *root_ba,
                                                 LineartRenderTriangle *rt,
                                                 double *LRUB,
-                                                int recursive)
+                                                int recursive,
+                                                int recursive_level)
 {
   if (!lineart_bounding_area_triangle_covered(rb, rt, root_ba)) {
     return;
@@ -2956,8 +2956,12 @@ static void lineart_bounding_area_link_triangle(LineartRenderBuffer *rb,
   if (root_ba->child == NULL) {
     lineart_list_append_pointer_static(&root_ba->linked_triangles, &rb->render_data_pool, rt);
     root_ba->triangle_count++;
-    if (root_ba->triangle_count > 200 && recursive) {
-      lineart_bounding_area_split(rb, root_ba);
+    /* If splitting doesn't improve triangle separation, then shouldn't allow splitting anymore.
+     * Here we use recursive limit. This is espetially useful in ortho render, where a lot of faces
+     * could easily line up perfectly in image space, which can not be separated by simply slicing
+     * the image tile. */
+    if (root_ba->triangle_count > 200 && recursive && recursive_level < 10) {
+      lineart_bounding_area_split(rb, root_ba, recursive_level);
     }
     if (recursive && rb->use_intersections) {
       lineart_triangle_intersections_in_bounding_area(rb, rt, root_ba);
@@ -2975,16 +2979,16 @@ static void lineart_bounding_area_link_triangle(LineartRenderBuffer *rb,
       B1 = b;
     }
     if (LRT_BOUND_AREA_CROSSES(B1, &ba[0].l)) {
-      lineart_bounding_area_link_triangle(rb, &ba[0], rt, B1, recursive);
+      lineart_bounding_area_link_triangle(rb, &ba[0], rt, B1, recursive, recursive_level + 1);
     }
     if (LRT_BOUND_AREA_CROSSES(B1, &ba[1].l)) {
-      lineart_bounding_area_link_triangle(rb, &ba[1], rt, B1, recursive);
+      lineart_bounding_area_link_triangle(rb, &ba[1], rt, B1, recursive, recursive_level + 1);
     }
     if (LRT_BOUND_AREA_CROSSES(B1, &ba[2].l)) {
-      lineart_bounding_area_link_triangle(rb, &ba[2], rt, B1, recursive);
+      lineart_bounding_area_link_triangle(rb, &ba[2], rt, B1, recursive, recursive_level + 1);
     }
     if (LRT_BOUND_AREA_CROSSES(B1, &ba[3].l)) {
-      lineart_bounding_area_link_triangle(rb, &ba[3], rt, B1, recursive);
+      lineart_bounding_area_link_triangle(rb, &ba[3], rt, B1, recursive, recursive_level + 1);
     }
   }
 }
@@ -3191,7 +3195,7 @@ static void lineart_add_triangles(LineartRenderBuffer *rb)
         for (co = x1; co <= x2; co++) {
           for (r = y1; r <= y2; r++) {
             lineart_bounding_area_link_triangle(
-                rb, &rb->initial_bounding_areas[r * 4 + co], rt, 0, 1);
+                rb, &rb->initial_bounding_areas[r * 4 + co], rt, 0, 1, 0);
           }
         }
       } /* else throw away. */



More information about the Bf-blender-cvs mailing list