[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