[Bf-blender-cvs] [0e19957ea12] soc-2019-npr: LANPR: CPU mode chaining use deep bounding areas.

YimingWu noreply at git.blender.org
Thu Jul 4 10:19:52 CEST 2019


Commit: 0e19957ea12bfe4baa93fd75073fc6fb46425c3f
Author: YimingWu
Date:   Thu Jul 4 16:18:55 2019 +0800
Branches: soc-2019-npr
https://developer.blender.org/rB0e19957ea12bfe4baa93fd75073fc6fb46425c3f

LANPR: CPU mode chaining use deep bounding areas.

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

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 a69a30c6de2..868958a1719 100644
--- a/source/blender/draw/engines/lanpr/lanpr_chain.c
+++ b/source/blender/draw/engines/lanpr/lanpr_chain.c
@@ -209,6 +209,8 @@ void lanpr_reduce_render_line_chain_recursive(LANPR_RenderLineChain *rlc,
   }
 }
 
+LANPR_BoundingArea *lanpr_get_point_bounding_area_deep(LANPR_RenderBuffer *rb, real x, real y);
+
 void lanpr_NO_THREAD_chain_feature_lines(LANPR_RenderBuffer *rb)
 {
   LANPR_RenderLineChain *rlc;
@@ -252,7 +254,7 @@ void lanpr_NO_THREAD_chain_feature_lines(LANPR_RenderBuffer *rb)
     }
 
     /*  step 1: grow left */
-    ba = lanpr_get_point_bounding_area(rb, rl->l->fbcoord[0], rl->l->fbcoord[1]);
+    ba = lanpr_get_point_bounding_area_deep(rb, rl->l->fbcoord[0], rl->l->fbcoord[1]);
     new_rv = rl->l;
     rls = rl->segments.first;
     lanpr_push_render_line_chain_point(rb,
@@ -332,7 +334,7 @@ void lanpr_NO_THREAD_chain_feature_lines(LANPR_RenderBuffer *rb)
                                            new_rl->flags,
                                            last_occlusion);
       }
-      ba = lanpr_get_point_bounding_area(rb, new_rv->fbcoord[0], new_rv->fbcoord[1]);
+      ba = lanpr_get_point_bounding_area_deep(rb, new_rv->fbcoord[0], new_rv->fbcoord[1]);
     }
 
     /*  step 2: this line */
@@ -358,7 +360,7 @@ void lanpr_NO_THREAD_chain_feature_lines(LANPR_RenderBuffer *rb)
                                          last_occlusion);
 
     /*  step 3: grow right */
-    ba = lanpr_get_point_bounding_area(rb, rl->r->fbcoord[0], rl->r->fbcoord[1]);
+    ba = lanpr_get_point_bounding_area_deep(rb, rl->r->fbcoord[0], rl->r->fbcoord[1]);
     new_rv = rl->r;
     /*  below already done in step 2 */
     /*  lanpr_push_render_line_chain_point(rb,rlc,new_rv->fbcoord[0],new_rv->fbcoord[1],rl->flags,0);
@@ -423,34 +425,41 @@ void lanpr_NO_THREAD_chain_feature_lines(LANPR_RenderBuffer *rb)
                                              new_rl->flags,
                                              last_occlusion);
       }
-      ba = lanpr_get_point_bounding_area(rb, new_rv->fbcoord[0], new_rv->fbcoord[1]);
+      ba = lanpr_get_point_bounding_area_deep(rb, new_rv->fbcoord[0], new_rv->fbcoord[1]);
     }
   }
 }
 
 LANPR_BoundingArea *lanpr_get_point_bounding_area(LANPR_RenderBuffer *rb, real x, real y);
-LANPR_BoundingArea *lanpr_get_point_bounding_area_recursive(LANPR_RenderBuffer *rb,
-                                                            LANPR_BoundingArea *root,
-                                                            LANPR_RenderLineChainItem *rlci)
+LANPR_BoundingArea *lanpr_get_rlci_bounding_area_recursive(LANPR_RenderBuffer *rb,
+                                                           LANPR_BoundingArea *root,
+                                                           LANPR_RenderLineChainItem *rlci)
 {
-  /*  if (!root->child) { */
-  return root;
-  /* } */
-  /*  else { */
-  /*   LANPR_BoundingArea* ch = root->child; */
-  /*   #define IN_BOUND(ba,rlci)\ */
-  /*     ba.l<=rlci->pos[0] && ba.r>=rlci->pos[0] && ba.b<=rlci->pos[1] && ba.u>=rlci->pos[1] */
-  /*   if     (IN_BOUND(ch[0],rlci)) return
-   * lanpr_get_point_bounding_area_recursive(rb,&ch[0],rlci); */
-  /*   else if(IN_BOUND(ch[1],rlci)) return
-   * lanpr_get_point_bounding_area_recursive(rb,&ch[1],rlci); */
-  /*   else if(IN_BOUND(ch[2],rlci)) return
-   * lanpr_get_point_bounding_area_recursive(rb,&ch[2],rlci); */
-  /*   else if(IN_BOUND(ch[3],rlci)) return
-   * lanpr_get_point_bounding_area_recursive(rb,&ch[3],rlci); */
-  /*   #undef IN_BOUND */
-  /* } */
-  /*  return NULL; */
+  if (!root->child) {
+    return root;
+  }
+  else {
+    LANPR_BoundingArea *ch = root->child;
+#define IN_BOUND(ba, rlci) \
+  \ 
+    ba.l <= rlci->pos[0] && \
+      ba.r >= rlci->pos[0] && ba.b <= rlci->pos[1] && ba.u >= rlci->pos[1]
+
+    if (IN_BOUND(ch[0], rlci)) {
+      return lanpr_get_rlci_bounding_area_recursive(rb, &ch[0], rlci);
+    }
+    else if (IN_BOUND(ch[1], rlci)) {
+      return lanpr_get_rlci_bounding_area_recursive(rb, &ch[1], rlci);
+    }
+    else if (IN_BOUND(ch[2], rlci)) {
+      return lanpr_get_rlci_bounding_area_recursive(rb, &ch[2], rlci);
+    }
+    else if (IN_BOUND(ch[3], rlci)) {
+      return lanpr_get_rlci_bounding_area_recursive(rb, &ch[3], rlci);
+    }
+#undef IN_BOUND
+  }
+  return NULL;
 }
 LANPR_BoundingArea *lanpr_get_end_point_bounding_area(LANPR_RenderBuffer *rb,
                                                       LANPR_RenderLineChainItem *rlci)
