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;
_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs