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