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

Reply via email to