[Bf-blender-cvs] [a4147edb3e2] soc-2019-npr: LANPR: Fixed occlusion bugs in first-step chaining.

YimingWu noreply at git.blender.org
Wed Jun 26 08:31:29 CEST 2019


Commit: a4147edb3e244e3f45623cf4ed4313eec3be0bf1
Author: YimingWu
Date:   Wed Jun 26 14:02:20 2019 +0800
Branches: soc-2019-npr
https://developer.blender.org/rBa4147edb3e244e3f45623cf4ed4313eec3be0bf1

LANPR: Fixed occlusion bugs in first-step chaining.

===================================================================

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 fbe062c7e31..b19ca4d8c3a 100644
--- a/source/blender/draw/engines/lanpr/lanpr_chain.c
+++ b/source/blender/draw/engines/lanpr/lanpr_chain.c
@@ -295,40 +295,38 @@ void lanpr_NO_THREAD_chain_feature_lines(LANPR_RenderBuffer *rb)
           last_occlusion = rls->occlusion;
         }
       }
-      else {
-        if (new_rv == new_rl->r) {
-          rls = new_rl->segments.first;
-          last_occlusion = rls->occlusion;
-          rls = (LANPR_RenderLineSegment *)rls->item.next;
-          for (rls; rls; rls = (LANPR_RenderLineSegment *)rls->item.next) {
-            double gpos[3], lpos[3];
-            lanpr_LinearInterpolate3dv(new_rl->l->fbcoord, new_rl->r->fbcoord, rls->at, lpos);
-            lanpr_LinearInterpolate3dv(new_rl->l->gloc, new_rl->r->gloc, rls->at, gpos);
-            lanpr_push_render_line_chain_point(rb,
-                                               rlc,
-                                               lpos[0],
-                                               lpos[1],
-                                               gpos[0],
-                                               gpos[1],
-                                               gpos[2],
-                                               N,
-                                               new_rl->flags,
-                                               last_occlusion);
-            last_occlusion = rls->occlusion;
-          }
+      else if (new_rv == new_rl->r) {
+        rls = new_rl->segments.first;
+        last_occlusion = rls->occlusion;
+        rls = (LANPR_RenderLineSegment *)rls->item.next;
+        for (rls; rls; rls = (LANPR_RenderLineSegment *)rls->item.next) {
+          double gpos[3], lpos[3];
+          lanpr_LinearInterpolate3dv(new_rl->l->fbcoord, new_rl->r->fbcoord, rls->at, lpos);
+          lanpr_LinearInterpolate3dv(new_rl->l->gloc, new_rl->r->gloc, rls->at, gpos);
           lanpr_push_render_line_chain_point(rb,
                                              rlc,
-                                             new_rl->r->fbcoord[0],
-                                             new_rl->r->fbcoord[1],
-                                             new_rl->r->gloc[0],
-                                             new_rl->r->gloc[1],
-                                             new_rl->r->gloc[2],
+                                             lpos[0],
+                                             lpos[1],
+                                             gpos[0],
+                                             gpos[1],
+                                             gpos[2],
                                              N,
                                              new_rl->flags,
                                              last_occlusion);
+          last_occlusion = rls->occlusion;
         }
-        ba = lanpr_get_point_bounding_area(rb, new_rv->fbcoord[0], new_rv->fbcoord[1]);
+        lanpr_push_render_line_chain_point(rb,
+                                           rlc,
+                                           new_rl->r->fbcoord[0],
+                                           new_rl->r->fbcoord[1],
+                                           new_rl->r->gloc[0],
+                                           new_rl->r->gloc[1],
+                                           new_rl->r->gloc[2],
+                                           N,
+                                           new_rl->flags,
+                                           last_occlusion);
       }
+      ba = lanpr_get_point_bounding_area(rb, new_rv->fbcoord[0], new_rv->fbcoord[1]);
     }
 
     /*  step 2: this line */
@@ -370,17 +368,13 @@ void lanpr_NO_THREAD_chain_feature_lines(LANPR_RenderBuffer *rb)
       if (new_rv == new_rl->l) {
         rls = new_rl->segments.last;
         last_occlusion = rls->occlusion;
-        rlci->occlusion = last_occlusion;
-        /*  rls = (LANPR_RenderLineSegment *)rls->item.prev; */
-        if (rls) {
-          last_occlusion = rls->occlusion;
-        }
+        rlci->occlusion = last_occlusion; /*  fix leading vertex occlusion */
         for (rls = new_rl->segments.last; rls; rls = (LANPR_RenderLineSegment *)rls->item.prev) {
           double gpos[3], lpos[3];
           lanpr_LinearInterpolate3dv(new_rl->l->fbcoord, new_rl->r->fbcoord, rls->at, lpos);
           lanpr_LinearInterpolate3dv(new_rl->l->gloc, new_rl->r->gloc, rls->at, gpos);
-          last_occlusion = (LANPR_RenderLineSegment *)rls->item.next ?
-                               ((LANPR_RenderLineSegment *)rls->item.next)->occlusion :
+          last_occlusion = (LANPR_RenderLineSegment *)rls->item.prev ?
+                               ((LANPR_RenderLineSegment *)rls->item.prev)->occlusion :
                                last_occlusion;
           lanpr_append_render_line_chain_point(rb,
                                                rlc,
@@ -394,39 +388,37 @@ void lanpr_NO_THREAD_chain_feature_lines(LANPR_RenderBuffer *rb)
                                                last_occlusion);
         }
       }
-      else {
-        if (new_rv == new_rl->r) {
-          rls = new_rl->segments.first;
-          last_occlusion = rls->occlusion;
-          rlci->occlusion = last_occlusion;
-          rls = (LANPR_RenderLineSegment *)rls->item.next;
-          for (rls; rls; rls = (LANPR_RenderLineSegment *)rls->item.next) {
-            double gpos[3], lpos[3];
-            lanpr_LinearInterpolate3dv(new_rl->l->fbcoord, new_rl->r->fbcoord, rls->at, lpos);
-            lanpr_LinearInterpolate3dv(new_rl->l->gloc, new_rl->r->gloc, rls->at, gpos);
-            lanpr_append_render_line_chain_point(rb,
-                                                 rlc,
-                                                 lpos[0],
-                                                 lpos[1],
-                                                 gpos[0],
-                                                 gpos[1],
-                                                 gpos[2],
-                                                 N,
-                                                 new_rl->flags,
-                                                 rls->occlusion);
-            last_occlusion = rls->occlusion;
-          }
+      else if (new_rv == new_rl->r) {
+        rls = new_rl->segments.first;
+        last_occlusion = rls->occlusion;
+        rlci->occlusion = last_occlusion;
+        rls = (LANPR_RenderLineSegment *)rls->item.next;
+        for (rls; rls; rls = (LANPR_RenderLineSegment *)rls->item.next) {
+          double gpos[3], lpos[3];
+          lanpr_LinearInterpolate3dv(new_rl->l->fbcoord, new_rl->r->fbcoord, rls->at, lpos);
+          lanpr_LinearInterpolate3dv(new_rl->l->gloc, new_rl->r->gloc, rls->at, gpos);
           lanpr_append_render_line_chain_point(rb,
                                                rlc,
-                                               new_rl->r->fbcoord[0],
-                                               new_rl->r->fbcoord[1],
-                                               new_rl->r->gloc[0],
-                                               new_rl->r->gloc[1],
-                                               new_rl->r->gloc[2],
+                                               lpos[0],
+                                               lpos[1],
+                                               gpos[0],
+                                               gpos[1],
+                                               gpos[2],
                                                N,
                                                new_rl->flags,
-                                               last_occlusion);
+                                               rls->occlusion);
+          last_occlusion = rls->occlusion;
         }
+        lanpr_append_render_line_chain_point(rb,
+                                             rlc,
+                                             new_rl->r->fbcoord[0],
+                                             new_rl->r->fbcoord[1],
+                                             new_rl->r->gloc[0],
+                                             new_rl->r->gloc[1],
+                                             new_rl->r->gloc[2],
+                                             N,
+                                             new_rl->flags,
+                                             last_occlusion);
       }
       ba = lanpr_get_point_bounding_area(rb, new_rv->fbcoord[0], new_rv->fbcoord[1]);
     }
diff --git a/source/blender/draw/engines/lanpr/lanpr_ops.c b/source/blender/draw/engines/lanpr/lanpr_ops.c
index 4f1637276ae..33dbb10aaa2 100644
--- a/source/blender/draw/engines/lanpr/lanpr_ops.c
+++ b/source/blender/draw/engines/lanpr/lanpr_ops.c
@@ -4120,9 +4120,9 @@ int lanpr_compute_feature_lines_internal(Depsgraph *depsgraph)
 
   if (lanpr->enable_chaining) {
     lanpr_NO_THREAD_chain_feature_lines(rb); /*  should use user_adjustable value */
-    lanpr_split_chains_for_fixed_occlusion(rb);
-    lanpr_connect_chains_image_space(rb, 1);
-    lanpr_connect_chains_image_space(rb, 0);
+    // lanpr_split_chains_for_fixed_occlusion(rb);
+    // lanpr_connect_chains_image_space(rb, 1);
+    // lanpr_connect_chains_image_space(rb, 0);
   }
 
   rb->cached_for_frame = rb->scene->r.cfra;



More information about the Bf-blender-cvs mailing list