[Bf-blender-cvs] [5860d4e2403] temp-lineart-contained: LineArt: Use array instead of array for ba->linked_edge
YimingWu
noreply at git.blender.org
Fri May 14 13:17:00 CEST 2021
Commit: 5860d4e240396a3a16d9b2b7f940214a8444c48a
Author: YimingWu
Date: Fri May 14 19:15:48 2021 +0800
Branches: temp-lineart-contained
https://developer.blender.org/rB5860d4e240396a3a16d9b2b7f940214a8444c48a
LineArt: Use array instead of array for ba->linked_edge
===================================================================
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
===================================================================
diff --git a/source/blender/gpencil_modifiers/intern/lineart/MOD_lineart.h b/source/blender/gpencil_modifiers/intern/lineart/MOD_lineart.h
index d3e3aa5ce92..7e980669a33 100644
--- a/source/blender/gpencil_modifiers/intern/lineart/MOD_lineart.h
+++ b/source/blender/gpencil_modifiers/intern/lineart/MOD_lineart.h
@@ -216,6 +216,7 @@ enum eLineArtTileRecursiveLimit {
};
#define LRT_TILE_SPLITTING_TRIANGLE_LIMIT 100
+#define LRT_TILE_EDGE_COUNT_INITIAL 32
typedef struct LineartRenderBuffer {
struct LineartRenderBuffer *prev, *next;
@@ -470,11 +471,12 @@ typedef struct LineartBoundingArea {
short triangle_count;
short max_triangle_count;
+ short line_count;
+ short max_line_count;
/* Use array for speeding up multiple accesses. */
struct LineartTriangle **linked_triangles;
-
- ListBase linked_lines;
+ struct LineartEdge **linked_lines;
/** Reserved for image space reduction && multi-thread chaining. */
ListBase linked_chains;
diff --git a/source/blender/gpencil_modifiers/intern/lineart/lineart_chain.c b/source/blender/gpencil_modifiers/intern/lineart/lineart_chain.c
index 53fb0b7333d..9b1f6becde5 100644
--- a/source/blender/gpencil_modifiers/intern/lineart/lineart_chain.c
+++ b/source/blender/gpencil_modifiers/intern/lineart/lineart_chain.c
@@ -41,8 +41,8 @@ static LineartEdge *lineart_line_get_connected(LineartBoundingArea *ba,
int match_flag,
unsigned char match_isec_mask)
{
- LISTBASE_FOREACH (LinkData *, lip, &ba->linked_lines) {
- LineartEdge *n_e = lip->data;
+ for (int i = 0; i < ba->line_count; i++) {
+ LineartEdge *n_e = ba->linked_lines[i];
if ((!(n_e->flags & LRT_EDGE_FLAG_ALL_TYPE)) || (n_e->flags & LRT_EDGE_FLAG_CHAIN_PICKED)) {
continue;
diff --git a/source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c b/source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c
index 3abf5b0bb20..ed951ca43b8 100644
--- a/source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c
+++ b/source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c
@@ -335,6 +335,21 @@ static void lineart_bounding_area_triangle_add(LineartRenderBuffer *rb,
ba->triangle_count++;
}
+static void lineart_bounding_area_line_add(LineartRenderBuffer *rb,
+ LineartBoundingArea *ba,
+ 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);
+ memcpy(new_array, ba->linked_lines, sizeof(LineartEdge *) * ba->max_line_count);
+ ba->max_line_count *= 2;
+ ba->linked_lines = new_array;
+ }
+ ba->linked_lines[ba->line_count] = rl;
+ ba->line_count++;
+}
+
static void lineart_occlusion_single_line(LineartRenderBuffer *rb, LineartEdge *e, int thread_id)
{
double x = e->v1->fbcoord[0], y = e->v1->fbcoord[1];
@@ -3094,8 +3109,11 @@ 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(
- &rb->render_data_pool, sizeof(LineartTriangle *) * LRT_TILE_SPLITTING_TRIANGLE_LIMIT);
+ &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);
/* Link adjacent ones. */
if (row) {
@@ -3314,8 +3332,11 @@ static void lineart_bounding_area_split(LineartRenderBuffer *rb,
/* Init linked_triangles array. */
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(
&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);
}
for (int i = 0; i < root->triangle_count; i++) {
@@ -3340,7 +3361,8 @@ static void lineart_bounding_area_split(LineartRenderBuffer *rb,
}
}
- while ((e = lineart_list_pop_pointer_no_free(&root->linked_lines)) != NULL) {
+ for (int i = 0; i < root->line_count; i++) {
+ e = root->linked_lines[i];
lineart_bounding_area_link_line(rb, root, e);
}
@@ -3488,7 +3510,7 @@ static void lineart_bounding_area_link_line(LineartRenderBuffer *rb,
LineartEdge *e)
{
if (root_ba->child == NULL) {
- lineart_list_append_pointer_pool(&root_ba->linked_lines, &rb->render_data_pool, e);
+ lineart_bounding_area_line_add(rb, root_ba, e);
}
else {
if (lineart_bounding_area_line_intersect(
More information about the Bf-blender-cvs
mailing list