[Bf-blender-cvs] [9a04768b8b8] lanpr-under-gp: LineArt: Removing more fields in render data structure to save memory.

YimingWu noreply at git.blender.org
Wed Jul 29 17:32:57 CEST 2020


Commit: 9a04768b8b8874f5b85c7a196b80b503045ddeaf
Author: YimingWu
Date:   Wed Jul 29 23:32:14 2020 +0800
Branches: lanpr-under-gp
https://developer.blender.org/rB9a04768b8b8874f5b85c7a196b80b503045ddeaf

LineArt: Removing more fields in render data structure to save memory.

===================================================================

M	source/blender/editors/include/ED_lineart.h
M	source/blender/editors/lineart/lineart_cpu.c

===================================================================

diff --git a/source/blender/editors/include/ED_lineart.h b/source/blender/editors/include/ED_lineart.h
index 40bce3cf617..3555dde36bd 100644
--- a/source/blender/editors/include/ED_lineart.h
+++ b/source/blender/editors/include/ED_lineart.h
@@ -60,12 +60,15 @@ typedef struct LineartRenderTriangle {
   short material_id;
   ListBase intersecting_verts;
   char cull_status;
-  /**  Should be testing** , Use testing[NumOfThreads] to access. */
-  struct LineartRenderTriangle *testing;
 } LineartRenderTriangle;
 
 typedef struct LineartRenderTriangleThread {
   struct LineartRenderTriangle base;
+  /** This variable is used to store per-thread triangle-line testing pair,
+   *  also re-used to store triangle-triangle pair for intersection testing stage.
+   *  Do not directly use LineartRenderTriangleThread, but use it as a pointer,
+   * the size of LineartRenderTriangle is dynamically allocated to contain set thread number of
+   * "testing" field, at least one thread is present, thus we always have at least testing[0].*/
   struct LineartRenderLine *testing[127];
 } LineartRenderTriangleThread;
 
@@ -91,7 +94,6 @@ typedef struct LineartRenderVert {
   struct LineartRenderVert *next, *prev;
   double gloc[4];
   double fbcoord[4];
-  int fbcoordi[2];
   /**  Used as "r" when intersecting */
   struct BMVert *v;
   struct LineartRenderLine *intersecting_line;
diff --git a/source/blender/editors/lineart/lineart_cpu.c b/source/blender/editors/lineart/lineart_cpu.c
index 8589883bfbc..e0d575086e0 100644
--- a/source/blender/editors/lineart/lineart_cpu.c
+++ b/source/blender/editors/lineart/lineart_cpu.c
@@ -1858,7 +1858,7 @@ static bool lineart_triangle_share_edge(const LineartRenderTriangle *l,
                                         const LineartRenderTriangle *r)
 {
   if (l->rl[0]->tl == r || l->rl[0]->tr == r || l->rl[1]->tl == r || l->rl[1]->tr == r ||
-      l->rl[1]->tl == r || l->rl[1]->tr == r) {
+      l->rl[2]->tl == r || l->rl[2]->tr == r) {
     return true;
   }
   return false;
@@ -2111,7 +2111,10 @@ static void lineart_triangle_intersections_in_bounding_area(LineartRenderBuffer
                                                             LineartRenderTriangle *rt,
                                                             LineartBoundingArea *ba)
 {
+  /* testing_triangle->testing[0] is used to store pairing triangle reference.
+   * See definition of LineartRenderTriangleThread for more info. */
   LineartRenderTriangle *testing_triangle;
+  LineartRenderTriangleThread *rtt;
   LinkData *lip, *next_lip;
 
   double *G0 = rt->v[0]->gloc, *G1 = rt->v[1]->gloc, *G2 = rt->v[2]->gloc;
@@ -2127,14 +2130,15 @@ static void lineart_triangle_intersections_in_bounding_area(LineartRenderBuffer
   for (lip = ba->linked_triangles.first; lip; lip = next_lip) {
     next_lip = lip->next;
     testing_triangle = lip->data;
-    if (testing_triangle == rt || testing_triangle->testing == rt ||
+    rtt = (LineartRenderTriangleThread *)testing_triangle;
+    if (testing_triangle == rt || rtt->testing[0] == (LineartRenderLine *)rt ||
         (rt->cull_status == LRT_CULL_GENERATED &&
          testing_triangle->cull_status == LRT_CULL_GENERATED) ||
         lineart_triangle_share_edge(rt, testing_triangle)) {
       continue;
     }
 
-    testing_triangle->testing = rt;
+    rtt->testing[0] = (LineartRenderLine *)rt;
     double *RG0 = testing_triangle->v[0]->gloc, *RG1 = testing_triangle->v[1]->gloc,
            *RG2 = testing_triangle->v[2]->gloc;



More information about the Bf-blender-cvs mailing list