@@ -459,8 +468,9 @@ LANPR_BoundingArea *lanpr_get_end_point_bounding_area(LANPR_RenderBuffer *rb,
   if (!root) {
     return NULL;
   }
-  return lanpr_get_point_bounding_area_recursive(rb, root, rlci);
+  return lanpr_get_rlci_bounding_area_recursive(rb, root, rlci);
 }
+
 /*  if reduction threshold is even larger than a small bounding area, */
 /*  then 1) geometry is simply too dense. */
 /*       2) probably need to add it to root bounding area which has larger surface area then it
@@ -471,30 +481,39 @@ void lanpr_link_point_with_bounding_area_recursive(LANPR_RenderBuffer *rb,
                                                    LANPR_RenderLineChain *rlc,
                                                    LANPR_RenderLineChainItem *rlci)
 {
-  /*  if (!root->child) { */
-  LANPR_ChainRegisterEntry *cre = list_append_pointer_static_sized(
-      &root->linked_chains, &rb->render_data_pool, rlc, sizeof(LANPR_ChainRegisterEntry));
+  if (!root->child) {
+    LANPR_ChainRegisterEntry *cre = list_append_pointer_static_sized(
+        &root->linked_chains, &rb->render_data_pool, rlc, sizeof(LANPR_ChainRegisterEntry));
+
+    cre->rlci = rlci;
 
-  cre->rlci = rlci;
+    if (rlci == rlc->chain.first) {
+      cre->is_left = 1;
+    }
+  }
+  else {
+    LANPR_BoundingArea *ch = root->child;
+
+#define IN_BOUND(ba, rlci) \
+  \ 
+      ba.l <= rlci->pos[0] && \
+      ba.r >= rlci->pos[0] && ba.b <= rlci->pos[1] && ba.u >= rlci->pos[1]
+
+    if (IN_BOUND(ch[0], rlci)) {
+      lanpr_link_point_with_bounding_area_recursive(rb, &ch[0], rlc, rlci);
+    }
+    else if (IN_BOUND(ch[1], rlci)) {
+      lanpr_link_point_with_bounding_area_recursive(rb, &ch[1], rlc, rlci);
+    }
+    else if (IN_BOUND(ch[2], rlci)) {
+      lanpr_link_point_with_bounding_area_recursive(rb, &ch[2], rlc, rlci);
+    }
+    else if (IN_BOUND(ch[3], rlci)) {
+      lanpr_link_point_with_bounding_area_recursive(rb, &ch[3], rlc, rlci);
+    }
 
-  if (rlci == rlc->chain.first) {
-    cre->is_left = 1;
+#undef IN_BOUND
   }
-  /* } */
-  /*  else { */
-  /*   LANPR_BoundingArea* ch = root->child; */
-  /*   #define IN_BOUND(ba,rlci)\ */
-  /*     ba.l<=rlci->pos[0] && ba.r>=rlci->pos[0] && ba.b<=rlci->pos[1] && ba.u>=rlci->pos[1] */
-  /*   if     (IN_BOUND(ch[0],rlci)) */
-  /*   lanpr_link_point_with_bounding_area_recursive(rb,&ch[0],rlc,rlci); else */
-  /*   if(IN_BOUND(ch[1],rlci)) lanpr_link_point_with_bounding_area_recursive(rb,&ch[1],rlc,rlci);
-   */
-  /*   else if(IN_BOUND(ch[2],rlci)) */
-  /*   lanpr_link_point_with_bounding_area_recursive(rb,&ch[2],rlc,rlci); else */
-  /*   if(IN_BOUND(ch[3],rlci)) lanpr_link_point_with_bounding_area_recursive(rb,&ch[3],rlc,rlci);
-   */
-  /*   #undef IN_BOUND */
-  /* } */
 }
 
 void lanpr_link_chain_with_bounding_areas(LANPR_RenderBuffer *rb, LANPR_RenderLineChain *rlc)
