[Bf-blender-cvs] [6624700725c] lineart-bvh: LineArt: Use BVH for intersection calculation.

YimingWu noreply at git.blender.org
Sat May 22 11:28:41 CEST 2021


Commit: 6624700725c82fa95da88878b940ab18ec5ac0da
Author: YimingWu
Date:   Sat May 22 17:16:33 2021 +0800
Branches: lineart-bvh
https://developer.blender.org/rB6624700725c82fa95da88878b940ab18ec5ac0da

LineArt: Use BVH for intersection calculation.

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

M	source/blender/gpencil_modifiers/intern/lineart/MOD_lineart.h
M	source/blender/gpencil_modifiers/intern/lineart/lineart_chain.c
M	source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c
M	source/blender/gpencil_modifiers/intern/lineart/lineart_util.c

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

diff --git a/source/blender/gpencil_modifiers/intern/lineart/MOD_lineart.h b/source/blender/gpencil_modifiers/intern/lineart/MOD_lineart.h
index 7e980669a33..2804330f870 100644
--- a/source/blender/gpencil_modifiers/intern/lineart/MOD_lineart.h
+++ b/source/blender/gpencil_modifiers/intern/lineart/MOD_lineart.h
@@ -218,6 +218,14 @@ enum eLineArtTileRecursiveLimit {
 #define LRT_TILE_SPLITTING_TRIANGLE_LIMIT 100
 #define LRT_TILE_EDGE_COUNT_INITIAL 32
 
+struct BVHTree;
+
+typedef struct LineartTriangleBufferIndexer {
+  int start_index; /* The first one. */
+  int end_index;   /* Not include the last one. */
+  LineartElementLinkNode *eln;
+} LineartTriangleBufferIndexer;
+
 typedef struct LineartRenderBuffer {
   struct LineartRenderBuffer *prev, *next;
 
@@ -233,9 +241,15 @@ typedef struct LineartRenderBuffer {
   struct LineartBoundingArea *initial_bounding_areas;
   unsigned int bounding_area_count;
 
-  /* When splitting bounding areas, if there's an ortho camera placed at a straight angle, there
-   * will be a lot of triangles aligned in line which can not be separated by continue subdividing
-   * the tile. So we set a strict limit when using ortho camera. See eLineArtTileRecursiveLimit. */
+  struct BVHTree *bvh_main;
+  int bvh_face_count;
+  struct LineartTriangleBufferIndexer *bvh_triangle_indexer;
+  int bvh_inderxer_count;
+
+  /* When splitting bounding areas, if there's an ortho camera placed at a straight angle,
+   * there will be a lot of triangles aligned in line which can not be separated by continue
+   * subdividing the tile. So we set a strict limit when using ortho camera. See
+   * eLineArtTileRecursiveLimit. */
   int tile_recursive_level;
 
   ListBase vertex_buffer_pointers;
diff --git a/source/blender/gpencil_modifiers/intern/lineart/lineart_chain.c b/source/blender/gpencil_modifiers/intern/lineart/lineart_chain.c
index 9b1f6becde5..df9dda1b089 100644
--- a/source/blender/gpencil_modifiers/intern/lineart/lineart_chain.c
+++ b/source/blender/gpencil_modifiers/intern/lineart/lineart_chain.c
@@ -79,7 +79,7 @@ static LineartEdge *lineart_line_get_connected(LineartBoundingArea *ba,
 static LineartLineChain *lineart_chain_create(LineartRenderBuffer *rb)
 {
   LineartLineChain *rlc;
-  rlc = lineart_mem_aquire(rb->chain_data_pool, sizeof(LineartLineChain));
+  rlc = lineart_mem_acquire(rb->chain_data_pool, sizeof(LineartLineChain));
 
   BLI_addtail(&rb->chains, rlc);
 
@@ -124,7 +124,7 @@ static LineartLineChainItem *lineart_chain_append_point(LineartRenderBuffer *rb,
     return old_rlci;
   }
 
-  rlci = lineart_mem_aquire(rb->chain_data_pool, sizeof(LineartLineChainItem));
+  rlci = lineart_mem_acquire(rb->chain_data_pool, sizeof(LineartLineChainItem));
 
   copy_v2_v2(rlci->pos, fbcoord);
   copy_v3_v3(rlci->gpos, gpos);
@@ -154,7 +154,7 @@ static LineartLineChainItem *lineart_chain_prepend_point(LineartRenderBuffer *rb
     return rlc->chain.first;
   }
 
-  rlci = lineart_mem_aquire(rb->chain_data_pool, sizeof(LineartLineChainItem));
+  rlci = lineart_mem_acquire(rb->chain_data_pool, sizeof(LineartLineChainItem));
 
   copy_v2_v2(rlci->pos, fbcoord);
   copy_v3_v3(rlci->gpos, gpos);
diff --git a/source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c b/source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c
index f0d8cc0a0ef..68c4f40f278 100644
--- a/source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c
+++ b/source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c
@@ -24,6 +24,7 @@
 #include "MOD_gpencil_lineart.h"
 #include "MOD_lineart.h"
 
+#include "BLI_kdopbvh.h"
 #include "BLI_linklist.h"
 #include "BLI_listbase.h"
 #include "BLI_math.h"
@@ -325,7 +326,7 @@ static void lineart_bounding_area_triangle_add(LineartRenderBuffer *rb,
                                                LineartTriangle *rt)
 {
   if (ba->triangle_count >= ba->max_triangle_count) {
-    LineartTriangle **new_array = lineart_mem_aquire(
+    LineartTriangle **new_array = lineart_mem_acquire(
         &rb->render_data_pool, sizeof(LineartTriangle *) * ba->max_triangle_count * 2);
     memcpy(new_array, ba->linked_triangles, sizeof(LineartTriangle *) * ba->max_triangle_count);
     ba->max_triangle_count *= 2;
@@ -340,8 +341,8 @@ static void lineart_bounding_area_line_add(LineartRenderBuffer *rb,
                                            LineartEdge *rl)
 {
   if (ba->line_count >= ba->max_line_count) {
-    LineartEdge **new_array = lineart_mem_aquire(&rb->render_data_pool,
-                                                 sizeof(LineartEdge *) * ba->max_line_count * 2);
+    LineartEdge **new_array = lineart_mem_acquire(&rb->render_data_pool,
+                                                  sizeof(LineartEdge *) * ba->max_line_count * 2);
     memcpy(new_array, ba->linked_lines, sizeof(LineartEdge *) * ba->max_line_count);
     ba->max_line_count *= 2;
     ba->linked_lines = new_array;
@@ -1315,6 +1316,8 @@ static void lineart_main_cull_triangles(LineartRenderBuffer *rb, bool clip_far)
 
   /* Then go through all the other triangles. */
   LISTBASE_FOREACH (LineartElementLinkNode *, reln, &rb->triangle_buffer_pointers) {
+    rb->bvh_face_count += reln->element_count;
+    rb->bvh_inderxer_count++;
     if (reln->flags & LRT_ELEMENT_IS_ADDITIONAL) {
       continue;
     }
@@ -1719,8 +1722,8 @@ static void lineart_geometry_object_load(LineartObjectInfo *obi, LineartRenderBu
 
   /* Only allocate memory for verts and tris as we don't know how many lines we will generate
    * yet. */
-  orv = lineart_mem_aquire_thread(&rb->render_data_pool, sizeof(LineartVert) * bm->totvert);
-  ort = lineart_mem_aquire_thread(&rb->render_data_pool, bm->totface * rb->triangle_size);
+  orv = lineart_mem_acquire_thread(&rb->render_data_pool, sizeof(LineartVert) * bm->totvert);
+  ort = lineart_mem_acquire_thread(&rb->render_data_pool, bm->totface * rb->triangle_size);
 
   orig_ob = obi->original_ob;
 
@@ -1843,9 +1846,9 @@ static void lineart_geometry_object_load(LineartObjectInfo *obi, LineartRenderBu
     e->head.hflag = eflag;
   }
 
-  o_la_e = lineart_mem_aquire_thread(&rb->render_data_pool, sizeof(LineartEdge) * allocate_la_e);
-  o_la_s = lineart_mem_aquire_thread(&rb->render_data_pool,
-                                     sizeof(LineartLineSegment) * allocate_la_e);
+  o_la_e = lineart_mem_acquire_thread(&rb->render_data_pool, sizeof(LineartEdge) * allocate_la_e);
+  o_la_s = lineart_mem_acquire_thread(&rb->render_data_pool,
+                                      sizeof(LineartLineSegment) * allocate_la_e);
   BLI_spin_lock(&rb->lock_task);
   reln = lineart_list_append_pointer_pool_sized_thread(
       &rb->line_buffer_pointers, &rb->render_data_pool, o_la_e, sizeof(LineartElementLinkNode));
@@ -2090,11 +2093,11 @@ static void lineart_main_load_geometries(
 
   /* This memory is in render buffer memory pool. so we don't need to free those after loading.
    */
-  LineartObjectLoadTaskInfo *olti = lineart_mem_aquire(
+  LineartObjectLoadTaskInfo *olti = lineart_mem_acquire(
       &rb->render_data_pool, sizeof(LineartObjectLoadTaskInfo) * thread_count);
 
   DEG_OBJECT_ITER_BEGIN (depsgraph, ob, flags) {
-    LineartObjectInfo *obi = lineart_mem_aquire(&rb->render_data_pool, sizeof(LineartObjectInfo));
+    LineartObjectInfo *obi = lineart_mem_acquire(&rb->render_data_pool, sizeof(LineartObjectInfo));
     obi->override_usage = lineart_usage_check(scene->master_collection, ob);
     obi->override_intersection_mask = lineart_intersection_mask_check(scene->master_collection,
                                                                       ob);
@@ -3110,10 +3113,10 @@ static void lineart_main_bounding_area_make_initial(LineartRenderBuffer *rb)
       /* Init linked_triangles array. */
       ba->max_triangle_count = LRT_TILE_SPLITTING_TRIANGLE_LIMIT;
       ba->max_line_count = LRT_TILE_EDGE_COUNT_INITIAL;
-      ba->linked_triangles = lineart_mem_aquire(
+      ba->linked_triangles = lineart_mem_acquire(
           &rb->render_data_pool, sizeof(LineartTriangle *) * ba->max_triangle_count);
-      ba->linked_lines = lineart_mem_aquire(&rb->render_data_pool,
-                                            sizeof(LineartEdge *) * ba->max_line_count);
+      ba->linked_lines = lineart_mem_acquire(&rb->render_data_pool,
+                                             sizeof(LineartEdge *) * ba->max_line_count);
 
       /* Link adjacent ones. */
       if (row) {
@@ -3333,10 +3336,10 @@ static void lineart_bounding_area_split(LineartRenderBuffer *rb,
   for (int i = 0; i < 4; i++) {
     ba[i].max_triangle_count = LRT_TILE_SPLITTING_TRIANGLE_LIMIT;
     ba[i].max_line_count = LRT_TILE_EDGE_COUNT_INITIAL;
-    ba[i].linked_triangles = lineart_mem_aquire(
+    ba[i].linked_triangles = lineart_mem_acquire(
         &rb->render_data_pool, sizeof(LineartTriangle *) * LRT_TILE_SPLITTING_TRIANGLE_LIMIT);
-    ba[i].linked_lines = lineart_mem_aquire(&rb->render_data_pool,
-                                            sizeof(LineartEdge *) * LRT_TILE_EDGE_COUNT_INITIAL);
+    ba[i].linked_lines = lineart_mem_acquire(&rb->render_data_pool,
+                                             sizeof(LineartEdge *) * LRT_TILE_EDGE_COUNT_INITIAL);
   }
 
   for (int i = 0; i < root->triangle_count; i++) {
@@ -3446,6 +3449,16 @@ static bool lineart_bounding_area_triangle_intersect(LineartRenderBuffer *fb,
   return false;
 }
 
+static void lineart_triangle_bbox(LineartTriangle *rt, float *result)
+{
+  result[0] = MIN3(rt->v[0]->gloc[0], rt->v[1]->gloc[0], rt->v[2]->gloc[0]);
+  result[1] = MIN3(rt->v[0]->gloc[1], rt->v[1]->gloc[1], rt->v[2]->gloc[1]);
+  result[2] = MIN3(rt->v[0]->gloc[2], rt->v[1]->gloc[2], rt->v[2]->gloc[2]);
+  result[3] = MAX3(rt->v[0]->gloc[0], rt->v[1]->gloc[0], rt->v[2]->gloc[0]);
+  result[4] = MAX3(rt->v[0]->gloc[1], rt->v[1]->gloc[1], rt->v[2]->gloc[1]);
+  result[5] = MAX3(rt->v[0]->gloc[2], rt->v[1]->gloc[2], rt->v[2]->gloc[2]);
+}
+
 /**
  * 1) Link triangles with bounding areas for later occlusion test.
  * 2) Test triangles with existing(added previously) triangles for intersection lines.
@@ -3472,7 +3485,7 @@ static void lineart_bounding_area_link_triangle(LineartRenderBuffer *rb,
       lineart_bounding_area_sp

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list