[Bf-blender-cvs] [661fa309f19] lanpr-under-gp: LineArt: Use separate adjacent info for clipping
YimingWu
noreply at git.blender.org
Fri Oct 23 02:57:31 CEST 2020
Commit: 661fa309f1916307d5a60ba7efea57b290e772f5
Author: YimingWu
Date: Fri Oct 23 08:57:23 2020 +0800
Branches: lanpr-under-gp
https://developer.blender.org/rB661fa309f1916307d5a60ba7efea57b290e772f5
LineArt: Use separate adjacent info for clipping
===================================================================
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 e4dc22af926..7c30aec5ef2 100644
--- a/source/blender/editors/include/ED_lineart.h
+++ b/source/blender/editors/include/ED_lineart.h
@@ -50,6 +50,10 @@ typedef struct LineartStaticMemPool {
SpinLock lock_mem;
} LineartStaticMemPool;
+typedef struct LineartRenderTriangleAdjacent {
+ struct LineartRenderLine *rl[3];
+} LineartRenderTriangleAdjacent;
+
typedef struct LineartRenderTriangle {
struct LineartRenderVert *v[3];
// struct LineartRenderLine *rl[3];
@@ -214,6 +218,9 @@ typedef struct LineartRenderBuffer {
ListBase line_buffer_pointers;
ListBase triangle_buffer_pointers;
+ /* This one's memory is not from main pool and is free()ed after culling stage. */
+ ListBase triangle_adjacent_pointers;
+
ListBase intersecting_vertex_buffer;
/** Use the one comes with Line Art. */
LineartStaticMemPool render_data_pool;
diff --git a/source/blender/editors/lineart/lineart_cpu.c b/source/blender/editors/lineart/lineart_cpu.c
index 0ecb35a2910..7f4c44497fa 100644
--- a/source/blender/editors/lineart/lineart_cpu.c
+++ b/source/blender/editors/lineart/lineart_cpu.c
@@ -691,7 +691,6 @@ static void lineart_triangle_cull_single(LineartRenderBuffer *rb,
double *view_dir,
bool allow_boundaries,
double (*vp)[4],
- LineartRenderLine *given_line,
Object *ob,
int *r_v_count,
int *r_l_count,
@@ -707,13 +706,17 @@ static void lineart_triangle_cull_single(LineartRenderBuffer *rb,
int t_count = *r_t_count;
char new_flag = 0;
- LineartRenderLine *new_rl, *rl;
+ LineartRenderLine *new_rl, *rl, *old_rl;
LineartRenderLineSegment *rls;
+ LineartRenderTriangleAdjacent *rta;
if (rt->flags & (LRT_CULL_USED | LRT_CULL_GENERATED | LRT_CULL_DISCARD)) {
return;
}
+ /* See header and object_load() for details. */
+ rta = (void *)rt->intersecting_verts;
+
LineartRenderVert *rv = &((LineartRenderVert *)veln->pointer)[v_count];
LineartRenderTriangle *rt1 = (void *)(((unsigned char *)teln->pointer) +
rb->triangle_size * t_count);
@@ -729,18 +732,26 @@ static void lineart_triangle_cull_single(LineartRenderBuffer *rb,
rls = lineart_mem_aquire(&rb->render_data_pool, sizeof(LineartRenderLineSegment)); \
BLI_addtail(&rl->segments, rls);
-#define SELECT_RL(v1, v2, llink, rlink) \
- if (given_line) { \
- if (lineart_line_match(rt, given_line, v1, v2)) { \
- new_flag = given_line->flags; \
- given_line->flags = LRT_EDGE_FLAG_CHAIN_PICKED; \
- INCREASE_RL \
- rl->l = (llink); \
- rl->r = (rlink); \
- rl->flags = new_flag; \
- rl->object_ref = ob; \
- lineart_add_line_to_list(rb, rl); \
- } \
+#define SELECT_RL(rl_num, llink, rlink, newrt) \
+ if (rta->rl[rl_num]) { \
+ old_rl = rta->rl[rl_num]; \
+ new_flag = old_rl->flags; \
+ old_rl->flags = LRT_EDGE_FLAG_CHAIN_PICKED; \
+ INCREASE_RL \
+ rl->l = (llink); \
+ rl->r = (rlink); \
+ rl->flags = new_flag; \
+ rl->object_ref = ob; \
+ rl->tl = ((old_rl->tl == rt) ? (newrt) : (old_rl->tl)); \
+ rl->tr = ((old_rl->tr == rt) ? (newrt) : (old_rl->tr)); \
+ lineart_add_line_to_list(rb, rl); \
+ }
+
+#define RELINK_RL(rl_num, newrt) \
+ if (rta->rl[rl_num]) { \
+ old_rl = rta->rl[rl_num]; \
+ old_rl->tl = ((old_rl->tl == rt) ? (newrt) : (old_rl->tl)); \
+ old_rl->tr = ((old_rl->tr == rt) ? (newrt) : (old_rl->tr)); \
}
switch (in0 + in1 + in2) {
@@ -816,10 +827,9 @@ static void lineart_triangle_cull_single(LineartRenderBuffer *rb,
rl->object_ref = ob;
/* new line connecting original point 0 and a new point, only when it's a selected line */
- SELECT_RL(0, 1, &rv[1], rt->v[0])
-
+ SELECT_RL(2, rt->v[0], &rv[0], rt1)
/* new line connecting original point 0 and another new point */
- SELECT_RL(0, 2, rt->v[0], &rv[0])
+ SELECT_RL(0, rt->v[0], &rv[1], rt1)
/* re-assign triangle point array to two new points. */
rt1->v[0] = rt->v[0];
@@ -860,17 +870,8 @@ static void lineart_triangle_cull_single(LineartRenderBuffer *rb,
rl->tl = rt1;
rl->object_ref = ob;
- INCREASE_RL
- rl->l = &rv[1];
- rl->r = rt->v[2];
- rl->flags |= LRT_EDGE_FLAG_CLIPPED;
- rl->object_ref = ob;
-
- INCREASE_RL
- rl->l = rt->v[2];
- rl->r = &rv[0];
- rl->flags |= LRT_EDGE_FLAG_CLIPPED;
- rl->object_ref = ob;
+ SELECT_RL(2, rt->v[2], &rv[0], rt1)
+ SELECT_RL(1, rt->v[2], &rv[1], rt1)
rt1->v[0] = &rv[0]; /*&rv[1];*/
rt1->v[1] = &rv[1]; /*rt->v[2];*/
@@ -910,17 +911,8 @@ static void lineart_triangle_cull_single(LineartRenderBuffer *rb,
rl->tl = rt1;
rl->object_ref = ob;
- INCREASE_RL
- rl->l = &rv[0];
- rl->r = rt->v[1];
- rl->flags |= LRT_EDGE_FLAG_CLIPPED;
- rl->object_ref = ob;
-
- INCREASE_RL
- rl->l = rt->v[1];
- rl->r = &rv[1];
- rl->flags |= LRT_EDGE_FLAG_CLIPPED;
- rl->object_ref = ob;
+ SELECT_RL(1, rt->v[1], &rv[0], rt1)
+ SELECT_RL(0, rt->v[1], &rv[1], rt1)
rt1->v[0] = &rv[0]; /*rt->v[1];*/
rt1->v[1] = rt->v[1]; /*&rv[1];*/
@@ -994,28 +986,15 @@ static void lineart_triangle_cull_single(LineartRenderBuffer *rb,
/** New line connects new point 0 and old point 1,
* this is a border line.
*/
- INCREASE_RL
- rl->l = &rv[0];
- rl->r = rt->v[1];
- rl->flags |= LRT_EDGE_FLAG_CLIPPED;
- rl->tl = rt1;
- rl->object_ref = ob;
+
+ SELECT_RL(0, rt->v[1], &rv[0], rt1)
+ SELECT_RL(2, rt->v[2], &rv[1], rt2)
+ RELINK_RL(1, rt2)
/* We now have one triangle closed. */
rt1->v[0] = rt->v[1];
rt1->v[1] = &rv[1];
rt1->v[2] = &rv[0];
-
- /** New line connects new point 1 and old point 2,
- * this is also a border line.
- */
- INCREASE_RL
- rl->l = rt->v[2];
- rl->r = &rv[1];
- rl->flags |= LRT_EDGE_FLAG_CLIPPED;
- rl->tl = rt2;
- rl->object_ref = ob;
-
/* Close the second triangle. */
rt2->v[0] = &rv[1];
rt2->v[1] = rt->v[1];
@@ -1057,24 +1036,14 @@ static void lineart_triangle_cull_single(LineartRenderBuffer *rb,
rl->tl = rt1;
rl->object_ref = ob;
- INCREASE_RL
- rl->l = &rv[0];
- rl->r = rt->v[2];
- rl->flags |= LRT_EDGE_FLAG_CLIPPED;
- rl->tl = rt1;
- rl->object_ref = ob;
+ SELECT_RL(1, rt->v[2], &rv[0], rt1)
+ SELECT_RL(0, rt->v[0], &rv[1], rt2)
+ RELINK_RL(2, rt2)
rt1->v[0] = rt->v[2];
rt1->v[1] = &rv[1];
rt1->v[2] = &rv[0];
- INCREASE_RL
- rl->l = rt->v[0];
- rl->r = &rv[1];
- rl->flags |= LRT_EDGE_FLAG_CLIPPED;
- rl->tl = rt2;
- rl->object_ref = ob;
-
rt2->v[0] = &rv[1];
rt2->v[1] = rt->v[2];
rt2->v[2] = rt->v[0];
@@ -1115,24 +1084,14 @@ static void lineart_triangle_cull_single(LineartRenderBuffer *rb,
rl->tl = rt1;
rl->object_ref = ob;
- INCREASE_RL
- rl->l = &rv[0];
- rl->r = rt->v[0];
- rl->flags |= LRT_EDGE_FLAG_CLIPPED;
- rl->tl = rt1;
- rl->object_ref = ob;
+ SELECT_RL(2, rt->v[0], &rv[0], rt1)
+ SELECT_RL(1, rt->v[1], &rv[1], rt2)
+ RELINK_RL(0, rt2)
rt1->v[0] = rt->v[0];
rt1->v[1] = &rv[1];
rt1->v[2] = &rv[0];
- INCREASE_RL
- rl->l = rt->v[1];
- rl->r = &rv[1];
- rl->flags |= LRT_EDGE_FLAG_CLIPPED;
- rl->tl = rt2;
- rl->object_ref = ob;
-
rt2->v[0] = &rv[1];
rt2->v[1] = rt->v[0];
rt2->v[2] = rt->v[1];
@@ -1243,64 +1202,6 @@ static void lineart_main_cull_triangles(LineartRenderBuffer *rb, bool clip_far)
use_w = 2;
}
- /* Cull line-adjacent triangles first, because triangles now doesn't have adjacent line info. */
- LRT_ITER_ALL_LINES_BEGIN
- {
-
- rt = rl->tl;
- if (rt) {
- LRT_CULL_DECIDE_INSIDE
- LRT_CULL_ENSURE_MEMORY
- lineart_triangle_cull_single(rb,
- rt,
- in0,
- in1,
- in2,
- cam_pos,
- view_dir,
- allow_boundaries,
- vp,
- rl,
- ob,
- &v_count,
- &l_count,
- &t_count,
- veln,
- leln,
- teln);
- }
-
- teln->element_count = t_count;
- veln->element_count = v_count;
-
- rt = rl->tr;
- if (rt) {
- LRT_CULL_DECIDE_INSIDE
- LRT_CULL_ENSURE_MEMORY
- lineart_triangle_cull_single(rb,
- rt,
- in0,
- in1,
- in2,
- cam_pos,
- view_dir,
- allow_boundaries,
- vp,
- rl,
- ob,
- &v_count,
- &l_count,
- &t_count,
- veln,
- leln,
- teln);
- }
-
- teln->element_
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list