[Bf-blender-cvs] [8adb6b35953] lanpr-under-gp: LineArt: Reduced triangle intersecting data size.
YimingWu
noreply at git.blender.org
Thu Oct 22 11:23:54 CEST 2020
Commit: 8adb6b3595356b5f1d71c91c61f8e8b95769828c
Author: YimingWu
Date: Thu Oct 22 17:19:33 2020 +0800
Branches: lanpr-under-gp
https://developer.blender.org/rB8adb6b3595356b5f1d71c91c61f8e8b95769828c
LineArt: Reduced triangle intersecting data size.
===================================================================
M source/blender/editors/include/ED_lineart.h
M source/blender/editors/lineart/lineart_chain.c
M source/blender/editors/lineart/lineart_cpu.c
M source/blender/editors/lineart/lineart_intern.h
M source/blender/editors/lineart/lineart_util.c
===================================================================
diff --git a/source/blender/editors/include/ED_lineart.h b/source/blender/editors/include/ED_lineart.h
index 1e885c0a13a..9a88fa0bdce 100644
--- a/source/blender/editors/include/ED_lineart.h
+++ b/source/blender/editors/include/ED_lineart.h
@@ -60,9 +60,8 @@ typedef struct LineartRenderTriangle {
unsigned char transparency_mask;
unsigned char flags; /* eLineartTriangleFlags */
- /* These two should only be allocated when intersection is enabled, using a pointer. */
- ListBase intersecting_verts;
- struct Object *object_ref;
+ /* Now only use single link list, because we don't need to go back in order. */
+ struct LinkNode *intersecting_verts;
} LineartRenderTriangle;
typedef struct LineartRenderTriangleThread {
@@ -143,7 +142,10 @@ typedef struct LineartRenderLine {
/** Also for line type determination on chainning */
unsigned char flags;
- /** Still need this entry because culled lines will not add to object reln node */
+ /** Still need this entry because culled lines will not add to object reln node,
+ * TODO: If really need more savings, we can allocate this in a "extended" way too, but we need
+ * another bit in flags to be able to show the difference.
+ */
struct Object *object_ref;
} LineartRenderLine;
diff --git a/source/blender/editors/lineart/lineart_chain.c b/source/blender/editors/lineart/lineart_chain.c
index f40ce97728f..da8ca563558 100644
--- a/source/blender/editors/lineart/lineart_chain.c
+++ b/source/blender/editors/lineart/lineart_chain.c
@@ -546,7 +546,7 @@ static void lineart_bounding_area_link_point_recursive(LineartRenderBuffer *rb,
LineartRenderLineChainItem *rlci)
{
if (root->child == NULL) {
- LineartChainRegisterEntry *cre = lineart_list_append_pointer_static_sized(
+ LineartChainRegisterEntry *cre = lineart_list_append_pointer_pool_sized(
&root->linked_chains, &rb->render_data_pool, rlc, sizeof(LineartChainRegisterEntry));
cre->rlci = rlci;
diff --git a/source/blender/editors/lineart/lineart_cpu.c b/source/blender/editors/lineart/lineart_cpu.c
index 7086f644002..0ec3212fd39 100644
--- a/source/blender/editors/lineart/lineart_cpu.c
+++ b/source/blender/editors/lineart/lineart_cpu.c
@@ -618,10 +618,10 @@ static LineartRenderElementLinkNode *lineart_memory_get_triangle_space(LineartRe
&rb->render_data_pool,
64 * rb->triangle_size); /* CreateNewBuffer(LineartRenderTriangle, 64); */
- reln = lineart_list_append_pointer_static_sized(&rb->triangle_buffer_pointers,
- &rb->render_data_pool,
- render_triangles,
- sizeof(LineartRenderElementLinkNode));
+ reln = lineart_list_append_pointer_pool_sized(&rb->triangle_buffer_pointers,
+ &rb->render_data_pool,
+ render_triangles,
+ sizeof(LineartRenderElementLinkNode));
reln->element_count = 64;
reln->flags |= LRT_ELEMENT_IS_ADDITIONAL;
@@ -635,10 +635,10 @@ static LineartRenderElementLinkNode *lineart_memory_get_vert_space(LineartRender
LineartRenderVert *render_vertices = lineart_mem_aquire(&rb->render_data_pool,
sizeof(LineartRenderVert) * 64);
- reln = lineart_list_append_pointer_static_sized(&rb->vertex_buffer_pointers,
- &rb->render_data_pool,
- render_vertices,
- sizeof(LineartRenderElementLinkNode));
+ reln = lineart_list_append_pointer_pool_sized(&rb->vertex_buffer_pointers,
+ &rb->render_data_pool,
+ render_vertices,
+ sizeof(LineartRenderElementLinkNode));
reln->element_count = 64;
reln->flags |= LRT_ELEMENT_IS_ADDITIONAL;
@@ -652,10 +652,10 @@ static LineartRenderElementLinkNode *lineart_memory_get_line_space(LineartRender
LineartRenderLine *render_lines = lineart_mem_aquire(&rb->render_data_pool,
sizeof(LineartRenderLine) * 64);
- reln = lineart_list_append_pointer_static_sized(&rb->line_buffer_pointers,
- &rb->render_data_pool,
- render_lines,
- sizeof(LineartRenderElementLinkNode));
+ reln = lineart_list_append_pointer_pool_sized(&rb->line_buffer_pointers,
+ &rb->render_data_pool,
+ render_lines,
+ sizeof(LineartRenderElementLinkNode));
reln->element_count = 64;
reln->crease_threshold = rb->crease_threshold;
reln->flags |= LRT_ELEMENT_IS_ADDITIONAL;
@@ -1583,10 +1583,10 @@ static void lineart_geometry_object_load(Depsgraph *dg,
orig_ob = ob->id.orig_id ? (Object *)ob->id.orig_id : ob;
- reln = lineart_list_append_pointer_static_sized(&rb->vertex_buffer_pointers,
- &rb->render_data_pool,
- orv,
- sizeof(LineartRenderElementLinkNode));
+ reln = lineart_list_append_pointer_pool_sized(&rb->vertex_buffer_pointers,
+ &rb->render_data_pool,
+ orv,
+ sizeof(LineartRenderElementLinkNode));
reln->element_count = bm->totvert;
reln->object_ref = orig_ob;
@@ -1602,10 +1602,10 @@ static void lineart_geometry_object_load(Depsgraph *dg,
reln->flags |= LRT_ELEMENT_BORDER_ONLY;
}
- reln = lineart_list_append_pointer_static_sized(&rb->triangle_buffer_pointers,
- &rb->render_data_pool,
- ort,
- sizeof(LineartRenderElementLinkNode));
+ reln = lineart_list_append_pointer_pool_sized(&rb->triangle_buffer_pointers,
+ &rb->render_data_pool,
+ ort,
+ sizeof(LineartRenderElementLinkNode));
reln->element_count = bm->totface;
reln->object_ref = orig_ob;
reln->flags |= (usage == OBJECT_LRT_NO_INTERSECTION ? LRT_ELEMENT_NO_INTERSECTION : 0);
@@ -1666,10 +1666,10 @@ static void lineart_geometry_object_load(Depsgraph *dg,
}
orl = lineart_mem_aquire(&rb->render_data_pool, sizeof(LineartRenderLine) * allocate_rl);
- reln = lineart_list_append_pointer_static_sized(&rb->line_buffer_pointers,
- &rb->render_data_pool,
- orl,
- sizeof(LineartRenderElementLinkNode));
+ reln = lineart_list_append_pointer_pool_sized(&rb->line_buffer_pointers,
+ &rb->render_data_pool,
+ orl,
+ sizeof(LineartRenderElementLinkNode));
reln->element_count = allocate_rl;
reln->object_ref = orig_ob;
@@ -2237,8 +2237,8 @@ static LineartRenderVert *lineart_triangle_2v_intersection_test(LineartRenderBuf
double gloc[3];
LineartRenderVert *l = v1, *r = v2;
- LISTBASE_FOREACH (LinkData *, ld, &testing->intersecting_verts) {
- LineartRenderVertIntersection *rv = (LineartRenderVert *)ld->data;
+ for (LinkNode *ln = (void *)testing->intersecting_verts; ln; ln = ln->next) {
+ LineartRenderVertIntersection *rv = ln->link;
if (rv->intersecting_with == rt &&
lineart_vert_already_intersected_2v(
rv, (LineartRenderVertIntersection *)l, (LineartRenderVertIntersection *)r)) {
@@ -2278,7 +2278,7 @@ static LineartRenderVert *lineart_triangle_2v_intersection_test(LineartRenderBuf
copy_v3_v3_db(result->gloc, gloc);
- lineart_list_append_pointer_static(&testing->intersecting_verts, &rb->render_data_pool, result);
+ lineart_prepend_pool(&testing->intersecting_verts, &rb->render_data_pool, result);
return result;
}
@@ -2323,12 +2323,10 @@ static LineartRenderLine *lineart_triangle_generate_intersection_line_only(
if (r == NULL) {
return 0;
}
- lineart_list_append_pointer_static(
- &testing->intersecting_verts, &rb->render_data_pool, new_share);
+ lineart_prepend_pool(&testing->intersecting_verts, &rb->render_data_pool, new_share);
}
else {
- lineart_list_append_pointer_static(
- &rt->intersecting_verts, &rb->render_data_pool, new_share);
+ lineart_prepend_pool(&rt->intersecting_verts, &rb->render_data_pool, new_share);
}
}
else {
@@ -2411,9 +2409,9 @@ static LineartRenderLine *lineart_triangle_generate_intersection_line_only(
result->tl = rt;
result->tr = testing;
- /* Currently we can only store one object_ref. Todo in the future: allow selection of object
- * pairs when using intersection lines. */
- result->object_ref = rt->object_ref;
+ /** TODO: Use bit flags similar to transparency_mask to select intersection pairs, or to use rt
+ * address as rt's are continuously allocated in memory for each object. object_ref is removed */
+ /* result->object_ref = rt->object_ref; */
LineartRenderLineSegment *rls = lineart_mem_aquire(&rb->render_data_pool,
sizeof(LineartRenderLineSegment));
@@ -2856,19 +2854,19 @@ static void lineart_main_bounding_area_make_initial(LineartRenderBuffer *rb)
ba->cy = (ba->u + ba->b) / 2;
if (row) {
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list