[Bf-blender-cvs] [668c15d5bf2] soc-2019-npr: LANPR: Chain image space connection (not working yet)
Yiming Wu
noreply at git.blender.org
Wed Jun 12 13:33:36 CEST 2019
Commit: 668c15d5bf282b0ad2c4f6306512c17d39b307c3
Author: Yiming Wu
Date: Wed Jun 12 17:55:57 2019 +0800
Branches: soc-2019-npr
https://developer.blender.org/rB668c15d5bf282b0ad2c4f6306512c17d39b307c3
LANPR: Chain image space connection (not working yet)
===================================================================
M release/datafiles/locale
M release/scripts/addons
M release/scripts/addons_contrib
M source/blender/draw/engines/lanpr/lanpr_all.h
M source/blender/draw/engines/lanpr/lanpr_chain.c
M source/blender/draw/engines/lanpr/lanpr_data_types.h
M source/blender/draw/engines/lanpr/lanpr_ops.c
M source/tools
===================================================================
diff --git a/release/datafiles/locale b/release/datafiles/locale
index ad82c4ce43e..469c949d1ca 160000
--- a/release/datafiles/locale
+++ b/release/datafiles/locale
@@ -1 +1 @@
-Subproject commit ad82c4ce43ef2801ef51e75af1f9702992478b02
+Subproject commit 469c949d1ca882be19daa128842f813b72a944d8
diff --git a/release/scripts/addons b/release/scripts/addons
index 8e6f485cf5b..c88411ff777 160000
--- a/release/scripts/addons
+++ b/release/scripts/addons
@@ -1 +1 @@
-Subproject commit 8e6f485cf5b160c425d7da7c743879b20f3d6a96
+Subproject commit c88411ff7776a2db5d6ef6117a1b2faa42a95611
diff --git a/release/scripts/addons_contrib b/release/scripts/addons_contrib
index 7077ff07384..310578043de 160000
--- a/release/scripts/addons_contrib
+++ b/release/scripts/addons_contrib
@@ -1 +1 @@
-Subproject commit 7077ff07384491d1f7630484995557f1c7302dae
+Subproject commit 310578043dec1aae382eb6a447ae1d103792d7e6
diff --git a/source/blender/draw/engines/lanpr/lanpr_all.h b/source/blender/draw/engines/lanpr/lanpr_all.h
index bbf07ce39e8..c73880282eb 100644
--- a/source/blender/draw/engines/lanpr/lanpr_all.h
+++ b/source/blender/draw/engines/lanpr/lanpr_all.h
@@ -404,7 +404,8 @@ typedef struct LANPR_BoundingArea {
int triangle_count;
ListBase linked_triangles;
ListBase linked_lines;
- ListBase linked_chains; // reserved for multithread chainning
+
+ ListBase linked_chains; // reserved for image space reduction && multithread chainning
} LANPR_BoundingArea;
#define TNS_COMMAND_LINE 0
diff --git a/source/blender/draw/engines/lanpr/lanpr_chain.c b/source/blender/draw/engines/lanpr/lanpr_chain.c
index d698311526b..60e0bda8af0 100644
--- a/source/blender/draw/engines/lanpr/lanpr_chain.c
+++ b/source/blender/draw/engines/lanpr/lanpr_chain.c
@@ -425,6 +425,60 @@ void lanpr_NO_THREAD_chain_feature_lines(LANPR_RenderBuffer *rb, float dist_thre
}
}
+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){
+ 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;
+}
+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]);
+ return lanpr_get_point_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 will cover typical threshold values.
+void lanpr_link_point_with_bounding_area_recursive(
+ LANPR_RenderBuffer *rb, LANPR_BoundingArea* root, 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));
+ cre->rlci = rlci;
+ }
+ 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)
+{
+ LANPR_RenderLineChainItem* pl = rlc->chain.first;
+ LANPR_RenderLineChainItem* pr = rlc->chain.last;
+ 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);
+}
+
void lanpr_split_chains_for_fixed_occlusion(LANPR_RenderBuffer *rb)
{
LANPR_RenderLineChain *rlc, *new_rlc;
@@ -468,6 +522,106 @@ void lanpr_split_chains_for_fixed_occlusion(LANPR_RenderBuffer *rb)
}
}
}
+ for(rlc = rb->chains.first;rlc;rlc=rlc->item.next){
+ lanpr_link_chain_with_bounding_areas(rb,rlc);
+ }
+}
+
+// note: segment type (crease/material/contour...) is ambiguous after this.
+void lanpr_connect_two_chains(LANPR_RenderBuffer* rb, LANPR_RenderLineChain* onto, LANPR_RenderLineChain* sub, int reverse_1, int reverse_2){
+ if(!reverse_1){ // L--R L-R
+ if(reverse_2){ // L--R R-L
+ BLI_listbase_reverse(&sub->chain);
+ }
+ ((LANPR_RenderLineChainItem*)onto->chain.last)->item.next = sub->chain.first;
+ ((LANPR_RenderLineChainItem*)sub->chain.first)->item.prev = onto->chain.last;
+ onto->chain.last = sub->chain.last;
+ }else{ // L-R L--R
+ if(!reverse_2){ // R-L L--R
+ BLI_listbase_reverse(&sub->chain);
+ }
+ ((LANPR_RenderLineChainItem*)sub->chain.last)->item.next = onto->chain.first;
+ ((LANPR_RenderLineChainItem*)onto->chain.first)->item.prev = sub->chain.last;
+ onto->chain.first = sub->chain.first;
+ }
+ BLI_remlink(&rb->chains,sub);
+}
+
+// this only does head-tail connection.
+// overlapping / tiny isolated segment / loop reduction not implemented here yet.
+void lanpr_connect_chains_image_space(LANPR_RenderBuffer *rb)
+{
+ LANPR_RenderLineChain *rlc, *new_rlc;
+ LANPR_RenderLineChainItem *rlci, *next_rlci;
+ LANPR_BoundingArea* ba;
+ LANPR_ChainRegisterEntry* cre, *next_cre, *closest_cre;
+ float dist;
+ ListBase swap = {0};
+
+ swap.first = rb->chains.first;
+ swap.last = rb->chains.last;
+
+ rb->chains.last = rb->chains.first = NULL;
+
+ while (rlc = BLI_pophead(&swap)) {
+ if(rlc->picked) continue;
+ 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;
+ }
+ }
+ 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);
+ }else{
+ lanpr_connect_two_chains(rb,rlc,closest_cre->rlc,0,1);
+ }
+ }
+
+ 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;
+ }
+ }
+ 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);
+ }else{
+ lanpr_connect_two_chains(rb,rlc,closest_cre->rlc,1,1);
+ }
+ }
+ }
+
}
int lanpr_count_chain(LANPR_RenderLineChain *rlc)
diff --git a/source/blender/draw/engines/lanpr/lanpr_data_types.h b/source/blender/draw/engines/lanpr/lanpr_data_types.h
index 32ca802c841..d7a32899d40 100644
--- a/source/blender/draw/engines/lanpr/lanpr_data_types.h
+++ b/source/blender/draw/engines/lanpr/lanpr_data_types.h
@@ -122,6 +122,7 @@ typedef struct LANPR_RenderLineChain {
ListBase chain;
// int SegmentCount; // we count before draw cmd.
float length; // calculated before draw cmd.
+ char picked; // used when re-connecting
} LANPR_RenderLineChain;
typedef struct LANPR_RenderLineChainItem {
@@ -133,4 +134,11 @@ typedef struct LANPR_RenderLineChainItem {
char occlusion; // [1]--------------->[2]---------------->[3]--....
} LANPR_RenderLineChainItem;
+typedef struct LANPR_ChainRegisterEntry{
+ Link item;
+ LANPR_RenderLineChain* rlc;
+ LANPR_RenderLineChainItem* rlci;
+ char picked;
+} LANPR_ChainRegisterEntry;
+
#endif
\ No newline at end of file
diff --git a/source/blender/draw/engines/lanpr/lanpr_ops.c b/source/blender/draw/engines/lanpr/lanpr_ops.c
index e72b7de6eb9..8db9a96e2ff 100644
--- a/source/blender/draw/engines/lanpr/lanpr_ops.c
+++ b/source/blender/draw/engines/lanpr/lanpr_ops.c
@@ -3722,6 +3722,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_connect_chains_image_space(LANPR_RenderBuffer *rb);
void lanpr_calculate_normal_object_vector(LANPR_LineLayer *ll, float *normal_object_direction)
{
@@ -3972,6 +3973,7 @@ int lanpr_compute_feature_lines_internal(Depsgraph *depsgraph, SceneLANPR *lanpr
if (lanpr->en
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list