[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