From 5ff7511a148bcfcd42c579f5c8e80306376c97d7 Mon Sep 17 00:00:00 2001
From: Alessandro Ranellucci <aar@cpan.org>
Date: Fri, 18 Mar 2016 22:19:49 +0100
Subject: [PATCH] Fixed regression in bridging caused by error in porting.
 Includes regression test. #3175

---
 lib/Slic3r/Test.pm               |  7 +++++++
 t/bridges.t                      | 28 +++++++++++++++++++++++++++-
 xs/src/libslic3r/LayerRegion.cpp | 12 +++++++-----
 3 files changed, 41 insertions(+), 6 deletions(-)

diff --git a/lib/Slic3r/Test.pm b/lib/Slic3r/Test.pm
index 2889f7969..1d8431b14 100644
--- a/lib/Slic3r/Test.pm
+++ b/lib/Slic3r/Test.pm
@@ -118,6 +118,13 @@ sub mesh {
         $facets = [
             [0,1,2],[3,4,5],[2,1,4],[2,4,3],[2,3,5],[2,5,0],[5,4,1],[5,1,0]
         ];
+    } elsif ($name eq 'bridge') {
+        $vertices = [
+            [75,84.5,8],[125,84.5,8],[75,94.5,8],[120,84.5,5],[125,94.5,8],[75,84.5,0],[80,84.5,5],[125,84.5,0],[125,94.5,0],[80,94.5,5],[75,94.5,0],[120,94.5,5],[120,84.5,0],[80,94.5,0],[80,84.5,0],[120,94.5,0]
+        ];
+        $facets = [
+            [0,1,2],[1,0,3],[2,1,4],[2,5,0],[0,6,3],[1,3,7],[1,8,4],[4,9,2],[10,5,2],[5,6,0],[6,11,3],[3,12,7],[7,8,1],[4,8,11],[4,11,9],[9,10,2],[10,13,5],[14,6,5],[9,11,6],[11,12,3],[12,8,7],[11,8,15],[13,10,9],[5,13,14],[14,13,6],[6,13,9],[15,12,11],[15,8,12]
+        ];
     } else {
         return undef;
     }
diff --git a/t/bridges.t b/t/bridges.t
index c7428a195..432d5e7a9 100644
--- a/t/bridges.t
+++ b/t/bridges.t
@@ -1,4 +1,4 @@
-use Test::More tests => 14;
+use Test::More tests => 16;
 use strict;
 use warnings;
 
@@ -107,4 +107,30 @@ sub check_angle {
     return defined $result && $result>=0 && abs($delta) < $tolerance;
 }
 
+{
+    my $config = Slic3r::Config->new_from_defaults;
+    $config->set('top_solid_layers', 0);            # to prevent bridging on sparse infill
+    $config->set('bridge_speed', 99);
+    
+    my $print = Slic3r::Test::init_print('bridge', config => $config);
+    
+    my %extrusions = ();  # angle => length
+    Slic3r::GCode::Reader->new->parse(Slic3r::Test::gcode($print), sub {
+        my ($self, $cmd, $args, $info) = @_;
+        
+        if ($cmd eq 'G1' && ($args->{F} // $self->F)/60 == $config->bridge_speed) {
+            my $line = Slic3r::Line->new_scale(
+                [ $self->X, $self->Y ],
+                [ $info->{new_X}, $info->{new_Y} ],
+            );
+            my $angle = $line->direction;
+            $extrusions{$angle} //= 0;
+            $extrusions{$angle} += $line->length;
+        }
+    });
+    ok !!%extrusions, "bridge is generated";
+    my ($main_angle) = sort { $extrusions{$b} <=> $extrusions{$a} } keys %extrusions;
+    is $main_angle, 0, "bridge has the expected direction";
+}
+
 __END__
diff --git a/xs/src/libslic3r/LayerRegion.cpp b/xs/src/libslic3r/LayerRegion.cpp
index a2683fa03..f459c5878 100644
--- a/xs/src/libslic3r/LayerRegion.cpp
+++ b/xs/src/libslic3r/LayerRegion.cpp
@@ -115,12 +115,14 @@ LayerRegion::process_external_surfaces(const Layer* lower_layer)
             printf("Processing bridge at layer %zu:\n", this->layer()->id();
             #endif
             
-            if (bd.detect_angle() && this->layer()->object()->config.support_material) {
+            if (bd.detect_angle()) {
                 angle = bd.angle;
-                
-                Polygons coverage = bd.coverage();
-                this->bridged.insert(this->bridged.end(), coverage.begin(), coverage.end());
-                this->unsupported_bridge_edges.append(bd.unsupported_edges()); 
+            
+                if (this->layer()->object()->config.support_material) {
+                    Polygons coverage = bd.coverage();
+                    this->bridged.insert(this->bridged.end(), coverage.begin(), coverage.end());
+                    this->unsupported_bridge_edges.append(bd.unsupported_edges()); 
+                }
             }
         }