[Bf-blender-cvs] [b0dda64a953] lanpr-under-gp: LANPR: Fixed crashes during duplicate point removal in chain connecting.

YimingWu noreply at git.blender.org
Mon Jun 8 08:21:02 CEST 2020


Commit: b0dda64a953dbf1454d13a1217b6b1aba42fab9e
Author: YimingWu
Date:   Mon Jun 8 14:20:54 2020 +0800
Branches: lanpr-under-gp
https://developer.blender.org/rBb0dda64a953dbf1454d13a1217b6b1aba42fab9e

LANPR: Fixed crashes during duplicate point removal in chain connecting.

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

M	source/blender/editors/lanpr/lanpr_chain.c

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

diff --git a/source/blender/editors/lanpr/lanpr_chain.c b/source/blender/editors/lanpr/lanpr_chain.c
index 8f9ee9e3db2..bfbd4c8b59e 100644
--- a/source/blender/editors/lanpr/lanpr_chain.c
+++ b/source/blender/editors/lanpr/lanpr_chain.c
@@ -464,6 +464,9 @@ static LANPR_BoundingArea *lanpr_get_rlci_bounding_area_recursive(LANPR_RenderBu
 static LANPR_BoundingArea *lanpr_get_end_point_bounding_area(LANPR_RenderBuffer *rb,
                                                              LANPR_RenderLineChainItem *rlci)
 {
+  if (!rlci) {
+    return NULL;
+  }
   LANPR_BoundingArea *root = ED_lanpr_get_point_bounding_area(rb, rlci->pos[0], rlci->pos[1]);
   if (root == NULL) {
     return NULL;
@@ -582,11 +585,12 @@ void ED_lanpr_split_chains_for_fixed_occlusion(LANPR_RenderBuffer *rb)
 }
 
 /*  note: segment type (crease/material/contour...) is ambiguous after this. */
-static void lanpr_connect_two_chains(LANPR_RenderBuffer *UNUSED(rb),
-                                     LANPR_RenderLineChain *onto,
-                                     LANPR_RenderLineChain *sub,
-                                     int reverse_1,
-                                     int reverse_2)
+static void __attribute__((optimize("O0")))
+lanpr_connect_two_chains(LANPR_RenderBuffer *UNUSED(rb),
+                         LANPR_RenderLineChain *onto,
+                         LANPR_RenderLineChain *sub,
+                         int reverse_1,
+                         int reverse_2)
 {
   LANPR_RenderLineChainItem *rlci;
   if (!reverse_1) {  /*  L--R L-R */
@@ -596,6 +600,9 @@ static void lanpr_connect_two_chains(LANPR_RenderBuffer *UNUSED(rb),
     rlci = sub->chain.first;
     if (lanpr_check_point_overlapping(onto->chain.last, rlci->pos[0], rlci->pos[1], 1e-5)) {
       BLI_pophead(&sub->chain);
+      if (sub->chain.first == NULL) {
+        return;
+      }
     }
     ((LANPR_RenderLineChainItem *)onto->chain.last)->next = sub->chain.first;
     ((LANPR_RenderLineChainItem *)sub->chain.first)->prev = onto->chain.last;
@@ -608,6 +615,9 @@ static void lanpr_connect_two_chains(LANPR_RenderBuffer *UNUSED(rb),
     rlci = onto->chain.first;
     if (lanpr_check_point_overlapping(sub->chain.last, rlci->pos[0], rlci->pos[1], 1e-5)) {
       BLI_pophead(&onto->chain);
+      if (onto->chain.first == NULL) {
+        return;
+      }
     }
     ((LANPR_RenderLineChainItem *)sub->chain.last)->next = onto->chain.first;
     ((LANPR_RenderLineChainItem *)onto->chain.first)->prev = sub->chain.last;
@@ -649,7 +659,7 @@ void ED_lanpr_connect_chains(LANPR_RenderBuffer *rb, const int do_geometry_space
     occlusion = ((LANPR_RenderLineChainItem *)rlc->chain.first)->occlusion;
 
     rlci = rlc->chain.last;
-    while ((ba = lanpr_get_end_point_bounding_area(rb, rlci)) != NULL) {
+    while (rlci && ((ba = lanpr_get_end_point_bounding_area(rb, rlci)) != NULL)) {
       dist = do_geometry_space ? rb->chaining_geometry_threshold : rb->chaining_image_threshold;
       closest_cre = NULL;
       if (ba->linked_chains.first == NULL) {
@@ -660,15 +670,15 @@ void ED_lanpr_connect_chains(LANPR_RenderBuffer *rb, const int do_geometry_space
         if (cre->rlc->object_ref != rlc->object_ref) {
           continue;
         }
-        if (cre->rlc == rlc ||
-            ((LANPR_RenderLineChainItem *)cre->rlc->chain.first)->occlusion != occlusion ||
-            (cre->rlc->type != rlc->type)) {
-          continue;
-        }
         if (cre->rlc->picked) {
           BLI_remlink(&ba->linked_chains, cre);
           continue;
         }
+        if (cre->rlc == rlc || (!cre->rlc->chain.first) ||
+            ((LANPR_RenderLineChainItem *)cre->rlc->chain.first)->occlusion != occlusion ||
+            (cre->rlc->type != rlc->type)) {
+          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) {
@@ -695,7 +705,7 @@ void ED_lanpr_connect_chains(LANPR_RenderBuffer *rb, const int do_geometry_space
     }
 
     rlci = rlc->chain.first;
-    while ((ba = lanpr_get_end_point_bounding_area(rb, rlci)) != NULL) {
+    while (rlci && ((ba = lanpr_get_end_point_bounding_area(rb, rlci)) != NULL)) {
       dist = do_geometry_space ? rb->chaining_geometry_threshold : rb->chaining_image_threshold;
       closest_cre = NULL;
       if (ba->linked_chains.first == NULL) {
@@ -706,15 +716,15 @@ void ED_lanpr_connect_chains(LANPR_RenderBuffer *rb, const int do_geometry_space
         if (cre->rlc->object_ref != rlc->object_ref) {
           continue;
         }
-        if (cre->rlc == rlc ||
-            ((LANPR_RenderLineChainItem *)cre->rlc->chain.first)->occlusion != occlusion ||
-            (cre->rlc->type != rlc->type)) {
-          continue;
-        }
         if (cre->rlc->picked) {
           BLI_remlink(&ba->linked_chains, cre);
           continue;
         }
+        if (cre->rlc == rlc || (!cre->rlc->chain.first) ||
+            ((LANPR_RenderLineChainItem *)cre->rlc->chain.first)->occlusion != occlusion ||
+            (cre->rlc->type != rlc->type)) {
+          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) {



More information about the Bf-blender-cvs mailing list