[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