[Bf-blender-cvs] [cf365828d85] lanpr-under-gp: LineArt: double point chaining algorithm
YimingWu
noreply at git.blender.org
Sat Jul 25 12:02:53 CEST 2020
Commit: cf365828d8595f6ea465ab0c198037b7930300a2
Author: YimingWu
Date: Sat Jul 25 17:56:54 2020 +0800
Branches: lanpr-under-gp
https://developer.blender.org/rBcf365828d8595f6ea465ab0c198037b7930300a2
LineArt: double point chaining algorithm
===================================================================
M source/blender/editors/lineart/lineart_chain.c
===================================================================
diff --git a/source/blender/editors/lineart/lineart_chain.c b/source/blender/editors/lineart/lineart_chain.c
index 6c6d8e27927..b5e38fe3873 100644
--- a/source/blender/editors/lineart/lineart_chain.c
+++ b/source/blender/editors/lineart/lineart_chain.c
@@ -679,8 +679,8 @@ LineartChainRegisterEntry *lineart_chain_get_closest_cre(LineartRenderBuffer *rb
continue;
}
}
- if (cre->rlc->picked) {
- BLI_remlink(&ba->linked_chains, cre);
+ if (cre->rlc->picked || cre->picked) {
+ // BLI_remlink(&ba->linked_chains, cre);
continue;
}
if (cre->rlc == rlc || (!cre->rlc->chain.first) || (cre->rlc->level != occlusion)) {
@@ -718,12 +718,12 @@ LineartChainRegisterEntry *lineart_chain_get_closest_cre(LineartRenderBuffer *rb
void ED_lineart_chain_connect(LineartRenderBuffer *rb, const int do_geometry_space)
{
LineartRenderLineChain *rlc;
- LineartRenderLineChainItem *rlci, *rlci_guard;
- LineartBoundingArea *ba, *ba_guard;
- LineartChainRegisterEntry *closest_cre_l, *closest_cre_r;
+ LineartRenderLineChainItem *rlci_l, *rlci_r;
+ LineartBoundingArea *ba_l, *ba_r;
+ LineartChainRegisterEntry *closest_cre_l, *closest_cre_r, *closest_cre;
float dist = do_geometry_space ? rb->chaining_geometry_threshold : rb->chaining_image_threshold;
- float new_len;
- int occlusion;
+ float dist_l, dist_r;
+ int occlusion, reverse_main;
ListBase swap = {0};
if ((!do_geometry_space && rb->chaining_image_threshold < 0.0001) ||
@@ -743,79 +743,51 @@ void ED_lineart_chain_connect(LineartRenderBuffer *rb, const int do_geometry_spa
}
BLI_addtail(&rb->chains, rlc);
- rlc->picked = 1;
-
occlusion = ((LineartRenderLineChainItem *)rlc->chain.first)->occlusion;
- rlci = rlc->chain.last;
- rlci_guard = rlc->chain.first;
- if (rlci_guard) {
- ba_guard = lineart_bounding_area_get_end_point(rb, rlci_guard);
- }
- while (rlci && ((ba = lineart_bounding_area_get_end_point(rb, rlci)) != NULL)) {
- closest_cre_l = NULL;
- if (ba->linked_chains.first == NULL) {
- break;
- }
+ rlci_l = rlc->chain.first;
+ rlci_r = rlc->chain.last;
+ while ((ba_l = lineart_bounding_area_get_end_point(rb, rlci_l)) &&
+ (ba_r = lineart_bounding_area_get_end_point(rb, rlci_r))) {
closest_cre_l = lineart_chain_get_closest_cre(
- rb, ba, rlc, rlci, occlusion, dist, do_geometry_space, &new_len);
- if (closest_cre_l) {
- if (ba_guard == ba) {
- /* Technically shouldn't do bounding areas here, but the looping bug can only possibly
- * occur when ba_guard==ba*/
- /* Todo in the future: robust chaining with near-bounding area implementation would get
- * rid of this hack */
- float guard_len = do_geometry_space ?
- len_v3v3(rlci_guard->gpos, closest_cre_l->rlci->gpos) :
- len_v2v2(rlci_guard->pos, closest_cre_l->rlci->pos);
- if (guard_len < new_len) {
- /* The point is actually closet to the other end of this line, thus do not chain right
- * now. */
- break;
- }
- }
- closest_cre_l->picked = 1;
- closest_cre_l->rlc->picked = 1;
- BLI_remlink(&ba->linked_chains, closest_cre_l);
- if (closest_cre_l->is_left) {
- lineart_chain_connect(rb, rlc, closest_cre_l->rlc, 0, 0);
+ rb, ba_l, rlc, rlci_l, occlusion, dist, do_geometry_space, &dist_l);
+ closest_cre_r = lineart_chain_get_closest_cre(
+ rb, ba_r, rlc, rlci_r, occlusion, dist, do_geometry_space, &dist_r);
+ if (closest_cre_l && closest_cre_r) {
+ if (dist_l < dist_r) {
+ closest_cre = closest_cre_l;
+ reverse_main = 1;
}
else {
- lineart_chain_connect(rb, rlc, closest_cre_l->rlc, 0, 1);
+ closest_cre = closest_cre_r;
+ reverse_main = 0;
}
- BLI_remlink(&swap, closest_cre_l->rlc);
}
- else {
- break;
+ else if (closest_cre_l) {
+ closest_cre = closest_cre_l;
+ reverse_main = 1;
}
- rlci = rlc->chain.last;
- }
-
- rlci = rlc->chain.first;
- while (rlci && ((ba = lineart_bounding_area_get_end_point(rb, rlci)) != NULL)) {
- closest_cre_r = NULL;
- if (ba->linked_chains.first == NULL) {
+ else if (closest_cre_r) {
+ closest_cre = closest_cre_r;
+ BLI_remlink(&ba_r->linked_chains, closest_cre_r);
+ reverse_main = 0;
+ }
+ else {
break;
}
- closest_cre_r = lineart_chain_get_closest_cre(
- rb, ba, rlc, rlci, occlusion, dist, do_geometry_space, NULL);
- if (closest_cre_r) {
- closest_cre_r->picked = 1;
- closest_cre_r->rlc->picked = 1;
- BLI_remlink(&ba->linked_chains, closest_cre_r);
- if (closest_cre_r->is_left) {
- lineart_chain_connect(rb, rlc, closest_cre_r->rlc, 1, 0);
- }
- else {
- lineart_chain_connect(rb, rlc, closest_cre_r->rlc, 1, 1);
- }
- BLI_remlink(&swap, closest_cre_r->rlc);
+ closest_cre->picked = 1;
+ closest_cre->rlc->picked = 1;
+ if (closest_cre->is_left) {
+ lineart_chain_connect(rb, rlc, closest_cre->rlc, reverse_main, 0);
}
else {
- break;
+ lineart_chain_connect(rb, rlc, closest_cre->rlc, reverse_main, 1);
}
- rlci = rlc->chain.first;
+ BLI_remlink(&swap, closest_cre->rlc);
+ rlci_l = rlc->chain.first;
+ rlci_r = rlc->chain.last;
}
+ rlc->picked = 1;
}
}
More information about the Bf-blender-cvs
mailing list