[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