Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYimingWu <xp8110@outlook.com>2021-06-22 15:57:31 +0300
committerYimingWu <xp8110@outlook.com>2021-06-22 15:57:31 +0300
commitf4ebf2133b36051b49ebd85857f2e636cbeb042a (patch)
treecd8a31a8ebe4f3943913d312c29cc3e2b9289f4a
parentee7e06d9b2d176b261c8c794635b08627fe1e3fe (diff)
LineArt: global look up list for bvh
-rw-r--r--source/blender/gpencil_modifiers/intern/lineart/MOD_lineart.h1
-rw-r--r--source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c20
2 files changed, 20 insertions, 1 deletions
diff --git a/source/blender/gpencil_modifiers/intern/lineart/MOD_lineart.h b/source/blender/gpencil_modifiers/intern/lineart/MOD_lineart.h
index 344c7069fe0..da9d628dbda 100644
--- a/source/blender/gpencil_modifiers/intern/lineart/MOD_lineart.h
+++ b/source/blender/gpencil_modifiers/intern/lineart/MOD_lineart.h
@@ -257,6 +257,7 @@ typedef struct LineartRenderBuffer {
ListBase vertex_buffer_pointers;
ListBase line_buffer_pointers;
ListBase triangle_buffer_pointers;
+ LineartTriangle **triangle_lookup;
/** This one's memory is not from main pool and is free()ed after culling stage. */
ListBase triangle_adjacent_pointers;
diff --git a/source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c b/source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c
index f27c89661d8..dc9d994beb4 100644
--- a/source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c
+++ b/source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c
@@ -67,7 +67,7 @@
#define LINEART_WITH_BVH
#define LINEART_WITH_BVH_THREAD
-//#define LINEART_BVH_OWN_ISEC
+#define LINEART_BVH_OWN_ISEC
static LineartBoundingArea *lineart_edge_first_bounding_area(LineartRenderBuffer *rb,
LineartEdge *e);
@@ -2258,6 +2258,23 @@ static void lineart_main_load_geometries(
}
}
+ int tri_count = 0;
+ int global_tri_i = 0;
+ LineartTriangle *tri;
+ LISTBASE_FOREACH (LineartElementLinkNode *, eln, &rb->triangle_buffer_pointers) {
+ tri_count += eln->element_count;
+ }
+
+ rb->triangle_lookup = lineart_mem_acquire(&rb->render_data_pool, sizeof(void *) * tri_count);
+
+ LISTBASE_FOREACH (LineartElementLinkNode *, eln, &rb->triangle_buffer_pointers) {
+ for (int i = 0; i < eln->element_count; i++) {
+ tri = (void *)(((uchar *)eln->pointer) + rb->triangle_size * i);
+ rb->triangle_lookup[global_tri_i] = tri;
+ global_tri_i++;
+ }
+ }
+
if (G.debug_value == 4000) {
double t_elapsed = PIL_check_seconds_timer() - t_start;
printf("Line art loading time: %lf\n", t_elapsed);
@@ -3891,6 +3908,7 @@ static void lineart_main_add_triangles(LineartRenderBuffer *rb)
static LineartTriangle *lineart_get_triangle_from_index(LineartRenderBuffer *rb, int index)
{
+ return rb->triangle_lookup[index];
int left = 0;
int right = rb->bvh_inderxer_count - 1;
while (left <= right) {