[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