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. @@
_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs