[Bf-blender-cvs] [c8ad50a4e33] soc-2019-npr: LANPR: Chain connection working.
Yiming Wu
noreply at git.blender.org
Wed Jun 12 13:33:38 CEST 2019
Commit: c8ad50a4e33ba7b5104b170e32d0e808e3851b2e
Author: Yiming Wu
Date: Wed Jun 12 19:33:25 2019 +0800
Branches: soc-2019-npr
https://developer.blender.org/rBc8ad50a4e33ba7b5104b170e32d0e808e3851b2e
LANPR: Chain connection working.
===================================================================
M source/blender/draw/engines/lanpr/lanpr_chain.c
===================================================================
diff --git a/source/blender/draw/engines/lanpr/lanpr_chain.c b/source/blender/draw/engines/lanpr/lanpr_chain.c
index 60e0bda8af0..dc2986e4eb9 100644
--- a/source/blender/draw/engines/lanpr/lanpr_chain.c
+++ b/source/blender/draw/engines/lanpr/lanpr_chain.c
@@ -445,6 +445,7 @@ LANPR_BoundingArea *lanpr_get_point_bounding_area_recursive(
}
LANPR_BoundingArea *lanpr_get_end_point_bounding_area(LANPR_RenderBuffer *rb, LANPR_RenderLineChainItem* rlci){
LANPR_BoundingArea* root = lanpr_get_point_bounding_area(rb,rlci->pos[0],rlci->pos[1]);
+ if(!root) return NULL;
return lanpr_get_point_bounding_area_recursive(rb,root,rlci);
}
// if reduction threshold is even larger than a small bounding area,
@@ -475,8 +476,8 @@ void lanpr_link_chain_with_bounding_areas(LANPR_RenderBuffer *rb, LANPR_RenderLi
LANPR_BoundingArea* ba1 = lanpr_get_point_bounding_area(rb,pl->pos[0],pl->pos[1]);
LANPR_BoundingArea* ba2 = lanpr_get_point_bounding_area(rb,pr->pos[0],pr->pos[1]);
- lanpr_link_point_with_bounding_area_recursive(rb,ba1,rlc,pl);
- lanpr_link_point_with_bounding_area_recursive(rb,ba2,rlc,pr);
+ if(ba1) lanpr_link_point_with_bounding_area_recursive(rb,ba1,rlc,pl);
+ if(ba2) lanpr_link_point_with_bounding_area_recursive(rb,ba2,rlc,pr);
}
void lanpr_split_chains_for_fixed_occlusion(LANPR_RenderBuffer *rb)
@@ -544,7 +545,9 @@ void lanpr_connect_two_chains(LANPR_RenderBuffer* rb, LANPR_RenderLineChain* ont
((LANPR_RenderLineChainItem*)onto->chain.first)->item.prev = sub->chain.last;
onto->chain.first = sub->chain.first;
}
- BLI_remlink(&rb->chains,sub);
+ //((LANPR_RenderLineChainItem*)sub->chain.first)->occlusion = ((LANPR_RenderLineChainItem*)onto->chain.first)->occlusion;
+ //((LANPR_RenderLineChainItem*)onto->chain.last)->occlusion = ((LANPR_RenderLineChainItem*)onto->chain.first)->occlusion;
+ //((LANPR_RenderLineChainItem*)sub->chain.last)->occlusion = ((LANPR_RenderLineChainItem*)onto->chain.first)->occlusion;
}
// this only does head-tail connection.
@@ -556,6 +559,7 @@ void lanpr_connect_chains_image_space(LANPR_RenderBuffer *rb)
LANPR_BoundingArea* ba;
LANPR_ChainRegisterEntry* cre, *next_cre, *closest_cre;
float dist;
+ int occlusion;
ListBase swap = {0};
swap.first = rb->chains.first;
@@ -564,61 +568,80 @@ void lanpr_connect_chains_image_space(LANPR_RenderBuffer *rb)
rb->chains.last = rb->chains.first = NULL;
while (rlc = BLI_pophead(&swap)) {
+ BLI_addtail(&rb->chains, rlc);
if(rlc->picked) continue;
+
+ occlusion = ((LANPR_RenderLineChainItem*)rlc->chain.first)->occlusion;
+
rlci = rlc->chain.last;
- ba = lanpr_get_end_point_bounding_area(rb,rlci);
- dist = 100.0f;
- closest_cre = NULL;
- for(cre = ba->linked_chains.first;cre;cre = next_cre){
- next_cre = cre->item.next;
- if(cre->rlc == rlc) continue;
- if(cre->rlc->picked){
- BLI_remlink(&ba->linked_chains,cre);
- continue;
- }
- float new_len = len_v2v2(cre->rlci->pos,rlci->pos);
- if(new_len<dist){
- closest_cre = cre;
- dist = new_len;
+ while(ba = lanpr_get_end_point_bounding_area(rb,rlci)){
+ dist = 100.0f;
+ closest_cre = NULL;
+ if(!ba->linked_chains.first) break;
+ for(cre = ba->linked_chains.first;cre;cre = next_cre){
+ next_cre = cre->item.next;
+ if(cre->rlc == rlc || ((LANPR_RenderLineChainItem*)cre->rlc->chain.first)->occlusion != occlusion) continue;
+ if(cre->rlc->picked){
+ BLI_remlink(&ba->linked_chains,cre);
+ continue;
+ }
+ float new_len = len_v2v2(cre->rlci->pos,rlci->pos);
+ if(new_len<dist){
+ closest_cre = cre;
+ dist = new_len;
+ }
}
- }
- if(dist<0.00001f && closest_cre){
- closest_cre->picked = 1;
- closest_cre->rlc->picked = 1;
- BLI_remlink(&ba->linked_chains,cre);
- if(closest_cre->rlci == closest_cre->rlc->chain.first){
- lanpr_connect_two_chains(rb,rlc,closest_cre->rlc,0,0);
+ if(dist<0.05f && closest_cre){
+ closest_cre->picked = 1;
+ closest_cre->rlc->picked = 1;
+ BLI_remlink(&ba->linked_chains,cre);
+ if(closest_cre->rlci == closest_cre->rlc->chain.first){
+ lanpr_connect_two_chains(rb,rlc,closest_cre->rlc,0,0);
+ BLI_remlink(&swap,closest_cre->rlc);
+ }else{
+ lanpr_connect_two_chains(rb,rlc,closest_cre->rlc,0,1);
+ BLI_remlink(&swap,closest_cre->rlc);
+ }
}else{
- lanpr_connect_two_chains(rb,rlc,closest_cre->rlc,0,1);
+ break;
}
+ rlci = rlc->chain.last;
}
+
rlci = rlc->chain.first;
- ba = lanpr_get_end_point_bounding_area(rb,rlci);
- dist = 100.0f;
- closest_cre = NULL;
- for(cre = ba->linked_chains.first;cre;cre = next_cre){
- next_cre = cre->item.next;
- if(cre->rlc == rlc) continue;
- if(cre->rlc->picked){
- BLI_remlink(&ba->linked_chains,cre);
- continue;
- }
- float new_len = len_v2v2(cre->rlci->pos,rlci->pos);
- if(new_len<dist){
- closest_cre = cre;
- dist = new_len;
+ while(ba = lanpr_get_end_point_bounding_area(rb,rlci)){
+ dist = 100.0f;
+ closest_cre = NULL;
+ if(!ba->linked_chains.first) break;
+ for(cre = ba->linked_chains.first;cre;cre = next_cre){
+ next_cre = cre->item.next;
+ if(cre->rlc == rlc || ((LANPR_RenderLineChainItem*)cre->rlc->chain.first)->occlusion != occlusion) continue;
+ if(cre->rlc->picked){
+ BLI_remlink(&ba->linked_chains,cre);
+ continue;
+ }
+ float new_len = len_v2v2(cre->rlci->pos,rlci->pos);
+ if(new_len<dist){
+ closest_cre = cre;
+ dist = new_len;
+ }
}
- }
- if(dist<0.00001f && closest_cre){
- closest_cre->picked = 1;
- closest_cre->rlc->picked = 1;
- BLI_remlink(&ba->linked_chains,cre);
- if(closest_cre->rlci == closest_cre->rlc->chain.first){
- lanpr_connect_two_chains(rb,rlc,closest_cre->rlc,1,0);
+ if(dist<0.05f && closest_cre){
+ closest_cre->picked = 1;
+ closest_cre->rlc->picked = 1;
+ BLI_remlink(&ba->linked_chains,cre);
+ if(closest_cre->rlci == closest_cre->rlc->chain.first){
+ BLI_remlink(&swap,closest_cre->rlc);
+ lanpr_connect_two_chains(rb,rlc,closest_cre->rlc,1,0);
+ }else{
+ lanpr_connect_two_chains(rb,rlc,closest_cre->rlc,1,1);
+ BLI_remlink(&swap,closest_cre->rlc);
+ }
}else{
- lanpr_connect_two_chains(rb,rlc,closest_cre->rlc,1,1);
+ break;
}
+ rlci = rlc->chain.first;
}
}
More information about the Bf-blender-cvs
mailing list