From 697399d4a28bb7e193bc19ca3f1a8f3af1f72edc Mon Sep 17 00:00:00 2001 From: Marius Kintel Date: Mon, 2 Mar 2015 13:11:34 -0500 Subject: [PATCH 1/6] bugfix: Sometimes, the margin wasn't wide enought to fit the line numbers, improved colors for no syntax highlighting --- src/scintillaeditor.cpp | 28 +++++++++++++--------------- src/scintillaeditor.h | 1 + 2 files changed, 14 insertions(+), 15 deletions(-) diff --git a/src/scintillaeditor.cpp b/src/scintillaeditor.cpp index 3286c99f..ed110952 100644 --- a/src/scintillaeditor.cpp +++ b/src/scintillaeditor.cpp @@ -344,17 +344,15 @@ void ScintillaEditor::noColor() qsci->setIndicatorOutlineColor(QColor(0, 0, 0, 255), indicatorNumber); // only alpha part is used qsci->setCaretLineBackgroundColor(Qt::white); qsci->setWhitespaceForegroundColor(Qt::black); - qsci->setMarginsBackgroundColor(Qt::white); - qsci->setMarginsForegroundColor(Qt::black); - qsci->setSelectionForegroundColor(Qt::white); - qsci->setSelectionBackgroundColor(Qt::black); - qsci->setMatchedBraceBackgroundColor(Qt::white); + qsci->setSelectionForegroundColor(Qt::black); + qsci->setSelectionBackgroundColor(QColor("LightSkyBlue")); + qsci->setMatchedBraceBackgroundColor(QColor("LightBlue")); qsci->setMatchedBraceForegroundColor(Qt::black); - qsci->setUnmatchedBraceBackgroundColor(Qt::white); + qsci->setUnmatchedBraceBackgroundColor(QColor("pink")); qsci->setUnmatchedBraceForegroundColor(Qt::black); - qsci->setMarginsBackgroundColor(Qt::lightGray); - qsci->setMarginsForegroundColor(Qt::black); - qsci->setFoldMarginColors(Qt::lightGray, Qt::lightGray); + qsci->setMarginsBackgroundColor(QColor("whiteSmoke")); + qsci->setMarginsForegroundColor(QColor("gray")); + qsci->setFoldMarginColors(QColor("whiteSmoke"), QColor("whiteSmoke")); qsci->setEdgeColor(Qt::black); } @@ -471,10 +469,10 @@ void ScintillaEditor::zoomOut() void ScintillaEditor::initFont(const QString& fontName, uint size) { - QFont font(fontName, size); - font.setFixedPitch(true); - lexer->setFont(font); - qsci->setMarginsFont(font); + this->currentFont = QFont(fontName, size); + this->currentFont.setFixedPitch(true); + lexer->setFont(this->currentFont); + qsci->setMarginsFont(this->currentFont); onTextChanged(); // Update margin width } @@ -486,8 +484,8 @@ void ScintillaEditor::initMargin() void ScintillaEditor::onTextChanged() { - QFontMetrics fontmetrics = qsci->fontMetrics(); - qsci->setMarginWidth(1, fontmetrics.width(QString::number(qsci->lines())) + 6); + QFontMetrics fontmetrics(this->currentFont); + qsci->setMarginWidth(1, QString(trunc(log10(qsci->lines())+2), '0')); } bool ScintillaEditor::find(const QString &expr, bool findNext, bool findBackwards) diff --git a/src/scintillaeditor.h b/src/scintillaeditor.h index 6d83da6e..c00e7542 100644 --- a/src/scintillaeditor.h +++ b/src/scintillaeditor.h @@ -94,4 +94,5 @@ private: static const int indicatorNumber = 8; // first 8 are used by lexers static const int markerNumber = 2; ScadLexer *lexer; + QFont currentFont; }; From 70ae4acdd0ba497ea4fa288103cd5314ba45e245 Mon Sep 17 00:00:00 2001 From: Marius Kintel Date: Mon, 2 Mar 2015 13:11:53 -0500 Subject: [PATCH 2/6] Improve line number coloring --- color-schemes/editor/dark-background.json | 4 ++-- color-schemes/editor/light-background.json | 4 ++-- color-schemes/editor/monokai.json | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/color-schemes/editor/dark-background.json b/color-schemes/editor/dark-background.json index 2c199fcc..3db0fb02 100644 --- a/color-schemes/editor/dark-background.json +++ b/color-schemes/editor/dark-background.json @@ -23,7 +23,7 @@ "selection-foreground" : "#ffffff", "selection-background" : "#4a90d9", "margin-background" : "#272822", - "margin-foreground" : "#e0e0e0", + "margin-foreground" : "Gray", "matched-brace-background" : "#505050", "matched-brace-foreground" : "#ffffff", "unmatched-brace-background" : "#dc322f", @@ -33,4 +33,4 @@ "error-indicator-outline" : "#ff000000", "edge" : "#ffffff" } -} \ No newline at end of file +} diff --git a/color-schemes/editor/light-background.json b/color-schemes/editor/light-background.json index 2c0ffb30..b7e02aee 100644 --- a/color-schemes/editor/light-background.json +++ b/color-schemes/editor/light-background.json @@ -23,7 +23,7 @@ "selection-foreground" : "#ffffff", "selection-background" : "#4a90d9", "margin-background" : "#f8f8f8", - "margin-foreground" : "#000000", + "margin-foreground" : "Gray", "matched-brace-background" : "#c7f6cb", "matched-brace-foreground" : "Blue", "unmatched-brace-background" : "#ffcdcc", @@ -33,4 +33,4 @@ "error-indicator-outline" : "#ff000000", "edge" : "#ffffff" } -} \ No newline at end of file +} diff --git a/color-schemes/editor/monokai.json b/color-schemes/editor/monokai.json index 8ddac03c..bfd8dc1a 100644 --- a/color-schemes/editor/monokai.json +++ b/color-schemes/editor/monokai.json @@ -23,7 +23,7 @@ "selection-foreground" : "#272822", "selection-background" : "#f8f8f2", "margin-background" : "#3e3d32", - "margin-foreground" : "#f8f8f2", + "margin-foreground" : "DarkGray", "matched-brace-background" : "#606060", "matched-brace-foreground" : "#ffff00", "unmatched-brace-background" : "#b06060", @@ -33,4 +33,4 @@ "error-indicator-outline" : "#ff000000", "edge" : "#ffffff" } -} \ No newline at end of file +} From 4c6cc6aa787ac8cd50a3abd0c025bae49d94e2bf Mon Sep 17 00:00:00 2001 From: Marius Kintel Date: Mon, 2 Mar 2015 14:46:45 -0500 Subject: [PATCH 3/6] Move private clase ZRemover to cc file --- src/cgalutils.cc | 48 +++++++++++++++++++++++++++++++++++++++++++++ src/cgalutils.h | 51 ------------------------------------------------ 2 files changed, 48 insertions(+), 51 deletions(-) diff --git a/src/cgalutils.cc b/src/cgalutils.cc index ed93c1d8..15d880fa 100644 --- a/src/cgalutils.cc +++ b/src/cgalutils.cc @@ -117,6 +117,54 @@ static CGAL_Nef_polyhedron *createNefPolyhedronFromPolygon2d(const Polygon2d &po return createNefPolyhedronFromPolySet(*ps); } +/* + +ZRemover + +This class converts one or more Nef3 polyhedra into a Nef2 polyhedron by +stripping off the 'z' coordinates from the vertices. The resulting Nef2 +poly is accumulated in the 'output_nefpoly2d' member variable. + +The 'z' coordinates will either be all 0s, for an xy-plane intersected Nef3, +or, they will be a mixture of -eps and +eps, for a thin-box intersected Nef3. + +Notes on CGAL's Nef Polyhedron2: + +1. The 'mark' on a 2d Nef face is important when doing unions/intersections. + If the 'mark' of a face is wrong the resulting nef2 poly will be unexpected. +2. The 'mark' can be dependent on the points fed to the Nef2 constructor. + This is why we iterate through the 3d faces using the halfedge cycle + source()->target() instead of the ordinary source()->source(). The + the latter can generate sequences of points that will fail the + the CGAL::is_simple_2() test, resulting in improperly marked nef2 polys. +3. 3d facets have 'two sides'. we throw out the 'down' side to prevent dups. + +The class uses the 'visitor' pattern from the CGAL manual. See also +http://www.cgal.org/Manual/latest/doc_html/cgal_manual/Nef_3/Chapter_main.html +http://www.cgal.org/Manual/latest/doc_html/cgal_manual/Nef_3_ref/Class_Nef_polyhedron3.html +OGL_helper.h +*/ + +class ZRemover { +public: + CGAL_Nef_polyhedron2::Boundary boundary; + boost::shared_ptr tmpnef2d; + boost::shared_ptr output_nefpoly2d; + CGAL::Direction_3 up; + ZRemover() + { + output_nefpoly2d.reset( new CGAL_Nef_polyhedron2() ); + boundary = CGAL_Nef_polyhedron2::INCLUDED; + up = CGAL::Direction_3(0,0,1); + } + void visit( CGAL_Nef_polyhedron3::Vertex_const_handle ) {} + void visit( CGAL_Nef_polyhedron3::Halfedge_const_handle ) {} + void visit( CGAL_Nef_polyhedron3::SHalfedge_const_handle ) {} + void visit( CGAL_Nef_polyhedron3::SHalfloop_const_handle ) {} + void visit( CGAL_Nef_polyhedron3::SFace_const_handle ) {} + void visit( CGAL_Nef_polyhedron3::Halffacet_const_handle hfacet ); +}; + namespace CGALUtils { bool applyHull(const Geometry::ChildList &children, PolySet &result) diff --git a/src/cgalutils.h b/src/cgalutils.h index 4939c9fb..9e09bcb6 100644 --- a/src/cgalutils.h +++ b/src/cgalutils.h @@ -40,54 +40,3 @@ namespace CGALUtils { std::vector &triangles, CGAL::Plane_3 &plane); }; - -#include "svg.h" -#include "printutils.h" - -/* - -ZRemover - -This class converts one or more Nef3 polyhedra into a Nef2 polyhedron by -stripping off the 'z' coordinates from the vertices. The resulting Nef2 -poly is accumulated in the 'output_nefpoly2d' member variable. - -The 'z' coordinates will either be all 0s, for an xy-plane intersected Nef3, -or, they will be a mixture of -eps and +eps, for a thin-box intersected Nef3. - -Notes on CGAL's Nef Polyhedron2: - -1. The 'mark' on a 2d Nef face is important when doing unions/intersections. - If the 'mark' of a face is wrong the resulting nef2 poly will be unexpected. -2. The 'mark' can be dependent on the points fed to the Nef2 constructor. - This is why we iterate through the 3d faces using the halfedge cycle - source()->target() instead of the ordinary source()->source(). The - the latter can generate sequences of points that will fail the - the CGAL::is_simple_2() test, resulting in improperly marked nef2 polys. -3. 3d facets have 'two sides'. we throw out the 'down' side to prevent dups. - -The class uses the 'visitor' pattern from the CGAL manual. See also -http://www.cgal.org/Manual/latest/doc_html/cgal_manual/Nef_3/Chapter_main.html -http://www.cgal.org/Manual/latest/doc_html/cgal_manual/Nef_3_ref/Class_Nef_polyhedron3.html -OGL_helper.h -*/ - -class ZRemover { -public: - CGAL_Nef_polyhedron2::Boundary boundary; - boost::shared_ptr tmpnef2d; - boost::shared_ptr output_nefpoly2d; - CGAL::Direction_3 up; - ZRemover() - { - output_nefpoly2d.reset( new CGAL_Nef_polyhedron2() ); - boundary = CGAL_Nef_polyhedron2::INCLUDED; - up = CGAL::Direction_3(0,0,1); - } - void visit( CGAL_Nef_polyhedron3::Vertex_const_handle ) {} - void visit( CGAL_Nef_polyhedron3::Halfedge_const_handle ) {} - void visit( CGAL_Nef_polyhedron3::SHalfedge_const_handle ) {} - void visit( CGAL_Nef_polyhedron3::SHalfloop_const_handle ) {} - void visit( CGAL_Nef_polyhedron3::SFace_const_handle ) {} - void visit( CGAL_Nef_polyhedron3::Halffacet_const_handle hfacet ); -}; From 43c500f0b8e79a225a2fbdf4397850e324feda17 Mon Sep 17 00:00:00 2001 From: Marius Kintel Date: Mon, 2 Mar 2015 14:47:28 -0500 Subject: [PATCH 4/6] Refactor: Moved _DxfData contents to main cc file as it's no longer related to dxfdata --- openscad.pro | 1 - src/CGAL_Nef_polyhedron.cc | 24 ++++++++++++ src/CGAL_Nef_polyhedron_DxfData.cc | 62 ------------------------------ tests/CMakeLists.txt | 1 - 4 files changed, 24 insertions(+), 64 deletions(-) delete mode 100644 src/CGAL_Nef_polyhedron_DxfData.cc diff --git a/openscad.pro b/openscad.pro index a2eefe65..3f7f9793 100644 --- a/openscad.pro +++ b/openscad.pro @@ -498,7 +498,6 @@ SOURCES += src/cgalutils.cc \ src/CGALCache.cc \ src/CGALRenderer.cc \ src/CGAL_Nef_polyhedron.cc \ - src/CGAL_Nef_polyhedron_DxfData.cc \ src/cgalworker.cc \ src/Polygon2d-CGAL.cc } diff --git a/src/CGAL_Nef_polyhedron.cc b/src/CGAL_Nef_polyhedron.cc index d49521e0..a470e191 100644 --- a/src/CGAL_Nef_polyhedron.cc +++ b/src/CGAL_Nef_polyhedron.cc @@ -3,6 +3,7 @@ #include "cgalutils.h" #include "printutils.h" #include "polyset.h" +#include "svg.h" CGAL_Nef_polyhedron::CGAL_Nef_polyhedron(CGAL_Nef_polyhedron3 *p) { @@ -135,3 +136,26 @@ void CGAL_Nef_polyhedron::resize(Vector3d newsize, this->transform(Transform3d(t)); } + +std::string CGAL_Nef_polyhedron::dump() const +{ + return OpenSCAD::dump_svg( *this->p3 ); +} + + +void CGAL_Nef_polyhedron::transform( const Transform3d &matrix ) +{ + if (!this->isEmpty()) { + if (matrix.matrix().determinant() == 0) { + PRINT("WARNING: Scaling a 3D object with 0 - removing object"); + this->reset(); + } + else { + CGAL_Aff_transformation t( + matrix(0,0), matrix(0,1), matrix(0,2), matrix(0,3), + matrix(1,0), matrix(1,1), matrix(1,2), matrix(1,3), + matrix(2,0), matrix(2,1), matrix(2,2), matrix(2,3), matrix(3,3)); + this->p3->transform(t); + } + } +} diff --git a/src/CGAL_Nef_polyhedron_DxfData.cc b/src/CGAL_Nef_polyhedron_DxfData.cc deleted file mode 100644 index cbb5ce77..00000000 --- a/src/CGAL_Nef_polyhedron_DxfData.cc +++ /dev/null @@ -1,62 +0,0 @@ -/* - * OpenSCAD (www.openscad.org) - * Copyright (C) 2009-2011 Clifford Wolf and - * Marius Kintel - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * As a special exception, you have permission to link this program - * with the CGAL library and distribute executables, as long as you - * follow the requirements of the GNU GPL in regard to all of the - * software in the executable aside from CGAL. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - */ - -#include "dxfdata.h" -#include "Polygon2d.h" -#include "grid.h" -#include "CGAL_Nef_polyhedron.h" -#include "cgal.h" -#include "cgalutils.h" -#include -#include "polyset.h" -#include "Tree.h" - -#ifdef ENABLE_CGAL - -std::string CGAL_Nef_polyhedron::dump() const -{ - return OpenSCAD::dump_svg( *this->p3 ); -} - - -void CGAL_Nef_polyhedron::transform( const Transform3d &matrix ) -{ - if (!this->isEmpty()) { - if (matrix.matrix().determinant() == 0) { - PRINT("WARNING: Scaling a 3D object with 0 - removing object"); - this->reset(); - } - else { - CGAL_Aff_transformation t( - matrix(0,0), matrix(0,1), matrix(0,2), matrix(0,3), - matrix(1,0), matrix(1,1), matrix(1,2), matrix(1,3), - matrix(2,0), matrix(2,1), matrix(2,2), matrix(2,3), matrix(3,3)); - this->p3->transform(t); - } - } -} - -#endif // ENABLE_CGAL diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 2448473f..2c4aa776 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -694,7 +694,6 @@ set(CGAL_SOURCES ../src/cgalutils-tess.cc ../src/cgalutils-polyhedron.cc ../src/CGALCache.cc - ../src/CGAL_Nef_polyhedron_DxfData.cc ../src/Polygon2d-CGAL.cc ../src/svg.cc ../src/GeometryEvaluator.cc) From dfc516c5e12b44e23996e15f2063d522316de379 Mon Sep 17 00:00:00 2001 From: Marius Kintel Date: Mon, 2 Mar 2015 17:06:27 -0500 Subject: [PATCH 5/6] #1233 Added testcase --- .../scad/3D/features/transform-tests.scad | 5 +++++ .../cgalpngtest/transform-tests-expected.png | Bin 4817 -> 16232 bytes .../dumptest/transform-tests-expected.csg | 7 +++++++ .../opencsgtest/transform-tests-expected.png | Bin 15379 -> 16346 bytes .../transform-tests-expected.png | Bin 15379 -> 16346 bytes 5 files changed, 12 insertions(+) diff --git a/testdata/scad/3D/features/transform-tests.scad b/testdata/scad/3D/features/transform-tests.scad index 0c922c78..95a1c589 100644 --- a/testdata/scad/3D/features/transform-tests.scad +++ b/testdata/scad/3D/features/transform-tests.scad @@ -15,3 +15,8 @@ multmatrix([[1,0.4,0.1,-25], [0.4,0.8,0,-25], [0.2,0.2,0.5,0], [0,0,0,1]]) mycyl(); +translate([-25,-40,0]) + multmatrix([[1,0,0,0], + [0,1,0,0], + [0,0,1,0], + [0,0,0,2]]) mycyl(); diff --git a/tests/regression/cgalpngtest/transform-tests-expected.png b/tests/regression/cgalpngtest/transform-tests-expected.png index ee8b6e5bbb1bf66156b6d7bfd1bb91490b4b7dec..145eebae3a18b4ff33824e12cdef0681895335d4 100644 GIT binary patch literal 16232 zcmeHuS6ow1@NXIc#0XNPNfAX*q)3$_2}Kb>KmkFDK|!h%rAbXt6cGg!rI#Q`6@t=~ zmWTzA-XZi}LnoB9d;H(~av$&W{XJ#R`D}J)_sq_GXTCepW+n!RBSJ?&AP~avn*J>i z2m&-AAhv%$Awqg3AP`dCP+!O537DM0Q6^~+G+|{!E``}#?t;QTUx@w?$+f;=#ugLr zbiC}1q$OZ74R9()t!C{GPwtR1r;!gIm7x42ii`o zV9UO8O*}G}FZlD_H0JR7T6I{6s7pusl6sg4(`&3|BtJiYVFkTMArSB`^C!Q0PrMP{ zj{w2MK@nSQCvEN~xLpL=U^ZhmanNfh8wvz@&W!>cAwNk)fPp8l!%^TBm-KrO#LTs+ z_u;<|Y#>MA6&95ZcuAYe!axTQgeU;K5;v0u!*E@( z`NRJ@aDo2(&*Zx7;-KdNTJ0}@CoD(-{!a$p>maan#f+QkKZ#)2i@+-s&J4na$`&y# zKLtDiBK{NVKN0`i#s75izvJ?s(fQ9V{^wo(pM3Ni*f=w4L0NPLaJywRz=6-L|8$bQ zR5$tAsoxwx17!{nHsVuF@r70~-@ZQyCYOwburl$!YWIX;!8|BXaE{FMuU^wJ z3B-O3Go&d^KHTOwBJVAibTohwZh3bO4g9P=`S`D+su9#{WP8#I|J@4szrtzVS9;7qC)$-TmH2`ItC9$juGG8j@kkq8kUKY9V-wC~U z^K8jfN{Nh1IQDBU_!~rCV{db1aRUr7x(4DD$D3%bB^$hWIWm6y_7wKA2VwGrQwnq1EF}oO8&tQ?k9;T1oGP3WrB zVs#tp3SORRpI@o-F_ijN%s~isX%WQDu!jJubs{5oj?jeBeRkG_I5ELDe?dV+9V{#4 zP>O9KLJ(`=Ztc{=56QztNW1;0a!duS`mmk7tU`J6G^Umnv1pR{E=H2*iHn&d1o)#F z6I(f~63;4l%INEILzGdY9NHu8Wlt`fh4BVvl^EgU1oyIfs)oOJf%ad{F30=VuR$}* z!eW#ielnU~WHHKyIN&mq#J!%wiYT}T9p67L_FmX_8ccda5=2rSn)p&nvSz9M|u>mNe` z!WJ5S+um`B&;)A;{C@i0(YIKcXczHWHAp0Hit6zgQ?IRabCQJ(au zT^l<{sr6yey_BnT1`E2-U~ZztC?oC1*`Aehn5vE>2@Q*}ZH!G83Qa0*kjM69L#>GO zVR4j~Ww+@K8{R4Ov_xhV0w*0`^o|Ed$cC@hFtnA4Q5U0+vU5RfeDYln@FUETH}O2; zQ4V|45FPToA#^8IT!!b*)Au}4&)!$!UYhZe-=0!kPaEzpL?1M)cs!_~RifgRCs7w% znTBGcU&uGp*jW9+*HYdB!NF;0oP7QqCY>*|O1f*<<)l|9>|uzP&qEzUb@1TCC3Zv0 zKuDX!ASmo;HEidRrxmI&F0&XfEIh@+t-ZdII{!=hrsl59#52Zq;8XW*p?}j1Oo;8( zqw8X)5%Dr*^m!3Y#=(cXSQzZFIEu~nM?H>=E;%uBy4CArI>^-J0~=IFv273fzG_6T z-G+npT#0=|-|&@wHh!oaaGG+=pWK=rzU; z6%)!jBwSn;CrkSo_*1rvz3XIfFXzBmF0Tgoo_KSb1N$Cy=cdwE8c6c28rzaogp7iJ zKfX1%&E>w{HfbU@fVN_S5@753PF?5FFk_vz(>eMi?yIG2^<5u{Nn)2Y~- z#ULOm9JL55u%2bj^m)E?2PGjVdQJYTtM(mN6o^&+~&lW#~oOV`HeF zM?4KXrZ&;p;d3o|2Lfz1$1^+`9mA}!#d(5ca3v0senyMB%D9$m1d#$8+!d(Br9M!t zX~o`U-O6s!aszXWGBqmTg*jpC=QoUXTaW!TGC(u_Z-{uoZ73V7<>tF`F2IH8mYK>e zj}YvgPsBl5*qbR|Kq}|`AUj`*z;9&~z+ae661qLuwKxvf@hrDxPJTv>voaMwe4N(% z;6RKwEp4KbdZSTNnQzw z`u`(lA`@5vi8V1ylts~YFdcjJF89Lfd^gB)S_oHB3+aDpRxxWeCHHUH9?Mx8)R0=O z?%zh`jiM|)27!?GUOga@o={c} zR2ThGmAg?UD9;E5rB^IVW{a$gIm*NbDB#RZ9zQiQhDf5V#V+nF7ok(S`|#<@efTz4 zGCuuI5>u8+%!U^@Q#UW)3wtl-Pzn84M1RlxJq27@?B=5 zbRul0Y25d^-_n{n;r!}1idD<<79s0eh>Wfjt_Xa7UI?c=CBAU=J`B(aw)jE&k3!5l zf#0U|DiF9^Gn!z_-jC8|v#^3teuUYVB6wd7#Jget7n4D0Dheg{;c5Riqf!SmXLTC+ z_j3p1@9HLxI#|gKE6OW=vhSIC{tn>UcCf00=gR+J9*TWidY53U>q|m-eN}41AA&W6 z+^~-&5F0P!oy0%4_oN=CIWyhw&GmIKDkVLX)*GZKuk&6sHwKgFphlfjGChXCX)xUU z^MSgBe9g27#Lo0S?Y#HTd&jPddZ=A0`*?BqH+xshWo4903S4@#2z`kXII(d}?PI|5 zU^l5OZVMPcJCW&Z9m9iz04ki*1EPy4oy@I%mpn|9eFcIjxCchHGVjRSy@A|8%piqN z{+Z5^HuKCWiV){pDFxps#X8~KrtpVRsq}?W5L-lK1Wp0%hC#=ZS*4ql9V&dfF50Rw z$~ih;eV(5A3*fOoEBDb1&c}weVtwgYo%1J)-WBoSQWv^G8KUl3?HZX4r3LSPZ>J#h zF7)rz0me;)UfAn&Yyk-{N!e!5P}`xOI);HP51p!5g-_2Md=ml`VDs>1E2cL2HzrtK zmR`x_b$H1HWu9Cc!!wz8HTo z(^5D?sNdh@Qf$M!=IMBT!gNb^Wv*2wu=rd2BNDA>hF!gTYlwJiqVpG?_;xR!Kq=Ho zcNNruCBn?P0DQQph-+dw1C=c&9NF7XG0aVaDb{#-3E|$l$#7o|v9`C>|Fiw*H;@hD zSnEm@nOy!!Y(SXN<1`*Yu8ty(RfFBxWAnf@H3pHHd!M5STl}#ll`c11nH1^x6paKi zh1HG?VfoB3iJKqh2(Xi8+fQY-v6u=%CbEdtZ2C1K)>CtAXr9A93}+cPj(E;o$Q&i zJ@zI%Yxn)>#&_f;8!22Cd{GzbPSl*(GA=P{g=|*v%NmLL0B8M6xGD@4mdRQ?AP>HeKz;J2Mx5*&xak-$kH9r*7UnSad{6p+4vX zrp-YJ2dNk1Et?|@3wr9eun!$Hh}`7a|Mm`0wb?O^<}Cu{D$Z4AD3e_vNbM4f_8#=% z@_Jab!O8M~2~ST%{~RGNT;||Iu_M?l+!9(x685UW6v3ZNQS>VWagEts!v4No*+`3={W6-p*mxWHOUtZr`oHQFyrO*l>>2UOIMU zZ3Ke`NUJgJq9IfHjRxC z97@x$Ckv%M5a0v*%Jyhj(3+~jMR~P63hM7Ka9PxQ5z^ho7aK8;bLo^~1&tLI?}oqO zIkb%#$t08e+V^7fLtL>P^bhDF0%w2m8}9xw2foE@utu@trE5R3nqMp%s3!?(JKe2J zNLL5+(iiej)4r8S^1nTzt|YoG9j^&41)tVB(e*$Wg>Zii@oQFbAO=lvH7p@9Kki(; zKG}+CXPo!7_Qkp0Mr_D*WL?V#A7Qv!-zL2E8!=4NEm!&I1JMPI7=@_6I^){7tqR@b!aQ+a($!NyXN|Xhm`6@JvS^wr>Lxjz2FU`Ftmin;l&k9 z8U<=`VU*kKlC(xQ@@gw4?rLy^LIe+2k9CVOB)-Tt=N}X&FDpyk~h0OdR7GJMG{rak4?+f}tBh<<{ z!ruy-u@}64{;t?fSxNPZK0tAv`%gG%5(kYNEUK1V0NlD^(nX3r|6-(oZ4EDID)V2L3EPE? zxjXk1qLb1zsLTP6%)?nF&Oz_~DusMQsD(42-_viQV!M#A1k8q)*M0pI>{i% zAi@VyXKE!M0Xnm4&df@j7OETp)pSjoUhALB4BgfvwMvI0Mi^I3e?|!F*ljp@+H~FIZH}t=eXH(AH{s7qM(9WwP1n6Dy zqa6YGfDV^ud%q_z8m{Gg|uQ>WCJr`7A_fY(}whuV`7H|S(n2CjNN zsO-~6yx5a_cZ^bWjxzA26H zyIUFXI58dg0#2;AlbAEVFrN_=F@M=Ga=lAd!`j`X%9d*;L^m<9uk9ad{-n@rjp@#* zk2dNzU)8fJT{zh%2d!5@C3S0RdZu~0h2`p+4#}oC|2SJ7s_xA)YUq6)PgB6AEhd^xz?(fOmgoMou4&+DFEieFWMT*H<;h8ZhdT8CoiWJJd0`k~(rUE2nqWkImsDgism zi2#^AS8j#-af!-${VC@rJ^$1;a=B09sd9TgZND{L< z+TIEGzzTQnB=23xE$Bm~$x?is_=N-s`wtPq1Pta3RLOqu1&=0JNvHL@0z?6|e!=Ge znXuasP+mEu6@lXn(>h3c(OJHMoT-pK%wX@JDRSADj&a7r^=$S4T7A9tMQ)7PPP@3#jMtIFN;0C|OzeGz1GOON5T4 z7J&_+I&a@v3VvJ3j55(G?M*;UfqH$mKIr?gYyXe3jLY?I5p1p)(OldoD{V%w>I`&s zHBWpnCCg>X8>hWD<*Rr9oD=Sxgt8@cRAC0$cSEP&7F$ZE+$G#jF8BZrLf%V}bNh(0 zm!3nz!2-CrRh=~Od7;u*C%ge`nv#yqEoaiqF&xN*h?Hqv^Zef=gFi*KkZiHZG_cpQ znb0I(u&z*-9Q3U2dA#Ox(STps_d@75vB1ap!)JokyGwyV6s$R81)0$dTN6(`BVO09 zJY6ze%DW$Lu-x@q8(8eZnge;IIJw+7C3Tp&8eF3WQYkdK?cLve;2VBer_y{DO1|!p zlyEdXh?K~$Ex#tBDRedB0;`k*!^`Fgf{kcrZ&phe{)5RI7=IwumEv?zJkipD|e=i99;&G3Rd7az_IQ8;SO+<}{Zfk0>V6 z!^0~O!d-u+L-xDNx;9yPtzk)fZuHT@v%{h$5VM<|6hTzi|d?fqrafpp_r2 z>?4*Fu^9q?p28=%R0S6cVCEu_7A$501U) zS8IlbQ>XJq9_`PnI3a7o#`q2YvYUx7)IKC3F7?|Ps{X>L{yiT^jWAyaHDF+c`8y#_YuZef z$;a%56Q|M!?_N8{Nh}r#RU&$no;^ILll09j;V2N~ds*j#=U)MVP=6D)ev70ZDCru_ zQRwW1JF))wfdpt~*Gjt@^xTt@0qT4m@XV8M-N1vVKWHK*!>=(fCyulz_A^qMn2yy? z15Z^JEd{;D*`zI0G-H!)N{n*5_F&6GU-=nG7QEq@LgX&K-CWUfnrIMiA}rrRU#z1l zjWXU$Bl{6p8*qWwA-Q3RaX!nt|F>b0Z?(xN&*#tendP0<{Q0qs15*Kwl&s{@E9KA_!H3sa|L=rz#AmXUUms<+E-qg`_KQ|d01z8b#X47CFti(? zyLQBaj!l8+cz_ldE=9Ix{%mc+UFfH}zB6LA5SWAN^b}?Np^KcMTZ~Sp_o~d@$CQE7 zYNT;*PtSnU@nWf3Cvdg8)Nx)vT6EMf-s+O+{o9hs=b>*ec9)_Gz-OTW==j6?r-U2^ z0xX`Ex#hu{QO#$zl_3hgtOpctz{JmA=gBgw=a+tE5@|vd7xLM1RP|UNOk}#JuQ9(E z5Z#4~GC-|a2GGxND~O~!Ud235CW71C^x?2{=JJuqz?ZjG9F{+&9SL1$<=po+PboYg zU+Jp?>G@c;ZO(EeL+9yT0${bqAHcHJ)qietm&#p@N&_y>%`P3jAdFZFVi}a7|9Y z0n(Ol$!O3E`g$JbN~xZVlV{r6tg1bGVS@de|Lvl(-!TbK*Dqzk&0|lOvla5s$yw~e z8|@<$PUezmf?w_tG~33Wn(^t*jP%NC>&$X-@w!WW-^h6avaiJf8PhRlZ{?p;f8E3` zy&gY$b1pY_`|dcVzHk`*BP%>HnMYw06gz$?NO!*?Zm&4M^-eZ?$M;yxK5QP*oY{Qp zWnDxUU%?^Rqy0OLCa1>Y?-pWxwhw#f^0O0J;(lx!aNWr}pN?Y%Yknp%$qN=UNb(&2 z6N@RfwCFatTQu*3%;AY=$Of7ftw|L`J0b3kr$qQG6=>T4i8EriEvG-ij3FK&POvkQ z;Dz#~S#s9M{IC!#^NBwIA7Kr;;M%^gEHvq)d(q4}@UrVINCMdMQ&)Tomf^*e(>Z0( zFbRWnU}OoaCpeauqpe&BxB@zS$?#Z$xY2Fo<4Tk0|5WReecPgIwu9Y$ADrknYhs z4Wt%l36!K-3<{Z9yvLR5OtMu7%Z)4&hL32HZ#NRT#08c$16kz zcilXyD+wfYJ$Y-@CTk(@z%eW-bp8zC>KsbBGENow_Ftbf@VDIiS2t5Lo-OfP*=Uhe$HX^^JWZU zSPFe+VSZZmg~^FbreD)-5laCwJ!!OI8^3;OJwMLtyp|-!>mIPi!B;!tx1K7<%_;)q zsRxmywrcz(Wc(-eh@LcDQRX#o|9P;Yg7<<-RvbvVJSD)1dXRMIZ4tMzrvKy&KvkTZ z4=caB7q;9XW<>SCgdVJKX2og}wRa6%;g2Aho4L;}ibYRHXq@j6WJbiA)ouJov!zeWwEueeZ=c13K!pz)>)x%>t*;66hU;%95xgU)Wh_+jA zO~ZfoE^#MRt2`W<^bRYKW9ICeHsuqGu8SkSt(h-mQD`dPOT4=;GF^U-$&dR?%-XVk z6#Iux*fW&KPuu2T`uwiUOEC(O_i;8iICUj`qKNo|=lC&d$KLp1IseHy^^`M*?0S}f z%Aw%!bvu}YLhc%u^&2b9KHEX9OVEe%GY>y5ct404`m$pp4yy0Ip}yJ1ArTUiBUPTt2U$@X1{Dt$7!XRS>7l5E1Sh`2h!Fo}fMp8g`kU)4hM zdJlMuxU5+#9=|`z_W87#Jp->fy7z1y%K9VAAOC#u<`-F}hiOHvGapOO%}>>rRZ>8G zcN-*?lBa*(QXP{qP-2v>uZDGBVS2ZomTEFZ%3P?FSaMB_vw4uvps2FGvhWGdq!xh0 zT!3h=EwXs0v4O_97yfgO;K{V1<%dCWntuh;L02NewW1;Qo9GFje`LiL;qYtT;)m-z zQj;Q#BtVt z?Vyumvhv^ns4_pk)4hDX>;gUP$*KecxPEVaEa|m(YiO9= zvP$^g9qmT$8;2Up+l+ClXz-l3&xk4PGt&TuL)Jn%D~1Vf2U*8nrejM#hy}F(%tu?o zpm+GyYS10agfyK!%oWl@6XI+0x-|QY6>@z0{`HYuZzTq|>~=`!mdVxV<=1%Qw4IXV zL>e_e{676u6}X3u2;wp-XiQ|1W#4!)IXMjCz!RaZ&^V3k@YVM6jcOTpN;P@HohGGx z&UnSc@YvOeLzB&W&u{eB|LyD8|JxbbBj)sx^LW3>;d!oh>fd|IoZk^?rA*UHt11Pa zDr^=>%u4cdAhci|8s%Rj;K$6HUfx1}?&_`L{2W)sr`5u2CNI!uXP-YRXH>N9-u}?J zf4KNXEs&;4X>VWH)y-J;0dr$3G6eBJ_v45^OVp104;pTS&hkY4jcu? zX0pVbU)t&%%zzX$72cM%XhSMNs2SJUr0gdsN_Sv*GoNYD2*x^ zYhM9+Tur{g zLh&-A@6zHqS*7xTXpJrnuK$3gm`Bi~;7zTic5e8+*5hmCdZz6Kw1 zlVj2+{L7u7)tZ9}K8woNqTEbd{pHgmFI#pRq9nU5;!m!_=QPY(r4~*+l2wfWT}Z^N zSz$)JX{S?MLkM0To;zrR90W){OJnm-OeVMX;RyBdE66avoM^*byk}><#qN96rM+Bq~OC`@#`kb?`{0@QFKfJ6Z`1 z-;~>_8oY7`yKf7TKkr3?oQBQ?rSv^IK&z0v!LLN2rHScMO;3@O`79r5wHs8tE)jWb zK4lHI%BbZ4kd9vQ`()o9{#S`XXoHl)qz4t^pw=Gqm@mC9%)B{5+T3OqK(2a9c~Z8_ zd8!ay51_bDMWkv_<@;*ADxR|ICPbQ2!`r2c>nr+ILHWnNU*St$p;AsfP#zSC!g_)t z2aB#U7vh+U_Z$e3l!(h?l2ajs^A7>)dj>gWxmw8;jx0#WZY(P1sjQEzYyI&6c+0%t zidjx8`YXy4qJjMSETiMB7e{9k)cOhktOsguj(LA%(mQ<3^Xjg%nJ+~3q4iT#S8USV zlxd?MB!21(jr1MaCg7&ko!vdrH;$PvL9Y$dJle0~E;G#S86jkIHPA==^GzPvDNS%f zb>xY1;fJ2n1oYd!G zpHbq{4;{>d-Q$}~(qX|AX5=o{2D{q@D4%obbCci;R+u*~WU=}K!5ZtZ!594ZB-I)M4gjBXPLBDaI=rFK zhD;}AZ;UhZ8qK}IJ>?GlzI-fSjWOclevqQMq>K3vTJZB_%jiGaWKShgl(%2{w^$VU z*hUSvUMO1*vw^m^-^pd=TI@KSfsHi^KP5gep?d80qJSvzi2r=ojY7ag@E5*eMzT2H z==@GwuLpBo=6vW}%i|!%StsH;p!(+KU4Z5%ye>KPXpJ-q=bJp1WplkaHJY`o=yF<- z{n9iNxYwX^){c?yo;iNL#(ySLbFlt>9~zMxBbUU}^>x_cR`9h%5Zqkl zp|C0r#%#6bFlU-DPH)n&Hs~o_w)!Un-I4eB;FTdDt?sn^55rlI9GFy|Mbs&(}_w-k#88m&s($KT!AhA-?y=j>F z8_(F8r1WVY;j)*k;a^noHi?m}3EqqA7moNSNhq2=mbIqEaV{Ff+tUqI_8kDkH3~?l zmlU}$X?)lF{$OhCJQ#`;vmx5kx}ySB>g`-}4C%zawY;;X3Dk-!=5l$gTPJWux4 zFSnKo{K35E8Hex&gWiJl1Hqn}OOq>sObHeNogm_LD)NT5p@Z*f#Gm zg%laOR9#DxD64I0AroNh%xoKW-h}KX6;9NC(B}bbVb3bgs&TWqF#qV5u+C@EE$NhP z`Q8aL_-g9Z>V*66_s?2Yc5NLi_-IXpZR0$~Is4WrC~O0CEPiqV4w;8VilU@JQ(I_0 zzfBN4h3@gD{xBhd9B~cgyagI((j{%vmhx4BUA4UlH14 zph|6)q%_0=RFjEc1g?i%bSR1fZp6pS0PVrdA9DYS%%TC_EgEco`CqA=9nk(xIU1k? zl)C-jGXPhZD_zPs{?)_X2bO)GXueg}%{9+L%E zpZ=RI83c(JQ0V_xKi3Qp@9`d;4*dUS`vtHmzp#a({{}4u+W#%#zpwD0BK>z3{qDm~#LC z+CQxHSqlJ0y<&hxqlO2U=2im$bwvK_muobAmyTIgU9}M{*LhX;&5lh5M^nsFV~pGX z5nRi)_HyO!jo{T@pL;6PqWUkJm@vaOQn1ofyXBsMaOHlgv)j5(KVz3k?tY8I$!0fB zSvQq^6X2uc>crW(#V{|^;>Qj8FYkWyR57>W!kl9%W`AUur$ifjFVVU$pHrA+scBsh zzuo9g0l(vcZ96H5+iH}#$0T99Q9+jFKSgs+Aah?2ZNKleN1oa5i{f24Vs*c04tZ(L z+xxcp2Q8l{<|ak(4knl$OEo)vz#=Er48@u#PFlAr1t~GcvO|`APwm1)djCx~U$a7I zdyqkFxS_9ymgcRatB|7^aNf9DPcynuGrUmK>vZI2GxbY{*MAF&a%QP)^_T$Yr~lyd z{rcqBA6s{L8&w&jt((8cAM$)xi*CGm6USTOvMReAW*fxDc6`xjsy|+CyL>rtLvZc0 zBXyIh)dJI&@0^Ov^JmA$QOVZB`*b|C?!X^J0~>c3l>Fu&`;2GGoDz%9$&oBi(YNgOrD6L!X>y|0YEU!};e2}X9}8-A*8*Wh5~ zy*n#lYguB-`^xcA^|4p55%+hI~8pn<=^v+d8!nuDT2eb{}j{9$Czj6OPZ9IJ1F%;MVPH*D^ zEArwCiLa#capwz;oMUQ}VIMs;K6MixoL+nzyMehe%C4t6>+-kaa?p=ehG4E&hOUhF zKshh&Z6v4n;a`Vexh8-sn%|~R9GKFo*3BqG`Ua(Ik1F#eX2?-hv^34@yG7!h0$|~{ z!(OIC+VRIDL?35%PQ92K#cXK}crpD_Kmk||u3X0*j3QAO(P7XKKJ`fb)rg2lVw8LU zbqe2ESOoY9b{S;(%giN1U5f5qOp!6^EZp#P17O?pb;%I;6a2l0_%`jwsqU#OV1!CD zrP=O`(u{b+DaN9V8*b3Ehx~>WSc5&nF8MhDD`GFhM*(<5IwRyDv5|;lmv$<;2k0Ub zO7HSmu)Ce(n13sX@+gXJ^juM*oF(zlEJV@xiLaV%%JHi-QAx(`gGe8xvDV{R?2yi+ zp6~@|A-DpLX1ou1SpqhIX#Ali77JFuQD;>?EjV+iXE@0inW2rKihQU28GQQzbOa$C z{(9m^w*0+C=U7d+mdp;#6YhTcfo@B)twS$HzetR3U@TsaAa0&ZdMBvv3C9~8s3jYJ z>FO}%bNM@{#I-X@?MVljC-d@qlg_cac9v`td^B6eRhi}$cZEJ$fOv!t%bK>VJh+?OeNx(01yiuGJZ32!Lq_&B6y2EnHP80 zQaRkUt6pgaaQ_YISR-tVBwEtMwkQJH!J((he5Dn6JLWz|{?+b@Xcz*0{sOKj3v(=~ z4`-3E^%`WuMljxGTogFy>)1ns{AD`Vu%aipSYG|TR=*AXaDs83Ik6#wlrZK zYN9+{00bZ&cf-|&r78AY{`-$dZ~E4^n-HNe2z=(maYgK%(I>mc57P8FEC)Ecs^_9b zK7^HQ;ab2w0yc4)Tug^uO~{v`@<^s|8EhF(3Hxu`C%2f~G%6S|Q>*}I(dvUPngtha zRc-eMIYN$}p{db8;#NFa`-vgn6peX`n5s}10MB5qXmYINPCxdE9*i8x6r19LG)a7@ zvU&d7>1&H3HtNXSXe0j-N8vtL+PEum<-Vtr{!}6a=z|u^5?cWCIjg;ndo1IT zzf6vWazp&)i(6Qzg=iMvorlW6IQ#&vE+QSoi`*phq#D{T*aq(7Mo#gsn^vYiope~k zCCl(ZCSO4nzmn7RW~VOye7Dy!Xp)bu$GW^@UpXbb7)bg!dDrt$HZEqU^5I#YimOU^ zs6H}Y?~$w*Om0emNz6xmZxX;8#-Y;!!Up|J;p81Ob%jCj&tX@CD0`LfStPB+?i?{G zEBq0!&i%`fv>2L`rnQttbg&hIrxV-9( zqcJhG#23ra%JqgW^CT|<6N!owsGd+q;)ySP9 z2_lhk>uC6CNdkQFyCzVOc1sQ7J?7hp{lDU zgcX{p^-c5Y@m&>7p)X|j0M=49P@ud;@5i3hM;nX7PTU1GN$xi>trt_FG}bjL_%nA?!Z$|)&y84nP_y0Yv+Q2 zG_OA2tVGNW(t}Va#TXqEQhRK0p2}D}3%gNp6@^>t)=;qt+lOj6^5g&{2G3@T89DAV zduG=7@y{VED=KY>~vLiA(5^CD>Ig=(7};`fENX z^;idxwknf>_RB1pKfyx0oOoj*0n~cSSmMmDq3<*JgE$Wc!mn^-{-icqB+GF^aUz)Q4Wu|E`_dC zg?i{LhNzWMHkM(Bey^nHcPCjwe_g?|#gaD(WERPP-`YO?`gnzO+JAEuhO3A#|@!P}W#CCWDe;+uR-)NZQH9 zhxxNnS%!Ot-&9%N=M=J$f}+S0D+FzSPj&WBwM`7nU|(*(WK7{M!Bo9kO7>uvGpf?O zCVh!cN^gTZ?Fmn0g%$3aD!ixe>@V+8m`KKEA~L4e`eFAC26-ZU@Z~GOUdiPz1pDyn z_Adh!sY9#q;)>pK?Izbp^HfF+e`^bAQ7#0A$3q{6-X_?go2GLEFaFX~-jlKs6ncx> z^>>o1$WZdAA!-5as9F#!V2azAtGqs^+}T7Qd>u-ruk*oT;Y)80tk$kcz}oPJStyNB zs&U-ely-NbV*?LuCM#?k&~ai5x{d99hxM}}JTr0)Wm;5c<6NaT|Q5+6q0co4b2cD{$VHWCoF&>|3X%T3tTK2qnpk~=fL|wH+i>$)(}YrKE3QcHj-$<2as0cmSyFlB88>LHR$zsLd7zj13cD`@+$GL*6wteM@UEnnO)mVK#^bc1T^S0P|6ID8#uddHc|soGEgHsAl83@#)e zkqeL)vN(C)N$%c|gtmb$4ux60{Vl{6A_ctF`@pD}pm!T!at_O@<4kKb>NcQX)RY}Fc;R8YwVmDXzwTl_ujb-&N+b|gAb_!(cwRutp z?X-c>u)>(4isSRi!NBgc3Rt(g@nD6t)rpKvWSX+XX@7&6p`WGW>Y;Vh@#t|)n3>M8 z(djqo>}Wv%mMM$(Elx>NuSx~h+aK&vXL}vE2QG(Fx0laM_`*yq+1B4w`)^8w;x=>e zpIuP_(xD>T?(hN-3r0C{UN;l_yWfrW-+K`JH%yIkb}6b?8~!w$6iDG>Tm<3=yz~EM zMk?;YTeYpH(-x;yN~^bk9kAy1>WaLy$-zJDP~PK~2ldo0-?QDj9MR`l4b%;eQ1_F) zPn&(U!+&6j-Ha&d^HW@LCg{HK_~gxFllK)q4B?4O3Z;5%rgyS=3Tx)d+~Gs8<*=^m zOxo+gKfZupy$43jG+F&PpCK|FO-sSj^(hc)2KB~OVxdMn&B zku7m}h85G~!DOS;C5|jnoh@10k2l1F__M(LdF0gb96f>=+^MZH?UWkqnDJczwo-f6 zx^oGZ?C=$R%&k&g^f*rbM;`ufxz_Cb&D5Qig zl&AohN`kNADmG!#P}{X~SW}}es`h}{q3FCm=#)ApK{eLfyC)xbE}GdfoDY2GfEdc; zk|*O90%Sx)zFNm5)k|mRgJqyKEKr|}tZe`Nycy^msNs$qlRB~oeb+JZ)N_*%FpZPy zazjJnY>(80+P=LuoFnV(TLa&9M$QyOIZ$2fHAN8%4J9pihZEY= zcsWlgK%W$mkq3v8R+Ulrh~Ccqrjn}6P_z(LIBAC!2cpH@Uh!8ANtSG&Z&~oeP->cE z72Sr7q%H4#X)iz(3TD_%taox-!{IrU?CW2m|C^^GK*O|R=gvKJ>740T4}Mr4;B#%6 Hc>n(ZYz@d< diff --git a/tests/regression/dumptest/transform-tests-expected.csg b/tests/regression/dumptest/transform-tests-expected.csg index 8b3d86a4..399fe735 100644 --- a/tests/regression/dumptest/transform-tests-expected.csg +++ b/tests/regression/dumptest/transform-tests-expected.csg @@ -42,4 +42,11 @@ group() { cylinder($fn = 0, $fa = 12, $fs = 2, h = 20, r1 = 10, r2 = 0, center = false); } } + multmatrix([[1, 0, 0, -25], [0, 1, 0, -40], [0, 0, 1, 0], [0, 0, 0, 1]]) { + multmatrix([[0.5, 0, 0, 0], [0, 0.5, 0, 0], [0, 0, 0.5, 0], [0, 0, 0, 1]]) { + group() { + cylinder($fn = 0, $fa = 12, $fs = 2, h = 20, r1 = 10, r2 = 0, center = false); + } + } + } } diff --git a/tests/regression/opencsgtest/transform-tests-expected.png b/tests/regression/opencsgtest/transform-tests-expected.png index 52f433049542549afc5fea129c8c4458540dbfb7..55d7a44d262d762ac67eb1dca37a77fdd9705cc2 100644 GIT binary patch literal 16346 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 VyRj{n0EqUvYG`UuqUZSRe*ne*Y+nEX literal 15379 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 diff --git a/tests/regression/throwntogethertest/transform-tests-expected.png b/tests/regression/throwntogethertest/transform-tests-expected.png index 52f433049542549afc5fea129c8c4458540dbfb7..55d7a44d262d762ac67eb1dca37a77fdd9705cc2 100644 GIT binary patch literal 16346 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 VyRj{n0EqUvYG`UuqUZSRe*ne*Y+nEX literal 15379 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 From fc436f6f9fea674f4d76b593366bc74b8f827339 Mon Sep 17 00:00:00 2001 From: Marius Kintel Date: Mon, 2 Mar 2015 17:16:56 -0500 Subject: [PATCH 6/6] #1233 Correctly handle homogeneous components in transformation matrices --- src/transform.cc | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/transform.cc b/src/transform.cc index c86f0301..2f7a2a89 100644 --- a/src/transform.cc +++ b/src/transform.cc @@ -168,12 +168,16 @@ AbstractNode *TransformModule::instantiate(const Context *ctx, const ModuleInsta { ValuePtr v = c.lookup_variable("m"); if (v->type() == Value::VECTOR) { + Matrix4d rawmatrix = Matrix4d::Identity(); for (int i = 0; i < 16; i++) { size_t x = i / 4, y = i % 4; if (y < v->toVector().size() && v->toVector()[y].type() == Value::VECTOR && x < v->toVector()[y].toVector().size()) - v->toVector()[y].toVector()[x].getDouble(node->matrix(y, x)); + v->toVector()[y].toVector()[x].getDouble(rawmatrix(y, x)); } + double w = rawmatrix(3,3); + if (w != 1.0) node->matrix = rawmatrix / w; + else node->matrix = rawmatrix; } }