[Bf-blender-cvs] [cbc0c4846b5] soc-2019-npr: LANPR: Split chains based on occlusion value changes.
YimingWu
noreply at git.blender.org
Tue Jun 4 10:25:30 CEST 2019
Commit: cbc0c4846b5f642e7f26b2f175c60481f31bb590
Author: YimingWu
Date: Tue Jun 4 16:24:40 2019 +0800
Branches: soc-2019-npr
https://developer.blender.org/rBcbc0c4846b5f642e7f26b2f175c60481f31bb590
LANPR: Split chains based on occlusion value changes.
===================================================================
M source/blender/draw/engines/lanpr/lanpr_chain.c
M source/blender/draw/engines/lanpr/lanpr_ops.c
===================================================================
diff --git a/source/blender/draw/engines/lanpr/lanpr_chain.c b/source/blender/draw/engines/lanpr/lanpr_chain.c
index 5270af22c5f..5f1b1fd0920 100644
--- a/source/blender/draw/engines/lanpr/lanpr_chain.c
+++ b/source/blender/draw/engines/lanpr/lanpr_chain.c
@@ -203,6 +203,7 @@ void lanpr_NO_THREAD_chain_feature_lines(LANPR_RenderBuffer *rb, float dist_thre
LANPR_BoundingArea *ba;
LANPR_RenderLineSegment *rls;
real *inv = rb->vp_inverse;
+ int last_occlusion;
for (rl = rb->all_render_lines.first; rl; rl = (LANPR_RenderLine *)rl->item.next) {
@@ -249,8 +250,6 @@ void lanpr_NO_THREAD_chain_feature_lines(LANPR_RenderBuffer *rb, float dist_thre
while (ba && (new_rl = lanpr_get_connected_render_line(ba, new_rv, &new_rv))) {
new_rl->flags |= LANPR_EDGE_FLAG_CHAIN_PICKED;
- int last_occlusion;
-
N[0] = N[1] = N[2] = 0;
if (new_rl->tl) {
N[0] += new_rl->tl->gn[0];
@@ -320,7 +319,7 @@ void lanpr_NO_THREAD_chain_feature_lines(LANPR_RenderBuffer *rb, float dist_thre
// step 2: this line
rls = rl->segments.first;
- int last_occlusion = ((LANPR_RenderLineSegment *)rls)->occlusion;
+ last_occlusion = ((LANPR_RenderLineSegment *)rls)->occlusion;
for (rls = (LANPR_RenderLineSegment *)rls->item.next; rls;
rls = (LANPR_RenderLineSegment *)rls->item.next) {
double gpos[3], lpos[3];
@@ -349,8 +348,6 @@ void lanpr_NO_THREAD_chain_feature_lines(LANPR_RenderBuffer *rb, float dist_thre
while (ba && (new_rl = lanpr_get_connected_render_line(ba, new_rv, &new_rv))) {
new_rl->flags |= LANPR_EDGE_FLAG_CHAIN_PICKED;
- int last_occlusion;
-
// fix leading vertex type
rlci = rlc->chain.last;
rlci->line_type = new_rl->flags & LANPR_EDGE_FLAG_ALL_TYPE;
@@ -428,6 +425,39 @@ void lanpr_NO_THREAD_chain_feature_lines(LANPR_RenderBuffer *rb, float dist_thre
}
}
+void lanpr_split_chains_for_fixed_occlusion(LANPR_RenderBuffer *rb){
+ LANPR_RenderLineChain *rlc,*new_rlc;
+ LANPR_RenderLineChainItem *rlci,*next_rlci;
+ ListBase swap={0};
+
+ while (rlc = BLI_pophead(&rb->chains)){
+ rlc->item.next=rlc->item.prev=NULL;
+ BLI_addtail(&swap,rlc);
+ }
+
+ while (rlc = BLI_pophead(&swap)){
+ rlc->item.next=rlc->item.prev=NULL;
+ BLI_addtail(&rb->chains,rlc);
+ LANPR_RenderLineChainItem* first_rlci = (LANPR_RenderLineChainItem*)rlc->chain.first;
+ int fixed_occ = first_rlci->occlusion;
+ for(rlci = (LANPR_RenderLineChainItem*)first_rlci->item.next;rlci;rlci = next_rlci){
+ next_rlci = (LANPR_RenderLineChainItem*)rlci->item.next;
+ if(rlci->occlusion != fixed_occ){
+ new_rlc = lanpr_create_render_line_chain(rb);
+ new_rlc->chain.first = rlci;
+ new_rlc->chain.last = rlc->chain.last;
+ rlc->chain.last=rlci->item.prev;
+ ((LANPR_RenderLineChainItem*)rlc->chain.last)->item.next=0;
+ rlci->item.prev=0;
+ rlc=new_rlc;
+ fixed_occ = rlci->occlusion;
+ }
+ }
+ }
+
+
+}
+
int lanpr_count_chain(LANPR_RenderLineChain *rlc)
{
LANPR_RenderLineChainItem *rlci;
diff --git a/source/blender/draw/engines/lanpr/lanpr_ops.c b/source/blender/draw/engines/lanpr/lanpr_ops.c
index a89aff7438e..c64f3bd4a4e 100644
--- a/source/blender/draw/engines/lanpr/lanpr_ops.c
+++ b/source/blender/draw/engines/lanpr/lanpr_ops.c
@@ -3713,6 +3713,7 @@ void lanpr_viewport_draw_offline_result(LANPR_TextureList *txl,
}
void lanpr_NO_THREAD_chain_feature_lines(LANPR_RenderBuffer *rb, float dist_threshold);
+void lanpr_split_chains_for_fixed_occlusion(LANPR_RenderBuffer *rb);
void lanpr_calculate_normal_object_vector(LANPR_LineLayer *ll, float *normal_object_direction)
{
@@ -3959,6 +3960,7 @@ int lanpr_compute_feature_lines_internal(Depsgraph *depsgraph, SceneLANPR *lanpr
if (lanpr->enable_chaining) {
lanpr_NO_THREAD_chain_feature_lines(rb, 0.00001); // should use user_adjustable value
+ lanpr_split_chains_for_fixed_occlusion(rb);
}
rb->cached_for_frame = scene->r.cfra;
More information about the Bf-blender-cvs
mailing list