From b0dd328fdec094cd072ece2cbfff87dcf07d51c2 Mon Sep 17 00:00:00 2001
From: Lukas Matena <lukasmatena@seznam.cz>
Date: Mon, 20 Aug 2018 11:27:25 +0200
Subject: [PATCH] Lay flat - icons and invalidation improvement

---
 lib/Slic3r/GUI/Plater.pm                  |   2 +-
 resources/icons/overlay/layflat_hover.png | Bin 0 -> 2410 bytes
 resources/icons/overlay/layflat_off.png   | Bin 0 -> 2864 bytes
 resources/icons/overlay/layflat_on.png    | Bin 0 -> 3816 bytes
 xs/src/libslic3r/TriangleMesh.cpp         |   5 +++++
 xs/src/libslic3r/TriangleMesh.hpp         |   1 +
 xs/src/slic3r/GUI/GLGizmo.cpp             |  23 ++++++++++++++--------
 xs/src/slic3r/GUI/GLGizmo.hpp             |   1 +
 8 files changed, 23 insertions(+), 9 deletions(-)
 create mode 100644 resources/icons/overlay/layflat_hover.png
 create mode 100644 resources/icons/overlay/layflat_off.png
 create mode 100644 resources/icons/overlay/layflat_on.png

diff --git a/lib/Slic3r/GUI/Plater.pm b/lib/Slic3r/GUI/Plater.pm
index 8ab749e24..98f31fb8b 100644
--- a/lib/Slic3r/GUI/Plater.pm
+++ b/lib/Slic3r/GUI/Plater.pm
@@ -143,7 +143,7 @@ sub new {
     my $on_gizmo_rotate = sub {
         my ($angle_z, $angle_y) = @_;
         $self->rotate(rad2deg($angle_z), Z, 'absolute');
-        $self->rotate(rad2deg($angle_y), Y, 'absolute');
+        $self->rotate(rad2deg($angle_y), Y, 'absolute') if $angle_y != 0;
     };
 
     # callback to update object's geometry info while using gizmos
diff --git a/resources/icons/overlay/layflat_hover.png b/resources/icons/overlay/layflat_hover.png
new file mode 100644
index 0000000000000000000000000000000000000000..afce81d19ee2a26916a1e7684f1bef13e42e486c
GIT binary patch
literal 2410
zcmV-w36=JVP)<h;3K|Lk000e1NJLTq002M$002M;1ONa40ARUQ00004XF*Lt006O%
z3;baP0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F}00002
zVoOIv0RM-N%)bBt010qNS#tmYE+YT{E+YYWr9XB6000McNliru;s_BDBn{m#KTZGu
z2wh1;K~!koz1i<`TxAsp@Xx)w*`%8^Buzrv6bellHUy|hX~iFrDhL#b&M3?{1Ecst
zLB#Qe<6q&7zHpS0869WT8Aq!{iq%3H8Y~5E(;v2_?b0@-r3q=;w9Stu&1U!dBHLsW
z(`J)(Jo{p2?!D(Z-*e9MoO7OY0!2_e1Y%;!q^!}R*{vEaR*7MQ&N}0S13IIl!I-S9
zh|NW;9TX*;P@VPGyH}${5)#V9ghJ%xWMyPrF``$e4%?lVV{Q=fB0yHS+gE%>Q?w+i
zj>4n{b&`@QRbnvQ7xu)n<@v8yXt6=J9scZq(UL6CPMP~W=~L0lsG&T#(F(U{QYWcQ
zT$#8)*6-{zJbkH1pA+7((Jq<I3j@$ji*_4w_o%JWqSbQs>MRy3kTa^&X2*=pw$ugt
z{LQNlUmHSj4bfD1&=a|bgQi+3cWQNu@)_S{b$i=Rr;T4*lWwouXq(a5_rolFj}uxN
zJQjUB`>~qDDyw~5vrr_OWC$?iuy^b<JeMak_WOk`K9bu!H-L6xR(Lx4ZmhA+TAz2D
zP$VZ32m}a>>(yzS6Zt1|Qm>!+ty8iyA;e}8-|RWxuUN8DyGJcYBoa;P9=I&+Z?-rq
zEKWRC)(V|)DHWx!4WOOCDnIaSd2+R<td*1#6__d}=b{dO(0M(-&qfJrBpq=fr4T{^
zfOc5vInS1tuknm#;Y2K%^j2tGmp^$;-+V-0rMSCgz3*Zngh>GH(Bv84uSnkSY0CuD
z#D^HQ)$biNnzzaVAgngzeS=dF3L{~;4bk%zRrmOsrPIVu=ziSa?bk0mKhsaAD&NuV
zw^I=^Z-EWsq7BgxVyWAF-3md$rVE9JykVn51}2}E0HMig>8mz~Uo}Lo#aDA{mV3-9
z3N~ISqsyE2=vGATDu(X$gkz2rSfHJlXL3)~RJVCV*`$X9p?*94)o$nH1O=g}1PV0j
z_pekgJ!JvwJQ{0i@qlFB_kqBe54`Jbr^F<+YLIqj_NYHUTINx2+nKjOJ8>^$zu2_s
zA#3y6hXVaNZLz~Sae+GD@>!KWFz~-{M6D5TrgG`L1@7|cu=Xx%CUws^Ylm&Rg<>Yk
zp&L|c)8&#uVW|LWe9GPS5^E>$LhhmZst2q#;o(7P8@=h`WT=gdOIWE&onAeqp9RW|
zMB8tV;sUkWG`6}OWcAx_tMk*&d*F)Kta7hgt=BKTP_a{Vqc*krLop9%N@{frMjY~z
zjrwF~d><L~XJ@d^XVfk<78X)d&=!QTRNQm9`|qr1)99?N{^*1&vwj~Lz|E@F8ImsD
z387)H$0gjSIwA6Jf4ASzb#%+<aI^Jpbib1hmbw+Itx+CJt@h1e$*?Ya95FP9URPXn
zlVxfp95YfHfIvn^EcGQ1sT$R%-}sz51ulwPrcRYnM@s|16-PsNE0-^}it%dJF8?&7
zUYmPL1(47ZYL=J}Pw2cI_6e-;n1<4}VnTChc~Q5c0*dR>p-Z_|pH)!`fHEsW^)n08
zxhZncHY2J$qG|r@QxsDls-FL83Jln17ixV{a^XQKP!+0N$Z-yJ+ipnQIyWqQAB2(%
zj3t4L9!CWl)rpr7m_x(Uir;zAsE<VAsusQraxRAk778G11cCU%T@V=xo%^rEHxK?2
zDeGM5jPZr?2c?3@I2Af>tW-r7Ok+-j4qPMs|9=1+3GJC*R*kOnCO2P)jOYv<);phb
zkhsR7izGFup3jNM>2)-e(P^Mqo?5L|shZ`@BKLX9=jM}~2JA5wm(^i|nqoKtkNSeF
zSG{3y+M6<;_qdxJcF6H!0rcB08%EivLr<|hWy&=AvUb&z&$1#9ddyA6^yx3&0^PRD
zh9c+uqqvqw<aN6YtGB_ED)WtstTvCh*|>lCqf5n#@3X^sQ7kPLx#WH~6~i^`v<gez
zpkAFy%_4E@+$?6dmmM$u931dtXEuwGqECy~;`YxaJz|!s)u=&IsLm2`yS(B^@!gY)
zUhzBGv>0iroI!V3Sqx|3qF#}uY9s{$38B4Sad19;vv>T=$<6W&iWJ@I-DPnxyrGLe
zlCxB0{>dRPJ7BE%%BII}Y!s!h0!T|m&Rb@6aVmrc^oT5zM3+C=Z?t&vIh*`S-$c(e
zAJ$Twmvy`4#jOz<_MxmQeKy%+WIlCWrx)#%zhUPAq@_3|;}cV1?)p7|(3oT1v(wQz
zn>N!{>h&X=rh3MOcY;w{H2L9G2o)9=G^}Q~<&Z$#b;SoV2BtFpke}O9n12g+^R3$F
zeNQ=&hdpS?!mE`@4bR%@tqDO_{M65N6;2KcEU;NSC%vTFHzpt~wsfHd<0OSfuGV~4
z{Mt)SP9I!M%dKfCE;%f+I!K(=qe6qS{ET4w@4rnw^A`$?_@_+{8fVyxe(J=`p~Z~k
zo)64vgIY(c&N=CV8a3CrIY*N}lP%0C0FmSVYO51Q1-*Xamrl+(uqc3VI%pbixDY$z
zi~$MN!Wp_>6>V~kV)A{)aUHhV?W|lT*y~6B;KSKQHnWsBX{pGd_nZ#0!Hpw}dz{jv
z&$tSSX)c&(WQY0xiRW4U4%?x_ySj`DyMw=Y(aSD~iX2*9rFQP{xDD>f)lzMhW=$F_
zQLS>u1TAvKkW0?%^P%HTx{Pq4W4i(f6NAf7YK|Im0gElQT%&q568Y_!lQHIkJ|Fqe
zS;Im>6!ht`v!uc0B#4R8ZJTA5sE)!&ByQ0R0HekyoRBl<ydH1a<bcut#q4<0E}iPF
z_keqY#$b^|l(-zf923i5j<RybV`KT@^<LX;cdob)QdIVvHokAkkMCEgQ!R<h23*kN
zxC3@OA~T=y{eJ*HdE+VDENh<t001R)MObuXVRU6WV{&C-bY%cCFflkSFgPtSH&ih>
zIx;yrH90FVGCD9Yc~-5}0000bbVXQnWMOn=I&E)cX=Zr<GB7bXEigDOF*j5(IXW^q
cIxsLRFfuwYFx7Kj-T(jq07*qoM6N<$f>Eh@wEzGB

literal 0
HcmV?d00001

diff --git a/resources/icons/overlay/layflat_off.png b/resources/icons/overlay/layflat_off.png
new file mode 100644
index 0000000000000000000000000000000000000000..70d198112910a86d34a96bd7e536bfd79a75ae5c
GIT binary patch
literal 2864
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
O0000<MNUMnLSTX*(kPw)

literal 0
HcmV?d00001

diff --git a/resources/icons/overlay/layflat_on.png b/resources/icons/overlay/layflat_on.png
new file mode 100644
index 0000000000000000000000000000000000000000..3c1891b3c44ce879dbe29bcb58b5f747b1e75113
GIT binary patch
literal 3816
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

literal 0
HcmV?d00001

diff --git a/xs/src/libslic3r/TriangleMesh.cpp b/xs/src/libslic3r/TriangleMesh.cpp
index 19dcc6a07..008679e6c 100644
--- a/xs/src/libslic3r/TriangleMesh.cpp
+++ b/xs/src/libslic3r/TriangleMesh.cpp
@@ -732,6 +732,11 @@ TriangleMesh TriangleMesh::convex_hull_3d() const
     return output_mesh;
 }
 
+const float* TriangleMesh::first_vertex() const
+{
+    return stl.facet_start ? &stl.facet_start->vertex[0].x : nullptr;
+}
+
 void
 TriangleMesh::require_shared_vertices()
 {
diff --git a/xs/src/libslic3r/TriangleMesh.hpp b/xs/src/libslic3r/TriangleMesh.hpp
index 6ab52efe2..be151f062 100644
--- a/xs/src/libslic3r/TriangleMesh.hpp
+++ b/xs/src/libslic3r/TriangleMesh.hpp
@@ -53,6 +53,7 @@ public:
     TriangleMeshPtrs split() const;
     void merge(const TriangleMesh &mesh);
     ExPolygons horizontal_projection() const;
+    const float* first_vertex() const;
     Polygon convex_hull();
     BoundingBoxf3 bounding_box() const;
     // Returns the bbox of this TriangleMesh transformed by the given matrix
diff --git a/xs/src/slic3r/GUI/GLGizmo.cpp b/xs/src/slic3r/GUI/GLGizmo.cpp
index f0a8f2e71..2b91afe41 100644
--- a/xs/src/slic3r/GUI/GLGizmo.cpp
+++ b/xs/src/slic3r/GUI/GLGizmo.cpp
@@ -515,15 +515,15 @@ bool GLGizmoFlatten::on_init()
 {
     std::string path = resources_dir() + "/icons/overlay/";
 
-    std::string filename = path + "scale_off.png";
+    std::string filename = path + "layflat_off.png";
     if (!m_textures[Off].load_from_file(filename, false))
         return false;
 
-    filename = path + "scale_hover.png";
+    filename = path + "layflat_hover.png";
     if (!m_textures[Hover].load_from_file(filename, false))
         return false;
 
-    filename = path + "scale_on.png";
+    filename = path + "layflat_on.png";
     if (!m_textures[On].load_from_file(filename, false))
         return false;
 
@@ -591,12 +591,12 @@ void GLGizmoFlatten::on_render_for_picking(const BoundingBoxf3& box) const
 
 
 // TODO - remove and use Eigen instead
-static Pointf3 super_rotation(const Pointf3& axis, float angle, const Pointf3& point)
+static Pointf3 super_rotation(Pointf3 axis, float angle, const Pointf3& point)
 {
-    float axis_length = axis.distance_to(Pointf3(0.f, 0.f, 0.f));
-    float x = axis.x / axis_length;
-    float y = axis.y / axis_length;
-    float z = axis.z / axis_length;
+    axis = normalize(axis);
+    const float& x = axis.x;
+    const float& y = axis.y;
+    const float& z = axis.z;
     float s = sin(angle);
     float c = cos(angle);
     float D = 1-c;
@@ -774,6 +774,8 @@ void GLGizmoFlatten::update_planes()
         m_source_data.bounding_boxes.push_back(vol->get_convex_hull().bounding_box());
     m_source_data.scaling_factor = m_model_object->instances.front()->scaling_factor;
     m_source_data.rotation = m_model_object->instances.front()->rotation;
+    const float* first_vertex = m_model_object->volumes.front()->get_convex_hull().first_vertex();
+    m_source_data.mesh_first_point = Pointf3(first_vertex[0], first_vertex[1], first_vertex[3]);
 }
 
 // Check if the bounding boxes of each volume's convex hull is the same as before
@@ -793,6 +795,11 @@ bool GLGizmoFlatten::is_plane_update_necessary() const
         if (m_model_object->volumes[i]->get_convex_hull().bounding_box() != m_source_data.bounding_boxes[i])
             return true;
 
+    const float* first_vertex = m_model_object->volumes.front()->get_convex_hull().first_vertex();
+    Pointf3 first_point(first_vertex[0], first_vertex[1], first_vertex[2]);
+    if (first_point != m_source_data.mesh_first_point)
+        return true;
+
     return false;
 }
 
diff --git a/xs/src/slic3r/GUI/GLGizmo.hpp b/xs/src/slic3r/GUI/GLGizmo.hpp
index 0cab603eb..2c82f73f3 100644
--- a/xs/src/slic3r/GUI/GLGizmo.hpp
+++ b/xs/src/slic3r/GUI/GLGizmo.hpp
@@ -166,6 +166,7 @@ private:
         std::vector<BoundingBoxf3> bounding_boxes; // bounding boxes of convex hulls of individual volumes
         float scaling_factor;
         float rotation;
+        Pointf3 mesh_first_point;
     };
 
     // This holds information to decide whether recalculation is necessary: