[Bf-blender-cvs] [ef2189542d3] lanpr-under-gp: LineArt: Use separate function for getting closest end point in chain.

YimingWu noreply at git.blender.org
Sat Jul 25 06:16:54 CEST 2020


Commit: ef2189542d3d4158cf08bd1fd8185d89356fb01a
Author: YimingWu
Date:   Fri Jul 24 22:28:07 2020 +0800
Branches: lanpr-under-gp
https://developer.blender.org/rBef2189542d3d4158cf08bd1fd8185d89356fb01a

LineArt: Use separate function for getting closest end point in chain.

===================================================================

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 ae251190c70..40f95a720dd 100644
--- a/source/blender/editors/lineart/lineart_chain.c
+++ b/source/blender/editors/lineart/lineart_chain.c
@@ -655,6 +655,60 @@ static void lineart_chain_connect(LineartRenderBuffer *UNUSED(rb),
   }
 }
 
+LineartChainRegisterEntry *lineart_chain_get_closest_cre(LineartRenderBuffer *rb,
+                                                         LineartBoundingArea *ba,
+                                                         LineartRenderLineChain *rlc,
+                                                         LineartRenderLineChainItem *rlci,
+                                                         int occlusion,
+                                                         float dist,
+                                                         int do_geometry_space)
+{
+
+  LineartChainRegisterEntry *cre, *next_cre, *closest_cre = NULL;
+  for (cre = ba->linked_chains.first; cre; cre = next_cre) {
+    next_cre = cre->next;
+    if (cre->rlc->object_ref != rlc->object_ref) {
+      if (rb->fuzzy_everything || rb->fuzzy_intersections) {
+        /* if both have object_ref, then none is intersection line. */
+        if (cre->rlc->object_ref && rlc->object_ref) {
+          continue; /* We don't want to chain along different objects at the moment. */
+        }
+      }
+      else {
+        continue;
+      }
+    }
+    if (cre->rlc->picked) {
+      BLI_remlink(&ba->linked_chains, cre);
+      continue;
+    }
+    if (cre->rlc == rlc || (!cre->rlc->chain.first) || (cre->rlc->level != occlusion)) {
+      continue;
+    }
+    if (!rb->fuzzy_everything) {
+      if (cre->rlc->type != rlc->type) {
+        if (rb->fuzzy_intersections) {
+          if (!(cre->rlc->type == LRT_EDGE_FLAG_INTERSECTION ||
+                rlc->type == LRT_EDGE_FLAG_INTERSECTION)) {
+            continue; /* fuzzy intersetions but no intersection line found. */
+          }
+        }
+        else { /* line type different but no fuzzy */
+          continue;
+        }
+      }
+    }
+
+    float new_len = do_geometry_space ? len_v3v3(cre->rlci->gpos, rlci->gpos) :
+                                        len_v2v2(cre->rlci->pos, rlci->pos);
+    if (new_len < dist) {
+      closest_cre = cre;
+      dist = new_len;
+    }
+  }
+  return closest_cre;
+}
+
 /*  this only does head-tail connection. */
 /*  overlapping / tiny isolated segment / loop reduction not implemented here yet. */
 void ED_lineart_chain_connect(LineartRenderBuffer *rb, const int do_geometry_space)
