Browse Source

Fixed regression causing fatal errors with many objects. #394

Alessandro Ranellucci 12 years ago
parent
commit
d8d2f73aff
2 changed files with 16 additions and 12 deletions
  1. 15 11
      lib/Slic3r/TriangleMesh.pm
  2. 1 1
      t/stl.t

+ 15 - 11
lib/Slic3r/TriangleMesh.pm

@@ -136,16 +136,20 @@ sub check_manifoldness {
     }
 }
 
+sub unpack_line {
+    my ($packed) = @_;
+    
+    my @data = unpack I_FMT, $packed;
+    splice @data, 0, 2, [ @data[0,1] ];
+    $data[$_] ||= undef for I_A_ID, I_B_ID, I_PREV_FACET_INDEX, I_NEXT_FACET_INDEX;
+    $data[I_FACET_EDGE] = undef if $data[I_FACET_EDGE] == -1;
+    return [@data];
+}
+
 sub make_loops {
     my ($layer) = @_;
     
-    my @lines = map {
-        my @data = unpack I_FMT, $_;
-        splice @data, 0, 2, [ @data[0,1] ];
-        $data[$_] ||= undef for I_A_ID, I_B_ID;
-        $data[I_FACET_EDGE] = undef if $data[I_FACET_EDGE] == -1;
-        [@data]
-    } @{$layer->lines};
+    my @lines = map unpack_line($_), @{$layer->lines};
     
     # remove tangent edges
     {
@@ -428,8 +432,8 @@ sub intersect_facet {
                 $a_id,                  # I_A_ID
                 $b_id,                  # I_B_ID
                 $facet_id,              # I_FACET_INDEX
-                undef,                  # I_PREV_FACET_INDEX
-                undef,                  # I_NEXT_FACET_INDEX
+                0,                      # I_PREV_FACET_INDEX
+                0,                      # I_NEXT_FACET_INDEX
                 $edge_type,             # I_FACET_EDGE
                 
                 # Unused data:
@@ -488,8 +492,8 @@ sub intersect_facet {
             $points[B][2] || 0,             # I_A_ID
             $points[A][2] || 0,             # I_B_ID
             $facet_id,                      # I_FACET_INDEX
-            $prev_facet_index,              # I_PREV_FACET_INDEX
-            $next_facet_index,              # I_NEXT_FACET_INDEX
+            $prev_facet_index || 0,         # I_PREV_FACET_INDEX
+            $next_facet_index || 0,         # I_NEXT_FACET_INDEX
             -1,                             # I_FACET_EDGE
         );
         #printf "  intersection points at z = %f: %f,%f - %f,%f\n", $z, map @$_, @intersection_points;

+ 1 - 1
t/stl.t

@@ -116,7 +116,7 @@ sub add_facet {
 
 sub intersect {
     add_facet(@_);
-    return $mesh->intersect_facet($#{$mesh->facets}, $z);
+    return map Slic3r::TriangleMesh::unpack_line($_), $mesh->intersect_facet($#{$mesh->facets}, $z);
 }
 
 sub lines {