diff --git a/source/blender/draw/engines/lanpr/lanpr_ops.c b/source/blender/draw/engines/lanpr/lanpr_ops.c
index 817c45cc489..ad27ea33bac 100644
--- a/source/blender/draw/engines/lanpr/lanpr_ops.c
+++ b/source/blender/draw/engines/lanpr/lanpr_ops.c
@@ -446,7 +446,23 @@ void lanpr_link_line_with_bounding_area(LANPR_RenderBuffer *rb,
                                         LANPR_BoundingArea *RootBoundingArea,
                                         LANPR_RenderLine *rl)
 {
-  list_append_pointer_static_pool(&rb->render_data_pool, &RootBoundingArea->linked_lines, rl);
+  if (!RootBoundingArea->child) {
+    list_append_pointer_static_pool(&rb->render_data_pool, &RootBoundingArea->linked_lines, rl);
+  }
+  else {
+    if (lanpr_line_crosses_bounding_area(rb, rl->l, rl->r, &RootBoundingArea->child[0])) {
+      lanpr_link_line_with_bounding_area(rb, &RootBoundingArea->child[0], rl);
+    }
+    else if (lanpr_line_crosses_bounding_area(rb, rl->l, rl->r, &RootBoundingArea->child[1])) {
+      lanpr_link_line_with_bounding_area(rb, &RootBoundingArea->child[1], rl);
+    }
+    else if (lanpr_line_crosses_bounding_area(rb, rl->l, rl->r, &RootBoundingArea->child[2])) {
+      lanpr_link_line_with_bounding_area(rb, &RootBoundingArea->child[2], rl);
+    }
+    else if (lanpr_line_crosses_bounding_area(rb, rl->l, rl->r, &RootBoundingArea->child[3])) {
+      lanpr_link_line_with_bounding_area(rb, &RootBoundingArea->child[3], rl);
+    }
+  }
 }
 int lanpr_get_triangle_bounding_areas(LANPR_RenderBuffer *rb,
                                       LANPR_RenderTriangle *rt,
@@ -565,6 +581,44 @@ LANPR_BoundingArea *lanpr_get_point_bounding_area(LANPR_RenderBuffer *rb, real x
 
   return &rb->initial_bounding_areas[row * 4 + col];
 }
+static LANPR_BoundingArea *lanpr_get_point_bounding_area_recursive(LANPR_BoundingArea *ba,
+                                                                   real x,
+                                                                   real y)
+{
+  if (!ba->child) {
+    return ba;
+  }
+  else {
+    LANPR_BoundingArea *ch = ba->child;
+#define IN_BOUND(i, x, y) \
+  \ 
+    ba->child[i] \
+              .l <= x && \
+      ba->child[i].r >= x && ba->child[i].b <= y && ba->child[i].u >= y
+
+    if (IN_BOUND(0, x, y)) {
+      return lanpr_get_point_bounding_area_recursive(&ba->child[0], x, y);
+    }
+    else if (IN_BOUND(1, x, y)) {
+      return lanpr_get_point_bounding_area_recursive(&ba->child[1], x, y);
+    }
+    else if (IN_BOUND(2, x, y)) {
+      return lanpr_get_point_bounding_area_recursive(&ba->child[2], x, y);
+    }
+    else if (IN_BOUND(3, x, y)) {
+      return lanpr_get_point_bounding_area_recursive(&ba->child[3], x, y);
+    }
+  }
+  return NULL;
+}
+LANPR_BoundingArea *lanpr_get_point_bo

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list