@@ -662,8 +716,8 @@ void ED_lineart_chain_connect(LineartRenderBuffer *rb, const int do_geometry_spa
   LineartRenderLineChain *rlc;
   LineartRenderLineChainItem *rlci;
   LineartBoundingArea *ba;
-  LineartChainRegisterEntry *cre, *next_cre, *closest_cre;
-  float dist;
+  LineartChainRegisterEntry *closest_cre_l, *closest_cre_r;
+  float dist = do_geometry_space ? rb->chaining_geometry_threshold : rb->chaining_image_threshold;
   int occlusion;
   ListBase swap = {0};
 
@@ -690,63 +744,22 @@ void ED_lineart_chain_connect(LineartRenderBuffer *rb, const int do_geometry_spa
 
     rlci = rlc->chain.last;
     while (rlci && ((ba = lineart_bounding_area_get_end_point(rb, rlci)) != NULL)) {
-      closest_cre = NULL;
       if (ba->linked_chains.first == NULL) {
         break;
       }
-      for (cre = ba->linked_chains.first; cre; cre = next_cre) {
-        dist = do_geometry_space ? rb->chaining_geometry_threshold : rb->chaining_image_threshold;
-        next_cre = cre->next;
-        if (cre->rlc->object_ref != rlc->object_ref) {
-          if (rb->fuzzy_everything || rb->fuzzy_intersections) {
-            /* if both have object_ref, then none is intersection line. */
-            if (cre->rlc->object_ref && rlc->object_ref) {
-              continue; /* We don't want to chain along different objects at the moment. */
-            }
-          }
-          else {
-            continue;
-          }
-        }
-        if (cre->rlc->picked) {
-          BLI_remlink(&ba->linked_chains, cre);
-          continue;
-        }
-        if (cre->rlc == rlc || (!cre->rlc->chain.first) || (cre->rlc->level != occlusion)) {
-          continue;
-        }
-        if (!rb->fuzzy_everything) {
-          if (cre->rlc->type != rlc->type) {
-            if (rb->fuzzy_intersections) {
-              if (!(cre->rlc->type == LRT_EDGE_FLAG_INTERSECTION ||
-                    rlc->type == LRT_EDGE_FLAG_INTERSECTION)) {
-                continue; /* fuzzy intersetions but no intersection line found. */
-              }
-            }
-            else { /* line type different but no fuzzy */
-              continue;
-            }
-          }
-        }
-
-        float new_len = do_geometry_space ? len_v3v3(cre->rlci->gpos, rlci->gpos) :
-                                            len_v2v2(cre->rlci->pos, rlci->pos);
-        if (new_len < dist) {
-          closest_cre = cre;
-          dist = new_len;
-        }
-      }
-      if (closest_cre) {
-        closest_cre->picked = 1;
-        closest_cre->rlc->picked = 1;
-        BLI_remlink(&ba->linked_chains, cre);
-        if (closest_cre->is_left) {
-          lineart_chain_connect(rb, rlc, closest_cre->rlc, 0, 0);
+      closest_cre_l = lineart_chain_get_closest_cre(
+          rb, ba, rlc, rlci, occlusion, dist, do_geometry_space);
+      if (closest_cre_l) {
+        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);
         }
         else {
-          lineart_chain_connect(rb, rlc, closest_cre->rlc, 0, 1);
+          lineart_chain_connect(rb, rlc, closest_cre_l->rlc, 0, 1);
         }
-        BLI_remlink(&swap, closest_cre->rlc);
+        BLI_remlink(&swap, closest_cre_l->rlc);
       }
       else {
         break;
@@ -756,62 +769,23 @@ void ED_lineart_chain_connect(LineartRenderBuffer *rb, const int do_geometry_spa
 
     rlci = rlc->chain.first;
     while (rlci && ((ba = lineart_bounding_area_get_end_point(rb, rlci)) != NULL)) {
-      closest_cre = NULL;
+      closest_cre_r = NULL;
       if (ba->linked_chains.first == NULL) {
         break;
       }
-      for (cre = ba->linked_chains.first; cre; cre = next_cre) {
-        dist = do_geometry_space ? rb->chaining_geometry_threshold : rb->chaining_image_threshold;
-        next_cre = cre->next;
-        if (cre->rlc->object_ref != rlc->object_ref) {
-          if (rb->fuzzy_everything || rb->fuzzy_intersections) {
-            /* if both have object_ref, then none is intersection line. */
-            if (cre->rlc->object_ref && rlc->object_ref) {
-              continue; /* We don't want to chain along different objects at the moment. */
-            }
-          }
-          else {
-            continue;
-          }
-        }
-        if (cre->rlc->picked) {
-          BLI_remlink(&ba->linked_chains, cre);
-          continue;
-        }
-        if (cre->rlc == rlc || (!cre->rlc->chain.first) || (cre->rlc->level != occlusion)) {
-          continue;
-        }
-        if (!rb->fuzzy_everything) {
-          if (cre->rlc->type != rlc->type) {
-            if (rb->fuzzy_intersections) {
-              if (!(cre->rlc->type == LRT_EDGE_FLAG_INTERSECTION ||
-                    rlc->type == LRT_EDGE_FLAG_INTERSECTION)) {
-                continue; /* fuzzy intersetions but no intersection line found. */
-              }
-            }
-            else { /* line type different but no fuzzy */
-              continue;
-            }
-          }
-        }
-        float new_len = do_geometry_space ? len_v3v3(cre->rlci->gpos, rlci->gpos) :
-                                            len_v2v2(cre->rlci->pos, rlci->pos);
-        if (new_len < dist) {
-          closest_cre = cre;
-          dist = new_len;
-        }
-      }
-      if (closest_cre) {
-        closest_cre->picked = 1;
-        closest_cre->rlc->picked = 1;
-        BLI_remlink(&ba->linked_chains, cre);
-        if (closest_cre->is_left) {
-          lineart_chain_connect(rb, rlc, closest_cre->rlc, 1, 0);
+      closest_cre_r = lineart_chain_get_closest_cre(
+          rb, ba, rlc, rlci, occlusion, dist, do_geometry_space);
+      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->rlc, 1, 1);
+          lineart_chain_connect(rb, rlc, closest_cre_r->rlc, 1, 1);
         }
-        BLI_remlink(&swap, closest_cre->rlc);
+        BLI_remlink(&swap, closest_cre_r->rlc);
       }
       else {
         break;



More information about the Bf-blender-cvs mailing list