From 6f1d1f6af77b2c452c170d59130020599428bd5d Mon Sep 17 00:00:00 2001 From: Alessandro Ranellucci Date: Sun, 10 Jul 2016 13:38:33 +0200 Subject: [PATCH] Some cleanup and further optimization to 5f521b24c42ed657967b919871900fa6a65ba790. #3293 --- lib/Slic3r/Print/GCode.pm | 21 +++++++++------------ xs/src/libslic3r/BoundingBox.cpp | 9 +++++++++ xs/src/libslic3r/BoundingBox.hpp | 1 + xs/xsp/BoundingBox.xsp | 2 ++ 4 files changed, 21 insertions(+), 12 deletions(-) diff --git a/lib/Slic3r/Print/GCode.pm b/lib/Slic3r/Print/GCode.pm index 02b9d4d74..3c32875ed 100644 --- a/lib/Slic3r/Print/GCode.pm +++ b/lib/Slic3r/Print/GCode.pm @@ -490,21 +490,18 @@ sub process_layer { # group extrusions by extruder and then by island my %by_extruder = (); # extruder_id => [ { perimeters => \@perimeters, infill => \@infill } ] - - my $n_slices = $#{$layer->slices}; - my @layer_surface_bboxes = (); - for my $i (0 .. $n_slices) { - push @layer_surface_bboxes, $layer->slices->[$i]->contour->bounding_box; - } + + # cache bounding boxes of layer slices + my @layer_slices_bb = map $_->contour->bounding_box, @{$layer->slices}; my $point_inside_surface = sub { my ($i, $point) = @_; - my $bbox = $layer_surface_bboxes[$i]; - return - $point->x >= $bbox->x_min && $point->x < $bbox->x_max && - $point->y >= $bbox->y_min && $point->y < $bbox->y_max && - $layer->slices->[$i]->contour->contains_point($point); + + my $bbox = $layer_slices_bb[$i]; + return $layer_slices_bb[$i]->contains_point($point) + && $layer->slices->[$i]->contour->contains_point($point); }; - + + my $n_slices = $layer->slices->count - 1; foreach my $region_id (0..($self->print->region_count-1)) { my $layerm = $layer->regions->[$region_id] or next; my $region = $self->print->get_region($region_id); diff --git a/xs/src/libslic3r/BoundingBox.cpp b/xs/src/libslic3r/BoundingBox.cpp index 1116d2dcb..3ec2258a9 100644 --- a/xs/src/libslic3r/BoundingBox.cpp +++ b/xs/src/libslic3r/BoundingBox.cpp @@ -219,4 +219,13 @@ BoundingBox3Base::center() const } template Pointf3 BoundingBox3Base::center() const; +template bool +BoundingBoxBase::contains(const PointClass &point) const +{ + return point.x >= this->min.x && point.x <= this->max.x + && point.y >= this->min.y && point.y <= this->max.y; +} +template bool BoundingBoxBase::contains(const Point &point) const; +template bool BoundingBoxBase::contains(const Pointf &point) const; + } diff --git a/xs/src/libslic3r/BoundingBox.hpp b/xs/src/libslic3r/BoundingBox.hpp index 533a19b56..3fd6008a5 100644 --- a/xs/src/libslic3r/BoundingBox.hpp +++ b/xs/src/libslic3r/BoundingBox.hpp @@ -30,6 +30,7 @@ class BoundingBoxBase void translate(coordf_t x, coordf_t y); void offset(coordf_t delta); PointClass center() const; + bool contains(const PointClass &point) const; }; template diff --git a/xs/xsp/BoundingBox.xsp b/xs/xsp/BoundingBox.xsp index db424ff29..9da9173aa 100644 --- a/xs/xsp/BoundingBox.xsp +++ b/xs/xsp/BoundingBox.xsp @@ -16,6 +16,7 @@ void scale(double factor); void translate(double x, double y); void offset(double delta); + bool contains_point(Point* point) %code{% RETVAL = THIS->contains(*point); %}; Clone polygon(); Clone size(); Clone center(); @@ -49,6 +50,7 @@ new_from_points(CLASS, points) void merge_point(Pointf* point) %code{% THIS->merge(*point); %}; void scale(double factor); void translate(double x, double y); + bool contains_point(Pointf* point) %code{% RETVAL = THIS->contains(*point); %}; Clone size(); Clone center(); Clone min_point() %code{% RETVAL = THIS->min; %};