From db266cde9f6d85b3e8f4e12d91211fc3840086da Mon Sep 17 00:00:00 2001 From: Alessandro Ranellucci Date: Sat, 22 Jun 2013 20:32:39 +0200 Subject: [PATCH] Little optimizations in slicing --- lib/Slic3r/TriangleMesh.pm | 10 +++++----- t/slice.t | 14 ++++++++------ 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/lib/Slic3r/TriangleMesh.pm b/lib/Slic3r/TriangleMesh.pm index 6e9054716..755816b6a 100644 --- a/lib/Slic3r/TriangleMesh.pm +++ b/lib/Slic3r/TriangleMesh.pm @@ -459,10 +459,9 @@ sub intersect_facet { my @edge_ids = @{$self->facets_edges->[$facet_id]}; my @edge_vertices_ids = $self->_facet_edges($facet_id); - my (@lines, @points, @intersection_points, @points_on_layer) = (); + my (@points, @intersection_points, @points_on_layer) = (); for my $e (0..2) { - my $edge_id = $edge_ids[$e]; my ($a_id, $b_id) = @{$edge_vertices_ids[$e]}; my ($a, $b) = @vertices{$a_id, $b_id}; #printf "Az = %f, Bz = %f, z = %f\n", $a->[Z], $b->[Z], $z; @@ -474,7 +473,9 @@ sub intersect_facet { ($a, $b) = ($b, $a); ($a_id, $b_id) = ($b_id, $a_id); } - push @lines, pack I_FMT, ( + # We assume that this method is never being called for horizontal + # facets, so no other edge is going to be on this layer. + return pack I_FMT, ( $b->[X], $b->[Y], # I_B $a_id, # I_A_ID $b_id, # I_B_ID @@ -504,14 +505,13 @@ sub intersect_facet { $b->[X] + ($a->[X] - $b->[X]) * ($z - $b->[Z]) / ($a->[Z] - $b->[Z]), $b->[Y] + ($a->[Y] - $b->[Y]) * ($z - $b->[Z]) / ($a->[Z] - $b->[Z]), undef, - $edge_id, + $edge_ids[$e], ]; push @intersection_points, $#points; #print "Intersects at $z!\n"; } } - return @lines if @lines; if (@points_on_layer == 2 && @intersection_points == 1) { $points[ $points_on_layer[1] ] = undef; @points = grep $_, @points; diff --git a/t/slice.t b/t/slice.t index e47929f0f..8032924fb 100644 --- a/t/slice.t +++ b/t/slice.t @@ -2,7 +2,7 @@ use Test::More; use strict; use warnings; -plan tests => 17; +plan tests => 16; BEGIN { use FindBin; @@ -20,11 +20,13 @@ my @points = ([3, 4], [8, 5], [1, 9]); # XY coordinates of the facet vertices # the first point of the intersection lines is replaced by -1 because TriangleMesh.pm # is saving memory and doesn't store point A anymore since it's not actually needed. -is_deeply lines(20, 20, 20), [ - [ -1, $points[1] ], # $points[0] - [ -1, $points[2] ], # $points[1] - [ -1, $points[0] ], # $points[2] -], 'horizontal'; +# We disable this test because intersect_facet() now assumes we never feed a horizontal +# facet to it. +# is_deeply lines(20, 20, 20), [ +# [ -1, $points[1] ], # $points[0] +# [ -1, $points[2] ], # $points[1] +# [ -1, $points[0] ], # $points[2] +# ], 'horizontal'; is_deeply lines(22, 20, 20), [ [ -1, $points[2] ] ], 'lower edge on layer'; # $points[1] is_deeply lines(20, 20, 22), [ [ -1, $points[1] ] ], 'lower edge on layer'; # $points[0]