From cae91b57cf839ee7b8902ca8b47efd1dd6875121 Mon Sep 17 00:00:00 2001 From: don Date: Fri, 16 Dec 2011 21:49:26 -0600 Subject: [PATCH 01/39] improve OPENSCAD_LIBRARIES for use on freebsd --- openscad.pro | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/openscad.pro b/openscad.pro index ac4200eb..60870be0 100644 --- a/openscad.pro +++ b/openscad.pro @@ -40,8 +40,8 @@ INCLUDEPATH += src # Used when manually installing 3rd party libraries OPENSCAD_LIBDIR = $$(OPENSCAD_LIBRARIES) !isEmpty(OPENSCAD_LIBDIR) { - QMAKE_INCDIR += $$OPENSCAD_LIBDIR/include - QMAKE_LIBDIR += $$OPENSCAD_LIBDIR/lib + INCLUDEPATH = $$OPENSCAD_LIBDIR/include $$INCLUDEPATH + QMAKE_LIBDIR = $$OPENSCAD_LIBDIR/lib $$QMAKE_LIBDIR } else { macx { From 52655b3b5f910fbdd8f6eddbf222bb2b18633f59 Mon Sep 17 00:00:00 2001 From: Don Bright Date: Sat, 17 Dec 2011 13:17:11 -0600 Subject: [PATCH 02/39] -fno-strict-aliasing fix for GCC bug & link to wikibooks build instructions. --- doc/testing.txt | 6 ++++++ openscad.pro | 9 +++++++++ 2 files changed, 15 insertions(+) diff --git a/doc/testing.txt b/doc/testing.txt index 67d14ba2..4623a962 100644 --- a/doc/testing.txt +++ b/doc/testing.txt @@ -96,3 +96,9 @@ log as well as your sysinfo.txt file, as well as running 'ldd' against your binaries, to make sure that the proper versions of libraries are getting compiled and linked with the test binaries. +7. Other issues + +The OpenSCAD User Manual has a section on buildling. Check there for updates: + +http://en.wikibooks.org/wiki/OpenSCAD_User_Manual + diff --git a/openscad.pro b/openscad.pro index e38251ad..ac498072 100644 --- a/openscad.pro +++ b/openscad.pro @@ -8,6 +8,10 @@ # OPENCSGDIR # OPENSCAD_LIBRARIES # +# Please see the 'Buildling' sections of the OpenSCAD user manual +# for updated tips & workarounds. +# +# http://en.wikibooks.org/wiki/OpenSCAD_User_Manual isEmpty(QT_VERSION) { error("Please use qmake for Qt 4 (probably qmake-qt4)") @@ -82,6 +86,11 @@ linux*:exists(/usr/lib64/libGLU*)|linux*:exists(/usr/lib/libGLU*) { LIBS += -lGLU } +# See Dec 2011 OpenSCAD mailing list, re: CGAL/GCC bugs. +*g++* { + QMAKE_CXXFLAGS *= -fno-strict-aliasing +} + CONFIG(mingw-cross-env) { include(mingw-cross-env.pri) } From 3763f373b24902e494946611980b3759fba790ff Mon Sep 17 00:00:00 2001 From: Don Bright Date: Sat, 17 Dec 2011 17:32:17 -0600 Subject: [PATCH 03/39] add no-strict-aliasing to cmake of regression tests, fixing CGAL/GCC bugs --- tests/CMakeLists.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 986076e2..8f3f81fc 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -13,6 +13,7 @@ set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}") # Build debug build as default if(NOT CMAKE_BUILD_TYPE) set(CMAKE_BUILD_TYPE RelWithDebInfo) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-strict-aliasing") endif() if(${CMAKE_BUILD_TYPE} STREQUAL "Debug") From 696c174b9133eda8a485f11dbc8a44d1674e5cba Mon Sep 17 00:00:00 2001 From: Don Bright Date: Sat, 17 Dec 2011 18:17:13 -0600 Subject: [PATCH 04/39] make it so test_pretty_print by default only shows failed tests --- tests/test_pretty_print.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/tests/test_pretty_print.py b/tests/test_pretty_print.py index 6fdc6639..e3772017 100755 --- a/tests/test_pretty_print.py +++ b/tests/test_pretty_print.py @@ -249,8 +249,8 @@ TESTLOG passed_tests = filter(lambda x: x.passed, tests) failed_tests = filter(lambda x: not x.passed, tests) - tests_to_report = tests - if failed_only: tests_to_report = failed_tests + tests_to_report = failed_tests + if include_passed: tests_to_report = tests try: percent = str(int(100.0*len(passed_tests) / len(tests))) except ZeroDivisionError: percent = 'n/a' @@ -317,8 +317,8 @@ def tohtml(wiki_rootpath, startdate, tests, enddate, sysinfo, sysid, makefiles): try: percent = str(int(100.0*len(passed_tests) / len(tests))) except ZeroDivisionError: percent = 'n/a' - tests_to_report = tests - if failed_only: tests_to_report = failed_tests + tests_to_report = failed_tests + if include_passed: tests_to_report = tests s='' @@ -495,7 +495,7 @@ maxretry = 10 if bool(os.getenv("TEST_GENERATE")): sys.exit(0) -failed_only = False -if '--failed-only' in sys.argv: failed_only = True +include_passed = False +if '--include-passed' in sys.argv: include_passed = True main() From 1a01aff2002d935129d499046fd4079f84b8f2bb Mon Sep 17 00:00:00 2001 From: Don Bright Date: Sun, 18 Dec 2011 13:03:12 -0600 Subject: [PATCH 05/39] fix zoomed-in panning (per Triffid Hunter bug report) --- src/glview.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/glview.cc b/src/glview.cc index c96fe019..fb69f27f 100644 --- a/src/glview.cc +++ b/src/glview.cc @@ -594,8 +594,8 @@ void GLView::mouseMoveEvent(QMouseEvent *event) if ((QApplication::keyboardModifiers() & Qt::ShiftModifier) != 0) { viewer_distance += (GLdouble)dy; } else { - object_trans_x += dx; - object_trans_z -= dy; + object_trans_x += dx * viewer_distance/1000; + object_trans_z -= dy * viewer_distance/1000; } } updateGL(); From fb28bc857649c2cab57476007e60827d7140c6f8 Mon Sep 17 00:00:00 2001 From: Don Bright Date: Sun, 18 Dec 2011 13:04:26 -0600 Subject: [PATCH 06/39] initialize variables in glview.cc --- src/glview.cc | 1 + 1 file changed, 1 insertion(+) diff --git a/src/glview.cc b/src/glview.cc index fb69f27f..0c8394a6 100644 --- a/src/glview.cc +++ b/src/glview.cc @@ -500,6 +500,7 @@ void GLView::paintGL() // FIXME: This was an attempt to keep contrast with background, but is suboptimal // (e.g. nearly invisible against a gray background). int r,g,b; + r=g=b=0; // bgcol.getRgb(&r, &g, &b); glColor3d((255.0-r)/255.0, (255.0-g)/255.0, (255.0-b)/255.0); glBegin(GL_LINES); From 541db676ee079eef7a6614cdd991514bf0c8ff52 Mon Sep 17 00:00:00 2001 From: Don Bright Date: Sun, 18 Dec 2011 13:17:24 -0600 Subject: [PATCH 07/39] make view rotation work like 2011.06 release. (per Triffid Hunter bug rpt) --- src/glview.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/glview.cc b/src/glview.cc index 0c8394a6..1dcddb74 100644 --- a/src/glview.cc +++ b/src/glview.cc @@ -388,12 +388,12 @@ void GLView::paintGL() gluLookAt(0.0, -viewer_distance, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0); - glTranslated(object_trans_x, object_trans_y, object_trans_z); - glRotated(object_rot_x, 1.0, 0.0, 0.0); glRotated(object_rot_y, 0.0, 1.0, 0.0); glRotated(object_rot_z, 0.0, 0.0, 1.0); + glTranslated(object_trans_x, object_trans_y, object_trans_z); + // FIXME: Crosshairs and axes are lighted, this doesn't make sense and causes them // to change color based on view orientation. if (showcrosshairs) From c2d94835b0fab1455c2e9ac290abfa80e5a9b09b Mon Sep 17 00:00:00 2001 From: Don Bright Date: Sun, 18 Dec 2011 15:55:12 -0600 Subject: [PATCH 08/39] translate old style viewport mouse drag into Eigen math (see T. Hunter bug rpt) --- src/glview.cc | 36 +++++++++++++++++++++++++++++++++--- 1 file changed, 33 insertions(+), 3 deletions(-) diff --git a/src/glview.cc b/src/glview.cc index 1dcddb74..59a56d61 100644 --- a/src/glview.cc +++ b/src/glview.cc @@ -58,6 +58,8 @@ #define FAR_FAR_AWAY 100000.0 +#include + GLView::GLView(QWidget *parent) : QGLWidget(parent), renderer(NULL) { init(); @@ -558,7 +560,6 @@ void GLView::mousePressEvent(QMouseEvent *event) setFocus(); } - void GLView::normalizeAngle(GLdouble& angle) { while(angle < 0) @@ -595,8 +596,37 @@ void GLView::mouseMoveEvent(QMouseEvent *event) if ((QApplication::keyboardModifiers() & Qt::ShiftModifier) != 0) { viewer_distance += (GLdouble)dy; } else { - object_trans_x += dx * viewer_distance/1000; - object_trans_z -= dy * viewer_distance/1000; + + double mx = +(dx) * viewer_distance/1000; + double my = -(dy) * viewer_distance/1000; + + Eigen::Matrix3d aax, aay, aaz, tm3; + aax = Eigen::AngleAxisd(-(object_rot_x/180) * M_PI,Eigen::Vector3d::UnitX()); + aay = Eigen::AngleAxisd(-(object_rot_y/180) * M_PI,Eigen::Vector3d::UnitY()); + aaz = Eigen::AngleAxisd(-(object_rot_z/180) * M_PI,Eigen::Vector3d::UnitZ()); + tm3 = Eigen::Matrix3d::Identity(); + tm3 = aaz * (aay * (aax * tm3)); + + Eigen::Matrix4d tm; + tm = Eigen::Matrix4d::Identity(); + for (int i=0;i<3;i++) for (int j=0;j<3;j++) tm(j,i)=tm3(j,i); + + Eigen::Matrix4d vec; + vec << + 0, 0, 0, mx, + 0, 0, 0, 0, + 0, 0, 0, my, + 0, 0, 0, 1 + ; + if ((QApplication::keyboardModifiers() & Qt::ShiftModifier) != 0) { + vec(0,3) = 0; + vec(1,3) = my; + vec(2,3) = 0; + } + tm = tm * vec; + object_trans_x += tm(0,3); + object_trans_y += tm(1,3); + object_trans_z += tm(2,3); } } updateGL(); From 87c915af43e6c6118b44581a67b6fb63861aa067 Mon Sep 17 00:00:00 2001 From: Marius Kintel Date: Mon, 19 Dec 2011 16:16:25 +0100 Subject: [PATCH 09/39] minor clarification --- doc/TODO.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/TODO.txt b/doc/TODO.txt index 6bb3a155..92ff8a09 100644 --- a/doc/TODO.txt +++ b/doc/TODO.txt @@ -189,6 +189,7 @@ IDEAS FOR LANGUAGE CHANGES -------------------------- o More strict checking of module parameters to make e.g. this fail: module test(a,b) { a=1; b=2; echo(a,b,c); } test(c=3); + (also for built-in modules) CODE ---- From 339aec3911f46f5a52faaae020a476391abec0c1 Mon Sep 17 00:00:00 2001 From: Marius Kintel Date: Mon, 19 Dec 2011 16:30:43 +0100 Subject: [PATCH 10/39] Supply the REQUIRED parameter to the find macros --- tests/CMakeLists.txt | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 986076e2..a1e587f8 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -86,8 +86,9 @@ if (WIN32) set(BOOST_THREAD_USE_LIB TRUE) endif() -set(Boost_ADDITIONAL_VERSIONS "1.47.0" "1.46.0") -find_package( Boost 1.35.0 COMPONENTS thread program_options ) +# Update this if FindBoost.cmake gets out of sync with the current boost release +# set(Boost_ADDITIONAL_VERSIONS "1.47.0" "1.46.0") +find_package( Boost 1.35.0 COMPONENTS thread program_options REQUIRED) if(Boost_FOUND) message(STATUS "Boost includes found: " ${Boost_INCLUDE_DIRS}) message(STATUS "Boost libraries found:") @@ -102,7 +103,7 @@ endif() # Mac OS X if(${CMAKE_SYSTEM_NAME} MATCHES "Darwin") - FIND_LIBRARY(COCOA_LIBRARY Cocoa) + FIND_LIBRARY(COCOA_LIBRARY Cocoa REQUIRED) endif(${CMAKE_SYSTEM_NAME} MATCHES "Darwin") # Qt4 @@ -112,7 +113,7 @@ if(${CMAKE_SYSTEM_NAME} MATCHES "FreeBSD") set(CMAKE_INCLUDE_DIRECTORIES_BEFORE ON) endif() -find_package(OpenGL) +find_package(OpenGL REQUIRED) find_package(Qt4 COMPONENTS QtCore QtGui QtOpenGL REQUIRED) include(${QT_USE_FILE}) @@ -187,14 +188,14 @@ if(WIN32_STATIC_BUILD) endif() # Flex/Bison -find_package(BISON) +find_package(BISON REQUIRED) if(${CMAKE_SYSTEM_NAME} MATCHES "FreeBSD") # FreeBSD has an old flex in /usr/bin and a new flex in /usr/local/bin set(FLEX_EXECUTABLE /usr/local/bin/flex) endif() -find_package(FLEX) +find_package(FLEX REQUIRED) # The COMPILE_FLAGS and forced C++ compiler is just to be compatible with qmake if (WIN32) set(FLEX_UNISTD_FLAG "-DYY_NO_UNISTD_H") From 80f50f0883157e00ae7fff1517f65b0aa9c1fd80 Mon Sep 17 00:00:00 2001 From: Marius Kintel Date: Mon, 19 Dec 2011 16:31:38 +0100 Subject: [PATCH 11/39] bugfix: The parameter yielded half as many segments as expected --- src/primitives.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/primitives.cc b/src/primitives.cc index b3fa45f1..466a0c76 100644 --- a/src/primitives.cc +++ b/src/primitives.cc @@ -245,7 +245,7 @@ int get_fragments_from_r(double r, double fn, double fs, double fa) if (r < GRID_FINE) return 0; if (fn > 0.0) return (int)fn; - return (int)ceil(fmax(fmin(360.0 / fa, r*M_PI / fs), 5)); + return (int)ceil(fmax(fmin(360.0 / fa, r*2*M_PI / fs), 5)); } struct point2d { From 1d2c59184cee7d31a5f6d388fdb5afab57f174a9 Mon Sep 17 00:00:00 2001 From: Marius Kintel Date: Mon, 19 Dec 2011 16:55:01 +0100 Subject: [PATCH 12/39] Changed the default value of to 2 to avoid breaking existing scripts which assume a certain default tesselation behavior --- src/context.cc | 2 +- .../dumptest/allmodules-expected.txt | 22 +- .../dumptest/background-modifier-expected.txt | 4 +- .../dumptest/child-background-expected.txt | 4 +- .../dumptest/child-tests-expected.txt | 8 +- tests/regression/dumptest/circle-expected.txt | 2 +- .../dumptest/circle-tests-expected.txt | 14 +- .../regression/dumptest/cylinder-expected.txt | 2 +- .../dumptest/cylinder-tests-expected.txt | 22 +- .../dumptest/difference-tests-expected.txt | 12 +- .../dumptest/disable-modifier-expected.txt | 2 +- .../dumptest/dxf_linear_extrude-expected.txt | 2 +- .../dumptest/dxf_rotate_extrude-expected.txt | 2 +- .../dumptest/escape-test-expected.txt | 2 +- .../dumptest/example002-expected.txt | 2 +- .../dumptest/example004-expected.txt | 2 +- .../dumptest/example009-expected.txt | 18 +- .../dumptest/example013-expected.txt | 12 +- .../dumptest/example015-expected.txt | 4 +- .../dumptest/example017-expected.txt | 54 ++-- .../dumptest/example018-expected.txt | 16 +- .../dumptest/example019-expected.txt | 82 ++--- .../dumptest/example022-expected.txt | 48 +-- .../dumptest/for-nested-tests-expected.txt | 72 ++--- .../dumptest/for-tests-expected.txt | 50 ++-- ...light-and-background-modifier-expected.txt | 8 +- .../dumptest/highlight-modifier-expected.txt | 4 +- .../dumptest/hull2-tests-expected.txt | 18 +- .../dumptest/hull3-tests-expected.txt | 8 +- tests/regression/dumptest/import-expected.txt | 2 +- .../dumptest/import_dxf-expected.txt | 2 +- .../dumptest/import_dxf-tests-expected.txt | 18 +- .../dumptest/import_off-expected.txt | 2 +- .../dumptest/import_stl-expected.txt | 2 +- .../dumptest/import_stl-tests-expected.txt | 2 +- .../dumptest/include-tests-expected.txt | 10 +- .../dumptest/intersection-tests-expected.txt | 12 +- .../dumptest/linear_extrude-expected.txt | 2 +- .../linear_extrude-tests-expected.txt | 20 +- .../dumptest/minkowski2-tests-expected.txt | 6 +- .../dumptest/minkowski3-tests-expected.txt | 6 +- .../dumptest/projection-tests-expected.txt | 12 +- .../dumptest/root-modifier-expected.txt | 4 +- .../dumptest/rotate_extrude-expected.txt | 2 +- .../rotate_extrude-tests-expected.txt | 24 +- .../rotate_extrude_dxf-tests-expected.txt | 2 +- tests/regression/dumptest/sphere-expected.txt | 2 +- .../dumptest/sphere-tests-expected.txt | 14 +- .../dumptest/testcolornames-expected.txt | 282 +++++++++--------- .../opencsgtest/circle-tests-expected.png | Bin 9537 -> 8880 bytes .../circle-tests-expected.png | Bin 5265 -> 8880 bytes 51 files changed, 462 insertions(+), 462 deletions(-) diff --git a/src/context.cc b/src/context.cc index bd97f8f0..6d0cb3a8 100644 --- a/src/context.cc +++ b/src/context.cc @@ -188,7 +188,7 @@ void register_builtin(Context &ctx) ctx.functions_p = &Builtins::instance()->functions(); ctx.modules_p = &Builtins::instance()->modules(); ctx.set_variable("$fn", Value(0.0)); - ctx.set_variable("$fs", Value(1.0)); + ctx.set_variable("$fs", Value(2.0)); ctx.set_variable("$fa", Value(12.0)); ctx.set_variable("$t", Value(0.0)); diff --git a/tests/regression/dumptest/allmodules-expected.txt b/tests/regression/dumptest/allmodules-expected.txt index fba39619..86bb7fbc 100644 --- a/tests/regression/dumptest/allmodules-expected.txt +++ b/tests/regression/dumptest/allmodules-expected.txt @@ -10,21 +10,21 @@ union(); difference(); intersection(); - linear_extrude(height = 100, center = false, convexity = 1, $fn = 0, $fa = 12, $fs = 1); - linear_extrude(height = 100, center = false, convexity = 1, $fn = 0, $fa = 12, $fs = 1); - rotate_extrude(convexity = 1, $fn = 0, $fa = 12, $fs = 1); - rotate_extrude(convexity = 1, $fn = 0, $fa = 12, $fs = 1); - import(file = "", layer = "", origin = [0, 0], scale = 1, convexity = 1, $fn = 0, $fa = 12, $fs = 1); - import(file = "", layer = "", origin = [0, 0], scale = 1, convexity = 1, $fn = 0, $fa = 12, $fs = 1); - import(file = "", layer = "", origin = [0, 0], scale = 1, convexity = 1, $fn = 0, $fa = 12, $fs = 1); - import(file = "", layer = "", origin = [0, 0], scale = 1, convexity = 1, $fn = 0, $fa = 12, $fs = 1); + linear_extrude(height = 100, center = false, convexity = 1, $fn = 0, $fa = 12, $fs = 2); + linear_extrude(height = 100, center = false, convexity = 1, $fn = 0, $fa = 12, $fs = 2); + rotate_extrude(convexity = 1, $fn = 0, $fa = 12, $fs = 2); + rotate_extrude(convexity = 1, $fn = 0, $fa = 12, $fs = 2); + import(file = "", layer = "", origin = [0, 0], scale = 1, convexity = 1, $fn = 0, $fa = 12, $fs = 2); + import(file = "", layer = "", origin = [0, 0], scale = 1, convexity = 1, $fn = 0, $fa = 12, $fs = 2); + import(file = "", layer = "", origin = [0, 0], scale = 1, convexity = 1, $fn = 0, $fa = 12, $fs = 2); + import(file = "", layer = "", origin = [0, 0], scale = 1, convexity = 1, $fn = 0, $fa = 12, $fs = 2); group(); cube(size = [1, 1, 1], center = false); - sphere($fn = 0, $fa = 12, $fs = 1, r = 1); - cylinder($fn = 0, $fa = 12, $fs = 1, h = 1, r1 = 1, r2 = 1, center = false); + sphere($fn = 0, $fa = 12, $fs = 2, r = 1); + cylinder($fn = 0, $fa = 12, $fs = 2, h = 1, r1 = 1, r2 = 1, center = false); polyhedron(points = undef, triangles = undef, convexity = 1); square(size = [1, 1], center = false); - circle($fn = 0, $fa = 12, $fs = 1, r = 1); + circle($fn = 0, $fa = 12, $fs = 2, r = 1); polygon(points = undef, paths = undef, convexity = 1); projection(cut = false, convexity = 0); render(convexity = 1); diff --git a/tests/regression/dumptest/background-modifier-expected.txt b/tests/regression/dumptest/background-modifier-expected.txt index b52612f1..6e9ca570 100644 --- a/tests/regression/dumptest/background-modifier-expected.txt +++ b/tests/regression/dumptest/background-modifier-expected.txt @@ -1,5 +1,5 @@ difference() { - sphere($fn = 0, $fa = 12, $fs = 1, r = 10); - %cylinder($fn = 0, $fa = 12, $fs = 1, h = 30, r1 = 6, r2 = 6, center = true); + sphere($fn = 0, $fa = 12, $fs = 2, r = 10); + %cylinder($fn = 0, $fa = 12, $fs = 2, h = 30, r1 = 6, r2 = 6, center = true); } diff --git a/tests/regression/dumptest/child-background-expected.txt b/tests/regression/dumptest/child-background-expected.txt index d7201796..c3e82887 100644 --- a/tests/regression/dumptest/child-background-expected.txt +++ b/tests/regression/dumptest/child-background-expected.txt @@ -1,7 +1,7 @@ difference() { - sphere($fn = 0, $fa = 12, $fs = 1, r = 10); + sphere($fn = 0, $fa = 12, $fs = 2, r = 10); group() { - cylinder($fn = 0, $fa = 12, $fs = 1, h = 30, r1 = 6, r2 = 6, center = true); + cylinder($fn = 0, $fa = 12, $fs = 2, h = 30, r1 = 6, r2 = 6, center = true); } } diff --git a/tests/regression/dumptest/child-tests-expected.txt b/tests/regression/dumptest/child-tests-expected.txt index 981a5c1f..9a886fe7 100644 --- a/tests/regression/dumptest/child-tests-expected.txt +++ b/tests/regression/dumptest/child-tests-expected.txt @@ -1,10 +1,10 @@ group() { group() { multmatrix([[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) { - sphere($fn = 16, $fa = 12, $fs = 1, r = 1); + sphere($fn = 16, $fa = 12, $fs = 2, r = 1); } multmatrix([[1, 0, 0, 2.5], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) { - cylinder($fn = 16, $fa = 12, $fs = 1, h = 2, r1 = 1, r2 = 1, center = true); + cylinder($fn = 16, $fa = 12, $fs = 2, h = 2, r1 = 1, r2 = 1, center = true); } multmatrix([[1, 0, 0, 5], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) { cube(size = [2, 2, 2], center = true); @@ -22,7 +22,7 @@ group() { group() { multmatrix([[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) { - sphere($fn = 16, $fa = 12, $fs = 1, r = 1); + sphere($fn = 16, $fa = 12, $fs = 2, r = 1); } multmatrix([[1, 0, 0, 2.5], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]); multmatrix([[1, 0, 0, 5], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]); @@ -31,7 +31,7 @@ } multmatrix([[1, 0, 0, 2.5], [0, 1, 0, 3], [0, 0, 1, 0], [0, 0, 0, 1]]) { group() { - cylinder($fn = 16, $fa = 12, $fs = 1, h = 2, r1 = 1, r2 = 1, center = true); + cylinder($fn = 16, $fa = 12, $fs = 2, h = 2, r1 = 1, r2 = 1, center = true); } } multmatrix([[1, 0, 0, 5], [0, 1, 0, 3], [0, 0, 1, 0], [0, 0, 0, 1]]) { diff --git a/tests/regression/dumptest/circle-expected.txt b/tests/regression/dumptest/circle-expected.txt index ce06391a..1e7bd9ac 100644 --- a/tests/regression/dumptest/circle-expected.txt +++ b/tests/regression/dumptest/circle-expected.txt @@ -1,2 +1,2 @@ - circle($fn = 0, $fa = 12, $fs = 1, r = 1); + circle($fn = 0, $fa = 12, $fs = 2, r = 1); diff --git a/tests/regression/dumptest/circle-tests-expected.txt b/tests/regression/dumptest/circle-tests-expected.txt index c19bb0c2..910b3752 100644 --- a/tests/regression/dumptest/circle-tests-expected.txt +++ b/tests/regression/dumptest/circle-tests-expected.txt @@ -1,21 +1,21 @@ - circle($fn = 0, $fa = 12, $fs = 1, r = 1); + circle($fn = 0, $fa = 12, $fs = 2, r = 1); multmatrix([[1, 0, 0, 0], [0, 1, 0, 3], [0, 0, 1, 0], [0, 0, 0, 1]]) { - circle($fn = 0, $fa = 12, $fs = 1, r = 1); + circle($fn = 0, $fa = 12, $fs = 2, r = 1); } multmatrix([[1, 0, 0, 5], [0, 1, 0, 1], [0, 0, 1, 0], [0, 0, 0, 1]]) { - circle($fn = 0, $fa = 12, $fs = 1, r = 3); + circle($fn = 0, $fa = 12, $fs = 2, r = 3); } multmatrix([[1, 0, 0, 0], [0, 1, 0, -1], [0, 0, 1, 0], [0, 0, 0, 1]]) { - circle($fn = 0, $fa = 12, $fs = 1, r = 0); + circle($fn = 0, $fa = 12, $fs = 2, r = 0); } multmatrix([[1, 0, 0, 0], [0, 1, 0, -3], [0, 0, 1, 0], [0, 0, 0, 1]]) { - circle($fn = 4, $fa = 12, $fs = 1, r = 1); + circle($fn = 4, $fa = 12, $fs = 2, r = 1); } multmatrix([[1, 0, 0, 3], [0, 1, 0, -3], [0, 0, 1, 0], [0, 0, 0, 1]]) { - circle($fn = 8, $fa = 12, $fs = 1, r = 1); + circle($fn = 8, $fa = 12, $fs = 2, r = 1); } multmatrix([[1, 0, 0, 6], [0, 1, 0, -3], [0, 0, 1, 0], [0, 0, 0, 1]]) { - circle($fn = 12, $fa = 12, $fs = 1, r = 1); + circle($fn = 12, $fa = 12, $fs = 2, r = 1); } multmatrix([[1, 0, 0, 0], [0, 1, 0, -6], [0, 0, 1, 0], [0, 0, 0, 1]]) { circle($fn = 0, $fa = 20, $fs = 0.3, r = 1); diff --git a/tests/regression/dumptest/cylinder-expected.txt b/tests/regression/dumptest/cylinder-expected.txt index b839db7f..73dcb7ce 100644 --- a/tests/regression/dumptest/cylinder-expected.txt +++ b/tests/regression/dumptest/cylinder-expected.txt @@ -1,2 +1,2 @@ - cylinder($fn = 0, $fa = 12, $fs = 1, h = 1, r1 = 1, r2 = 1, center = false); + cylinder($fn = 0, $fa = 12, $fs = 2, h = 1, r1 = 1, r2 = 1, center = false); diff --git a/tests/regression/dumptest/cylinder-tests-expected.txt b/tests/regression/dumptest/cylinder-tests-expected.txt index 5b25429a..2ac25499 100644 --- a/tests/regression/dumptest/cylinder-tests-expected.txt +++ b/tests/regression/dumptest/cylinder-tests-expected.txt @@ -1,32 +1,32 @@ - cylinder($fn = 0, $fa = 12, $fs = 1, h = 1, r1 = 1, r2 = 1, center = false); + cylinder($fn = 0, $fa = 12, $fs = 2, h = 1, r1 = 1, r2 = 1, center = false); multmatrix([[1, 0, 0, 1], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) { - cylinder($fn = 0, $fa = 12, $fs = 1, h = 1, r1 = 0, r2 = 0, center = false); + cylinder($fn = 0, $fa = 12, $fs = 2, h = 1, r1 = 0, r2 = 0, center = false); } multmatrix([[1, 0, 0, 2], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) { - cylinder($fn = 0, $fa = 12, $fs = 1, h = 1, r1 = 0, r2 = 0, center = false); + cylinder($fn = 0, $fa = 12, $fs = 2, h = 1, r1 = 0, r2 = 0, center = false); } multmatrix([[1, 0, 0, 0], [0, 1, 0, -11], [0, 0, 1, 0], [0, 0, 0, 1]]) { - cylinder($fn = 0, $fa = 12, $fs = 1, h = 1, r1 = 5, r2 = 5, center = false); + cylinder($fn = 0, $fa = 12, $fs = 2, h = 1, r1 = 5, r2 = 5, center = false); } multmatrix([[1, 0, 0, 0], [0, 1, 0, 11], [0, 0, 1, 0], [0, 0, 0, 1]]) { - cylinder($fn = 0, $fa = 12, $fs = 1, h = 10, r1 = 5, r2 = 5, center = true); + cylinder($fn = 0, $fa = 12, $fs = 2, h = 10, r1 = 5, r2 = 5, center = true); } multmatrix([[1, 0, 0, 11], [0, 1, 0, -11], [0, 0, 1, 0], [0, 0, 0, 1]]) { - cylinder($fn = 0, $fa = 12, $fs = 1, h = 5, r1 = 5, r2 = 1, center = false); + cylinder($fn = 0, $fa = 12, $fs = 2, h = 5, r1 = 5, r2 = 1, center = false); } multmatrix([[1, 0, 0, 11], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) { - cylinder($fn = 0, $fa = 12, $fs = 1, h = 5, r1 = 5, r2 = 0, center = false); + cylinder($fn = 0, $fa = 12, $fs = 2, h = 5, r1 = 5, r2 = 0, center = false); } multmatrix([[1, 0, 0, 11], [0, 1, 0, 11], [0, 0, 1, 0], [0, 0, 0, 1]]) { - cylinder($fn = 0, $fa = 12, $fs = 1, h = 8, r1 = 5, r2 = 5, center = false); + cylinder($fn = 0, $fa = 12, $fs = 2, h = 8, r1 = 5, r2 = 5, center = false); } multmatrix([[1, 0, 0, 22], [0, 1, 0, -11], [0, 0, 1, 0], [0, 0, 0, 1]]) { - cylinder($fn = 0, $fa = 12, $fs = 1, h = 5, r1 = 0, r2 = 5, center = true); + cylinder($fn = 0, $fa = 12, $fs = 2, h = 5, r1 = 0, r2 = 5, center = true); } multmatrix([[1, 0, 0, 22], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) { - cylinder($fn = 0, $fa = 12, $fs = 1, h = 5, r1 = 5, r2 = 0, center = false); + cylinder($fn = 0, $fa = 12, $fs = 2, h = 5, r1 = 5, r2 = 0, center = false); } multmatrix([[1, 0, 0, 22], [0, 1, 0, 11], [0, 0, 1, 0], [0, 0, 0, 1]]) { - cylinder($fn = 0, $fa = 12, $fs = 1, h = 15, r1 = 5, r2 = 5, center = false); + cylinder($fn = 0, $fa = 12, $fs = 2, h = 15, r1 = 5, r2 = 5, center = false); } diff --git a/tests/regression/dumptest/difference-tests-expected.txt b/tests/regression/dumptest/difference-tests-expected.txt index eee4616a..30dd0014 100644 --- a/tests/regression/dumptest/difference-tests-expected.txt +++ b/tests/regression/dumptest/difference-tests-expected.txt @@ -2,20 +2,20 @@ difference(); difference() { cube(size = [10, 10, 10], center = true); - cylinder($fn = 0, $fa = 12, $fs = 1, h = 20, r1 = 4, r2 = 4, center = true); + cylinder($fn = 0, $fa = 12, $fs = 2, h = 20, r1 = 4, r2 = 4, center = true); } multmatrix([[1, 0, 0, 12], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) { difference() { cube(size = [10, 10, 10], center = true); - cylinder($fn = 0, $fa = 12, $fs = 1, h = 10.5, r1 = 4, r2 = 4, center = true); + cylinder($fn = 0, $fa = 12, $fs = 2, h = 10.5, r1 = 4, r2 = 4, center = true); } } multmatrix([[1, 0, 0, 0], [0, 1, 0, 12], [0, 0, 1, 0], [0, 0, 0, 1]]) { difference() { cube(size = [10, 10, 10], center = true); - cylinder($fn = 0, $fa = 12, $fs = 1, h = 11, r1 = 4, r2 = 4, center = true); + cylinder($fn = 0, $fa = 12, $fs = 2, h = 11, r1 = 4, r2 = 4, center = true); multmatrix([[2.22045e-16, 0, 1, 0], [0, 1, 0, 0], [-1, 0, 2.22045e-16, 0], [0, 0, 0, 1]]) { - cylinder($fn = 0, $fa = 12, $fs = 1, h = 11, r1 = 4, r2 = 4, center = true); + cylinder($fn = 0, $fa = 12, $fs = 2, h = 11, r1 = 4, r2 = 4, center = true); } } } @@ -23,7 +23,7 @@ difference() { cube(size = [10, 10, 10], center = true); multmatrix([[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 7.01], [0, 0, 0, 1]]) { - cylinder($fn = 0, $fa = 12, $fs = 1, h = 4, r1 = 4, r2 = 4, center = true); + cylinder($fn = 0, $fa = 12, $fs = 2, h = 4, r1 = 4, r2 = 4, center = true); } } } @@ -31,7 +31,7 @@ difference() { cube(size = [10, 10, 10], center = true); multmatrix([[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 6.99], [0, 0, 0, 1]]) { - cylinder($fn = 0, $fa = 12, $fs = 1, h = 4, r1 = 4, r2 = 4, center = true); + cylinder($fn = 0, $fa = 12, $fs = 2, h = 4, r1 = 4, r2 = 4, center = true); } } } diff --git a/tests/regression/dumptest/disable-modifier-expected.txt b/tests/regression/dumptest/disable-modifier-expected.txt index b1543f7e..a237a48e 100644 --- a/tests/regression/dumptest/disable-modifier-expected.txt +++ b/tests/regression/dumptest/disable-modifier-expected.txt @@ -1,4 +1,4 @@ difference() { - cylinder($fn = 0, $fa = 12, $fs = 1, h = 30, r1 = 6, r2 = 6, center = true); + cylinder($fn = 0, $fa = 12, $fs = 2, h = 30, r1 = 6, r2 = 6, center = true); } diff --git a/tests/regression/dumptest/dxf_linear_extrude-expected.txt b/tests/regression/dumptest/dxf_linear_extrude-expected.txt index c6034d9e..ec46e667 100644 --- a/tests/regression/dumptest/dxf_linear_extrude-expected.txt +++ b/tests/regression/dumptest/dxf_linear_extrude-expected.txt @@ -1,2 +1,2 @@ - linear_extrude(height = 100, center = false, convexity = 1, $fn = 0, $fa = 12, $fs = 1); + linear_extrude(height = 100, center = false, convexity = 1, $fn = 0, $fa = 12, $fs = 2); diff --git a/tests/regression/dumptest/dxf_rotate_extrude-expected.txt b/tests/regression/dumptest/dxf_rotate_extrude-expected.txt index 9ab8f0f3..c212d763 100644 --- a/tests/regression/dumptest/dxf_rotate_extrude-expected.txt +++ b/tests/regression/dumptest/dxf_rotate_extrude-expected.txt @@ -1,2 +1,2 @@ - rotate_extrude(convexity = 1, $fn = 0, $fa = 12, $fs = 1); + rotate_extrude(convexity = 1, $fn = 0, $fa = 12, $fs = 2); diff --git a/tests/regression/dumptest/escape-test-expected.txt b/tests/regression/dumptest/escape-test-expected.txt index 2097dc49..af7f3e7a 100644 --- a/tests/regression/dumptest/escape-test-expected.txt +++ b/tests/regression/dumptest/escape-test-expected.txt @@ -1,2 +1,2 @@ - import(file = "B-\" C-\t D-\n E-'", layer = "A:\\ B:\" C:\t D:\n E:' F:\\\\", origin = [0, 0], scale = 1, convexity = 1, $fn = 0, $fa = 12, $fs = 1); + import(file = "B-\" C-\t D-\n E-'", layer = "A:\\ B:\" C:\t D:\n E:' F:\\\\", origin = [0, 0], scale = 1, convexity = 1, $fn = 0, $fa = 12, $fs = 2); diff --git a/tests/regression/dumptest/example002-expected.txt b/tests/regression/dumptest/example002-expected.txt index 04fc3b9f..b3a79ceb 100644 --- a/tests/regression/dumptest/example002-expected.txt +++ b/tests/regression/dumptest/example002-expected.txt @@ -14,7 +14,7 @@ } } multmatrix([[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 5], [0, 0, 0, 1]]) { - cylinder($fn = 0, $fa = 12, $fs = 1, h = 50, r1 = 20, r2 = 5, center = true); + cylinder($fn = 0, $fa = 12, $fs = 2, h = 50, r1 = 20, r2 = 5, center = true); } } } diff --git a/tests/regression/dumptest/example004-expected.txt b/tests/regression/dumptest/example004-expected.txt index a85ed907..9fda7fe3 100644 --- a/tests/regression/dumptest/example004-expected.txt +++ b/tests/regression/dumptest/example004-expected.txt @@ -1,7 +1,7 @@ group() { difference() { cube(size = [30, 30, 30], center = true); - sphere($fn = 0, $fa = 12, $fs = 1, r = 20); + sphere($fn = 0, $fa = 12, $fs = 2, r = 20); } } diff --git a/tests/regression/dumptest/example009-expected.txt b/tests/regression/dumptest/example009-expected.txt index 47ada916..b293224e 100644 --- a/tests/regression/dumptest/example009-expected.txt +++ b/tests/regression/dumptest/example009-expected.txt @@ -1,22 +1,22 @@ - %linear_extrude(height = 22, center = true, convexity = 10, $fn = 0, $fa = 12, $fs = 1) { - import(file = "example009.dxf", layer = "body", origin = [0, 0], scale = 1, convexity = 1, $fn = 0, $fa = 12, $fs = 1); + %linear_extrude(height = 22, center = true, convexity = 10, $fn = 0, $fa = 12, $fs = 2) { + import(file = "example009.dxf", layer = "body", origin = [0, 0], scale = 1, convexity = 1, $fn = 0, $fa = 12, $fs = 2); } %group() { multmatrix([[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 12], [0, 0, 0, 1]]) { - linear_extrude(height = 2, center = true, convexity = 10, $fn = 0, $fa = 12, $fs = 1) { - import(file = "example009.dxf", layer = "plate", origin = [0, 0], scale = 1, convexity = 1, $fn = 0, $fa = 12, $fs = 1); + linear_extrude(height = 2, center = true, convexity = 10, $fn = 0, $fa = 12, $fs = 2) { + import(file = "example009.dxf", layer = "plate", origin = [0, 0], scale = 1, convexity = 1, $fn = 0, $fa = 12, $fs = 2); } } multmatrix([[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, -12], [0, 0, 0, 1]]) { - linear_extrude(height = 2, center = true, convexity = 10, $fn = 0, $fa = 12, $fs = 1) { - import(file = "example009.dxf", layer = "plate", origin = [0, 0], scale = 1, convexity = 1, $fn = 0, $fa = 12, $fs = 1); + linear_extrude(height = 2, center = true, convexity = 10, $fn = 0, $fa = 12, $fs = 2) { + import(file = "example009.dxf", layer = "plate", origin = [0, 0], scale = 1, convexity = 1, $fn = 0, $fa = 12, $fs = 2); } } } intersection() { - linear_extrude(height = 20, center = true, convexity = 10, twist = -57.5288, slices = 4, $fn = 0, $fa = 12, $fs = 1) { - import(file = "example009.dxf", layer = "fan_top", origin = [0, 0], scale = 1, convexity = 1, $fn = 0, $fa = 12, $fs = 1); + linear_extrude(height = 20, center = true, convexity = 10, twist = -57.5288, slices = 4, $fn = 0, $fa = 12, $fs = 2) { + import(file = "example009.dxf", layer = "fan_top", origin = [0, 0], scale = 1, convexity = 1, $fn = 0, $fa = 12, $fs = 2); } - rotate_extrude(file = "example009.dxf", layer = "fan_side", origin = [0, -40], scale = 1, convexity = 10, $fn = 0, $fa = 12, $fs = 1); + rotate_extrude(file = "example009.dxf", layer = "fan_side", origin = [0, -40], scale = 1, convexity = 10, $fn = 0, $fa = 12, $fs = 2); } diff --git a/tests/regression/dumptest/example013-expected.txt b/tests/regression/dumptest/example013-expected.txt index f4d0aec0..d3ddd172 100644 --- a/tests/regression/dumptest/example013-expected.txt +++ b/tests/regression/dumptest/example013-expected.txt @@ -1,15 +1,15 @@ intersection() { - linear_extrude(height = 100, center = true, convexity = 3, $fn = 0, $fa = 12, $fs = 1) { - import(file = "example013.dxf", layer = "", origin = [0, 0], scale = 1, convexity = 1, $fn = 0, $fa = 12, $fs = 1); + linear_extrude(height = 100, center = true, convexity = 3, $fn = 0, $fa = 12, $fs = 2) { + import(file = "example013.dxf", layer = "", origin = [0, 0], scale = 1, convexity = 1, $fn = 0, $fa = 12, $fs = 2); } multmatrix([[2.22045e-16, 0, 1, 0], [0, 1, 0, 0], [-1, 0, 2.22045e-16, 0], [0, 0, 0, 1]]) { - linear_extrude(height = 100, center = true, convexity = 3, $fn = 0, $fa = 12, $fs = 1) { - import(file = "example013.dxf", layer = "", origin = [0, 0], scale = 1, convexity = 1, $fn = 0, $fa = 12, $fs = 1); + linear_extrude(height = 100, center = true, convexity = 3, $fn = 0, $fa = 12, $fs = 2) { + import(file = "example013.dxf", layer = "", origin = [0, 0], scale = 1, convexity = 1, $fn = 0, $fa = 12, $fs = 2); } } multmatrix([[1, 0, 0, 0], [0, 2.22045e-16, -1, 0], [0, 1, 2.22045e-16, 0], [0, 0, 0, 1]]) { - linear_extrude(height = 100, center = true, convexity = 3, $fn = 0, $fa = 12, $fs = 1) { - import(file = "example013.dxf", layer = "", origin = [0, 0], scale = 1, convexity = 1, $fn = 0, $fa = 12, $fs = 1); + linear_extrude(height = 100, center = true, convexity = 3, $fn = 0, $fa = 12, $fs = 2) { + import(file = "example013.dxf", layer = "", origin = [0, 0], scale = 1, convexity = 1, $fn = 0, $fa = 12, $fs = 2); } } } diff --git a/tests/regression/dumptest/example015-expected.txt b/tests/regression/dumptest/example015-expected.txt index c6d870aa..e1434e85 100644 --- a/tests/regression/dumptest/example015-expected.txt +++ b/tests/regression/dumptest/example015-expected.txt @@ -20,10 +20,10 @@ } multmatrix([[0.707107, 0.707107, 0, 0], [-0.707107, 0.707107, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) { multmatrix([[0.7, 0, 0, 0], [0, 1.3, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) { - circle($fn = 0, $fa = 12, $fs = 1, r = 5); + circle($fn = 0, $fa = 12, $fs = 2, r = 5); } } } - import(file = "example009.dxf", layer = "body", origin = [0, 0], scale = 2, convexity = 6, $fn = 0, $fa = 12, $fs = 1); + import(file = "example009.dxf", layer = "body", origin = [0, 0], scale = 2, convexity = 6, $fn = 0, $fa = 12, $fs = 2); } diff --git a/tests/regression/dumptest/example017-expected.txt b/tests/regression/dumptest/example017-expected.txt index 3f4ded68..a27ed759 100644 --- a/tests/regression/dumptest/example017-expected.txt +++ b/tests/regression/dumptest/example017-expected.txt @@ -3,10 +3,10 @@ group() { group() { multmatrix([[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 74], [0, 0, 0, 1]]) { - linear_extrude(height = 6, center = false, convexity = 4, $fn = 0, $fa = 12, $fs = 1) { + linear_extrude(height = 6, center = false, convexity = 4, $fn = 0, $fa = 12, $fs = 2) { group() { difference() { - circle($fn = 0, $fa = 12, $fs = 1, r = 47); + circle($fn = 0, $fa = 12, $fs = 2, r = 47); group() { multmatrix([[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) { multmatrix([[1, 0, 0, 0], [0, 1, 0, 36], [0, 0, 1, 0], [0, 0, 0, 1]]) { @@ -24,15 +24,15 @@ } } } - circle($fn = 0, $fa = 12, $fs = 1, r = 25); + circle($fn = 0, $fa = 12, $fs = 2, r = 25); } } } } - linear_extrude(height = 6, center = false, convexity = 4, $fn = 0, $fa = 12, $fs = 1) { + linear_extrude(height = 6, center = false, convexity = 4, $fn = 0, $fa = 12, $fs = 2) { group() { difference() { - circle($fn = 0, $fa = 12, $fs = 1, r = 102); + circle($fn = 0, $fa = 12, $fs = 2, r = 102); group() { multmatrix([[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) { multmatrix([[1, 0, 0, 0], [0, 1, 0, 88.5], [0, 0, 1, 0], [0, 0, 0, 1]]) { @@ -50,7 +50,7 @@ } } } - circle($fn = 0, $fa = 12, $fs = 1, r = 75); + circle($fn = 0, $fa = 12, $fs = 2, r = 75); } } } @@ -59,27 +59,27 @@ multmatrix([[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) { multmatrix([[1, 0, 0, 0], [0, 1, 0, 102], [0, 0, 1, 0], [0, 0, 0, 1]]) { multmatrix([[2.22045e-16, 2.22045e-16, -1, 0], [-1, 0, -2.22045e-16, 0], [0, 1, 2.22045e-16, 0], [0, 0, 0, 1]]) { - linear_extrude(height = 6, center = true, convexity = 10, $fn = 0, $fa = 12, $fs = 1) { + linear_extrude(height = 6, center = true, convexity = 10, $fn = 0, $fa = 12, $fs = 2) { group() { union() { difference() { polygon(points = [[0, 6], [6, 6], [6, 0], [21, 0], [21, 6], [27, 6], [27, 0], [77, 0], [83, 12], [77, 18], [77, 74], [71, 74], [71, 80], [61, 80], [61, 74], [55, 74], [55, 80], [49, 74], [49, 18], [43, 12], [6, 12]], paths = undef, convexity = 1); multmatrix([[1, 0, 0, 43], [0, 1, 0, 18], [0, 0, 1, 0], [0, 0, 0, 1]]) { - circle($fn = 0, $fa = 12, $fs = 1, r = 6); + circle($fn = 0, $fa = 12, $fs = 2, r = 6); } multmatrix([[1, 0, 0, 83], [0, 1, 0, 18], [0, 0, 1, 0], [0, 0, 0, 1]]) { - circle($fn = 0, $fa = 12, $fs = 1, r = 6); + circle($fn = 0, $fa = 12, $fs = 2, r = 6); } } multmatrix([[1, 0, 0, 77], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) { square(size = [9, 12], center = false); } multmatrix([[1, 0, 0, 86], [0, 1, 0, 6], [0, 0, 1, 0], [0, 0, 0, 1]]) { - circle($fn = 0, $fa = 12, $fs = 1, r = 6); + circle($fn = 0, $fa = 12, $fs = 2, r = 6); } multmatrix([[1, 0, 0, 6], [0, 1, 0, 6], [0, 0, 1, 0], [0, 0, 0, 1]]) { intersection() { - circle($fn = 0, $fa = 12, $fs = 1, r = 6); + circle($fn = 0, $fa = 12, $fs = 2, r = 6); multmatrix([[1, 0, 0, -12], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) { square(size = [12, 12], center = false); } @@ -87,7 +87,7 @@ } multmatrix([[1, 0, 0, 55], [0, 1, 0, 74], [0, 0, 1, 0], [0, 0, 0, 1]]) { intersection() { - circle($fn = 0, $fa = 12, $fs = 1, r = 6); + circle($fn = 0, $fa = 12, $fs = 2, r = 6); multmatrix([[1, 0, 0, -12], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) { square(size = [12, 12], center = false); } @@ -102,27 +102,27 @@ multmatrix([[-0.5, -0.866025, 0, 0], [0.866025, -0.5, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) { multmatrix([[1, 0, 0, 0], [0, 1, 0, 102], [0, 0, 1, 0], [0, 0, 0, 1]]) { multmatrix([[2.22045e-16, 2.22045e-16, -1, 0], [-1, 0, -2.22045e-16, 0], [0, 1, 2.22045e-16, 0], [0, 0, 0, 1]]) { - linear_extrude(height = 6, center = true, convexity = 10, $fn = 0, $fa = 12, $fs = 1) { + linear_extrude(height = 6, center = true, convexity = 10, $fn = 0, $fa = 12, $fs = 2) { group() { union() { difference() { polygon(points = [[0, 6], [6, 6], [6, 0], [21, 0], [21, 6], [27, 6], [27, 0], [77, 0], [83, 12], [77, 18], [77, 74], [71, 74], [71, 80], [61, 80], [61, 74], [55, 74], [55, 80], [49, 74], [49, 18], [43, 12], [6, 12]], paths = undef, convexity = 1); multmatrix([[1, 0, 0, 43], [0, 1, 0, 18], [0, 0, 1, 0], [0, 0, 0, 1]]) { - circle($fn = 0, $fa = 12, $fs = 1, r = 6); + circle($fn = 0, $fa = 12, $fs = 2, r = 6); } multmatrix([[1, 0, 0, 83], [0, 1, 0, 18], [0, 0, 1, 0], [0, 0, 0, 1]]) { - circle($fn = 0, $fa = 12, $fs = 1, r = 6); + circle($fn = 0, $fa = 12, $fs = 2, r = 6); } } multmatrix([[1, 0, 0, 77], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) { square(size = [9, 12], center = false); } multmatrix([[1, 0, 0, 86], [0, 1, 0, 6], [0, 0, 1, 0], [0, 0, 0, 1]]) { - circle($fn = 0, $fa = 12, $fs = 1, r = 6); + circle($fn = 0, $fa = 12, $fs = 2, r = 6); } multmatrix([[1, 0, 0, 6], [0, 1, 0, 6], [0, 0, 1, 0], [0, 0, 0, 1]]) { intersection() { - circle($fn = 0, $fa = 12, $fs = 1, r = 6); + circle($fn = 0, $fa = 12, $fs = 2, r = 6); multmatrix([[1, 0, 0, -12], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) { square(size = [12, 12], center = false); } @@ -130,7 +130,7 @@ } multmatrix([[1, 0, 0, 55], [0, 1, 0, 74], [0, 0, 1, 0], [0, 0, 0, 1]]) { intersection() { - circle($fn = 0, $fa = 12, $fs = 1, r = 6); + circle($fn = 0, $fa = 12, $fs = 2, r = 6); multmatrix([[1, 0, 0, -12], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) { square(size = [12, 12], center = false); } @@ -145,27 +145,27 @@ multmatrix([[-0.5, 0.866025, 0, 0], [-0.866025, -0.5, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) { multmatrix([[1, 0, 0, 0], [0, 1, 0, 102], [0, 0, 1, 0], [0, 0, 0, 1]]) { multmatrix([[2.22045e-16, 2.22045e-16, -1, 0], [-1, 0, -2.22045e-16, 0], [0, 1, 2.22045e-16, 0], [0, 0, 0, 1]]) { - linear_extrude(height = 6, center = true, convexity = 10, $fn = 0, $fa = 12, $fs = 1) { + linear_extrude(height = 6, center = true, convexity = 10, $fn = 0, $fa = 12, $fs = 2) { group() { union() { difference() { polygon(points = [[0, 6], [6, 6], [6, 0], [21, 0], [21, 6], [27, 6], [27, 0], [77, 0], [83, 12], [77, 18], [77, 74], [71, 74], [71, 80], [61, 80], [61, 74], [55, 74], [55, 80], [49, 74], [49, 18], [43, 12], [6, 12]], paths = undef, convexity = 1); multmatrix([[1, 0, 0, 43], [0, 1, 0, 18], [0, 0, 1, 0], [0, 0, 0, 1]]) { - circle($fn = 0, $fa = 12, $fs = 1, r = 6); + circle($fn = 0, $fa = 12, $fs = 2, r = 6); } multmatrix([[1, 0, 0, 83], [0, 1, 0, 18], [0, 0, 1, 0], [0, 0, 0, 1]]) { - circle($fn = 0, $fa = 12, $fs = 1, r = 6); + circle($fn = 0, $fa = 12, $fs = 2, r = 6); } } multmatrix([[1, 0, 0, 77], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) { square(size = [9, 12], center = false); } multmatrix([[1, 0, 0, 86], [0, 1, 0, 6], [0, 0, 1, 0], [0, 0, 0, 1]]) { - circle($fn = 0, $fa = 12, $fs = 1, r = 6); + circle($fn = 0, $fa = 12, $fs = 2, r = 6); } multmatrix([[1, 0, 0, 6], [0, 1, 0, 6], [0, 0, 1, 0], [0, 0, 0, 1]]) { intersection() { - circle($fn = 0, $fa = 12, $fs = 1, r = 6); + circle($fn = 0, $fa = 12, $fs = 2, r = 6); multmatrix([[1, 0, 0, -12], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) { square(size = [12, 12], center = false); } @@ -173,7 +173,7 @@ } multmatrix([[1, 0, 0, 55], [0, 1, 0, 74], [0, 0, 1, 0], [0, 0, 0, 1]]) { intersection() { - circle($fn = 0, $fa = 12, $fs = 1, r = 6); + circle($fn = 0, $fa = 12, $fs = 2, r = 6); multmatrix([[1, 0, 0, -12], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) { square(size = [12, 12], center = false); } @@ -189,13 +189,13 @@ } %multmatrix([[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 12], [0, 0, 0, 1]]) { group() { - rotate_extrude(convexity = 2, $fn = 0, $fa = 12, $fs = 1) { + rotate_extrude(convexity = 2, $fn = 0, $fa = 12, $fs = 2) { square(size = [25, 68], center = false); multmatrix([[1, 0, 0, 0], [0, 1, 0, 68], [0, 0, 1, 0], [0, 0, 0, 1]]) { intersection() { square(size = [25, 25], center = false); multmatrix([[1, 0, 0, 0], [0, 0.7, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) { - circle($fn = 0, $fa = 12, $fs = 1, r = 25); + circle($fn = 0, $fa = 12, $fs = 2, r = 25); } } } @@ -204,7 +204,7 @@ multmatrix([[1, 0, 0, 0], [0, 1, 0, -12.5], [0, 0, 1, 0], [0, 0, 0, 1]]) { square(size = [12.5, 25], center = false); } - circle($fn = 0, $fa = 12, $fs = 1, r = 12.5); + circle($fn = 0, $fa = 12, $fs = 2, r = 12.5); } } } diff --git a/tests/regression/dumptest/example018-expected.txt b/tests/regression/dumptest/example018-expected.txt index d83440a6..6691d385 100644 --- a/tests/regression/dumptest/example018-expected.txt +++ b/tests/regression/dumptest/example018-expected.txt @@ -6,7 +6,7 @@ cube(size = [60, 60, 60], center = true); } multmatrix([[1, 0, 0, -50], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) { - cylinder($fn = 0, $fa = 12, $fs = 1, h = 50, r1 = 30, r2 = 30, center = true); + cylinder($fn = 0, $fa = 12, $fs = 2, h = 50, r1 = 30, r2 = 30, center = true); } multmatrix([[1, 0, 0, 50], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) { union() { @@ -23,7 +23,7 @@ } } multmatrix([[1, 0, 0, 150], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) { - sphere($fn = 0, $fa = 12, $fs = 1, r = 30); + sphere($fn = 0, $fa = 12, $fs = 2, r = 30); } } } @@ -32,7 +32,7 @@ group() { group() { multmatrix([[1, 0, 0, -150], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) { - cylinder($fn = 0, $fa = 12, $fs = 1, h = 50, r1 = 30, r2 = 30, center = true); + cylinder($fn = 0, $fa = 12, $fs = 2, h = 50, r1 = 30, r2 = 30, center = true); } multmatrix([[1, 0, 0, -50], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) { union() { @@ -49,7 +49,7 @@ } } multmatrix([[1, 0, 0, 50], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) { - sphere($fn = 0, $fa = 12, $fs = 1, r = 30); + sphere($fn = 0, $fa = 12, $fs = 2, r = 30); } multmatrix([[1, 0, 0, 150], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) { cube(size = [60, 60, 60], center = true); @@ -75,13 +75,13 @@ } } multmatrix([[1, 0, 0, -50], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) { - sphere($fn = 0, $fa = 12, $fs = 1, r = 30); + sphere($fn = 0, $fa = 12, $fs = 2, r = 30); } multmatrix([[1, 0, 0, 50], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) { cube(size = [60, 60, 60], center = true); } multmatrix([[1, 0, 0, 150], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) { - cylinder($fn = 0, $fa = 12, $fs = 1, h = 50, r1 = 30, r2 = 30, center = true); + cylinder($fn = 0, $fa = 12, $fs = 2, h = 50, r1 = 30, r2 = 30, center = true); } } } @@ -90,13 +90,13 @@ group() { group() { multmatrix([[1, 0, 0, -150], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) { - sphere($fn = 0, $fa = 12, $fs = 1, r = 30); + sphere($fn = 0, $fa = 12, $fs = 2, r = 30); } multmatrix([[1, 0, 0, -50], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) { cube(size = [60, 60, 60], center = true); } multmatrix([[1, 0, 0, 50], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) { - cylinder($fn = 0, $fa = 12, $fs = 1, h = 50, r1 = 30, r2 = 30, center = true); + cylinder($fn = 0, $fa = 12, $fs = 2, h = 50, r1 = 30, r2 = 30, center = true); } multmatrix([[1, 0, 0, 150], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) { union() { diff --git a/tests/regression/dumptest/example019-expected.txt b/tests/regression/dumptest/example019-expected.txt index 2ad2fb62..47406e65 100644 --- a/tests/regression/dumptest/example019-expected.txt +++ b/tests/regression/dumptest/example019-expected.txt @@ -1,126 +1,126 @@ group() { multmatrix([[1, 0, 0, -100], [0, 1, 0, 0], [0, 0, 1, -30], [0, 0, 0, 1]]) { - cylinder($fn = 0, $fa = 12, $fs = 1, h = 45, r1 = 6, r2 = 2, center = false); + cylinder($fn = 0, $fa = 12, $fs = 2, h = 45, r1 = 6, r2 = 2, center = false); } multmatrix([[1, 0, 0, -95], [0, 1, 0, 0], [0, 0, 1, -30], [0, 0, 0, 1]]) { - cylinder($fn = 0, $fa = 12, $fs = 1, h = 46.5, r1 = 6, r2 = 2, center = false); + cylinder($fn = 0, $fa = 12, $fs = 2, h = 46.5, r1 = 6, r2 = 2, center = false); } multmatrix([[1, 0, 0, -90], [0, 1, 0, 0], [0, 0, 1, -30], [0, 0, 0, 1]]) { - cylinder($fn = 0, $fa = 12, $fs = 1, h = 48, r1 = 6, r2 = 2, center = false); + cylinder($fn = 0, $fa = 12, $fs = 2, h = 48, r1 = 6, r2 = 2, center = false); } multmatrix([[1, 0, 0, -85], [0, 1, 0, 0], [0, 0, 1, -30], [0, 0, 0, 1]]) { - cylinder($fn = 0, $fa = 12, $fs = 1, h = 49.5, r1 = 6, r2 = 2, center = false); + cylinder($fn = 0, $fa = 12, $fs = 2, h = 49.5, r1 = 6, r2 = 2, center = false); } multmatrix([[1, 0, 0, -80], [0, 1, 0, 0], [0, 0, 1, -30], [0, 0, 0, 1]]) { - cylinder($fn = 0, $fa = 12, $fs = 1, h = 51, r1 = 6, r2 = 2, center = false); + cylinder($fn = 0, $fa = 12, $fs = 2, h = 51, r1 = 6, r2 = 2, center = false); } multmatrix([[1, 0, 0, -75], [0, 1, 0, 0], [0, 0, 1, -30], [0, 0, 0, 1]]) { - cylinder($fn = 0, $fa = 12, $fs = 1, h = 52.5, r1 = 6, r2 = 2, center = false); + cylinder($fn = 0, $fa = 12, $fs = 2, h = 52.5, r1 = 6, r2 = 2, center = false); } multmatrix([[1, 0, 0, -70], [0, 1, 0, 0], [0, 0, 1, -30], [0, 0, 0, 1]]) { - cylinder($fn = 0, $fa = 12, $fs = 1, h = 54, r1 = 6, r2 = 2, center = false); + cylinder($fn = 0, $fa = 12, $fs = 2, h = 54, r1 = 6, r2 = 2, center = false); } multmatrix([[1, 0, 0, -65], [0, 1, 0, 0], [0, 0, 1, -30], [0, 0, 0, 1]]) { - cylinder($fn = 0, $fa = 12, $fs = 1, h = 55.5, r1 = 6, r2 = 2, center = false); + cylinder($fn = 0, $fa = 12, $fs = 2, h = 55.5, r1 = 6, r2 = 2, center = false); } multmatrix([[1, 0, 0, -60], [0, 1, 0, 0], [0, 0, 1, -30], [0, 0, 0, 1]]) { - cylinder($fn = 0, $fa = 12, $fs = 1, h = 57, r1 = 6, r2 = 2, center = false); + cylinder($fn = 0, $fa = 12, $fs = 2, h = 57, r1 = 6, r2 = 2, center = false); } multmatrix([[1, 0, 0, -55], [0, 1, 0, 0], [0, 0, 1, -30], [0, 0, 0, 1]]) { - cylinder($fn = 0, $fa = 12, $fs = 1, h = 58.5, r1 = 6, r2 = 2, center = false); + cylinder($fn = 0, $fa = 12, $fs = 2, h = 58.5, r1 = 6, r2 = 2, center = false); } multmatrix([[1, 0, 0, -50], [0, 1, 0, 0], [0, 0, 1, -30], [0, 0, 0, 1]]) { - cylinder($fn = 0, $fa = 12, $fs = 1, h = 60, r1 = 6, r2 = 2, center = false); + cylinder($fn = 0, $fa = 12, $fs = 2, h = 60, r1 = 6, r2 = 2, center = false); } multmatrix([[1, 0, 0, -45], [0, 1, 0, 0], [0, 0, 1, -30], [0, 0, 0, 1]]) { - cylinder($fn = 0, $fa = 12, $fs = 1, h = 59, r1 = 6, r2 = 2, center = false); + cylinder($fn = 0, $fa = 12, $fs = 2, h = 59, r1 = 6, r2 = 2, center = false); } multmatrix([[1, 0, 0, -40], [0, 1, 0, 0], [0, 0, 1, -30], [0, 0, 0, 1]]) { - cylinder($fn = 0, $fa = 12, $fs = 1, h = 58, r1 = 6, r2 = 2, center = false); + cylinder($fn = 0, $fa = 12, $fs = 2, h = 58, r1 = 6, r2 = 2, center = false); } multmatrix([[1, 0, 0, -35], [0, 1, 0, 0], [0, 0, 1, -30], [0, 0, 0, 1]]) { - cylinder($fn = 0, $fa = 12, $fs = 1, h = 57, r1 = 6, r2 = 2, center = false); + cylinder($fn = 0, $fa = 12, $fs = 2, h = 57, r1 = 6, r2 = 2, center = false); } multmatrix([[1, 0, 0, -30], [0, 1, 0, 0], [0, 0, 1, -30], [0, 0, 0, 1]]) { - cylinder($fn = 0, $fa = 12, $fs = 1, h = 56, r1 = 6, r2 = 2, center = false); + cylinder($fn = 0, $fa = 12, $fs = 2, h = 56, r1 = 6, r2 = 2, center = false); } multmatrix([[1, 0, 0, -25], [0, 1, 0, 0], [0, 0, 1, -30], [0, 0, 0, 1]]) { - cylinder($fn = 0, $fa = 12, $fs = 1, h = 55, r1 = 6, r2 = 2, center = false); + cylinder($fn = 0, $fa = 12, $fs = 2, h = 55, r1 = 6, r2 = 2, center = false); } multmatrix([[1, 0, 0, -20], [0, 1, 0, 0], [0, 0, 1, -30], [0, 0, 0, 1]]) { - cylinder($fn = 0, $fa = 12, $fs = 1, h = 54, r1 = 6, r2 = 2, center = false); + cylinder($fn = 0, $fa = 12, $fs = 2, h = 54, r1 = 6, r2 = 2, center = false); } multmatrix([[1, 0, 0, -15], [0, 1, 0, 0], [0, 0, 1, -30], [0, 0, 0, 1]]) { - cylinder($fn = 0, $fa = 12, $fs = 1, h = 55.05, r1 = 6, r2 = 2, center = false); + cylinder($fn = 0, $fa = 12, $fs = 2, h = 55.05, r1 = 6, r2 = 2, center = false); } multmatrix([[1, 0, 0, -10], [0, 1, 0, 0], [0, 0, 1, -30], [0, 0, 0, 1]]) { - cylinder($fn = 0, $fa = 12, $fs = 1, h = 56.1, r1 = 6, r2 = 2, center = false); + cylinder($fn = 0, $fa = 12, $fs = 2, h = 56.1, r1 = 6, r2 = 2, center = false); } multmatrix([[1, 0, 0, -5], [0, 1, 0, 0], [0, 0, 1, -30], [0, 0, 0, 1]]) { - cylinder($fn = 0, $fa = 12, $fs = 1, h = 57.15, r1 = 6, r2 = 2, center = false); + cylinder($fn = 0, $fa = 12, $fs = 2, h = 57.15, r1 = 6, r2 = 2, center = false); } multmatrix([[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, -30], [0, 0, 0, 1]]) { - cylinder($fn = 0, $fa = 12, $fs = 1, h = 58.2, r1 = 6, r2 = 2, center = false); + cylinder($fn = 0, $fa = 12, $fs = 2, h = 58.2, r1 = 6, r2 = 2, center = false); } multmatrix([[1, 0, 0, 5], [0, 1, 0, 0], [0, 0, 1, -30], [0, 0, 0, 1]]) { - cylinder($fn = 0, $fa = 12, $fs = 1, h = 59.25, r1 = 6, r2 = 2, center = false); + cylinder($fn = 0, $fa = 12, $fs = 2, h = 59.25, r1 = 6, r2 = 2, center = false); } multmatrix([[1, 0, 0, 10], [0, 1, 0, 0], [0, 0, 1, -30], [0, 0, 0, 1]]) { - cylinder($fn = 0, $fa = 12, $fs = 1, h = 60.3, r1 = 6, r2 = 2, center = false); + cylinder($fn = 0, $fa = 12, $fs = 2, h = 60.3, r1 = 6, r2 = 2, center = false); } multmatrix([[1, 0, 0, 15], [0, 1, 0, 0], [0, 0, 1, -30], [0, 0, 0, 1]]) { - cylinder($fn = 0, $fa = 12, $fs = 1, h = 61.35, r1 = 6, r2 = 2, center = false); + cylinder($fn = 0, $fa = 12, $fs = 2, h = 61.35, r1 = 6, r2 = 2, center = false); } multmatrix([[1, 0, 0, 20], [0, 1, 0, 0], [0, 0, 1, -30], [0, 0, 0, 1]]) { - cylinder($fn = 0, $fa = 12, $fs = 1, h = 62.4, r1 = 6, r2 = 2, center = false); + cylinder($fn = 0, $fa = 12, $fs = 2, h = 62.4, r1 = 6, r2 = 2, center = false); } multmatrix([[1, 0, 0, 25], [0, 1, 0, 0], [0, 0, 1, -30], [0, 0, 0, 1]]) { - cylinder($fn = 0, $fa = 12, $fs = 1, h = 63.45, r1 = 6, r2 = 2, center = false); + cylinder($fn = 0, $fa = 12, $fs = 2, h = 63.45, r1 = 6, r2 = 2, center = false); } multmatrix([[1, 0, 0, 30], [0, 1, 0, 0], [0, 0, 1, -30], [0, 0, 0, 1]]) { - cylinder($fn = 0, $fa = 12, $fs = 1, h = 64.5, r1 = 6, r2 = 2, center = false); + cylinder($fn = 0, $fa = 12, $fs = 2, h = 64.5, r1 = 6, r2 = 2, center = false); } multmatrix([[1, 0, 0, 35], [0, 1, 0, 0], [0, 0, 1, -30], [0, 0, 0, 1]]) { - cylinder($fn = 0, $fa = 12, $fs = 1, h = 65.55, r1 = 6, r2 = 2, center = false); + cylinder($fn = 0, $fa = 12, $fs = 2, h = 65.55, r1 = 6, r2 = 2, center = false); } multmatrix([[1, 0, 0, 40], [0, 1, 0, 0], [0, 0, 1, -30], [0, 0, 0, 1]]) { - cylinder($fn = 0, $fa = 12, $fs = 1, h = 66.6, r1 = 6, r2 = 2, center = false); + cylinder($fn = 0, $fa = 12, $fs = 2, h = 66.6, r1 = 6, r2 = 2, center = false); } multmatrix([[1, 0, 0, 45], [0, 1, 0, 0], [0, 0, 1, -30], [0, 0, 0, 1]]) { - cylinder($fn = 0, $fa = 12, $fs = 1, h = 67.65, r1 = 6, r2 = 2, center = false); + cylinder($fn = 0, $fa = 12, $fs = 2, h = 67.65, r1 = 6, r2 = 2, center = false); } multmatrix([[1, 0, 0, 50], [0, 1, 0, 0], [0, 0, 1, -30], [0, 0, 0, 1]]) { - cylinder($fn = 0, $fa = 12, $fs = 1, h = 68.7, r1 = 6, r2 = 2, center = false); + cylinder($fn = 0, $fa = 12, $fs = 2, h = 68.7, r1 = 6, r2 = 2, center = false); } multmatrix([[1, 0, 0, 55], [0, 1, 0, 0], [0, 0, 1, -30], [0, 0, 0, 1]]) { - cylinder($fn = 0, $fa = 12, $fs = 1, h = 69.75, r1 = 6, r2 = 2, center = false); + cylinder($fn = 0, $fa = 12, $fs = 2, h = 69.75, r1 = 6, r2 = 2, center = false); } multmatrix([[1, 0, 0, 60], [0, 1, 0, 0], [0, 0, 1, -30], [0, 0, 0, 1]]) { - cylinder($fn = 0, $fa = 12, $fs = 1, h = 70.8, r1 = 6, r2 = 2, center = false); + cylinder($fn = 0, $fa = 12, $fs = 2, h = 70.8, r1 = 6, r2 = 2, center = false); } multmatrix([[1, 0, 0, 65], [0, 1, 0, 0], [0, 0, 1, -30], [0, 0, 0, 1]]) { - cylinder($fn = 0, $fa = 12, $fs = 1, h = 71.85, r1 = 6, r2 = 2, center = false); + cylinder($fn = 0, $fa = 12, $fs = 2, h = 71.85, r1 = 6, r2 = 2, center = false); } multmatrix([[1, 0, 0, 70], [0, 1, 0, 0], [0, 0, 1, -30], [0, 0, 0, 1]]) { - cylinder($fn = 0, $fa = 12, $fs = 1, h = 72.9, r1 = 6, r2 = 2, center = false); + cylinder($fn = 0, $fa = 12, $fs = 2, h = 72.9, r1 = 6, r2 = 2, center = false); } multmatrix([[1, 0, 0, 75], [0, 1, 0, 0], [0, 0, 1, -30], [0, 0, 0, 1]]) { - cylinder($fn = 0, $fa = 12, $fs = 1, h = 73.95, r1 = 6, r2 = 2, center = false); + cylinder($fn = 0, $fa = 12, $fs = 2, h = 73.95, r1 = 6, r2 = 2, center = false); } multmatrix([[1, 0, 0, 80], [0, 1, 0, 0], [0, 0, 1, -30], [0, 0, 0, 1]]) { - cylinder($fn = 0, $fa = 12, $fs = 1, h = 75, r1 = 6, r2 = 2, center = false); + cylinder($fn = 0, $fa = 12, $fs = 2, h = 75, r1 = 6, r2 = 2, center = false); } multmatrix([[1, 0, 0, 85], [0, 1, 0, 0], [0, 0, 1, -30], [0, 0, 0, 1]]) { - cylinder($fn = 0, $fa = 12, $fs = 1, h = 70.0714, r1 = 6, r2 = 2, center = false); + cylinder($fn = 0, $fa = 12, $fs = 2, h = 70.0714, r1 = 6, r2 = 2, center = false); } multmatrix([[1, 0, 0, 90], [0, 1, 0, 0], [0, 0, 1, -30], [0, 0, 0, 1]]) { - cylinder($fn = 0, $fa = 12, $fs = 1, h = 65.1429, r1 = 6, r2 = 2, center = false); + cylinder($fn = 0, $fa = 12, $fs = 2, h = 65.1429, r1 = 6, r2 = 2, center = false); } multmatrix([[1, 0, 0, 95], [0, 1, 0, 0], [0, 0, 1, -30], [0, 0, 0, 1]]) { - cylinder($fn = 0, $fa = 12, $fs = 1, h = 60.2143, r1 = 6, r2 = 2, center = false); + cylinder($fn = 0, $fa = 12, $fs = 2, h = 60.2143, r1 = 6, r2 = 2, center = false); } multmatrix([[1, 0, 0, 100], [0, 1, 0, 0], [0, 0, 1, -30], [0, 0, 0, 1]]) { - cylinder($fn = 0, $fa = 12, $fs = 1, h = 55.2857, r1 = 6, r2 = 2, center = false); + cylinder($fn = 0, $fa = 12, $fs = 2, h = 55.2857, r1 = 6, r2 = 2, center = false); } } diff --git a/tests/regression/dumptest/example022-expected.txt b/tests/regression/dumptest/example022-expected.txt index 4f224be5..bd200f80 100644 --- a/tests/regression/dumptest/example022-expected.txt +++ b/tests/regression/dumptest/example022-expected.txt @@ -5,16 +5,16 @@ cube(size = [20, 20, 40], center = true); group() { multmatrix([[1, 0, 0, -5], [0, 1, 0, -10], [0, 0, 1, 0], [0, 0, 0, 1]]) { - cylinder($fn = 0, $fa = 12, $fs = 1, h = 40, r1 = 5, r2 = 5, center = true); + cylinder($fn = 0, $fa = 12, $fs = 2, h = 40, r1 = 5, r2 = 5, center = true); } multmatrix([[1, 0, 0, -5], [0, 1, 0, 10], [0, 0, 1, 0], [0, 0, 0, 1]]) { - cylinder($fn = 0, $fa = 12, $fs = 1, h = 40, r1 = 5, r2 = 5, center = true); + cylinder($fn = 0, $fa = 12, $fs = 2, h = 40, r1 = 5, r2 = 5, center = true); } multmatrix([[1, 0, 0, 5], [0, 1, 0, -10], [0, 0, 1, 0], [0, 0, 0, 1]]) { - cylinder($fn = 0, $fa = 12, $fs = 1, h = 40, r1 = 5, r2 = 5, center = true); + cylinder($fn = 0, $fa = 12, $fs = 2, h = 40, r1 = 5, r2 = 5, center = true); } multmatrix([[1, 0, 0, 5], [0, 1, 0, 10], [0, 0, 1, 0], [0, 0, 0, 1]]) { - cylinder($fn = 0, $fa = 12, $fs = 1, h = 40, r1 = 5, r2 = 5, center = true); + cylinder($fn = 0, $fa = 12, $fs = 2, h = 40, r1 = 5, r2 = 5, center = true); } } } @@ -30,94 +30,94 @@ group() { multmatrix([[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) { multmatrix([[1, 0, 0, -5], [0, 1, 0, -10], [0, 0, 1, 0], [0, 0, 0, 1]]) { - cylinder($fn = 0, $fa = 12, $fs = 1, h = 30, r1 = 5, r2 = 5, center = true); + cylinder($fn = 0, $fa = 12, $fs = 2, h = 30, r1 = 5, r2 = 5, center = true); } } multmatrix([[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) { multmatrix([[1, 0, 0, -5], [0, 1, 0, 10], [0, 0, 1, 0], [0, 0, 0, 1]]) { - cylinder($fn = 0, $fa = 12, $fs = 1, h = 30, r1 = 5, r2 = 5, center = true); + cylinder($fn = 0, $fa = 12, $fs = 2, h = 30, r1 = 5, r2 = 5, center = true); } } multmatrix([[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) { multmatrix([[1, 0, 0, 5], [0, 1, 0, -10], [0, 0, 1, 0], [0, 0, 0, 1]]) { - cylinder($fn = 0, $fa = 12, $fs = 1, h = 30, r1 = 5, r2 = 5, center = true); + cylinder($fn = 0, $fa = 12, $fs = 2, h = 30, r1 = 5, r2 = 5, center = true); } } multmatrix([[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) { multmatrix([[1, 0, 0, 5], [0, 1, 0, 10], [0, 0, 1, 0], [0, 0, 0, 1]]) { - cylinder($fn = 0, $fa = 12, $fs = 1, h = 30, r1 = 5, r2 = 5, center = true); + cylinder($fn = 0, $fa = 12, $fs = 2, h = 30, r1 = 5, r2 = 5, center = true); } } } group() { multmatrix([[2.22045e-16, -2.22045e-16, 1, 0], [1, 0, -2.22045e-16, 0], [0, 1, 2.22045e-16, 0], [0, 0, 0, 1]]) { multmatrix([[1, 0, 0, -10], [0, 1, 0, -15], [0, 0, 1, 0], [0, 0, 0, 1]]) { - cylinder($fn = 0, $fa = 12, $fs = 1, h = 10, r1 = 5, r2 = 5, center = true); + cylinder($fn = 0, $fa = 12, $fs = 2, h = 10, r1 = 5, r2 = 5, center = true); } } multmatrix([[2.22045e-16, -2.22045e-16, 1, 0], [1, 0, -2.22045e-16, 0], [0, 1, 2.22045e-16, 0], [0, 0, 0, 1]]) { multmatrix([[1, 0, 0, -10], [0, 1, 0, 15], [0, 0, 1, 0], [0, 0, 0, 1]]) { - cylinder($fn = 0, $fa = 12, $fs = 1, h = 10, r1 = 5, r2 = 5, center = true); + cylinder($fn = 0, $fa = 12, $fs = 2, h = 10, r1 = 5, r2 = 5, center = true); } } multmatrix([[2.22045e-16, -2.22045e-16, 1, 0], [1, 0, -2.22045e-16, 0], [0, 1, 2.22045e-16, 0], [0, 0, 0, 1]]) { multmatrix([[1, 0, 0, 10], [0, 1, 0, -15], [0, 0, 1, 0], [0, 0, 0, 1]]) { - cylinder($fn = 0, $fa = 12, $fs = 1, h = 10, r1 = 5, r2 = 5, center = true); + cylinder($fn = 0, $fa = 12, $fs = 2, h = 10, r1 = 5, r2 = 5, center = true); } } multmatrix([[2.22045e-16, -2.22045e-16, 1, 0], [1, 0, -2.22045e-16, 0], [0, 1, 2.22045e-16, 0], [0, 0, 0, 1]]) { multmatrix([[1, 0, 0, 10], [0, 1, 0, 15], [0, 0, 1, 0], [0, 0, 0, 1]]) { - cylinder($fn = 0, $fa = 12, $fs = 1, h = 10, r1 = 5, r2 = 5, center = true); + cylinder($fn = 0, $fa = 12, $fs = 2, h = 10, r1 = 5, r2 = 5, center = true); } } } group() { multmatrix([[2.22045e-16, 1, 2.22045e-16, 0], [0, 2.22045e-16, -1, 0], [-1, 2.22045e-16, 0, 0], [0, 0, 0, 1]]) { multmatrix([[1, 0, 0, -15], [0, 1, 0, -5], [0, 0, 1, 0], [0, 0, 0, 1]]) { - cylinder($fn = 0, $fa = 12, $fs = 1, h = 20, r1 = 5, r2 = 5, center = true); + cylinder($fn = 0, $fa = 12, $fs = 2, h = 20, r1 = 5, r2 = 5, center = true); } } multmatrix([[2.22045e-16, 1, 2.22045e-16, 0], [0, 2.22045e-16, -1, 0], [-1, 2.22045e-16, 0, 0], [0, 0, 0, 1]]) { multmatrix([[1, 0, 0, -15], [0, 1, 0, 5], [0, 0, 1, 0], [0, 0, 0, 1]]) { - cylinder($fn = 0, $fa = 12, $fs = 1, h = 20, r1 = 5, r2 = 5, center = true); + cylinder($fn = 0, $fa = 12, $fs = 2, h = 20, r1 = 5, r2 = 5, center = true); } } multmatrix([[2.22045e-16, 1, 2.22045e-16, 0], [0, 2.22045e-16, -1, 0], [-1, 2.22045e-16, 0, 0], [0, 0, 0, 1]]) { multmatrix([[1, 0, 0, 15], [0, 1, 0, -5], [0, 0, 1, 0], [0, 0, 0, 1]]) { - cylinder($fn = 0, $fa = 12, $fs = 1, h = 20, r1 = 5, r2 = 5, center = true); + cylinder($fn = 0, $fa = 12, $fs = 2, h = 20, r1 = 5, r2 = 5, center = true); } } multmatrix([[2.22045e-16, 1, 2.22045e-16, 0], [0, 2.22045e-16, -1, 0], [-1, 2.22045e-16, 0, 0], [0, 0, 0, 1]]) { multmatrix([[1, 0, 0, 15], [0, 1, 0, 5], [0, 0, 1, 0], [0, 0, 0, 1]]) { - cylinder($fn = 0, $fa = 12, $fs = 1, h = 20, r1 = 5, r2 = 5, center = true); + cylinder($fn = 0, $fa = 12, $fs = 2, h = 20, r1 = 5, r2 = 5, center = true); } } } } group() { multmatrix([[1, 0, 0, -5], [0, 1, 0, -10], [0, 0, 1, -15], [0, 0, 0, 1]]) { - sphere($fn = 0, $fa = 12, $fs = 1, r = 5); + sphere($fn = 0, $fa = 12, $fs = 2, r = 5); } multmatrix([[1, 0, 0, -5], [0, 1, 0, -10], [0, 0, 1, 15], [0, 0, 0, 1]]) { - sphere($fn = 0, $fa = 12, $fs = 1, r = 5); + sphere($fn = 0, $fa = 12, $fs = 2, r = 5); } multmatrix([[1, 0, 0, -5], [0, 1, 0, 10], [0, 0, 1, -15], [0, 0, 0, 1]]) { - sphere($fn = 0, $fa = 12, $fs = 1, r = 5); + sphere($fn = 0, $fa = 12, $fs = 2, r = 5); } multmatrix([[1, 0, 0, -5], [0, 1, 0, 10], [0, 0, 1, 15], [0, 0, 0, 1]]) { - sphere($fn = 0, $fa = 12, $fs = 1, r = 5); + sphere($fn = 0, $fa = 12, $fs = 2, r = 5); } multmatrix([[1, 0, 0, 5], [0, 1, 0, -10], [0, 0, 1, -15], [0, 0, 0, 1]]) { - sphere($fn = 0, $fa = 12, $fs = 1, r = 5); + sphere($fn = 0, $fa = 12, $fs = 2, r = 5); } multmatrix([[1, 0, 0, 5], [0, 1, 0, -10], [0, 0, 1, 15], [0, 0, 0, 1]]) { - sphere($fn = 0, $fa = 12, $fs = 1, r = 5); + sphere($fn = 0, $fa = 12, $fs = 2, r = 5); } multmatrix([[1, 0, 0, 5], [0, 1, 0, 10], [0, 0, 1, -15], [0, 0, 0, 1]]) { - sphere($fn = 0, $fa = 12, $fs = 1, r = 5); + sphere($fn = 0, $fa = 12, $fs = 2, r = 5); } multmatrix([[1, 0, 0, 5], [0, 1, 0, 10], [0, 0, 1, 15], [0, 0, 0, 1]]) { - sphere($fn = 0, $fa = 12, $fs = 1, r = 5); + sphere($fn = 0, $fa = 12, $fs = 2, r = 5); } } } diff --git a/tests/regression/dumptest/for-nested-tests-expected.txt b/tests/regression/dumptest/for-nested-tests-expected.txt index 24fd447e..d1034b33 100644 --- a/tests/regression/dumptest/for-nested-tests-expected.txt +++ b/tests/regression/dumptest/for-nested-tests-expected.txt @@ -1,111 +1,111 @@ group() { multmatrix([[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) { - sphere($fn = 0, $fa = 12, $fs = 1, r = 3); + sphere($fn = 0, $fa = 12, $fs = 2, r = 3); } multmatrix([[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 20], [0, 0, 0, 1]]) { - sphere($fn = 0, $fa = 12, $fs = 1, r = 3); + sphere($fn = 0, $fa = 12, $fs = 2, r = 3); } multmatrix([[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 30], [0, 0, 0, 1]]) { - sphere($fn = 0, $fa = 12, $fs = 1, r = 3); + sphere($fn = 0, $fa = 12, $fs = 2, r = 3); } multmatrix([[1, 0, 0, 0], [0, 1, 0, 5], [0, 0, 1, 0], [0, 0, 0, 1]]) { - sphere($fn = 0, $fa = 12, $fs = 1, r = 3); + sphere($fn = 0, $fa = 12, $fs = 2, r = 3); } multmatrix([[1, 0, 0, 0], [0, 1, 0, 5], [0, 0, 1, 20], [0, 0, 0, 1]]) { - sphere($fn = 0, $fa = 12, $fs = 1, r = 3); + sphere($fn = 0, $fa = 12, $fs = 2, r = 3); } multmatrix([[1, 0, 0, 0], [0, 1, 0, 5], [0, 0, 1, 30], [0, 0, 0, 1]]) { - sphere($fn = 0, $fa = 12, $fs = 1, r = 3); + sphere($fn = 0, $fa = 12, $fs = 2, r = 3); } multmatrix([[1, 0, 0, 0], [0, 1, 0, 10], [0, 0, 1, 0], [0, 0, 0, 1]]) { - sphere($fn = 0, $fa = 12, $fs = 1, r = 3); + sphere($fn = 0, $fa = 12, $fs = 2, r = 3); } multmatrix([[1, 0, 0, 0], [0, 1, 0, 10], [0, 0, 1, 20], [0, 0, 0, 1]]) { - sphere($fn = 0, $fa = 12, $fs = 1, r = 3); + sphere($fn = 0, $fa = 12, $fs = 2, r = 3); } multmatrix([[1, 0, 0, 0], [0, 1, 0, 10], [0, 0, 1, 30], [0, 0, 0, 1]]) { - sphere($fn = 0, $fa = 12, $fs = 1, r = 3); + sphere($fn = 0, $fa = 12, $fs = 2, r = 3); } multmatrix([[1, 0, 0, 10], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) { - sphere($fn = 0, $fa = 12, $fs = 1, r = 3); + sphere($fn = 0, $fa = 12, $fs = 2, r = 3); } multmatrix([[1, 0, 0, 10], [0, 1, 0, 0], [0, 0, 1, 20], [0, 0, 0, 1]]) { - sphere($fn = 0, $fa = 12, $fs = 1, r = 3); + sphere($fn = 0, $fa = 12, $fs = 2, r = 3); } multmatrix([[1, 0, 0, 10], [0, 1, 0, 0], [0, 0, 1, 30], [0, 0, 0, 1]]) { - sphere($fn = 0, $fa = 12, $fs = 1, r = 3); + sphere($fn = 0, $fa = 12, $fs = 2, r = 3); } multmatrix([[1, 0, 0, 10], [0, 1, 0, 5], [0, 0, 1, 0], [0, 0, 0, 1]]) { - sphere($fn = 0, $fa = 12, $fs = 1, r = 3); + sphere($fn = 0, $fa = 12, $fs = 2, r = 3); } multmatrix([[1, 0, 0, 10], [0, 1, 0, 5], [0, 0, 1, 20], [0, 0, 0, 1]]) { - sphere($fn = 0, $fa = 12, $fs = 1, r = 3); + sphere($fn = 0, $fa = 12, $fs = 2, r = 3); } multmatrix([[1, 0, 0, 10], [0, 1, 0, 5], [0, 0, 1, 30], [0, 0, 0, 1]]) { - sphere($fn = 0, $fa = 12, $fs = 1, r = 3); + sphere($fn = 0, $fa = 12, $fs = 2, r = 3); } multmatrix([[1, 0, 0, 10], [0, 1, 0, 10], [0, 0, 1, 0], [0, 0, 0, 1]]) { - sphere($fn = 0, $fa = 12, $fs = 1, r = 3); + sphere($fn = 0, $fa = 12, $fs = 2, r = 3); } multmatrix([[1, 0, 0, 10], [0, 1, 0, 10], [0, 0, 1, 20], [0, 0, 0, 1]]) { - sphere($fn = 0, $fa = 12, $fs = 1, r = 3); + sphere($fn = 0, $fa = 12, $fs = 2, r = 3); } multmatrix([[1, 0, 0, 10], [0, 1, 0, 10], [0, 0, 1, 30], [0, 0, 0, 1]]) { - sphere($fn = 0, $fa = 12, $fs = 1, r = 3); + sphere($fn = 0, $fa = 12, $fs = 2, r = 3); } multmatrix([[1, 0, 0, 20], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) { - sphere($fn = 0, $fa = 12, $fs = 1, r = 3); + sphere($fn = 0, $fa = 12, $fs = 2, r = 3); } multmatrix([[1, 0, 0, 20], [0, 1, 0, 0], [0, 0, 1, 20], [0, 0, 0, 1]]) { - sphere($fn = 0, $fa = 12, $fs = 1, r = 3); + sphere($fn = 0, $fa = 12, $fs = 2, r = 3); } multmatrix([[1, 0, 0, 20], [0, 1, 0, 0], [0, 0, 1, 30], [0, 0, 0, 1]]) { - sphere($fn = 0, $fa = 12, $fs = 1, r = 3); + sphere($fn = 0, $fa = 12, $fs = 2, r = 3); } multmatrix([[1, 0, 0, 20], [0, 1, 0, 5], [0, 0, 1, 0], [0, 0, 0, 1]]) { - sphere($fn = 0, $fa = 12, $fs = 1, r = 3); + sphere($fn = 0, $fa = 12, $fs = 2, r = 3); } multmatrix([[1, 0, 0, 20], [0, 1, 0, 5], [0, 0, 1, 20], [0, 0, 0, 1]]) { - sphere($fn = 0, $fa = 12, $fs = 1, r = 3); + sphere($fn = 0, $fa = 12, $fs = 2, r = 3); } multmatrix([[1, 0, 0, 20], [0, 1, 0, 5], [0, 0, 1, 30], [0, 0, 0, 1]]) { - sphere($fn = 0, $fa = 12, $fs = 1, r = 3); + sphere($fn = 0, $fa = 12, $fs = 2, r = 3); } multmatrix([[1, 0, 0, 20], [0, 1, 0, 10], [0, 0, 1, 0], [0, 0, 0, 1]]) { - sphere($fn = 0, $fa = 12, $fs = 1, r = 3); + sphere($fn = 0, $fa = 12, $fs = 2, r = 3); } multmatrix([[1, 0, 0, 20], [0, 1, 0, 10], [0, 0, 1, 20], [0, 0, 0, 1]]) { - sphere($fn = 0, $fa = 12, $fs = 1, r = 3); + sphere($fn = 0, $fa = 12, $fs = 2, r = 3); } multmatrix([[1, 0, 0, 20], [0, 1, 0, 10], [0, 0, 1, 30], [0, 0, 0, 1]]) { - sphere($fn = 0, $fa = 12, $fs = 1, r = 3); + sphere($fn = 0, $fa = 12, $fs = 2, r = 3); } multmatrix([[1, 0, 0, 30], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) { - sphere($fn = 0, $fa = 12, $fs = 1, r = 3); + sphere($fn = 0, $fa = 12, $fs = 2, r = 3); } multmatrix([[1, 0, 0, 30], [0, 1, 0, 0], [0, 0, 1, 20], [0, 0, 0, 1]]) { - sphere($fn = 0, $fa = 12, $fs = 1, r = 3); + sphere($fn = 0, $fa = 12, $fs = 2, r = 3); } multmatrix([[1, 0, 0, 30], [0, 1, 0, 0], [0, 0, 1, 30], [0, 0, 0, 1]]) { - sphere($fn = 0, $fa = 12, $fs = 1, r = 3); + sphere($fn = 0, $fa = 12, $fs = 2, r = 3); } multmatrix([[1, 0, 0, 30], [0, 1, 0, 5], [0, 0, 1, 0], [0, 0, 0, 1]]) { - sphere($fn = 0, $fa = 12, $fs = 1, r = 3); + sphere($fn = 0, $fa = 12, $fs = 2, r = 3); } multmatrix([[1, 0, 0, 30], [0, 1, 0, 5], [0, 0, 1, 20], [0, 0, 0, 1]]) { - sphere($fn = 0, $fa = 12, $fs = 1, r = 3); + sphere($fn = 0, $fa = 12, $fs = 2, r = 3); } multmatrix([[1, 0, 0, 30], [0, 1, 0, 5], [0, 0, 1, 30], [0, 0, 0, 1]]) { - sphere($fn = 0, $fa = 12, $fs = 1, r = 3); + sphere($fn = 0, $fa = 12, $fs = 2, r = 3); } multmatrix([[1, 0, 0, 30], [0, 1, 0, 10], [0, 0, 1, 0], [0, 0, 0, 1]]) { - sphere($fn = 0, $fa = 12, $fs = 1, r = 3); + sphere($fn = 0, $fa = 12, $fs = 2, r = 3); } multmatrix([[1, 0, 0, 30], [0, 1, 0, 10], [0, 0, 1, 20], [0, 0, 0, 1]]) { - sphere($fn = 0, $fa = 12, $fs = 1, r = 3); + sphere($fn = 0, $fa = 12, $fs = 2, r = 3); } multmatrix([[1, 0, 0, 30], [0, 1, 0, 10], [0, 0, 1, 30], [0, 0, 0, 1]]) { - sphere($fn = 0, $fa = 12, $fs = 1, r = 3); + sphere($fn = 0, $fa = 12, $fs = 2, r = 3); } } diff --git a/tests/regression/dumptest/for-tests-expected.txt b/tests/regression/dumptest/for-tests-expected.txt index ce8953b9..f9cf5e0b 100644 --- a/tests/regression/dumptest/for-tests-expected.txt +++ b/tests/regression/dumptest/for-tests-expected.txt @@ -5,60 +5,60 @@ } multmatrix([[1, 0, 0, 10], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) { group() { - cylinder($fn = 0, $fa = 12, $fs = 1, h = 1, r1 = 3, r2 = 3, center = false); + cylinder($fn = 0, $fa = 12, $fs = 2, h = 1, r1 = 3, r2 = 3, center = false); } } group() { multmatrix([[1, 0, 0, -20], [0, 1, 0, 10], [0, 0, 1, 0], [0, 0, 0, 1]]) { - cylinder($fn = 0, $fa = 12, $fs = 1, h = 1, r1 = 1, r2 = 1, center = false); + cylinder($fn = 0, $fa = 12, $fs = 2, h = 1, r1 = 1, r2 = 1, center = false); } multmatrix([[1, 0, 0, -10], [0, 1, 0, 10], [0, 0, 1, 0], [0, 0, 0, 1]]) { - cylinder($fn = 0, $fa = 12, $fs = 1, h = 1, r1 = 2, r2 = 2, center = false); + cylinder($fn = 0, $fa = 12, $fs = 2, h = 1, r1 = 2, r2 = 2, center = false); } multmatrix([[1, 0, 0, 0], [0, 1, 0, 10], [0, 0, 1, 0], [0, 0, 0, 1]]) { - cylinder($fn = 0, $fa = 12, $fs = 1, h = 1, r1 = 3, r2 = 3, center = false); + cylinder($fn = 0, $fa = 12, $fs = 2, h = 1, r1 = 3, r2 = 3, center = false); } multmatrix([[1, 0, 0, 10], [0, 1, 0, 10], [0, 0, 1, 0], [0, 0, 0, 1]]) { - cylinder($fn = 0, $fa = 12, $fs = 1, h = 1, r1 = 4, r2 = 4, center = false); + cylinder($fn = 0, $fa = 12, $fs = 2, h = 1, r1 = 4, r2 = 4, center = false); } multmatrix([[1, 0, 0, 20], [0, 1, 0, 10], [0, 0, 1, 0], [0, 0, 0, 1]]) { - cylinder($fn = 0, $fa = 12, $fs = 1, h = 1, r1 = 5, r2 = 5, center = false); + cylinder($fn = 0, $fa = 12, $fs = 2, h = 1, r1 = 5, r2 = 5, center = false); } } group() { multmatrix([[1, 0, 0, -20], [0, 1, 0, 20], [0, 0, 1, 0], [0, 0, 0, 1]]) { - cylinder($fn = 0, $fa = 12, $fs = 1, h = 1, r1 = 1, r2 = 1, center = false); + cylinder($fn = 0, $fa = 12, $fs = 2, h = 1, r1 = 1, r2 = 1, center = false); } multmatrix([[1, 0, 0, -10], [0, 1, 0, 20], [0, 0, 1, 0], [0, 0, 0, 1]]) { - cylinder($fn = 0, $fa = 12, $fs = 1, h = 1, r1 = 2, r2 = 2, center = false); + cylinder($fn = 0, $fa = 12, $fs = 2, h = 1, r1 = 2, r2 = 2, center = false); } multmatrix([[1, 0, 0, 0], [0, 1, 0, 20], [0, 0, 1, 0], [0, 0, 0, 1]]) { - cylinder($fn = 0, $fa = 12, $fs = 1, h = 1, r1 = 3, r2 = 3, center = false); + cylinder($fn = 0, $fa = 12, $fs = 2, h = 1, r1 = 3, r2 = 3, center = false); } multmatrix([[1, 0, 0, 10], [0, 1, 0, 20], [0, 0, 1, 0], [0, 0, 0, 1]]) { - cylinder($fn = 0, $fa = 12, $fs = 1, h = 1, r1 = 4, r2 = 4, center = false); + cylinder($fn = 0, $fa = 12, $fs = 2, h = 1, r1 = 4, r2 = 4, center = false); } multmatrix([[1, 0, 0, 20], [0, 1, 0, 20], [0, 0, 1, 0], [0, 0, 0, 1]]) { - cylinder($fn = 0, $fa = 12, $fs = 1, h = 1, r1 = 5, r2 = 5, center = false); + cylinder($fn = 0, $fa = 12, $fs = 2, h = 1, r1 = 5, r2 = 5, center = false); } } group() { multmatrix([[1, 0, 0, -20], [0, 1, 0, 30], [0, 0, 1, 0], [0, 0, 0, 1]]) { difference() { - cylinder($fn = 0, $fa = 12, $fs = 1, h = 1, r1 = 1, r2 = 1, center = true); - cylinder($fn = 0, $fa = 12, $fs = 1, h = 2, r1 = 0.5, r2 = 0.5, center = true); + cylinder($fn = 0, $fa = 12, $fs = 2, h = 1, r1 = 1, r2 = 1, center = true); + cylinder($fn = 0, $fa = 12, $fs = 2, h = 2, r1 = 0.5, r2 = 0.5, center = true); } } multmatrix([[1, 0, 0, 0], [0, 1, 0, 30], [0, 0, 1, 0], [0, 0, 0, 1]]) { difference() { - cylinder($fn = 0, $fa = 12, $fs = 1, h = 1, r1 = 3, r2 = 3, center = true); - cylinder($fn = 0, $fa = 12, $fs = 1, h = 2, r1 = 1.5, r2 = 1.5, center = true); + cylinder($fn = 0, $fa = 12, $fs = 2, h = 1, r1 = 3, r2 = 3, center = true); + cylinder($fn = 0, $fa = 12, $fs = 2, h = 2, r1 = 1.5, r2 = 1.5, center = true); } } multmatrix([[1, 0, 0, 20], [0, 1, 0, 30], [0, 0, 1, 0], [0, 0, 0, 1]]) { difference() { - cylinder($fn = 0, $fa = 12, $fs = 1, h = 1, r1 = 5, r2 = 5, center = true); - cylinder($fn = 0, $fa = 12, $fs = 1, h = 2, r1 = 2.5, r2 = 2.5, center = true); + cylinder($fn = 0, $fa = 12, $fs = 2, h = 1, r1 = 5, r2 = 5, center = true); + cylinder($fn = 0, $fa = 12, $fs = 2, h = 2, r1 = 2.5, r2 = 2.5, center = true); } } } @@ -82,19 +82,19 @@ group(); group() { multmatrix([[1, 0, 0, -20], [0, 1, 0, 40], [0, 0, 1, 0], [0, 0, 0, 1]]) { - cylinder($fn = 0, $fa = 12, $fs = 1, h = 1, r1 = 1, r2 = 1, center = false); + cylinder($fn = 0, $fa = 12, $fs = 2, h = 1, r1 = 1, r2 = 1, center = false); } multmatrix([[1, 0, 0, -10], [0, 1, 0, 40], [0, 0, 1, 0], [0, 0, 0, 1]]) { - cylinder($fn = 0, $fa = 12, $fs = 1, h = 1, r1 = 2, r2 = 2, center = false); + cylinder($fn = 0, $fa = 12, $fs = 2, h = 1, r1 = 2, r2 = 2, center = false); } multmatrix([[1, 0, 0, 0], [0, 1, 0, 40], [0, 0, 1, 0], [0, 0, 0, 1]]) { - cylinder($fn = 0, $fa = 12, $fs = 1, h = 1, r1 = 3, r2 = 3, center = false); + cylinder($fn = 0, $fa = 12, $fs = 2, h = 1, r1 = 3, r2 = 3, center = false); } multmatrix([[1, 0, 0, 10], [0, 1, 0, 40], [0, 0, 1, 0], [0, 0, 0, 1]]) { - cylinder($fn = 0, $fa = 12, $fs = 1, h = 1, r1 = 4, r2 = 4, center = false); + cylinder($fn = 0, $fa = 12, $fs = 2, h = 1, r1 = 4, r2 = 4, center = false); } multmatrix([[1, 0, 0, 20], [0, 1, 0, 40], [0, 0, 1, 0], [0, 0, 0, 1]]) { - cylinder($fn = 0, $fa = 12, $fs = 1, h = 1, r1 = 5, r2 = 5, center = false); + cylinder($fn = 0, $fa = 12, $fs = 2, h = 1, r1 = 5, r2 = 5, center = false); } } group(); @@ -102,13 +102,13 @@ group(); group() { multmatrix([[1, 0, 0, -20], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) { - cylinder($fn = 0, $fa = 12, $fs = 1, h = 1, r1 = 1, r2 = 1, center = false); + cylinder($fn = 0, $fa = 12, $fs = 2, h = 1, r1 = 1, r2 = 1, center = false); } multmatrix([[1, 0, 0, -10], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) { - cylinder($fn = 0, $fa = 12, $fs = 1, h = 1, r1 = 2, r2 = 2, center = false); + cylinder($fn = 0, $fa = 12, $fs = 2, h = 1, r1 = 2, r2 = 2, center = false); } multmatrix([[1, 0, 0, 20], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) { - cylinder($fn = 0, $fa = 12, $fs = 1, h = 1, r1 = 5, r2 = 5, center = false); + cylinder($fn = 0, $fa = 12, $fs = 2, h = 1, r1 = 5, r2 = 5, center = false); } } diff --git a/tests/regression/dumptest/highlight-and-background-modifier-expected.txt b/tests/regression/dumptest/highlight-and-background-modifier-expected.txt index 8f13dcdd..a525d68a 100644 --- a/tests/regression/dumptest/highlight-and-background-modifier-expected.txt +++ b/tests/regression/dumptest/highlight-and-background-modifier-expected.txt @@ -1,11 +1,11 @@ difference() { - sphere($fn = 0, $fa = 12, $fs = 1, r = 10); - %cylinder($fn = 0, $fa = 12, $fs = 1, h = 30, r1 = 6, r2 = 6, center = true); + sphere($fn = 0, $fa = 12, $fs = 2, r = 10); + %cylinder($fn = 0, $fa = 12, $fs = 2, h = 30, r1 = 6, r2 = 6, center = true); } multmatrix([[1, 0, 0, 13], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) { difference() { - sphere($fn = 0, $fa = 12, $fs = 1, r = 10); - %cylinder($fn = 0, $fa = 12, $fs = 1, h = 30, r1 = 6, r2 = 6, center = true); + sphere($fn = 0, $fa = 12, $fs = 2, r = 10); + %cylinder($fn = 0, $fa = 12, $fs = 2, h = 30, r1 = 6, r2 = 6, center = true); } } diff --git a/tests/regression/dumptest/highlight-modifier-expected.txt b/tests/regression/dumptest/highlight-modifier-expected.txt index ca75e52a..c0f1da2d 100644 --- a/tests/regression/dumptest/highlight-modifier-expected.txt +++ b/tests/regression/dumptest/highlight-modifier-expected.txt @@ -1,5 +1,5 @@ difference() { - sphere($fn = 0, $fa = 12, $fs = 1, r = 10); - cylinder($fn = 0, $fa = 12, $fs = 1, h = 30, r1 = 6, r2 = 6, center = true); + sphere($fn = 0, $fa = 12, $fs = 2, r = 10); + cylinder($fn = 0, $fa = 12, $fs = 2, h = 30, r1 = 6, r2 = 6, center = true); } diff --git a/tests/regression/dumptest/hull2-tests-expected.txt b/tests/regression/dumptest/hull2-tests-expected.txt index d060d1d4..e4c5a5b1 100644 --- a/tests/regression/dumptest/hull2-tests-expected.txt +++ b/tests/regression/dumptest/hull2-tests-expected.txt @@ -1,11 +1,11 @@ group() { hull() { multmatrix([[1, 0, 0, 15], [0, 1, 0, 10], [0, 0, 1, 0], [0, 0, 0, 1]]) { - circle($fn = 0, $fa = 12, $fs = 1, r = 10); + circle($fn = 0, $fa = 12, $fs = 2, r = 10); } difference() { - circle($fn = 0, $fa = 12, $fs = 1, r = 10); - circle($fn = 0, $fa = 12, $fs = 1, r = 5); + circle($fn = 0, $fa = 12, $fs = 2, r = 10); + circle($fn = 0, $fa = 12, $fs = 2, r = 5); } } } @@ -13,9 +13,9 @@ group() { hull() { multmatrix([[1, 0, 0, 15], [0, 1, 0, 10], [0, 0, 1, 0], [0, 0, 0, 1]]) { - circle($fn = 0, $fa = 12, $fs = 1, r = 10); + circle($fn = 0, $fa = 12, $fs = 2, r = 10); } - circle($fn = 0, $fa = 12, $fs = 1, r = 10); + circle($fn = 0, $fa = 12, $fs = 2, r = 10); } } } @@ -38,18 +38,18 @@ group() { group() { multmatrix([[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) { - circle($fn = 0, $fa = 12, $fs = 1, r = 3); + circle($fn = 0, $fa = 12, $fs = 2, r = 3); } multmatrix([[1, 0, 0, 0], [0, 1, 0, 10], [0, 0, 1, 0], [0, 0, 0, 1]]) { - circle($fn = 0, $fa = 12, $fs = 1, r = 3); + circle($fn = 0, $fa = 12, $fs = 2, r = 3); } } group() { multmatrix([[1, 0, 0, 10], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) { - circle($fn = 0, $fa = 12, $fs = 1, r = 3); + circle($fn = 0, $fa = 12, $fs = 2, r = 3); } multmatrix([[1, 0, 0, 10], [0, 1, 0, 10], [0, 0, 1, 0], [0, 0, 0, 1]]) { - circle($fn = 0, $fa = 12, $fs = 1, r = 3); + circle($fn = 0, $fa = 12, $fs = 2, r = 3); } } } diff --git a/tests/regression/dumptest/hull3-tests-expected.txt b/tests/regression/dumptest/hull3-tests-expected.txt index bde58c98..af48b7ff 100644 --- a/tests/regression/dumptest/hull3-tests-expected.txt +++ b/tests/regression/dumptest/hull3-tests-expected.txt @@ -1,7 +1,7 @@ hull(); hull(); hull() { - cylinder($fn = 0, $fa = 12, $fs = 1, h = 1, r1 = 10, r2 = 10, center = false); + cylinder($fn = 0, $fa = 12, $fs = 2, h = 1, r1 = 10, r2 = 10, center = false); multmatrix([[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 10], [0, 0, 0, 1]]) { cube(size = [5, 5, 5], center = true); } @@ -9,11 +9,11 @@ multmatrix([[1, 0, 0, 25], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) { hull() { multmatrix([[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 10], [0, 0, 0, 1]]) { - cylinder($fn = 0, $fa = 12, $fs = 1, h = 1, r1 = 3, r2 = 3, center = false); + cylinder($fn = 0, $fa = 12, $fs = 2, h = 1, r1 = 3, r2 = 3, center = false); } difference() { - cylinder($fn = 0, $fa = 12, $fs = 1, h = 4, r1 = 10, r2 = 10, center = true); - cylinder($fn = 0, $fa = 12, $fs = 1, h = 5, r1 = 5, r2 = 5, center = true); + cylinder($fn = 0, $fa = 12, $fs = 2, h = 4, r1 = 10, r2 = 10, center = true); + cylinder($fn = 0, $fa = 12, $fs = 2, h = 5, r1 = 5, r2 = 5, center = true); } } } diff --git a/tests/regression/dumptest/import-expected.txt b/tests/regression/dumptest/import-expected.txt index 2c66bf4e..b1d81de6 100644 --- a/tests/regression/dumptest/import-expected.txt +++ b/tests/regression/dumptest/import-expected.txt @@ -1,2 +1,2 @@ - import(file = "", layer = "", origin = [0, 0], scale = 1, convexity = 1, $fn = 0, $fa = 12, $fs = 1); + import(file = "", layer = "", origin = [0, 0], scale = 1, convexity = 1, $fn = 0, $fa = 12, $fs = 2); diff --git a/tests/regression/dumptest/import_dxf-expected.txt b/tests/regression/dumptest/import_dxf-expected.txt index 2c66bf4e..b1d81de6 100644 --- a/tests/regression/dumptest/import_dxf-expected.txt +++ b/tests/regression/dumptest/import_dxf-expected.txt @@ -1,2 +1,2 @@ - import(file = "", layer = "", origin = [0, 0], scale = 1, convexity = 1, $fn = 0, $fa = 12, $fs = 1); + import(file = "", layer = "", origin = [0, 0], scale = 1, convexity = 1, $fn = 0, $fa = 12, $fs = 2); diff --git a/tests/regression/dumptest/import_dxf-tests-expected.txt b/tests/regression/dumptest/import_dxf-tests-expected.txt index 2fdbbca1..977efcc9 100644 --- a/tests/regression/dumptest/import_dxf-tests-expected.txt +++ b/tests/regression/dumptest/import_dxf-tests-expected.txt @@ -1,24 +1,24 @@ - import(file = "", layer = "", origin = [0, 0], scale = 1, convexity = 1, $fn = 0, $fa = 12, $fs = 1); + import(file = "", layer = "", origin = [0, 0], scale = 1, convexity = 1, $fn = 0, $fa = 12, $fs = 2); multmatrix([[1, 0, 0, -210], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) { - import(file = "../../dxf/polygons.dxf", layer = "", origin = [0, 0], scale = 1, convexity = 1, $fn = 0, $fa = 12, $fs = 1); + import(file = "../../dxf/polygons.dxf", layer = "", origin = [0, 0], scale = 1, convexity = 1, $fn = 0, $fa = 12, $fs = 2); } multmatrix([[1, 0, 0, -210], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) { - import(file = "../../dxf/polygons.dxf", layer = "", origin = [0, 110], scale = 1, convexity = 1, $fn = 0, $fa = 12, $fs = 1); + import(file = "../../dxf/polygons.dxf", layer = "", origin = [0, 110], scale = 1, convexity = 1, $fn = 0, $fa = 12, $fs = 2); } multmatrix([[1, 0, 0, -210], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) { - import(file = "../../dxf/polygons.dxf", layer = "", origin = [110, 110], scale = 0.5, convexity = 1, $fn = 0, $fa = 12, $fs = 1); + import(file = "../../dxf/polygons.dxf", layer = "", origin = [110, 110], scale = 0.5, convexity = 1, $fn = 0, $fa = 12, $fs = 2); } - import(file = "../../dxf/multiple-layers.dxf", layer = "", origin = [0, 0], scale = 1, convexity = 1, $fn = 0, $fa = 12, $fs = 1); + import(file = "../../dxf/multiple-layers.dxf", layer = "", origin = [0, 0], scale = 1, convexity = 1, $fn = 0, $fa = 12, $fs = 2); multmatrix([[1, 0, 0, -200], [0, 1, 0, 200], [0, 0, 1, 0], [0, 0, 0, 1]]) { - import(file = "../../dxf/multiple-layers.dxf", layer = "0", origin = [0, 0], scale = 1, convexity = 1, $fn = 0, $fa = 12, $fs = 1); + import(file = "../../dxf/multiple-layers.dxf", layer = "0", origin = [0, 0], scale = 1, convexity = 1, $fn = 0, $fa = 12, $fs = 2); } multmatrix([[1, 0, 0, 0], [0, 1, 0, 200], [0, 0, 1, 0], [0, 0, 0, 1]]) { - import(file = "../../dxf/multiple-layers.dxf", layer = "0", origin = [0, 0], scale = 1, convexity = 1, $fn = 0, $fa = 12, $fs = 1); + import(file = "../../dxf/multiple-layers.dxf", layer = "0", origin = [0, 0], scale = 1, convexity = 1, $fn = 0, $fa = 12, $fs = 2); } multmatrix([[1, 0, 0, 200], [0, 1, 0, 200], [0, 0, 1, 0], [0, 0, 0, 1]]) { - import(file = "../../dxf/multiple-layers.dxf", layer = "noname", origin = [0, 0], scale = 1, convexity = 1, $fn = 0, $fa = 12, $fs = 1); + import(file = "../../dxf/multiple-layers.dxf", layer = "noname", origin = [0, 0], scale = 1, convexity = 1, $fn = 0, $fa = 12, $fs = 2); } multmatrix([[1, 0, 0, 0], [0, 1, 0, 200], [0, 0, 1, 0], [0, 0, 0, 1]]) { - import(file = "../../dxf/multiple-layers.dxf", layer = "Layer with a pretty long name including \\ \"special\" /'\\\\ characters", origin = [0, 0], scale = 1, convexity = 1, $fn = 0, $fa = 12, $fs = 1); + import(file = "../../dxf/multiple-layers.dxf", layer = "Layer with a pretty long name including \\ \"special\" /'\\\\ characters", origin = [0, 0], scale = 1, convexity = 1, $fn = 0, $fa = 12, $fs = 2); } diff --git a/tests/regression/dumptest/import_off-expected.txt b/tests/regression/dumptest/import_off-expected.txt index 2c66bf4e..b1d81de6 100644 --- a/tests/regression/dumptest/import_off-expected.txt +++ b/tests/regression/dumptest/import_off-expected.txt @@ -1,2 +1,2 @@ - import(file = "", layer = "", origin = [0, 0], scale = 1, convexity = 1, $fn = 0, $fa = 12, $fs = 1); + import(file = "", layer = "", origin = [0, 0], scale = 1, convexity = 1, $fn = 0, $fa = 12, $fs = 2); diff --git a/tests/regression/dumptest/import_stl-expected.txt b/tests/regression/dumptest/import_stl-expected.txt index 2c66bf4e..b1d81de6 100644 --- a/tests/regression/dumptest/import_stl-expected.txt +++ b/tests/regression/dumptest/import_stl-expected.txt @@ -1,2 +1,2 @@ - import(file = "", layer = "", origin = [0, 0], scale = 1, convexity = 1, $fn = 0, $fa = 12, $fs = 1); + import(file = "", layer = "", origin = [0, 0], scale = 1, convexity = 1, $fn = 0, $fa = 12, $fs = 2); diff --git a/tests/regression/dumptest/import_stl-tests-expected.txt b/tests/regression/dumptest/import_stl-tests-expected.txt index 8d7bbc47..ac702f6c 100644 --- a/tests/regression/dumptest/import_stl-tests-expected.txt +++ b/tests/regression/dumptest/import_stl-tests-expected.txt @@ -1,2 +1,2 @@ - import(file = "import.stl", layer = "", origin = [0, 0], scale = 1, convexity = 1, $fn = 0, $fa = 12, $fs = 1); + import(file = "import.stl", layer = "", origin = [0, 0], scale = 1, convexity = 1, $fn = 0, $fa = 12, $fs = 2); diff --git a/tests/regression/dumptest/include-tests-expected.txt b/tests/regression/dumptest/include-tests-expected.txt index 33f9156a..d4b50653 100644 --- a/tests/regression/dumptest/include-tests-expected.txt +++ b/tests/regression/dumptest/include-tests-expected.txt @@ -4,29 +4,29 @@ } multmatrix([[1, 0, 0, 2], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) { group() { - cylinder($fn = 0, $fa = 12, $fs = 1, h = 1, r1 = 0.7, r2 = 0.2, center = true); + cylinder($fn = 0, $fa = 12, $fs = 2, h = 1, r1 = 0.7, r2 = 0.2, center = true); } } multmatrix([[1, 0, 0, 2], [0, 1, 0, -2], [0, 0, 1, 0], [0, 0, 0, 1]]) { group() { - cylinder($fn = 10, $fa = 12, $fs = 1, h = 1, r1 = 0.5, r2 = 0.5, center = true); + cylinder($fn = 10, $fa = 12, $fs = 2, h = 1, r1 = 0.5, r2 = 0.5, center = true); } } multmatrix([[1, 0, 0, -2], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) { group() { - sphere($fn = 8, $fa = 12, $fs = 1, r = 0.5); + sphere($fn = 8, $fa = 12, $fs = 2, r = 0.5); } } multmatrix([[1, 0, 0, -2], [0, 1, 0, -2], [0, 0, 1, 0], [0, 0, 0, 1]]) { group() { difference() { cube(size = [1, 1, 1], center = true); - cylinder($fn = 0, $fa = 12, $fs = 1, h = 2, r1 = 0.4, r2 = 0.4, center = true); + cylinder($fn = 0, $fa = 12, $fs = 2, h = 2, r1 = 0.4, r2 = 0.4, center = true); } } } multmatrix([[1, 0, 0, 0], [0, 1, 0, -2], [0, 0, 1, 0], [0, 0, 0, 1]]) { - sphere($fn = 16, $fa = 12, $fs = 1, r = 0.7); + sphere($fn = 16, $fa = 12, $fs = 2, r = 0.7); } } diff --git a/tests/regression/dumptest/intersection-tests-expected.txt b/tests/regression/dumptest/intersection-tests-expected.txt index 5613abf4..e6bbf328 100644 --- a/tests/regression/dumptest/intersection-tests-expected.txt +++ b/tests/regression/dumptest/intersection-tests-expected.txt @@ -1,7 +1,7 @@ intersection(); intersection(); intersection() { - sphere($fn = 0, $fa = 12, $fs = 1, r = 5); + sphere($fn = 0, $fa = 12, $fs = 2, r = 5); multmatrix([[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 3], [0, 0, 0, 1]]) { cube(size = [4, 4, 6], center = true); } @@ -9,15 +9,15 @@ multmatrix([[1, 0, 0, 0], [0, 1, 0, 12], [0, 0, 1, 0], [0, 0, 0, 1]]) { intersection() { cube(size = [10, 10, 10], center = true); - cylinder($fn = 0, $fa = 12, $fs = 1, h = 12, r1 = 4, r2 = 4, center = true); + cylinder($fn = 0, $fa = 12, $fs = 2, h = 12, r1 = 4, r2 = 4, center = true); } } multmatrix([[1, 0, 0, 12], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) { intersection() { cube(size = [10, 10, 10], center = true); - cylinder($fn = 0, $fa = 12, $fs = 1, h = 12, r1 = 4, r2 = 4, center = true); + cylinder($fn = 0, $fa = 12, $fs = 2, h = 12, r1 = 4, r2 = 4, center = true); multmatrix([[2.22045e-16, 0, 1, 0], [0, 1, 0, 0], [-1, 0, 2.22045e-16, 0], [0, 0, 0, 1]]) { - cylinder($fn = 0, $fa = 12, $fs = 1, h = 12, r1 = 4, r2 = 4, center = true); + cylinder($fn = 0, $fa = 12, $fs = 2, h = 12, r1 = 4, r2 = 4, center = true); } } } @@ -25,7 +25,7 @@ intersection() { cube(size = [10, 10, 10], center = true); multmatrix([[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 7], [0, 0, 0, 1]]) { - cylinder($fn = 0, $fa = 12, $fs = 1, h = 4, r1 = 4, r2 = 4, center = true); + cylinder($fn = 0, $fa = 12, $fs = 2, h = 4, r1 = 4, r2 = 4, center = true); } } } @@ -33,7 +33,7 @@ intersection() { cube(size = [10, 10, 10], center = true); multmatrix([[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 6.99], [0, 0, 0, 1]]) { - cylinder($fn = 0, $fa = 12, $fs = 1, h = 4, r1 = 4, r2 = 4, center = true); + cylinder($fn = 0, $fa = 12, $fs = 2, h = 4, r1 = 4, r2 = 4, center = true); } } } diff --git a/tests/regression/dumptest/linear_extrude-expected.txt b/tests/regression/dumptest/linear_extrude-expected.txt index c6034d9e..ec46e667 100644 --- a/tests/regression/dumptest/linear_extrude-expected.txt +++ b/tests/regression/dumptest/linear_extrude-expected.txt @@ -1,2 +1,2 @@ - linear_extrude(height = 100, center = false, convexity = 1, $fn = 0, $fa = 12, $fs = 1); + linear_extrude(height = 100, center = false, convexity = 1, $fn = 0, $fa = 12, $fs = 2); diff --git a/tests/regression/dumptest/linear_extrude-tests-expected.txt b/tests/regression/dumptest/linear_extrude-tests-expected.txt index 08b9f3e9..cba1189f 100644 --- a/tests/regression/dumptest/linear_extrude-tests-expected.txt +++ b/tests/regression/dumptest/linear_extrude-tests-expected.txt @@ -1,31 +1,31 @@ - rotate_extrude(convexity = 1, $fn = 0, $fa = 12, $fs = 1); - rotate_extrude(convexity = 1, $fn = 0, $fa = 12, $fs = 1); - rotate_extrude(convexity = 1, $fn = 0, $fa = 12, $fs = 1) { + rotate_extrude(convexity = 1, $fn = 0, $fa = 12, $fs = 2); + rotate_extrude(convexity = 1, $fn = 0, $fa = 12, $fs = 2); + rotate_extrude(convexity = 1, $fn = 0, $fa = 12, $fs = 2) { cube(size = [1, 1, 1], center = false); } - linear_extrude(height = 10, center = false, convexity = 1, $fn = 0, $fa = 12, $fs = 1) { + linear_extrude(height = 10, center = false, convexity = 1, $fn = 0, $fa = 12, $fs = 2) { square(size = [10, 10], center = false); } multmatrix([[1, 0, 0, 19], [0, 1, 0, 5], [0, 0, 1, 0], [0, 0, 0, 1]]) { - linear_extrude(height = 10, center = true, convexity = 1, $fn = 0, $fa = 12, $fs = 1) { + linear_extrude(height = 10, center = true, convexity = 1, $fn = 0, $fa = 12, $fs = 2) { difference() { - circle($fn = 0, $fa = 12, $fs = 1, r = 5); - circle($fn = 0, $fa = 12, $fs = 1, r = 3); + circle($fn = 0, $fa = 12, $fs = 2, r = 5); + circle($fn = 0, $fa = 12, $fs = 2, r = 3); } } } multmatrix([[1, 0, 0, 31.5], [0, 1, 0, 2.5], [0, 0, 1, 0], [0, 0, 0, 1]]) { - linear_extrude(height = 10, center = false, convexity = 1, twist = -45, slices = 3, $fn = 0, $fa = 12, $fs = 1) { + linear_extrude(height = 10, center = false, convexity = 1, twist = -45, slices = 3, $fn = 0, $fa = 12, $fs = 2) { polygon(points = [[-5, -2.5], [5, -2.5], [0, 2.5]], paths = undef, convexity = 1); } } multmatrix([[1, 0, 0, 0], [0, 1, 0, 20], [0, 0, 1, 0], [0, 0, 0, 1]]) { - linear_extrude(height = 20, center = false, convexity = 1, twist = 45, slices = 2, $fn = 0, $fa = 12, $fs = 1) { + linear_extrude(height = 20, center = false, convexity = 1, twist = 45, slices = 2, $fn = 0, $fa = 12, $fs = 2) { square(size = [10, 10], center = false); } } multmatrix([[1, 0, 0, 19], [0, 1, 0, 20], [0, 0, 1, 0], [0, 0, 0, 1]]) { - linear_extrude(height = 20, center = false, convexity = 1, twist = 45, slices = 10, $fn = 0, $fa = 12, $fs = 1) { + linear_extrude(height = 20, center = false, convexity = 1, twist = 45, slices = 10, $fn = 0, $fa = 12, $fs = 2) { square(size = [10, 10], center = false); } } diff --git a/tests/regression/dumptest/minkowski2-tests-expected.txt b/tests/regression/dumptest/minkowski2-tests-expected.txt index fe78b906..dc3ad861 100644 --- a/tests/regression/dumptest/minkowski2-tests-expected.txt +++ b/tests/regression/dumptest/minkowski2-tests-expected.txt @@ -5,7 +5,7 @@ square(size = [10, 10], center = true); square(size = [8, 8], center = true); } - circle($fn = 0, $fa = 12, $fs = 1, r = 2); + circle($fn = 0, $fa = 12, $fs = 2, r = 2); } } } @@ -16,7 +16,7 @@ square(size = [10, 10], center = false); square(size = [5, 5], center = false); } - circle($fn = 0, $fa = 12, $fs = 1, r = 5); + circle($fn = 0, $fa = 12, $fs = 2, r = 5); } } } @@ -24,7 +24,7 @@ group() { minkowski(convexity = 0) { square(size = [10, 10], center = false); - circle($fn = 0, $fa = 12, $fs = 1, r = 5); + circle($fn = 0, $fa = 12, $fs = 2, r = 5); } } } diff --git a/tests/regression/dumptest/minkowski3-tests-expected.txt b/tests/regression/dumptest/minkowski3-tests-expected.txt index 0226beb8..52440143 100644 --- a/tests/regression/dumptest/minkowski3-tests-expected.txt +++ b/tests/regression/dumptest/minkowski3-tests-expected.txt @@ -5,7 +5,7 @@ cube(size = [10, 10, 5], center = true); cube(size = [8, 8, 10], center = true); } - cylinder($fn = 0, $fa = 12, $fs = 1, h = 1, r1 = 2, r2 = 2, center = false); + cylinder($fn = 0, $fa = 12, $fs = 2, h = 1, r1 = 2, r2 = 2, center = false); } } } @@ -16,7 +16,7 @@ cube(size = [10, 10, 5], center = false); cube(size = [5, 5, 5], center = false); } - cylinder($fn = 0, $fa = 12, $fs = 1, h = 5, r1 = 5, r2 = 5, center = false); + cylinder($fn = 0, $fa = 12, $fs = 2, h = 5, r1 = 5, r2 = 5, center = false); } } } @@ -24,7 +24,7 @@ group() { minkowski(convexity = 0) { cube(size = [10, 10, 5], center = false); - cylinder($fn = 0, $fa = 12, $fs = 1, h = 5, r1 = 5, r2 = 5, center = false); + cylinder($fn = 0, $fa = 12, $fs = 2, h = 5, r1 = 5, r2 = 5, center = false); } } } diff --git a/tests/regression/dumptest/projection-tests-expected.txt b/tests/regression/dumptest/projection-tests-expected.txt index e51ce8ec..8b580043 100644 --- a/tests/regression/dumptest/projection-tests-expected.txt +++ b/tests/regression/dumptest/projection-tests-expected.txt @@ -3,25 +3,25 @@ projection(cut = true, convexity = 0) { square(size = [1, 1], center = false); } - linear_extrude(height = 20, center = false, convexity = 1, $fn = 0, $fa = 12, $fs = 1) { + linear_extrude(height = 20, center = false, convexity = 1, $fn = 0, $fa = 12, $fs = 2) { projection(cut = false, convexity = 0) { - sphere($fn = 0, $fa = 12, $fs = 1, r = 10); + sphere($fn = 0, $fa = 12, $fs = 2, r = 10); } } multmatrix([[1, 0, 0, 22], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) { - linear_extrude(height = 20, center = false, convexity = 1, $fn = 0, $fa = 12, $fs = 1) { + linear_extrude(height = 20, center = false, convexity = 1, $fn = 0, $fa = 12, $fs = 2) { projection(cut = true, convexity = 0) { multmatrix([[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 9], [0, 0, 0, 1]]) { - sphere($fn = 0, $fa = 12, $fs = 1, r = 10); + sphere($fn = 0, $fa = 12, $fs = 2, r = 10); } } } } multmatrix([[1, 0, 0, 44], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) { - linear_extrude(height = 20, center = false, convexity = 1, $fn = 0, $fa = 12, $fs = 1) { + linear_extrude(height = 20, center = false, convexity = 1, $fn = 0, $fa = 12, $fs = 2) { projection(cut = true, convexity = 0) { multmatrix([[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 7], [0, 0, 0, 1]]) { - sphere($fn = 0, $fa = 12, $fs = 1, r = 10); + sphere($fn = 0, $fa = 12, $fs = 2, r = 10); } } } diff --git a/tests/regression/dumptest/root-modifier-expected.txt b/tests/regression/dumptest/root-modifier-expected.txt index ca75e52a..c0f1da2d 100644 --- a/tests/regression/dumptest/root-modifier-expected.txt +++ b/tests/regression/dumptest/root-modifier-expected.txt @@ -1,5 +1,5 @@ difference() { - sphere($fn = 0, $fa = 12, $fs = 1, r = 10); - cylinder($fn = 0, $fa = 12, $fs = 1, h = 30, r1 = 6, r2 = 6, center = true); + sphere($fn = 0, $fa = 12, $fs = 2, r = 10); + cylinder($fn = 0, $fa = 12, $fs = 2, h = 30, r1 = 6, r2 = 6, center = true); } diff --git a/tests/regression/dumptest/rotate_extrude-expected.txt b/tests/regression/dumptest/rotate_extrude-expected.txt index 9ab8f0f3..c212d763 100644 --- a/tests/regression/dumptest/rotate_extrude-expected.txt +++ b/tests/regression/dumptest/rotate_extrude-expected.txt @@ -1,2 +1,2 @@ - rotate_extrude(convexity = 1, $fn = 0, $fa = 12, $fs = 1); + rotate_extrude(convexity = 1, $fn = 0, $fa = 12, $fs = 2); diff --git a/tests/regression/dumptest/rotate_extrude-tests-expected.txt b/tests/regression/dumptest/rotate_extrude-tests-expected.txt index f3deec2f..42faff24 100644 --- a/tests/regression/dumptest/rotate_extrude-tests-expected.txt +++ b/tests/regression/dumptest/rotate_extrude-tests-expected.txt @@ -1,20 +1,20 @@ - rotate_extrude(convexity = 1, $fn = 0, $fa = 12, $fs = 1); - rotate_extrude(convexity = 1, $fn = 0, $fa = 12, $fs = 1); - rotate_extrude(convexity = 1, $fn = 0, $fa = 12, $fs = 1) { + rotate_extrude(convexity = 1, $fn = 0, $fa = 12, $fs = 2); + rotate_extrude(convexity = 1, $fn = 0, $fa = 12, $fs = 2); + rotate_extrude(convexity = 1, $fn = 0, $fa = 12, $fs = 2) { cube(size = [1, 1, 1], center = false); } - rotate_extrude(convexity = 1, $fn = 0, $fa = 12, $fs = 1) { + rotate_extrude(convexity = 1, $fn = 0, $fa = 12, $fs = 2) { multmatrix([[1, 0, 0, 20], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) { - circle($fn = 0, $fa = 12, $fs = 1, r = 10); + circle($fn = 0, $fa = 12, $fs = 2, r = 10); } } multmatrix([[1, 0, 0, 50], [0, 1, 0, -20], [0, 0, 1, 0], [0, 0, 0, 1]]) { difference() { - rotate_extrude(convexity = 1, $fn = 0, $fa = 12, $fs = 1) { + rotate_extrude(convexity = 1, $fn = 0, $fa = 12, $fs = 2) { multmatrix([[1, 0, 0, 20], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) { difference() { - circle($fn = 0, $fa = 12, $fs = 1, r = 10); - circle($fn = 0, $fa = 12, $fs = 1, r = 8); + circle($fn = 0, $fa = 12, $fs = 2, r = 10); + circle($fn = 0, $fa = 12, $fs = 2, r = 8); } } } @@ -26,14 +26,14 @@ multmatrix([[1, 0, 0, 50], [0, 1, 0, 50], [0, 0, 1, 0], [0, 0, 0, 1]]) { difference() { difference() { - rotate_extrude(convexity = 1, $fn = 0, $fa = 12, $fs = 1) { + rotate_extrude(convexity = 1, $fn = 0, $fa = 12, $fs = 2) { multmatrix([[1, 0, 0, 20], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) { - circle($fn = 0, $fa = 12, $fs = 1, r = 10); + circle($fn = 0, $fa = 12, $fs = 2, r = 10); } } - rotate_extrude(convexity = 1, $fn = 0, $fa = 12, $fs = 1) { + rotate_extrude(convexity = 1, $fn = 0, $fa = 12, $fs = 2) { multmatrix([[1, 0, 0, 20], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) { - circle($fn = 0, $fa = 12, $fs = 1, r = 8); + circle($fn = 0, $fa = 12, $fs = 2, r = 8); } } } diff --git a/tests/regression/dumptest/rotate_extrude_dxf-tests-expected.txt b/tests/regression/dumptest/rotate_extrude_dxf-tests-expected.txt index 3abef40d..f79e0ceb 100644 --- a/tests/regression/dumptest/rotate_extrude_dxf-tests-expected.txt +++ b/tests/regression/dumptest/rotate_extrude_dxf-tests-expected.txt @@ -1,2 +1,2 @@ - rotate_extrude(file = "../../dxf/open-polyline.dxf", layer = "", origin = [0, 0], scale = 1, convexity = 1, $fn = 0, $fa = 12, $fs = 1); + rotate_extrude(file = "../../dxf/open-polyline.dxf", layer = "", origin = [0, 0], scale = 1, convexity = 1, $fn = 0, $fa = 12, $fs = 2); diff --git a/tests/regression/dumptest/sphere-expected.txt b/tests/regression/dumptest/sphere-expected.txt index 3a931011..1b8369fc 100644 --- a/tests/regression/dumptest/sphere-expected.txt +++ b/tests/regression/dumptest/sphere-expected.txt @@ -1,2 +1,2 @@ - sphere($fn = 0, $fa = 12, $fs = 1, r = 1); + sphere($fn = 0, $fa = 12, $fs = 2, r = 1); diff --git a/tests/regression/dumptest/sphere-tests-expected.txt b/tests/regression/dumptest/sphere-tests-expected.txt index f6f6a499..84f8c23d 100644 --- a/tests/regression/dumptest/sphere-tests-expected.txt +++ b/tests/regression/dumptest/sphere-tests-expected.txt @@ -1,21 +1,21 @@ - sphere($fn = 0, $fa = 12, $fs = 1, r = 1); + sphere($fn = 0, $fa = 12, $fs = 2, r = 1); multmatrix([[1, 0, 0, 2], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) { - sphere($fn = 0, $fa = 12, $fs = 1, r = 0); + sphere($fn = 0, $fa = 12, $fs = 2, r = 0); } multmatrix([[1, 0, 0, 0], [0, 1, 0, 11], [0, 0, 1, 0], [0, 0, 0, 1]]) { - sphere($fn = 0, $fa = 12, $fs = 1, r = 5); + sphere($fn = 0, $fa = 12, $fs = 2, r = 5); } multmatrix([[1, 0, 0, 0], [0, 1, 0, -11], [0, 0, 1, 0], [0, 0, 0, 1]]) { - sphere($fn = 0, $fa = 12, $fs = 1, r = 5); + sphere($fn = 0, $fa = 12, $fs = 2, r = 5); } multmatrix([[1, 0, 0, 11], [0, 1, 0, -11], [0, 0, 1, 0], [0, 0, 0, 1]]) { - sphere($fn = 5, $fa = 12, $fs = 1, r = 5); + sphere($fn = 5, $fa = 12, $fs = 2, r = 5); } multmatrix([[1, 0, 0, 11], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) { - sphere($fn = 10, $fa = 12, $fs = 1, r = 5); + sphere($fn = 10, $fa = 12, $fs = 2, r = 5); } multmatrix([[1, 0, 0, 11], [0, 1, 0, 11], [0, 0, 1, 0], [0, 0, 0, 1]]) { - sphere($fn = 15, $fa = 12, $fs = 1, r = 5); + sphere($fn = 15, $fa = 12, $fs = 2, r = 5); } multmatrix([[1, 0, 0, 22], [0, 1, 0, -11], [0, 0, 1, 0], [0, 0, 0, 1]]) { sphere($fn = 0, $fa = 20, $fs = 0.3, r = 5); diff --git a/tests/regression/dumptest/testcolornames-expected.txt b/tests/regression/dumptest/testcolornames-expected.txt index 626a2668..56e664f1 100644 --- a/tests/regression/dumptest/testcolornames-expected.txt +++ b/tests/regression/dumptest/testcolornames-expected.txt @@ -1,706 +1,706 @@ multmatrix([[1, 0, 0, 1], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) { color([0.803922, 0.360784, 0.360784, 1]) { - sphere($fn = 5, $fa = 12, $fs = 1, r = 0.8); + sphere($fn = 5, $fa = 12, $fs = 2, r = 0.8); } } multmatrix([[1, 0, 0, 2], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) { color([0.941176, 0.501961, 0.501961, 1]) { - sphere($fn = 5, $fa = 12, $fs = 1, r = 0.8); + sphere($fn = 5, $fa = 12, $fs = 2, r = 0.8); } } multmatrix([[1, 0, 0, 3], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) { color([0.980392, 0.501961, 0.447059, 1]) { - sphere($fn = 5, $fa = 12, $fs = 1, r = 0.8); + sphere($fn = 5, $fa = 12, $fs = 2, r = 0.8); } } multmatrix([[1, 0, 0, 4], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) { color([0.913725, 0.588235, 0.478431, 1]) { - sphere($fn = 5, $fa = 12, $fs = 1, r = 0.8); + sphere($fn = 5, $fa = 12, $fs = 2, r = 0.8); } } multmatrix([[1, 0, 0, 5], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) { color([1, 0.627451, 0.478431, 1]) { - sphere($fn = 5, $fa = 12, $fs = 1, r = 0.8); + sphere($fn = 5, $fa = 12, $fs = 2, r = 0.8); } } multmatrix([[1, 0, 0, 6], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) { color([1, 0, 0, 1]) { - sphere($fn = 5, $fa = 12, $fs = 1, r = 0.8); + sphere($fn = 5, $fa = 12, $fs = 2, r = 0.8); } } multmatrix([[1, 0, 0, 7], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) { color([0.862745, 0.0784314, 0.235294, 1]) { - sphere($fn = 5, $fa = 12, $fs = 1, r = 0.8); + sphere($fn = 5, $fa = 12, $fs = 2, r = 0.8); } } multmatrix([[1, 0, 0, 8], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) { color([0.698039, 0.133333, 0.133333, 1]) { - sphere($fn = 5, $fa = 12, $fs = 1, r = 0.8); + sphere($fn = 5, $fa = 12, $fs = 2, r = 0.8); } } multmatrix([[1, 0, 0, 9], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) { color([0.545098, 0, 0, 1]) { - sphere($fn = 5, $fa = 12, $fs = 1, r = 0.8); + sphere($fn = 5, $fa = 12, $fs = 2, r = 0.8); } } multmatrix([[1, 0, 0, 0], [0, 1, 0, 1], [0, 0, 1, 0], [0, 0, 0, 1]]) { color([1, 0.752941, 0.796078, 1]) { - sphere($fn = 5, $fa = 12, $fs = 1, r = 0.8); + sphere($fn = 5, $fa = 12, $fs = 2, r = 0.8); } } multmatrix([[1, 0, 0, 1], [0, 1, 0, 1], [0, 0, 1, 0], [0, 0, 0, 1]]) { color([1, 0.713725, 0.756863, 1]) { - sphere($fn = 5, $fa = 12, $fs = 1, r = 0.8); + sphere($fn = 5, $fa = 12, $fs = 2, r = 0.8); } } multmatrix([[1, 0, 0, 2], [0, 1, 0, 1], [0, 0, 1, 0], [0, 0, 0, 1]]) { color([1, 0.411765, 0.705882, 1]) { - sphere($fn = 5, $fa = 12, $fs = 1, r = 0.8); + sphere($fn = 5, $fa = 12, $fs = 2, r = 0.8); } } multmatrix([[1, 0, 0, 3], [0, 1, 0, 1], [0, 0, 1, 0], [0, 0, 0, 1]]) { color([1, 0.0784314, 0.576471, 1]) { - sphere($fn = 5, $fa = 12, $fs = 1, r = 0.8); + sphere($fn = 5, $fa = 12, $fs = 2, r = 0.8); } } multmatrix([[1, 0, 0, 4], [0, 1, 0, 1], [0, 0, 1, 0], [0, 0, 0, 1]]) { color([0.780392, 0.0823529, 0.521569, 1]) { - sphere($fn = 5, $fa = 12, $fs = 1, r = 0.8); + sphere($fn = 5, $fa = 12, $fs = 2, r = 0.8); } } multmatrix([[1, 0, 0, 5], [0, 1, 0, 1], [0, 0, 1, 0], [0, 0, 0, 1]]) { color([0.858824, 0.439216, 0.576471, 1]) { - sphere($fn = 5, $fa = 12, $fs = 1, r = 0.8); + sphere($fn = 5, $fa = 12, $fs = 2, r = 0.8); } } multmatrix([[1, 0, 0, 7], [0, 1, 0, 1], [0, 0, 1, 0], [0, 0, 0, 1]]) { color([1, 0.627451, 0.478431, 1]) { - sphere($fn = 5, $fa = 12, $fs = 1, r = 0.8); + sphere($fn = 5, $fa = 12, $fs = 2, r = 0.8); } } multmatrix([[1, 0, 0, 8], [0, 1, 0, 1], [0, 0, 1, 0], [0, 0, 0, 1]]) { color([1, 0.498039, 0.313725, 1]) { - sphere($fn = 5, $fa = 12, $fs = 1, r = 0.8); + sphere($fn = 5, $fa = 12, $fs = 2, r = 0.8); } } multmatrix([[1, 0, 0, 9], [0, 1, 0, 1], [0, 0, 1, 0], [0, 0, 0, 1]]) { color([1, 0.388235, 0.278431, 1]) { - sphere($fn = 5, $fa = 12, $fs = 1, r = 0.8); + sphere($fn = 5, $fa = 12, $fs = 2, r = 0.8); } } multmatrix([[1, 0, 0, 10], [0, 1, 0, 1], [0, 0, 1, 0], [0, 0, 0, 1]]) { color([1, 0.270588, 0, 1]) { - sphere($fn = 5, $fa = 12, $fs = 1, r = 0.8); + sphere($fn = 5, $fa = 12, $fs = 2, r = 0.8); } } multmatrix([[1, 0, 0, 0], [0, 1, 0, 2], [0, 0, 1, 0], [0, 0, 0, 1]]) { color([1, 0.54902, 0, 1]) { - sphere($fn = 5, $fa = 12, $fs = 1, r = 0.8); + sphere($fn = 5, $fa = 12, $fs = 2, r = 0.8); } } multmatrix([[1, 0, 0, 1], [0, 1, 0, 2], [0, 0, 1, 0], [0, 0, 0, 1]]) { color([1, 0.647059, 0, 1]) { - sphere($fn = 5, $fa = 12, $fs = 1, r = 0.8); + sphere($fn = 5, $fa = 12, $fs = 2, r = 0.8); } } multmatrix([[1, 0, 0, 3], [0, 1, 0, 2], [0, 0, 1, 0], [0, 0, 0, 1]]) { color([1, 0.843137, 0, 1]) { - sphere($fn = 5, $fa = 12, $fs = 1, r = 0.8); + sphere($fn = 5, $fa = 12, $fs = 2, r = 0.8); } } multmatrix([[1, 0, 0, 4], [0, 1, 0, 2], [0, 0, 1, 0], [0, 0, 0, 1]]) { color([1, 1, 0, 1]) { - sphere($fn = 5, $fa = 12, $fs = 1, r = 0.8); + sphere($fn = 5, $fa = 12, $fs = 2, r = 0.8); } } multmatrix([[1, 0, 0, 5], [0, 1, 0, 2], [0, 0, 1, 0], [0, 0, 0, 1]]) { color([1, 1, 0.878431, 1]) { - sphere($fn = 5, $fa = 12, $fs = 1, r = 0.8); + sphere($fn = 5, $fa = 12, $fs = 2, r = 0.8); } } multmatrix([[1, 0, 0, 6], [0, 1, 0, 2], [0, 0, 1, 0], [0, 0, 0, 1]]) { color([1, 0.980392, 0.803922, 1]) { - sphere($fn = 5, $fa = 12, $fs = 1, r = 0.8); + sphere($fn = 5, $fa = 12, $fs = 2, r = 0.8); } } multmatrix([[1, 0, 0, 7], [0, 1, 0, 2], [0, 0, 1, 0], [0, 0, 0, 1]]) { color([0.980392, 0.980392, 0.823529, 1]) { - sphere($fn = 5, $fa = 12, $fs = 1, r = 0.8); + sphere($fn = 5, $fa = 12, $fs = 2, r = 0.8); } } multmatrix([[1, 0, 0, 8], [0, 1, 0, 2], [0, 0, 1, 0], [0, 0, 0, 1]]) { color([1, 0.937255, 0.835294, 1]) { - sphere($fn = 5, $fa = 12, $fs = 1, r = 0.8); + sphere($fn = 5, $fa = 12, $fs = 2, r = 0.8); } } multmatrix([[1, 0, 0, 9], [0, 1, 0, 2], [0, 0, 1, 0], [0, 0, 0, 1]]) { color([1, 0.894118, 0.709804, 1]) { - sphere($fn = 5, $fa = 12, $fs = 1, r = 0.8); + sphere($fn = 5, $fa = 12, $fs = 2, r = 0.8); } } multmatrix([[1, 0, 0, 10], [0, 1, 0, 2], [0, 0, 1, 0], [0, 0, 0, 1]]) { color([1, 0.854902, 0.72549, 1]) { - sphere($fn = 5, $fa = 12, $fs = 1, r = 0.8); + sphere($fn = 5, $fa = 12, $fs = 2, r = 0.8); } } multmatrix([[1, 0, 0, 0], [0, 1, 0, 3], [0, 0, 1, 0], [0, 0, 0, 1]]) { color([0.933333, 0.909804, 0.666667, 1]) { - sphere($fn = 5, $fa = 12, $fs = 1, r = 0.8); + sphere($fn = 5, $fa = 12, $fs = 2, r = 0.8); } } multmatrix([[1, 0, 0, 1], [0, 1, 0, 3], [0, 0, 1, 0], [0, 0, 0, 1]]) { color([0.941176, 0.901961, 0.54902, 1]) { - sphere($fn = 5, $fa = 12, $fs = 1, r = 0.8); + sphere($fn = 5, $fa = 12, $fs = 2, r = 0.8); } } multmatrix([[1, 0, 0, 2], [0, 1, 0, 3], [0, 0, 1, 0], [0, 0, 0, 1]]) { color([0.741176, 0.717647, 0.419608, 1]) { - sphere($fn = 5, $fa = 12, $fs = 1, r = 0.8); + sphere($fn = 5, $fa = 12, $fs = 2, r = 0.8); } } multmatrix([[1, 0, 0, 4], [0, 1, 0, 3], [0, 0, 1, 0], [0, 0, 0, 1]]) { color([0.901961, 0.901961, 0.980392, 1]) { - sphere($fn = 5, $fa = 12, $fs = 1, r = 0.8); + sphere($fn = 5, $fa = 12, $fs = 2, r = 0.8); } } multmatrix([[1, 0, 0, 5], [0, 1, 0, 3], [0, 0, 1, 0], [0, 0, 0, 1]]) { color([0.847059, 0.74902, 0.847059, 1]) { - sphere($fn = 5, $fa = 12, $fs = 1, r = 0.8); + sphere($fn = 5, $fa = 12, $fs = 2, r = 0.8); } } multmatrix([[1, 0, 0, 6], [0, 1, 0, 3], [0, 0, 1, 0], [0, 0, 0, 1]]) { color([0.866667, 0.627451, 0.866667, 1]) { - sphere($fn = 5, $fa = 12, $fs = 1, r = 0.8); + sphere($fn = 5, $fa = 12, $fs = 2, r = 0.8); } } multmatrix([[1, 0, 0, 7], [0, 1, 0, 3], [0, 0, 1, 0], [0, 0, 0, 1]]) { color([0.933333, 0.509804, 0.933333, 1]) { - sphere($fn = 5, $fa = 12, $fs = 1, r = 0.8); + sphere($fn = 5, $fa = 12, $fs = 2, r = 0.8); } } multmatrix([[1, 0, 0, 8], [0, 1, 0, 3], [0, 0, 1, 0], [0, 0, 0, 1]]) { color([0.854902, 0.439216, 0.839216, 1]) { - sphere($fn = 5, $fa = 12, $fs = 1, r = 0.8); + sphere($fn = 5, $fa = 12, $fs = 2, r = 0.8); } } multmatrix([[1, 0, 0, 9], [0, 1, 0, 3], [0, 0, 1, 0], [0, 0, 0, 1]]) { color([1, 0, 1, 1]) { - sphere($fn = 5, $fa = 12, $fs = 1, r = 0.8); + sphere($fn = 5, $fa = 12, $fs = 2, r = 0.8); } } multmatrix([[1, 0, 0, 10], [0, 1, 0, 3], [0, 0, 1, 0], [0, 0, 0, 1]]) { color([1, 0, 1, 1]) { - sphere($fn = 5, $fa = 12, $fs = 1, r = 0.8); + sphere($fn = 5, $fa = 12, $fs = 2, r = 0.8); } } multmatrix([[1, 0, 0, 0], [0, 1, 0, 4], [0, 0, 1, 0], [0, 0, 0, 1]]) { color([0.729412, 0.333333, 0.827451, 1]) { - sphere($fn = 5, $fa = 12, $fs = 1, r = 0.8); + sphere($fn = 5, $fa = 12, $fs = 2, r = 0.8); } } multmatrix([[1, 0, 0, 1], [0, 1, 0, 4], [0, 0, 1, 0], [0, 0, 0, 1]]) { color([0.576471, 0.439216, 0.858824, 1]) { - sphere($fn = 5, $fa = 12, $fs = 1, r = 0.8); + sphere($fn = 5, $fa = 12, $fs = 2, r = 0.8); } } multmatrix([[1, 0, 0, 2], [0, 1, 0, 4], [0, 0, 1, 0], [0, 0, 0, 1]]) { color([0.541176, 0.168627, 0.886275, 1]) { - sphere($fn = 5, $fa = 12, $fs = 1, r = 0.8); + sphere($fn = 5, $fa = 12, $fs = 2, r = 0.8); } } multmatrix([[1, 0, 0, 3], [0, 1, 0, 4], [0, 0, 1, 0], [0, 0, 0, 1]]) { color([0.580392, 0, 0.827451, 1]) { - sphere($fn = 5, $fa = 12, $fs = 1, r = 0.8); + sphere($fn = 5, $fa = 12, $fs = 2, r = 0.8); } } multmatrix([[1, 0, 0, 4], [0, 1, 0, 4], [0, 0, 1, 0], [0, 0, 0, 1]]) { color([0.6, 0.196078, 0.8, 1]) { - sphere($fn = 5, $fa = 12, $fs = 1, r = 0.8); + sphere($fn = 5, $fa = 12, $fs = 2, r = 0.8); } } multmatrix([[1, 0, 0, 5], [0, 1, 0, 4], [0, 0, 1, 0], [0, 0, 0, 1]]) { color([0.545098, 0, 0.545098, 1]) { - sphere($fn = 5, $fa = 12, $fs = 1, r = 0.8); + sphere($fn = 5, $fa = 12, $fs = 2, r = 0.8); } } multmatrix([[1, 0, 0, 6], [0, 1, 0, 4], [0, 0, 1, 0], [0, 0, 0, 1]]) { color([0.501961, 0, 0.501961, 1]) { - sphere($fn = 5, $fa = 12, $fs = 1, r = 0.8); + sphere($fn = 5, $fa = 12, $fs = 2, r = 0.8); } } multmatrix([[1, 0, 0, 7], [0, 1, 0, 4], [0, 0, 1, 0], [0, 0, 0, 1]]) { color([0.294118, 0, 0.509804, 1]) { - sphere($fn = 5, $fa = 12, $fs = 1, r = 0.8); + sphere($fn = 5, $fa = 12, $fs = 2, r = 0.8); } } multmatrix([[1, 0, 0, 8], [0, 1, 0, 4], [0, 0, 1, 0], [0, 0, 0, 1]]) { color([0.282353, 0.239216, 0.545098, 1]) { - sphere($fn = 5, $fa = 12, $fs = 1, r = 0.8); + sphere($fn = 5, $fa = 12, $fs = 2, r = 0.8); } } multmatrix([[1, 0, 0, 9], [0, 1, 0, 4], [0, 0, 1, 0], [0, 0, 0, 1]]) { color([0.415686, 0.352941, 0.803922, 1]) { - sphere($fn = 5, $fa = 12, $fs = 1, r = 0.8); + sphere($fn = 5, $fa = 12, $fs = 2, r = 0.8); } } multmatrix([[1, 0, 0, 10], [0, 1, 0, 4], [0, 0, 1, 0], [0, 0, 0, 1]]) { color([0.482353, 0.407843, 0.933333, 1]) { - sphere($fn = 5, $fa = 12, $fs = 1, r = 0.8); + sphere($fn = 5, $fa = 12, $fs = 2, r = 0.8); } } multmatrix([[1, 0, 0, 1], [0, 1, 0, 5], [0, 0, 1, 0], [0, 0, 0, 1]]) { color([0.678431, 1, 0.184314, 1]) { - sphere($fn = 5, $fa = 12, $fs = 1, r = 0.8); + sphere($fn = 5, $fa = 12, $fs = 2, r = 0.8); } } multmatrix([[1, 0, 0, 2], [0, 1, 0, 5], [0, 0, 1, 0], [0, 0, 0, 1]]) { color([0.498039, 1, 0, 1]) { - sphere($fn = 5, $fa = 12, $fs = 1, r = 0.8); + sphere($fn = 5, $fa = 12, $fs = 2, r = 0.8); } } multmatrix([[1, 0, 0, 3], [0, 1, 0, 5], [0, 0, 1, 0], [0, 0, 0, 1]]) { color([0.486275, 0.988235, 0, 1]) { - sphere($fn = 5, $fa = 12, $fs = 1, r = 0.8); + sphere($fn = 5, $fa = 12, $fs = 2, r = 0.8); } } multmatrix([[1, 0, 0, 4], [0, 1, 0, 5], [0, 0, 1, 0], [0, 0, 0, 1]]) { color([0, 1, 0, 1]) { - sphere($fn = 5, $fa = 12, $fs = 1, r = 0.8); + sphere($fn = 5, $fa = 12, $fs = 2, r = 0.8); } } multmatrix([[1, 0, 0, 5], [0, 1, 0, 5], [0, 0, 1, 0], [0, 0, 0, 1]]) { color([0.196078, 0.803922, 0.196078, 1]) { - sphere($fn = 5, $fa = 12, $fs = 1, r = 0.8); + sphere($fn = 5, $fa = 12, $fs = 2, r = 0.8); } } multmatrix([[1, 0, 0, 6], [0, 1, 0, 5], [0, 0, 1, 0], [0, 0, 0, 1]]) { color([0.596078, 0.984314, 0.596078, 1]) { - sphere($fn = 5, $fa = 12, $fs = 1, r = 0.8); + sphere($fn = 5, $fa = 12, $fs = 2, r = 0.8); } } multmatrix([[1, 0, 0, 7], [0, 1, 0, 5], [0, 0, 1, 0], [0, 0, 0, 1]]) { color([0.564706, 0.933333, 0.564706, 1]) { - sphere($fn = 5, $fa = 12, $fs = 1, r = 0.8); + sphere($fn = 5, $fa = 12, $fs = 2, r = 0.8); } } multmatrix([[1, 0, 0, 8], [0, 1, 0, 5], [0, 0, 1, 0], [0, 0, 0, 1]]) { color([0, 0.980392, 0.603922, 1]) { - sphere($fn = 5, $fa = 12, $fs = 1, r = 0.8); + sphere($fn = 5, $fa = 12, $fs = 2, r = 0.8); } } multmatrix([[1, 0, 0, 9], [0, 1, 0, 5], [0, 0, 1, 0], [0, 0, 0, 1]]) { color([0, 1, 0.498039, 1]) { - sphere($fn = 5, $fa = 12, $fs = 1, r = 0.8); + sphere($fn = 5, $fa = 12, $fs = 2, r = 0.8); } } multmatrix([[1, 0, 0, 10], [0, 1, 0, 5], [0, 0, 1, 0], [0, 0, 0, 1]]) { color([0.235294, 0.701961, 0.443137, 1]) { - sphere($fn = 5, $fa = 12, $fs = 1, r = 0.8); + sphere($fn = 5, $fa = 12, $fs = 2, r = 0.8); } } multmatrix([[1, 0, 0, 0], [0, 1, 0, 6], [0, 0, 1, 0], [0, 0, 0, 1]]) { color([0.180392, 0.545098, 0.341176, 1]) { - sphere($fn = 5, $fa = 12, $fs = 1, r = 0.8); + sphere($fn = 5, $fa = 12, $fs = 2, r = 0.8); } } multmatrix([[1, 0, 0, 1], [0, 1, 0, 6], [0, 0, 1, 0], [0, 0, 0, 1]]) { color([0.133333, 0.545098, 0.133333, 1]) { - sphere($fn = 5, $fa = 12, $fs = 1, r = 0.8); + sphere($fn = 5, $fa = 12, $fs = 2, r = 0.8); } } multmatrix([[1, 0, 0, 2], [0, 1, 0, 6], [0, 0, 1, 0], [0, 0, 0, 1]]) { color([0, 0.501961, 0, 1]) { - sphere($fn = 5, $fa = 12, $fs = 1, r = 0.8); + sphere($fn = 5, $fa = 12, $fs = 2, r = 0.8); } } multmatrix([[1, 0, 0, 3], [0, 1, 0, 6], [0, 0, 1, 0], [0, 0, 0, 1]]) { color([0, 0.392157, 0, 1]) { - sphere($fn = 5, $fa = 12, $fs = 1, r = 0.8); + sphere($fn = 5, $fa = 12, $fs = 2, r = 0.8); } } multmatrix([[1, 0, 0, 4], [0, 1, 0, 6], [0, 0, 1, 0], [0, 0, 0, 1]]) { color([0.603922, 0.803922, 0.196078, 1]) { - sphere($fn = 5, $fa = 12, $fs = 1, r = 0.8); + sphere($fn = 5, $fa = 12, $fs = 2, r = 0.8); } } multmatrix([[1, 0, 0, 5], [0, 1, 0, 6], [0, 0, 1, 0], [0, 0, 0, 1]]) { color([0.419608, 0.556863, 0.137255, 1]) { - sphere($fn = 5, $fa = 12, $fs = 1, r = 0.8); + sphere($fn = 5, $fa = 12, $fs = 2, r = 0.8); } } multmatrix([[1, 0, 0, 6], [0, 1, 0, 6], [0, 0, 1, 0], [0, 0, 0, 1]]) { color([0.501961, 0.501961, 0, 1]) { - sphere($fn = 5, $fa = 12, $fs = 1, r = 0.8); + sphere($fn = 5, $fa = 12, $fs = 2, r = 0.8); } } multmatrix([[1, 0, 0, 7], [0, 1, 0, 6], [0, 0, 1, 0], [0, 0, 0, 1]]) { color([0.333333, 0.419608, 0.184314, 1]) { - sphere($fn = 5, $fa = 12, $fs = 1, r = 0.8); + sphere($fn = 5, $fa = 12, $fs = 2, r = 0.8); } } multmatrix([[1, 0, 0, 8], [0, 1, 0, 6], [0, 0, 1, 0], [0, 0, 0, 1]]) { color([0.4, 0.803922, 0.666667, 1]) { - sphere($fn = 5, $fa = 12, $fs = 1, r = 0.8); + sphere($fn = 5, $fa = 12, $fs = 2, r = 0.8); } } multmatrix([[1, 0, 0, 9], [0, 1, 0, 6], [0, 0, 1, 0], [0, 0, 0, 1]]) { color([0.560784, 0.737255, 0.560784, 1]) { - sphere($fn = 5, $fa = 12, $fs = 1, r = 0.8); + sphere($fn = 5, $fa = 12, $fs = 2, r = 0.8); } } multmatrix([[1, 0, 0, 10], [0, 1, 0, 6], [0, 0, 1, 0], [0, 0, 0, 1]]) { color([0.12549, 0.698039, 0.666667, 1]) { - sphere($fn = 5, $fa = 12, $fs = 1, r = 0.8); + sphere($fn = 5, $fa = 12, $fs = 2, r = 0.8); } } multmatrix([[1, 0, 0, 0], [0, 1, 0, 7], [0, 0, 1, 0], [0, 0, 0, 1]]) { color([0, 0.545098, 0.545098, 1]) { - sphere($fn = 5, $fa = 12, $fs = 1, r = 0.8); + sphere($fn = 5, $fa = 12, $fs = 2, r = 0.8); } } multmatrix([[1, 0, 0, 1], [0, 1, 0, 7], [0, 0, 1, 0], [0, 0, 0, 1]]) { color([0, 0.501961, 0.501961, 1]) { - sphere($fn = 5, $fa = 12, $fs = 1, r = 0.8); + sphere($fn = 5, $fa = 12, $fs = 2, r = 0.8); } } multmatrix([[1, 0, 0, 3], [0, 1, 0, 7], [0, 0, 1, 0], [0, 0, 0, 1]]) { color([0, 1, 1, 1]) { - sphere($fn = 5, $fa = 12, $fs = 1, r = 0.8); + sphere($fn = 5, $fa = 12, $fs = 2, r = 0.8); } } multmatrix([[1, 0, 0, 4], [0, 1, 0, 7], [0, 0, 1, 0], [0, 0, 0, 1]]) { color([0, 1, 1, 1]) { - sphere($fn = 5, $fa = 12, $fs = 1, r = 0.8); + sphere($fn = 5, $fa = 12, $fs = 2, r = 0.8); } } multmatrix([[1, 0, 0, 5], [0, 1, 0, 7], [0, 0, 1, 0], [0, 0, 0, 1]]) { color([0.878431, 1, 1, 1]) { - sphere($fn = 5, $fa = 12, $fs = 1, r = 0.8); + sphere($fn = 5, $fa = 12, $fs = 2, r = 0.8); } } multmatrix([[1, 0, 0, 6], [0, 1, 0, 7], [0, 0, 1, 0], [0, 0, 0, 1]]) { color([0.686275, 0.933333, 0.933333, 1]) { - sphere($fn = 5, $fa = 12, $fs = 1, r = 0.8); + sphere($fn = 5, $fa = 12, $fs = 2, r = 0.8); } } multmatrix([[1, 0, 0, 7], [0, 1, 0, 7], [0, 0, 1, 0], [0, 0, 0, 1]]) { color([0.498039, 1, 0.831373, 1]) { - sphere($fn = 5, $fa = 12, $fs = 1, r = 0.8); + sphere($fn = 5, $fa = 12, $fs = 2, r = 0.8); } } multmatrix([[1, 0, 0, 8], [0, 1, 0, 7], [0, 0, 1, 0], [0, 0, 0, 1]]) { color([0.25098, 0.878431, 0.815686, 1]) { - sphere($fn = 5, $fa = 12, $fs = 1, r = 0.8); + sphere($fn = 5, $fa = 12, $fs = 2, r = 0.8); } } multmatrix([[1, 0, 0, 9], [0, 1, 0, 7], [0, 0, 1, 0], [0, 0, 0, 1]]) { color([0.282353, 0.819608, 0.8, 1]) { - sphere($fn = 5, $fa = 12, $fs = 1, r = 0.8); + sphere($fn = 5, $fa = 12, $fs = 2, r = 0.8); } } multmatrix([[1, 0, 0, 10], [0, 1, 0, 7], [0, 0, 1, 0], [0, 0, 0, 1]]) { color([0, 0.807843, 0.819608, 1]) { - sphere($fn = 5, $fa = 12, $fs = 1, r = 0.8); + sphere($fn = 5, $fa = 12, $fs = 2, r = 0.8); } } multmatrix([[1, 0, 0, 0], [0, 1, 0, 8], [0, 0, 1, 0], [0, 0, 0, 1]]) { color([0.372549, 0.619608, 0.627451, 1]) { - sphere($fn = 5, $fa = 12, $fs = 1, r = 0.8); + sphere($fn = 5, $fa = 12, $fs = 2, r = 0.8); } } multmatrix([[1, 0, 0, 1], [0, 1, 0, 8], [0, 0, 1, 0], [0, 0, 0, 1]]) { color([0.27451, 0.509804, 0.705882, 1]) { - sphere($fn = 5, $fa = 12, $fs = 1, r = 0.8); + sphere($fn = 5, $fa = 12, $fs = 2, r = 0.8); } } multmatrix([[1, 0, 0, 2], [0, 1, 0, 8], [0, 0, 1, 0], [0, 0, 0, 1]]) { color([0.690196, 0.768627, 0.870588, 1]) { - sphere($fn = 5, $fa = 12, $fs = 1, r = 0.8); + sphere($fn = 5, $fa = 12, $fs = 2, r = 0.8); } } multmatrix([[1, 0, 0, 3], [0, 1, 0, 8], [0, 0, 1, 0], [0, 0, 0, 1]]) { color([0.690196, 0.878431, 0.901961, 1]) { - sphere($fn = 5, $fa = 12, $fs = 1, r = 0.8); + sphere($fn = 5, $fa = 12, $fs = 2, r = 0.8); } } multmatrix([[1, 0, 0, 4], [0, 1, 0, 8], [0, 0, 1, 0], [0, 0, 0, 1]]) { color([0.678431, 0.847059, 0.901961, 1]) { - sphere($fn = 5, $fa = 12, $fs = 1, r = 0.8); + sphere($fn = 5, $fa = 12, $fs = 2, r = 0.8); } } multmatrix([[1, 0, 0, 5], [0, 1, 0, 8], [0, 0, 1, 0], [0, 0, 0, 1]]) { color([0.529412, 0.807843, 0.921569, 1]) { - sphere($fn = 5, $fa = 12, $fs = 1, r = 0.8); + sphere($fn = 5, $fa = 12, $fs = 2, r = 0.8); } } multmatrix([[1, 0, 0, 6], [0, 1, 0, 8], [0, 0, 1, 0], [0, 0, 0, 1]]) { color([0.529412, 0.807843, 0.980392, 1]) { - sphere($fn = 5, $fa = 12, $fs = 1, r = 0.8); + sphere($fn = 5, $fa = 12, $fs = 2, r = 0.8); } } multmatrix([[1, 0, 0, 7], [0, 1, 0, 8], [0, 0, 1, 0], [0, 0, 0, 1]]) { color([0, 0.74902, 1, 1]) { - sphere($fn = 5, $fa = 12, $fs = 1, r = 0.8); + sphere($fn = 5, $fa = 12, $fs = 2, r = 0.8); } } multmatrix([[1, 0, 0, 8], [0, 1, 0, 8], [0, 0, 1, 0], [0, 0, 0, 1]]) { color([0.117647, 0.564706, 1, 1]) { - sphere($fn = 5, $fa = 12, $fs = 1, r = 0.8); + sphere($fn = 5, $fa = 12, $fs = 2, r = 0.8); } } multmatrix([[1, 0, 0, 9], [0, 1, 0, 8], [0, 0, 1, 0], [0, 0, 0, 1]]) { color([0.392157, 0.584314, 0.929412, 1]) { - sphere($fn = 5, $fa = 12, $fs = 1, r = 0.8); + sphere($fn = 5, $fa = 12, $fs = 2, r = 0.8); } } multmatrix([[1, 0, 0, 10], [0, 1, 0, 8], [0, 0, 1, 0], [0, 0, 0, 1]]) { color([0.254902, 0.411765, 0.882353, 1]) { - sphere($fn = 5, $fa = 12, $fs = 1, r = 0.8); + sphere($fn = 5, $fa = 12, $fs = 2, r = 0.8); } } multmatrix([[1, 0, 0, 0], [0, 1, 0, 9], [0, 0, 1, 0], [0, 0, 0, 1]]) { color([0, 0, 1, 1]) { - sphere($fn = 5, $fa = 12, $fs = 1, r = 0.8); + sphere($fn = 5, $fa = 12, $fs = 2, r = 0.8); } } multmatrix([[1, 0, 0, 1], [0, 1, 0, 9], [0, 0, 1, 0], [0, 0, 0, 1]]) { color([0, 0, 0.803922, 1]) { - sphere($fn = 5, $fa = 12, $fs = 1, r = 0.8); + sphere($fn = 5, $fa = 12, $fs = 2, r = 0.8); } } multmatrix([[1, 0, 0, 2], [0, 1, 0, 9], [0, 0, 1, 0], [0, 0, 0, 1]]) { color([0, 0, 0.545098, 1]) { - sphere($fn = 5, $fa = 12, $fs = 1, r = 0.8); + sphere($fn = 5, $fa = 12, $fs = 2, r = 0.8); } } multmatrix([[1, 0, 0, 3], [0, 1, 0, 9], [0, 0, 1, 0], [0, 0, 0, 1]]) { color([0, 0, 0.501961, 1]) { - sphere($fn = 5, $fa = 12, $fs = 1, r = 0.8); + sphere($fn = 5, $fa = 12, $fs = 2, r = 0.8); } } multmatrix([[1, 0, 0, 4], [0, 1, 0, 9], [0, 0, 1, 0], [0, 0, 0, 1]]) { color([0.0980392, 0.0980392, 0.439216, 1]) { - sphere($fn = 5, $fa = 12, $fs = 1, r = 0.8); + sphere($fn = 5, $fa = 12, $fs = 2, r = 0.8); } } multmatrix([[1, 0, 0, 6], [0, 1, 0, 9], [0, 0, 1, 0], [0, 0, 0, 1]]) { color([1, 0.972549, 0.862745, 1]) { - sphere($fn = 5, $fa = 12, $fs = 1, r = 0.8); + sphere($fn = 5, $fa = 12, $fs = 2, r = 0.8); } } multmatrix([[1, 0, 0, 7], [0, 1, 0, 9], [0, 0, 1, 0], [0, 0, 0, 1]]) { color([1, 0.921569, 0.803922, 1]) { - sphere($fn = 5, $fa = 12, $fs = 1, r = 0.8); + sphere($fn = 5, $fa = 12, $fs = 2, r = 0.8); } } multmatrix([[1, 0, 0, 8], [0, 1, 0, 9], [0, 0, 1, 0], [0, 0, 0, 1]]) { color([1, 0.894118, 0.768627, 1]) { - sphere($fn = 5, $fa = 12, $fs = 1, r = 0.8); + sphere($fn = 5, $fa = 12, $fs = 2, r = 0.8); } } multmatrix([[1, 0, 0, 9], [0, 1, 0, 9], [0, 0, 1, 0], [0, 0, 0, 1]]) { color([1, 0.870588, 0.678431, 1]) { - sphere($fn = 5, $fa = 12, $fs = 1, r = 0.8); + sphere($fn = 5, $fa = 12, $fs = 2, r = 0.8); } } multmatrix([[1, 0, 0, 10], [0, 1, 0, 9], [0, 0, 1, 0], [0, 0, 0, 1]]) { color([0.960784, 0.870588, 0.701961, 1]) { - sphere($fn = 5, $fa = 12, $fs = 1, r = 0.8); + sphere($fn = 5, $fa = 12, $fs = 2, r = 0.8); } } multmatrix([[1, 0, 0, 0], [0, 1, 0, 10], [0, 0, 1, 0], [0, 0, 0, 1]]) { color([0.870588, 0.721569, 0.529412, 1]) { - sphere($fn = 5, $fa = 12, $fs = 1, r = 0.8); + sphere($fn = 5, $fa = 12, $fs = 2, r = 0.8); } } multmatrix([[1, 0, 0, 1], [0, 1, 0, 10], [0, 0, 1, 0], [0, 0, 0, 1]]) { color([0.823529, 0.705882, 0.54902, 1]) { - sphere($fn = 5, $fa = 12, $fs = 1, r = 0.8); + sphere($fn = 5, $fa = 12, $fs = 2, r = 0.8); } } multmatrix([[1, 0, 0, 2], [0, 1, 0, 10], [0, 0, 1, 0], [0, 0, 0, 1]]) { color([0.737255, 0.560784, 0.560784, 1]) { - sphere($fn = 5, $fa = 12, $fs = 1, r = 0.8); + sphere($fn = 5, $fa = 12, $fs = 2, r = 0.8); } } multmatrix([[1, 0, 0, 3], [0, 1, 0, 10], [0, 0, 1, 0], [0, 0, 0, 1]]) { color([0.956863, 0.643137, 0.376471, 1]) { - sphere($fn = 5, $fa = 12, $fs = 1, r = 0.8); + sphere($fn = 5, $fa = 12, $fs = 2, r = 0.8); } } multmatrix([[1, 0, 0, 4], [0, 1, 0, 10], [0, 0, 1, 0], [0, 0, 0, 1]]) { color([0.854902, 0.647059, 0.12549, 1]) { - sphere($fn = 5, $fa = 12, $fs = 1, r = 0.8); + sphere($fn = 5, $fa = 12, $fs = 2, r = 0.8); } } multmatrix([[1, 0, 0, 5], [0, 1, 0, 10], [0, 0, 1, 0], [0, 0, 0, 1]]) { color([0.721569, 0.52549, 0.0431373, 1]) { - sphere($fn = 5, $fa = 12, $fs = 1, r = 0.8); + sphere($fn = 5, $fa = 12, $fs = 2, r = 0.8); } } multmatrix([[1, 0, 0, 6], [0, 1, 0, 10], [0, 0, 1, 0], [0, 0, 0, 1]]) { color([0.803922, 0.521569, 0.247059, 1]) { - sphere($fn = 5, $fa = 12, $fs = 1, r = 0.8); + sphere($fn = 5, $fa = 12, $fs = 2, r = 0.8); } } multmatrix([[1, 0, 0, 7], [0, 1, 0, 10], [0, 0, 1, 0], [0, 0, 0, 1]]) { color([0.823529, 0.411765, 0.117647, 1]) { - sphere($fn = 5, $fa = 12, $fs = 1, r = 0.8); + sphere($fn = 5, $fa = 12, $fs = 2, r = 0.8); } } multmatrix([[1, 0, 0, 8], [0, 1, 0, 10], [0, 0, 1, 0], [0, 0, 0, 1]]) { color([0.545098, 0.270588, 0.0745098, 1]) { - sphere($fn = 5, $fa = 12, $fs = 1, r = 0.8); + sphere($fn = 5, $fa = 12, $fs = 2, r = 0.8); } } multmatrix([[1, 0, 0, 9], [0, 1, 0, 10], [0, 0, 1, 0], [0, 0, 0, 1]]) { color([0.627451, 0.321569, 0.176471, 1]) { - sphere($fn = 5, $fa = 12, $fs = 1, r = 0.8); + sphere($fn = 5, $fa = 12, $fs = 2, r = 0.8); } } multmatrix([[1, 0, 0, 10], [0, 1, 0, 10], [0, 0, 1, 0], [0, 0, 0, 1]]) { color([0.647059, 0.164706, 0.164706, 1]) { - sphere($fn = 5, $fa = 12, $fs = 1, r = 0.8); + sphere($fn = 5, $fa = 12, $fs = 2, r = 0.8); } } multmatrix([[1, 0, 0, 0], [0, 1, 0, 11], [0, 0, 1, 0], [0, 0, 0, 1]]) { color([0.501961, 0, 0, 1]) { - sphere($fn = 5, $fa = 12, $fs = 1, r = 0.8); + sphere($fn = 5, $fa = 12, $fs = 2, r = 0.8); } } multmatrix([[1, 0, 0, 2], [0, 1, 0, 11], [0, 0, 1, 0], [0, 0, 0, 1]]) { color([1, 1, 1, 1]) { - sphere($fn = 5, $fa = 12, $fs = 1, r = 0.8); + sphere($fn = 5, $fa = 12, $fs = 2, r = 0.8); } } multmatrix([[1, 0, 0, 3], [0, 1, 0, 11], [0, 0, 1, 0], [0, 0, 0, 1]]) { color([1, 0.980392, 0.980392, 1]) { - sphere($fn = 5, $fa = 12, $fs = 1, r = 0.8); + sphere($fn = 5, $fa = 12, $fs = 2, r = 0.8); } } multmatrix([[1, 0, 0, 4], [0, 1, 0, 11], [0, 0, 1, 0], [0, 0, 0, 1]]) { color([0.941176, 1, 0.941176, 1]) { - sphere($fn = 5, $fa = 12, $fs = 1, r = 0.8); + sphere($fn = 5, $fa = 12, $fs = 2, r = 0.8); } } multmatrix([[1, 0, 0, 5], [0, 1, 0, 11], [0, 0, 1, 0], [0, 0, 0, 1]]) { color([0.960784, 1, 0.980392, 1]) { - sphere($fn = 5, $fa = 12, $fs = 1, r = 0.8); + sphere($fn = 5, $fa = 12, $fs = 2, r = 0.8); } } multmatrix([[1, 0, 0, 6], [0, 1, 0, 11], [0, 0, 1, 0], [0, 0, 0, 1]]) { color([0.941176, 1, 1, 1]) { - sphere($fn = 5, $fa = 12, $fs = 1, r = 0.8); + sphere($fn = 5, $fa = 12, $fs = 2, r = 0.8); } } multmatrix([[1, 0, 0, 7], [0, 1, 0, 11], [0, 0, 1, 0], [0, 0, 0, 1]]) { color([0.941176, 0.972549, 1, 1]) { - sphere($fn = 5, $fa = 12, $fs = 1, r = 0.8); + sphere($fn = 5, $fa = 12, $fs = 2, r = 0.8); } } multmatrix([[1, 0, 0, 8], [0, 1, 0, 11], [0, 0, 1, 0], [0, 0, 0, 1]]) { color([0.972549, 0.972549, 1, 1]) { - sphere($fn = 5, $fa = 12, $fs = 1, r = 0.8); + sphere($fn = 5, $fa = 12, $fs = 2, r = 0.8); } } multmatrix([[1, 0, 0, 9], [0, 1, 0, 11], [0, 0, 1, 0], [0, 0, 0, 1]]) { color([0.960784, 0.960784, 0.960784, 1]) { - sphere($fn = 5, $fa = 12, $fs = 1, r = 0.8); + sphere($fn = 5, $fa = 12, $fs = 2, r = 0.8); } } multmatrix([[1, 0, 0, 10], [0, 1, 0, 11], [0, 0, 1, 0], [0, 0, 0, 1]]) { color([1, 0.960784, 0.933333, 1]) { - sphere($fn = 5, $fa = 12, $fs = 1, r = 0.8); + sphere($fn = 5, $fa = 12, $fs = 2, r = 0.8); } } multmatrix([[1, 0, 0, 0], [0, 1, 0, 12], [0, 0, 1, 0], [0, 0, 0, 1]]) { color([0.960784, 0.960784, 0.862745, 1]) { - sphere($fn = 5, $fa = 12, $fs = 1, r = 0.8); + sphere($fn = 5, $fa = 12, $fs = 2, r = 0.8); } } multmatrix([[1, 0, 0, 1], [0, 1, 0, 12], [0, 0, 1, 0], [0, 0, 0, 1]]) { color([0.992157, 0.960784, 0.901961, 1]) { - sphere($fn = 5, $fa = 12, $fs = 1, r = 0.8); + sphere($fn = 5, $fa = 12, $fs = 2, r = 0.8); } } multmatrix([[1, 0, 0, 2], [0, 1, 0, 12], [0, 0, 1, 0], [0, 0, 0, 1]]) { color([1, 0.980392, 0.941176, 1]) { - sphere($fn = 5, $fa = 12, $fs = 1, r = 0.8); + sphere($fn = 5, $fa = 12, $fs = 2, r = 0.8); } } multmatrix([[1, 0, 0, 3], [0, 1, 0, 12], [0, 0, 1, 0], [0, 0, 0, 1]]) { color([1, 1, 0.941176, 1]) { - sphere($fn = 5, $fa = 12, $fs = 1, r = 0.8); + sphere($fn = 5, $fa = 12, $fs = 2, r = 0.8); } } multmatrix([[1, 0, 0, 4], [0, 1, 0, 12], [0, 0, 1, 0], [0, 0, 0, 1]]) { color([0.980392, 0.921569, 0.843137, 1]) { - sphere($fn = 5, $fa = 12, $fs = 1, r = 0.8); + sphere($fn = 5, $fa = 12, $fs = 2, r = 0.8); } } multmatrix([[1, 0, 0, 5], [0, 1, 0, 12], [0, 0, 1, 0], [0, 0, 0, 1]]) { color([0.980392, 0.941176, 0.901961, 1]) { - sphere($fn = 5, $fa = 12, $fs = 1, r = 0.8); + sphere($fn = 5, $fa = 12, $fs = 2, r = 0.8); } } multmatrix([[1, 0, 0, 6], [0, 1, 0, 12], [0, 0, 1, 0], [0, 0, 0, 1]]) { color([1, 0.941176, 0.960784, 1]) { - sphere($fn = 5, $fa = 12, $fs = 1, r = 0.8); + sphere($fn = 5, $fa = 12, $fs = 2, r = 0.8); } } multmatrix([[1, 0, 0, 7], [0, 1, 0, 12], [0, 0, 1, 0], [0, 0, 0, 1]]) { color([1, 0.894118, 0.882353, 1]) { - sphere($fn = 5, $fa = 12, $fs = 1, r = 0.8); + sphere($fn = 5, $fa = 12, $fs = 2, r = 0.8); } } multmatrix([[1, 0, 0, 9], [0, 1, 0, 12], [0, 0, 1, 0], [0, 0, 0, 1]]) { color([0.862745, 0.862745, 0.862745, 1]) { - sphere($fn = 5, $fa = 12, $fs = 1, r = 0.8); + sphere($fn = 5, $fa = 12, $fs = 2, r = 0.8); } } multmatrix([[1, 0, 0, 10], [0, 1, 0, 12], [0, 0, 1, 0], [0, 0, 0, 1]]) { color([0.827451, 0.827451, 0.827451, 1]) { - sphere($fn = 5, $fa = 12, $fs = 1, r = 0.8); + sphere($fn = 5, $fa = 12, $fs = 2, r = 0.8); } } multmatrix([[1, 0, 0, 0], [0, 1, 0, 13], [0, 0, 1, 0], [0, 0, 0, 1]]) { color([0.752941, 0.752941, 0.752941, 1]) { - sphere($fn = 5, $fa = 12, $fs = 1, r = 0.8); + sphere($fn = 5, $fa = 12, $fs = 2, r = 0.8); } } multmatrix([[1, 0, 0, 1], [0, 1, 0, 13], [0, 0, 1, 0], [0, 0, 0, 1]]) { color([0.662745, 0.662745, 0.662745, 1]) { - sphere($fn = 5, $fa = 12, $fs = 1, r = 0.8); + sphere($fn = 5, $fa = 12, $fs = 2, r = 0.8); } } multmatrix([[1, 0, 0, 2], [0, 1, 0, 13], [0, 0, 1, 0], [0, 0, 0, 1]]) { color([0.501961, 0.501961, 0.501961, 1]) { - sphere($fn = 5, $fa = 12, $fs = 1, r = 0.8); + sphere($fn = 5, $fa = 12, $fs = 2, r = 0.8); } } multmatrix([[1, 0, 0, 3], [0, 1, 0, 13], [0, 0, 1, 0], [0, 0, 0, 1]]) { color([0.411765, 0.411765, 0.411765, 1]) { - sphere($fn = 5, $fa = 12, $fs = 1, r = 0.8); + sphere($fn = 5, $fa = 12, $fs = 2, r = 0.8); } } multmatrix([[1, 0, 0, 4], [0, 1, 0, 13], [0, 0, 1, 0], [0, 0, 0, 1]]) { color([0.466667, 0.533333, 0.6, 1]) { - sphere($fn = 5, $fa = 12, $fs = 1, r = 0.8); + sphere($fn = 5, $fa = 12, $fs = 2, r = 0.8); } } multmatrix([[1, 0, 0, 5], [0, 1, 0, 13], [0, 0, 1, 0], [0, 0, 0, 1]]) { color([0.439216, 0.501961, 0.564706, 1]) { - sphere($fn = 5, $fa = 12, $fs = 1, r = 0.8); + sphere($fn = 5, $fa = 12, $fs = 2, r = 0.8); } } multmatrix([[1, 0, 0, 6], [0, 1, 0, 13], [0, 0, 1, 0], [0, 0, 0, 1]]) { color([0.184314, 0.309804, 0.309804, 1]) { - sphere($fn = 5, $fa = 12, $fs = 1, r = 0.8); + sphere($fn = 5, $fa = 12, $fs = 2, r = 0.8); } } multmatrix([[1, 0, 0, 7], [0, 1, 0, 13], [0, 0, 1, 0], [0, 0, 0, 1]]) { color([0, 0, 0, 1]) { - sphere($fn = 5, $fa = 12, $fs = 1, r = 0.8); + sphere($fn = 5, $fa = 12, $fs = 2, r = 0.8); } } diff --git a/tests/regression/opencsgtest/circle-tests-expected.png b/tests/regression/opencsgtest/circle-tests-expected.png index 7066eb9b626f616d09e2197a3aec82bac075c5c9..2e5b3146053960ff10d735750782ab9ce86674bc 100644 GIT binary patch literal 8880 zcmeHN`#aPB`+seQVOS)GN~?6BoGFDiol7K#D6yq-%%Q|cvn@&|hf)c#l_G@o&iS+< zc_$&q9A1YhtGBO`sMY!c0Hf>eeXU!@B4AT?mO5YQazH~P$u1b}1||C0Huo41RsGu@@p7KJ#A!FISBc#+ActAw329as<++ZZjJxo%$qg;M)_U@zS2H`0AvVTVrd z%(2^r08McjZQ4|w<%J7zl;Z3_0ZXCj%UM@fwwk#i z9+9S1(xqVxZ^~|d|J;u0Vx1RA^zvJ2%#bv$vnY@6Ma>J>Nqqzy@0d(BnGr1Rbw_lu zvi5y*09ta>)BQgPgFAAk4;VX~JLGM-5n?pZW3bMfkL`lr*ewS&-!dPr_9l*Qe->@q`M7>{Pt2_{~0p~=j>wrbRuSBz7#4pQVeC$Q-X^nlE z0>Jx93zAD0gSS11zO8d_s7`B~yZ3f?`yKKGj=xExxOrIoTRHk&b7ZQs4g`YCbtjDb z^SN1L8=x>P2*fD=3XV^4u~a)mrICQ02&<9VaLJkvIrOf!)#e>JlvqueIufW`FAyxu zh!brEL?~i{$$=`sO|$vawd6GM`^L_)D0jfj^eLpX%&$rFJx9m{?0~M)MSN(0vQC}K@o!ie1(H^& zxHN+drDo7H-YrM|Xbo(rWo6D@LSGLPx!f>)3fp+3MAjHe%_PtRE|&wo-Ud>YODKUKbs+#j{ZA@Hl7JZXh5dTTHw9G-BU3uV9c z3lz?eG3$FhOCoyiutXyxDG9dl%L9B{4Xw}+vOkplm>1Lg+>60oZa5!J9Z8smOQWQ^p?0#QXz#>rbQ=6il85a)i|$(Uh}-X~jfSNccB zHo9(e@BoVU2O`Xxo>ikFnv)4vf6rHX#K$H_{}f)U_Z5mAr4D`~F^RbWC4_T+z>QO* zbQG-@FNoUkKKtO{aSI~P++8|)Do~ZUH+x)zCJgpKCsQ2kfR|Mf#o`IZ9WRC_x_%|y zNM&W3y%qi_!Zn|u~fj&Hjb=)o1)KxLi_w3{lPiBo9Zjr`Jl`l3)NpTj<@j>>X z0b7STmfERKXP$LA>Z#as1<%$7XjRF7QXm!9?~xmt>k(GDZ$P4GF4TvyvIk0dc)y{= z+PKmLZY%~WzGh4HPW2Bbr(-9h68m}?v_;uyX`|h--{A{u%Oivh%+#p^uR`;P>-+6m zY__)ZI1{OrQTkMOE8=b+{XzsckTRg=->@8ow%PM2a@=Fez$^#% zP8ZlytHy3oa)}&*_Yv2s=hAGViV4Jq4QW;DoGvb1q@{ZCYPOAdSTEy+bIER-mK%7l!k> zZ_+iAAQ?wRZMi{rho4}88(*iXF+tKB%pS<5sJ|ofgB7dS`fl{H{@C9q^ME`H3Hdse zxo0M-&P%_2e*M)N*L(jg8p?Y|>mvE7YCC1>Wf>zMuN03ijgp4&bGx!UuCWyeKhtgL zYS-CwQ|k>zI4r$vg6`~mdQnB-u)g|YL9V{(Z|M7Rb=Z(x_1lL&L!#~?!me2k(fh>5 zT4N4}Rq{5T%(0av!_ssn>#3!F3Z#wuJEny*L`$pBxlRf#IDW7k7_M1oq7{BPSOV$$4ccG&0roW!Sqr%1UGhr=+=5seLI-F2(uHxeD@(h9gGN{${+H@~!jExtS z9Zr9CT~|4cH=!-p)a0`Y__a9uF0B*x z#1%l=&tmNm)4h+n)nO&UeD|qSsj>ylg}Dy?RrI--9lYfc+p;D9c~yCl0MD)LpBT-O z%*EFn6O7VV=Q}RNaD*OeVX_#@ZvtbZnc&@%Y1XTCj@oAG|IVqrO1^ON4qg24r{ZhN zP}RsGc}TVaCttKFv~o_MJk@V#@^3zvvR_!Vs;mTc7j zX=57G;JL+WN=;H-@gSJ6)R=zyMO#g;mH0%ZaC@DmrTF6h{NP&~tyID@*qhP7kHzzw zTN5<_{h5=9tH?5DFe7!ou=DZkd)HI@Qc^Ee+1@V9TzqUK$Yy!)T4LTFcT17Yr@-*z zzCl(OP}hOtZi<>zsj$KI?wawfG^CuZ`)sj!p}n_<&MC__n?ldwbReyAL>4pfGE_ad zA}ndoTkXq>a_7{Vc$tL7Z$;t=7pDj2sm;OxT&d|oE+wlVzXHba#X$_aRvl?M^vQ$* z)gmJP$NBo{(-8v{qCZ{hk~zP0;Pip|v!I=)GPKR(5@UvP*(dCW7Hd8wpXxX=wMJtp zhU7IP_E1mL@J*&xHP*4gGHd}A7~R4y0IXlWbbN(rXVR0WO&AKdTQ4)DiU65U2rK7> zz%53EFS%{G1$HV6%OM3%UgmtxtgB+A-K>UMbUR~_FX9+4OT~=|#hUGe+JO;|1U_qfi+%t@XvzJ`AXE?oAha@`|)PUK=HhD~mB{|VC zdG5Kcl+x9FzyjIcAcsUDT`<7mnU|5OZaYGRQJDjS&&JZdJz?+NWe7p)0O6^3R03Dh zQd%OvOV=n7Pc}aYrLs)?&^Ibs6+W3iM@g-hbqS--SbXKThG%$!rlOix%SGdwX#>Sz zBXFMRYG`1Tj`$(W!c1g9@I#9wBLTj(U=hrlnJI0aza{aJ(WLP?tiszBwQJ!YgswsZ zns*?a6gY4hPvm(}W9VzT6vuHp$PL6y&HYkJgCfh{sg0O>OnO5R4+Bj9P&cM+b+gWq z{YH8fE-75YyGQoG6N9BV>lh$kzh=CWo;>ZLM8WGLk8Yqvh7mf2x@KakqZ)Asb%vXPQdU8t;C&-d*gQBXV+T zdFVfcrn6>ZpqqF z3t#xR#Zy;e5at4u(~LO(&hGKL;}>a7+303okeUxue~~L>wn$@+84uRAfBl|-z7TAm zxX`71L45PKk>D3rJofX8b7ZlG%r{tEON{j%k<06)$lk#NO#UUQKv4k&aPv4O#r!82 z@q;7l&q!$4eb+|V{^YSyeK?V)P}KJrSJpXT6~T6jt6jtQ;70kDDNqgwYsv_m1;t}2 ztRmC1DzO86OJhj;nWy_E*GPr0nk>jB?!Tb(h{oh%XDafSh*y6m?p{qpacWtMcEF9b z+mvf-kin76WqkFbc-$m>^-0gRCeQfTasOS0Yx9OUw)0(J5gnw|#M6PU`4fI#+jJr^Y4jiil##J+NSDA6I@s^oVFR zHmr8wEa3cOtyA7{>O@d&)1%(_-5N`bg(MLS#)uBmHg_k73Fm#K@v2F%tkj&EB;feK z%{vs8$x^0Mnf*%R$kW)mHw7`w6)6_ zLvo{jNv~AizTAvRMdJ`bI*?~$w|@;Jsd%mzJ+W1JaQXJj#wO;9y3pk`Vs~rvwcTLf zn2+_2N@7@*ijP2zY43(3Tp@I2oU8G~F|`*g4lC@nZb3e0iEmX_MOc#cxux`JIzYP^ z17??>W^M&grr2!?Ci}wGeRPP+0 zc9{+MJL>=KZDfmpqr<_fz_9y^98x+~G?($H1d>!C{8%6|FS_~rYJk&^QRo5qK1T^&s)KM0k(oghX}-&}(`@0k6;A&$x>rb))c9P4rvDIMcrNhX#EhH zCieid#Sr>j!oi+H2z1JsDZJT4B+!tq^+At3ij6wY!@4-7T{o%2$_u6>w1>w4#FSt0 zN$G#CFy^rm^#R8|TXJJ=;DJ(M@KWEXCxj-O78kqrU!Ehb6RcAW`fVXq#NJAX@~S-> zVmzw&Y`6)q_3-mz*K?Wl8>3fiS0{JaM{AD7_wu7W4ZRr+6ZuChqQ6>qx9YEaTG4+x z>5_&fOOuxdY)l`L!>6$Ct~WIV74OPRjzOt!3P0>xXK|mr!y|GS&&iKS zsL2kW?4jR${HvZ(OYe_=T?Qw;u9hkCU<>vJ`{!sF%iU$IxDJ?~)cC=79d4>P0z4X> z)+=wskl2qQA-9)B<#81HNa?kl~*^kdwZQzQBB^Ka*(s+<%8@?dP307qCqQv z@t?Zvt^K^>>&o!e<-Jyy?m$tOdb_Lh8FPkA+DeiFap7(EdgbcIY$A#p#|06I@R92# zVmYXvkU?D_h@MRyYPz0!J>g?8u$ukFYdcIo}kE zp3*K`^UjuW%%-bb`6GylFnqxa$jo1TixHV&$rAmNEByV$282M8j;3x0UGeTZByi}V zRw6jI`QKm3(NF?fzL@3PnpQ>vUf_u?$G`~=2z%l5<1OJxlud?3E-Ik5WzaH zg$D;ZxFK-EkjQ1@AO8j;r^Jkd0=ZX%8>)r*`@w0_do?5w;5TRk5{p!TlOp-9VIYp< z24ZJD9py0~F&-!jk5lv;=a$*wgTP7JK1sY~gm zJ_K2OEt_eJi#CJ~NnXVXorC@d^!mROEy3X{SUx#xoW6k=R4taXdnI0>WDQ6;>jE+u zv%>({OcTdfrfKD;z6Rc9t8I5YkFt|_de=;R6=v^gv~mdb5R(qUM)&QW5)CL1S$?ft z>tfH?MY>*kw9o~YU?@E;E-5U{oA{}Q>7FsJaD>{)wEPSs70|o3oG>Z`j<;XlmZ{rb zt0efnY|2Gk%PK%0PWR6QOQZ_R@w1+6UG+^>N8jnt7E`dAx`imfvH0BM0qGGPGLsm! zH{<(h_5<4#?P+}WN4Sov+bz3U7Hcq95QXL~X0)BMf{8zHCb+9&8$2%@kywo z{3%fyBb#!)FaCTnpz&;=@u0lfiP@)j?n@?Y)oV2b?b&Ffcf)(+!32C%8?Q2{8?s;R zX0*cOFT={LiCO!t4hJ#7QwQ@ujtGTE>{`|JYXr zv|wzW@t;}^96iE(pXjQfFw|HOVSMF(3iK}+7z>cJ%MU=O+PN78oP4L14EhQLwCZ27 zf0gjxiCew>)=P766|UN9+$59>m@L4-QWw AUjP6A literal 9537 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 AUjP6A literal 5265 zcmeHLX*iVa+rMUM8bw44dTd2JElidaF@s7{kt|cTDa(XJ_HE3dvXrGFWSg>Qt&}Wd zNKu3-F(nKoOUjZNlQGMC_x#`E{r-M=kN3m#>AuhFIj)>{*s%zu59#_V;yZQktLPuSPD#|S zvfQ!TuO998f<2eIl=^zviqj6OalgQtv$;xdJWpu!6R9c9AyhE;RTy`7$v&_hHm2#kBdoxhzo*1 zb%b~V*woAG29<}waZf?_4g?xhJP~@Ffk&u=k^(0$VD#`{>=tYl>(z>}dQ(}>}udUkjCD8OkIhOw2|(NrHjb8wJ1yfr@%%{~Tx?GK(h8V`cZ z!Q)ccyGx(Ks?4ZbNGdWJ^%^LHD_)>>C!7kySqGb2XB|a&wnTIsWMFh?H0I}-u`8YU z+D9uZPt=U^{X_XaO%8|F$!Wa1o6OuVT58Zb#N_7C-!jp!))Fq(3r#JW#qBrXieVlr z<4@*wM@65AmoG(s6mLB?$KT|N4pN&3H<#zEut46LGC5aY2lxN}R#Y5PempI24+1kZ z;x`nzn(P>=pddI~xrK5Zk@Qh;4R*|*=b?NidyVq78NV(K;E-|(b-Vukv=%!N`&=_K zz7Pqw9-6Cn-wOHL47{1s9}ez3+36BiYG3h}x^rJsojGnD7ETpG1LuyvS^aw?bqk^Wn=QAJI&wucK`a|*8hqkZzT-||+ z^dhWaO;%%|TX4IcgTiVXQ=yw0Ok2eqa9dg;-g%yOLq=!qsc!+^f4;d=P}P)@BJ_6o zOq*0{FaVYorgZid?tJ6dl8#j+1(8R}6ef7#d5($+=j!EKkz!oHS}|2@iB$s{NL9aI`gAGDcq(;+{@Gp?z_9|k@(G;3cEc~DJA+^yc2I# z#Ur>5heUJ%qgY4OrDbEB+rf@3E~?CDzjW$tO|v9StKIjwFvVMDEl7$Ed=Z>Hh#16@ zID4uepN(xHwhl`26CH0~^`5rF2fqx|wXfLQgR@bq6`nn|6MTI#@G5bc_1+S7iDYos z{ys@M$!WnP?-BDs_2rKpQh%RY2lZC0b<{MSJfYe=VQ zinjoJB4d7jxN-JkJnN7SZG@JUImoDa^VqHorF8wGJ&W69$TQka!|Z65T|Ub6U} z&ywNt4e$)zoT|M&m?&aGSeAUcEdcjD88#TzPw-dFZCLG7yA! zy)o6CWxaomn?SkqzI16IKCLALh)Uv>4jBDV2>*k16_!sERcUi3YaVW^F5mvoY9F3Zd(?#fY!_kFmZ%)8NlU*m{6#@FXXeNH87m%_U5 zWshnCxo%^`qixpCy|`G10Z(oY>XDF0Hpm?5cfcWTH*xZr`yY zq*sd2bY=}9YWe-@4VjfuGL01#cQ4Wi|K*13@N@PZQn~3=lgLo1@!1$Sv^>$>E-I{& zwk=FB;We>rtk{j)JqYfB^oK``%1l-7e{WdlTSER+MLe)iHb_i+NHBq5q~lPE(PQih z;Ynxy*yDQVMn~5DBNo#>lFvxLcrw^9!%y)ob?e;R1~TbUjhyiZBT63z{diolNaa=+0N1l z3Y3y=xvb{;2j-Tpcgi1aER2foydD%D7kPKeg~ar&wI12HY5u=e3N}lg-OIEKQWL0$ z&J3LT;pF=MjK64y*3K|Hy_#f|tYP{a6@q~2zC7)itZ&7_i2-&e1g>#gMOTo((Vam3 zoX=_h;T*>2Ne_hB>g;BKEc;Tidp*U60;P8D|ojSPR zbHXnaEuZ!@8&SHeQ4OSD`cWtvmrC*j&N7tVn|;f_*YD)|1tje_eFCA#=UL|W93JK} zvb7Zxz)L--a!I;RL9w3;SC=noaNdxjmV1&e4=9+Fb`Z5_^aJCn+PR`ikx zd0}CS%pD$!UYYcrZCq_D@AGrwM0&P_lr*`H_6*k)tu$7kTw+%h&n>o1K3?4m$6$=y zTfd~XzK|7H6GP;!s?1`fo%;m$&HL2wu~DJ)BLG$TL>$lG#L*K|>mh|Ux`>ujjK~2Q z4z7A-(i2Uqa7-+eMg@N^>Pcfa1@*S!Qje&RkEy_FO(L)?;W5H>vi?ZQZ>FmODci?!)BlL7cw4}C^g=RY8jKw3LtWPZVK2G*_u z{4>taMaMI#YoU@ECtb)I|CR_Nse+doQ26x8jN=Os)xteDf}w_$ujai%2S)MhE8I-d zrrmnLz%~$x7oE^kw6u_nAD02}zXLS&DAi)%^rl1U$?fFiD97rXTp z1i7sT*H&p&^ntH_8esx6qoX`aP`1ZypL{CYk=0;rLPS!2>F*mdyR1v~lRF^FcPt~o zar=!|J`o3bJ77$Dv7ZDEC>!2l(k&1dtw60%DjirW&r0S=fpv9$eW-Y-dAH4}uL?x( zfe7x!%9q#x8Sj~fX1i#mca89O#k1B`nztc zf{F1v1*DQ21w-}3xWe7qTpbm|Iq8%631%9jU!VA09z8uI<11JL3?BRSUC)wi z-X}<|->r1B&n04aEN6ZPlzmKccHd+HY?kF3Y>rzjnfvtqpNsD5+9p0*s|(lvN~~WC zNSW#&?B1#28-+hZo}7){4@K;IbuF!3P_?h=YBMPq1S zl93*xSxUa;DJI=b;V5aqlRbw^q}M3BjQeWoJHjCc*hwb%&oEl3Lw!fZS?jaOdflt8<)*-IMW zM~lUC$u*qux6EGgpH@T+7Y$zS0vKz3y5bttH^M=Ccl)^dsK0zs z;UpSB$m0Gpoq)QyKi0ATv6Qj@U@rym9g_;?f59suhgfN#G57~)I!woiTw#UML9 zUoWi808($ubO-_qb6PCrp2YJ5r(4bT34*F7(Fql|Vm!qjdkAK(0cAvkXDhEC`sLlf zyjmfmpC$7ixWG>Kpqz4#@wHE4;UMmo3u^h4@vPT*h;a73tzmY8sQP!Mws7D}nke5) z|G?ajkGgIJsE)L!ZC`W({xm;%a2yV5H>K_XfCk_e8sMzq0OI<;*8dR_wl7toL7+8E zDgmOe8UQ9@0AiI?;{VFxh^&?HN};*i*#J5lbOaxC!q43UnmGb(%)Wh?gO~$FlW{0$ O4_F*Ib-3D;5c^-1z^}Ui From 54ea77bcc9ded4d2561bdc0d12083132fe64417a Mon Sep 17 00:00:00 2001 From: Marius Kintel Date: Mon, 19 Dec 2011 16:57:55 +0100 Subject: [PATCH 13/39] Added note about the bugfix --- RELEASE_NOTES | 1 + 1 file changed, 1 insertion(+) diff --git a/RELEASE_NOTES b/RELEASE_NOTES index ac895114..146d6588 100644 --- a/RELEASE_NOTES +++ b/RELEASE_NOTES @@ -29,6 +29,7 @@ o On some platforms it was possible to insertion rich text in the editor, causin o Less crashes due to CGAL assertions o OpenCSG should now work on systems with OpenGL 1.x, given that the right extensions are available o include now searches librarydir +o The $fs parameter yielded only half the number of segments it should have Deprecations: o dxf_linear_extrude() and dxf_rotate_extrude() are now deprecated. From bce7212b612315ac4c90edeaaf8c7ed04ba7720c Mon Sep 17 00:00:00 2001 From: Marius Kintel Date: Mon, 19 Dec 2011 19:34:23 +0100 Subject: [PATCH 14/39] Added note about auto-generated documentation --- doc/TODO.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/TODO.txt b/doc/TODO.txt index 92ff8a09..22fff0a9 100644 --- a/doc/TODO.txt +++ b/doc/TODO.txt @@ -223,6 +223,7 @@ o Use a logging framework to get debugging/info output more under control? DOCUMENTATION ------------- +o Auto-generate API documentation instead of, in addition to or combined with, the wikibooks docs. o Write checklists for typical extension work (add new module, add new function) -> make sure new test files are added From 81e3eb41025ba14471dfb5ad868c5f5a34e6ab83 Mon Sep 17 00:00:00 2001 From: Marius Kintel Date: Mon, 19 Dec 2011 19:49:52 +0100 Subject: [PATCH 15/39] Minor Eigen namespace update --- src/glview.cc | 19 +++++++++---------- src/linalg.h | 1 + 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/glview.cc b/src/glview.cc index 59a56d61..d9f6bb53 100644 --- a/src/glview.cc +++ b/src/glview.cc @@ -28,6 +28,7 @@ #include "Preferences.h" #include "renderer.h" #include "rendersettings.h" +#include "linalg.h" #include #include @@ -58,8 +59,6 @@ #define FAR_FAR_AWAY 100000.0 -#include - GLView::GLView(QWidget *parent) : QGLWidget(parent), renderer(NULL) { init(); @@ -600,18 +599,18 @@ void GLView::mouseMoveEvent(QMouseEvent *event) double mx = +(dx) * viewer_distance/1000; double my = -(dy) * viewer_distance/1000; - Eigen::Matrix3d aax, aay, aaz, tm3; - aax = Eigen::AngleAxisd(-(object_rot_x/180) * M_PI,Eigen::Vector3d::UnitX()); - aay = Eigen::AngleAxisd(-(object_rot_y/180) * M_PI,Eigen::Vector3d::UnitY()); - aaz = Eigen::AngleAxisd(-(object_rot_z/180) * M_PI,Eigen::Vector3d::UnitZ()); - tm3 = Eigen::Matrix3d::Identity(); + Matrix3d aax, aay, aaz, tm3; + aax = Eigen::AngleAxisd(-(object_rot_x/180) * M_PI, Vector3d::UnitX()); + aay = Eigen::AngleAxisd(-(object_rot_y/180) * M_PI, Vector3d::UnitY()); + aaz = Eigen::AngleAxisd(-(object_rot_z/180) * M_PI, Vector3d::UnitZ()); + tm3 = Matrix3d::Identity(); tm3 = aaz * (aay * (aax * tm3)); - Eigen::Matrix4d tm; - tm = Eigen::Matrix4d::Identity(); + Matrix4d tm; + tm = Matrix4d::Identity(); for (int i=0;i<3;i++) for (int j=0;j<3;j++) tm(j,i)=tm3(j,i); - Eigen::Matrix4d vec; + Matrix4d vec; vec << 0, 0, 0, mx, 0, 0, 0, 0, diff --git a/src/linalg.h b/src/linalg.h index e20d8d88..a83949e7 100644 --- a/src/linalg.h +++ b/src/linalg.h @@ -10,6 +10,7 @@ using Eigen::Vector3d; typedef Eigen::AlignedBox BoundingBox; using Eigen::Matrix3f; using Eigen::Matrix3d; +using Eigen::Matrix4d; using Eigen::Transform3d; #endif From b18f3d2371203ba4e903d8be1c8ce8769bbbefdf Mon Sep 17 00:00:00 2001 From: Marius Kintel Date: Mon, 19 Dec 2011 21:33:09 +0100 Subject: [PATCH 16/39] Note about include/use doc clarification --- doc/TODO.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/TODO.txt b/doc/TODO.txt index 22fff0a9..fd938cfc 100644 --- a/doc/TODO.txt +++ b/doc/TODO.txt @@ -226,6 +226,7 @@ DOCUMENTATION o Auto-generate API documentation instead of, in addition to or combined with, the wikibooks docs. o Write checklists for typical extension work (add new module, add new function) -> make sure new test files are added +o Clarify include/use better in the wikibook docs (e.g. that use'd modules have to be self-contained) TESTING ------- From 1f6c0b6cdc6d89378ff0a9702341a2b38d000ef8 Mon Sep 17 00:00:00 2001 From: Marius Kintel Date: Tue, 20 Dec 2011 02:19:14 +0100 Subject: [PATCH 17/39] Added suggestion to output console log to a file --- doc/TODO.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/TODO.txt b/doc/TODO.txt index fd938cfc..190d7428 100644 --- a/doc/TODO.txt +++ b/doc/TODO.txt @@ -98,6 +98,7 @@ o Error reporting/debugging o Provide some interaction for debug walk-through? - Provide visual highlighting of geometry corresponding to code -> could aid debugging a lot + - Optionally output console log to a file o Computation - Run CGAL rendering in a background thread - Enable viewing/editing while rendering From 8c31bac6c7b2a77b8bd96a288535b84e5ee81488 Mon Sep 17 00:00:00 2001 From: Marius Kintel Date: Wed, 21 Dec 2011 17:06:13 +0100 Subject: [PATCH 18/39] Patch to fix not-unitized normal vectors due to floating point calculations. Patch by Xyne. --- src/export.cc | 30 +++++++++++++++++++----------- 1 file changed, 19 insertions(+), 11 deletions(-) diff --git a/src/export.cc b/src/export.cc index 6c427dd0..89f60afe 100644 --- a/src/export.cc +++ b/src/export.cc @@ -84,17 +84,25 @@ void export_stl(CGAL_Nef_polyhedron *root_N, std::ostream &output, QProgressDial stream << x3 << " " << y3 << " " << z3; std::string vs3 = stream.str(); if (vs1 != vs2 && vs1 != vs3 && vs2 != vs3) { - - double nx = (y1-y2)*(z1-z3) - (z1-z2)*(y1-y3); - double ny = (z1-z2)*(x1-x3) - (x1-x2)*(z1-z3); - double nz = (x1-x2)*(y1-y3) - (y1-y2)*(x1-x3); + // The above condition ensures that vs1-vs2, vs1-vs3, and their cross + // product are non-zero. Floating point arithmetic may however truncate + // small values to 0. This can be avoided by first scaling the components + // of vs1-vs2 and vs1-vs3. This has no effect on the resulting unit + // normal vector. + double dn[6] = { x1-x2, y1-y2, z1-z2, x1-x3, y1-y3, z1-z3 }; + double mindn = 1; + for (int i = 0; i < 6; ++i) { + double dx = abs(dn[i]); + if (dx < mindn && dx != 0) mindn = dx; + } + for (int i = 0; i < 6; ++i) dn[i] /= mindn; + double nx = dn[1]*dn[5] - dn[2]*dn[4]; + double ny = dn[2]*dn[3] - dn[0]*dn[5]; + double nz = dn[0]*dn[4] - dn[1]*dn[3]; double nlength = sqrt(nx*nx + ny*ny + nz*nz); - // Avoid generating normals for polygons with zero area - double eps = 0.000001; - if (nlength < eps) nlength = 1.0; - output << " facet normal " - << nx / nlength << " " - << ny / nlength << " " + output << " facet normal " + << nx / nlength << " " + << ny / nlength << " " << nz / nlength << "\n"; output << " outer loop\n"; output << " vertex " << vs1 << "\n"; @@ -164,7 +172,7 @@ void export_dxf(CGAL_Nef_polyhedron *root_N, std::ostream &output, QProgressDial << y2 << "\n"; } } - + output << " 0\n" << "ENDSEC\n"; From f707466580f526f75ac85af3a628667797874645 Mon Sep 17 00:00:00 2001 From: Marius Kintel Date: Mon, 19 Dec 2011 15:36:52 +0100 Subject: [PATCH 19/39] simple surface test --- testdata/scad/features/surface-simple.dat | 2 ++ testdata/scad/features/surface-simple.scad | 1 + 2 files changed, 3 insertions(+) create mode 100644 testdata/scad/features/surface-simple.dat create mode 100644 testdata/scad/features/surface-simple.scad diff --git a/testdata/scad/features/surface-simple.dat b/testdata/scad/features/surface-simple.dat new file mode 100644 index 00000000..32eba08b --- /dev/null +++ b/testdata/scad/features/surface-simple.dat @@ -0,0 +1,2 @@ +0 1 +2 3 diff --git a/testdata/scad/features/surface-simple.scad b/testdata/scad/features/surface-simple.scad new file mode 100644 index 00000000..9659143e --- /dev/null +++ b/testdata/scad/features/surface-simple.scad @@ -0,0 +1 @@ +surface("surface-simple.dat", center=true); From 0e59b194abbe5b261e5aa8ca9fcaaffc6b019b01 Mon Sep 17 00:00:00 2001 From: Marius Kintel Date: Wed, 21 Dec 2011 17:41:30 +0100 Subject: [PATCH 20/39] Expected files for surface-simple --- .../cgalpngtest/surface-simple-expected.png | Bin 0 -> 7157 bytes .../dumptest/surface-simple-expected.txt | 2 ++ .../opencsgtest/surface-simple-expected.png | Bin 0 -> 7396 bytes .../surface-simple-expected.png | Bin 0 -> 7396 bytes 4 files changed, 2 insertions(+) create mode 100644 tests/regression/cgalpngtest/surface-simple-expected.png create mode 100644 tests/regression/dumptest/surface-simple-expected.txt create mode 100644 tests/regression/opencsgtest/surface-simple-expected.png create mode 100644 tests/regression/throwntogethertest/surface-simple-expected.png diff --git a/tests/regression/cgalpngtest/surface-simple-expected.png b/tests/regression/cgalpngtest/surface-simple-expected.png new file mode 100644 index 0000000000000000000000000000000000000000..4152c388718f5675e41ad3f099ab970162aec80f GIT binary patch literal 7157 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 literal 0 HcmV?d00001 diff --git a/tests/regression/dumptest/surface-simple-expected.txt b/tests/regression/dumptest/surface-simple-expected.txt new file mode 100644 index 00000000..3b42fcbd --- /dev/null +++ b/tests/regression/dumptest/surface-simple-expected.txt @@ -0,0 +1,2 @@ + surface(file = "surface-simple.dat", center = true); + diff --git a/tests/regression/opencsgtest/surface-simple-expected.png b/tests/regression/opencsgtest/surface-simple-expected.png new file mode 100644 index 0000000000000000000000000000000000000000..2abef81f9e18c0362260a5999eb99a88e28883aa GIT binary patch literal 7396 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 KY%4SOKJ!1m;IQcc literal 0 HcmV?d00001 diff --git a/tests/regression/throwntogethertest/surface-simple-expected.png b/tests/regression/throwntogethertest/surface-simple-expected.png new file mode 100644 index 0000000000000000000000000000000000000000..2abef81f9e18c0362260a5999eb99a88e28883aa GIT binary patch literal 7396 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 KY%4SOKJ!1m;IQcc literal 0 HcmV?d00001 From 9113cf42d08e828a2ba7c4e40ac24a937f17b306 Mon Sep 17 00:00:00 2001 From: Marius Kintel Date: Wed, 21 Dec 2011 17:42:11 +0100 Subject: [PATCH 21/39] Handle missing expected files gracefully --- tests/test_cmdline_tool.py | 2 +- tests/test_pretty_print.py | 14 ++++++++------ 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/tests/test_cmdline_tool.py b/tests/test_cmdline_tool.py index 848a6eb5..967e334d 100755 --- a/tests/test_cmdline_tool.py +++ b/tests/test_cmdline_tool.py @@ -93,7 +93,7 @@ def compare_png(resultfilename): compare_method = 'NCC' msg = 'ImageMagick image comparison: ' + options.convert_exec + ' '+ ' '.join(args[2:]) - msg += '\nexpected image: ' + expectedfilename + '\n' + msg += '\n expected image: ' + expectedfilename + '\n' print >> sys.stderr, msg if not resultfilename: print >> sys.stderr, "Error: OpenSCAD did not generate an image to test" diff --git a/tests/test_pretty_print.py b/tests/test_pretty_print.py index 7407b157..87ac3df1 100755 --- a/tests/test_pretty_print.py +++ b/tests/test_pretty_print.py @@ -151,14 +151,14 @@ def parsetest(teststring): "Test time.*?Test (Passed)", # pass/fail "Output:(.*?)", 'Command:.*?-s" "(.*?)"', # type - "actual .*?:(.*?)\n", - "expected .*?:(.*?)\n", + "^ actual .*?:(.*?)\n", + "^ expected .*?:(.*?)\n", 'Command:.*?(testdata.*?)"' # scadfile ] hits = map( lambda pattern: ezsearch(pattern,teststring), patterns ) test = Test(hits[0],hits[1],hits[2]=='Passed',hits[3],hits[4],hits[5],hits[6],hits[7],teststring) - test.actualfile_data = tryread(test.actualfile) - test.expectedfile_data = tryread(test.expectedfile) + if len(test.actualfile) > 0: test.actualfile_data = tryread(test.actualfile) + if len(test.actualfile) > 0: test.expectedfile_data = tryread(test.expectedfile) return test def parselog(data): @@ -274,10 +274,12 @@ TESTLOG wikiname_a = wikify_filename(tmp,wiki_rootpath,sysid) tmp = t.expectedfile.replace(os.path.dirname(builddir),'') wikiname_e = wikify_filename(tmp,wiki_rootpath,sysid) - imgs[wikiname_e] = t.expectedfile_data + if hasattr(t, 'expectedfile_data'): + imgs[wikiname_e] = t.expectedfile_data if t.actualfile: actualfile_wiki = '[[File:'+wikiname_a+'|250px]]' - imgs[wikiname_a] = t.actualfile_data + if hasattr(t, 'actualfile_data'): + imgs[wikiname_a] = t.actualfile_data else: actualfile_wiki = 'No image generated.' newchunk = re.sub('FTESTNAME',t.fullname,repeat1) From 8d10aa298295a31c2bc2ad1bae4f2edc364bed38 Mon Sep 17 00:00:00 2001 From: Marius Kintel Date: Wed, 21 Dec 2011 17:43:01 +0100 Subject: [PATCH 22/39] bugfix: surface() modules with center=true wasn't exactly centered in the XY plane --- src/surface.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/surface.cc b/src/surface.cc index 1a5f9bde..39d1972d 100644 --- a/src/surface.cc +++ b/src/surface.cc @@ -129,8 +129,8 @@ PolySet *SurfaceNode::evaluate_polyset(class PolySetEvaluator *) const p->convexity = convexity; - double ox = center ? -columns/2.0 : 0; - double oy = center ? -lines/2.0 : 0; + double ox = center ? -(columns-1)/2.0 : 0; + double oy = center ? -(lines-1)/2.0 : 0; for (int i = 1; i < lines; i++) for (int j = 1; j < columns; j++) From bce8e2204311e5f900bbffe4122aaafcada4e2cf Mon Sep 17 00:00:00 2001 From: Marius Kintel Date: Wed, 21 Dec 2011 17:43:30 +0100 Subject: [PATCH 23/39] bugfix: surface() modules with center=true wasn't exactly centered in the XY plane --- RELEASE_NOTES | 1 + 1 file changed, 1 insertion(+) diff --git a/RELEASE_NOTES b/RELEASE_NOTES index 146d6588..0de366e4 100644 --- a/RELEASE_NOTES +++ b/RELEASE_NOTES @@ -30,6 +30,7 @@ o Less crashes due to CGAL assertions o OpenCSG should now work on systems with OpenGL 1.x, given that the right extensions are available o include now searches librarydir o The $fs parameter yielded only half the number of segments it should have +o surface(center=true) is now correctly centered in the XY plane Deprecations: o dxf_linear_extrude() and dxf_rotate_extrude() are now deprecated. From 6fd779c2be83170b59d183f5374898c7beafd87a Mon Sep 17 00:00:00 2001 From: Marius Kintel Date: Wed, 21 Dec 2011 18:03:23 +0100 Subject: [PATCH 24/39] bugfix: render() statement containing only 2D geometry caused a crash --- src/PolySetCGALEvaluator.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/PolySetCGALEvaluator.cc b/src/PolySetCGALEvaluator.cc index 7a9566b6..3285b465 100644 --- a/src/PolySetCGALEvaluator.cc +++ b/src/PolySetCGALEvaluator.cc @@ -396,7 +396,7 @@ PolySet *PolySetCGALEvaluator::evaluatePolySet(const RenderNode &node) CGAL_Nef_polyhedron N = this->cgalevaluator.evaluateCGALMesh(node); PolySet *ps = NULL; if (!N.empty()) { - if (!N.p3->is_simple()) { + if (N.dim == 3 && !N.p3->is_simple()) { PRINTF("WARNING: Body of render() isn't valid 2-manifold!"); } else { From 16f644872f6f6e55dc97be92d72f09f8c4acdf58 Mon Sep 17 00:00:00 2001 From: Marius Kintel Date: Wed, 21 Dec 2011 18:03:58 +0100 Subject: [PATCH 25/39] Added 2D render() test --- testdata/scad/features/render-2d-tests.scad | 6 ++++++ .../cgalpngtest/render-2d-tests-expected.png | Bin 0 -> 7029 bytes .../dumptest/render-2d-tests-expected.txt | 7 +++++++ .../opencsgtest/render-2d-tests-expected.png | Bin 0 -> 7646 bytes .../render-2d-tests-expected.png | Bin 0 -> 7646 bytes 5 files changed, 13 insertions(+) create mode 100644 testdata/scad/features/render-2d-tests.scad create mode 100644 tests/regression/cgalpngtest/render-2d-tests-expected.png create mode 100644 tests/regression/dumptest/render-2d-tests-expected.txt create mode 100644 tests/regression/opencsgtest/render-2d-tests-expected.png create mode 100644 tests/regression/throwntogethertest/render-2d-tests-expected.png diff --git a/testdata/scad/features/render-2d-tests.scad b/testdata/scad/features/render-2d-tests.scad new file mode 100644 index 00000000..683ffe4d --- /dev/null +++ b/testdata/scad/features/render-2d-tests.scad @@ -0,0 +1,6 @@ +render() { + difference() { + square(100, center=true); + circle(r=30); + } +} diff --git a/tests/regression/cgalpngtest/render-2d-tests-expected.png b/tests/regression/cgalpngtest/render-2d-tests-expected.png new file mode 100644 index 0000000000000000000000000000000000000000..19ea16a8420f316cfa12234a7bfec301ca8b5336 GIT binary patch literal 7029 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 E0C)6rsQ>@~ literal 0 HcmV?d00001 diff --git a/tests/regression/dumptest/render-2d-tests-expected.txt b/tests/regression/dumptest/render-2d-tests-expected.txt new file mode 100644 index 00000000..26b916c4 --- /dev/null +++ b/tests/regression/dumptest/render-2d-tests-expected.txt @@ -0,0 +1,7 @@ + render(convexity = 1) { + difference() { + square(size = [100, 100], center = true); + circle($fn = 0, $fa = 12, $fs = 2, r = 30); + } + } + diff --git a/tests/regression/opencsgtest/render-2d-tests-expected.png b/tests/regression/opencsgtest/render-2d-tests-expected.png new file mode 100644 index 0000000000000000000000000000000000000000..0bf6288ffa1570e2dda5c892fde05ef473238ec3 GIT binary patch literal 7646 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 literal 0 HcmV?d00001 diff --git a/tests/regression/throwntogethertest/render-2d-tests-expected.png b/tests/regression/throwntogethertest/render-2d-tests-expected.png new file mode 100644 index 0000000000000000000000000000000000000000..0bf6288ffa1570e2dda5c892fde05ef473238ec3 GIT binary patch literal 7646 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 literal 0 HcmV?d00001 From 95c952c5fa1103b99ad3b2cd2328020c1d1dd82d Mon Sep 17 00:00:00 2001 From: Marius Kintel Date: Wed, 21 Dec 2011 20:44:19 +0100 Subject: [PATCH 26/39] Updated expected file for new sphere evaluation --- .../cgalpngtest/sphere-tests-expected.png | Bin 17379 -> 16818 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/tests/regression/cgalpngtest/sphere-tests-expected.png b/tests/regression/cgalpngtest/sphere-tests-expected.png index 6ad650fb048ee013325a8cbc7cb319691768cce5..f2a11f3050cb3d96bfa972de4fe16d8992150f85 100644 GIT binary patch literal 16818 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 w916{Op7ytkO literal 17379 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 Date: Wed, 21 Dec 2011 20:44:36 +0100 Subject: [PATCH 27/39] Updated expected file for surface(center=true) bugfix --- .../cgalpngtest/example010-expected.png | Bin 36785 -> 36996 bytes .../example010-expected.png | Bin 35378 -> 35604 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/tests/regression/cgalpngtest/example010-expected.png b/tests/regression/cgalpngtest/example010-expected.png index f611b12843f876416319db7695f995ce208bc896..68ecc9e03fe0bd120c8ba061481abc4a005d1f92 100644 GIT binary patch literal 36996 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 Wcerj8Hy42L(NNV@seEMp=KllQ0mZxk diff --git a/tests/regression/throwntogethertest/example010-expected.png b/tests/regression/throwntogethertest/example010-expected.png index 37e65456e14fc710f24577dd7a8cb16648b9230f..854eea81fa50cac4c3563aecc7608c88f4b7694d 100644 GIT binary patch literal 35604 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 From 3e419ce31871eb930b4ef2b96f84e2db800f81b8 Mon Sep 17 00:00:00 2001 From: Marius Kintel Date: Wed, 21 Dec 2011 21:48:01 +0100 Subject: [PATCH 28/39] bugfix: Sometimes, the CSG normalization created extremely large trees. Rewrote the algorithm based on the original Goldfeather paper. Fixes #44 --- src/csgterm.cc | 46 +++++++++++++++++++++++++--------------------- src/csgterm.h | 2 +- 2 files changed, 26 insertions(+), 22 deletions(-) diff --git a/src/csgterm.cc b/src/csgterm.cc index b21a20c4..49f3dbb5 100644 --- a/src/csgterm.cc +++ b/src/csgterm.cc @@ -72,31 +72,29 @@ CSGTerm::~CSGTerm() shared_ptr CSGTerm::normalize(shared_ptr &term) { // This function implements the CSG normalization - // Reference: Florian Kirsch, Juergen Doeller, - // OpenCSG: A Library for Image-Based CSG Rendering, - // University of Potsdam, Hasso-Plattner-Institute, Germany - // http://www.opencsg.org/data/csg_freenix2005_paper.pdf + // Reference: + // Goldfeather, J., Molnar, S., Turk, G., and Fuchs, H. Near + // Realtime CSG Rendering Using Tree Normalization and Geometric + // Pruning. IEEE Computer Graphics and Applications, 9(3):20-28, + // 1989. + // http://www.cc.gatech.edu/~turk/my_papers/pxpl_csg.pdf if (term->type == TYPE_PRIMITIVE) return term; - shared_ptr x = normalize(term->left); - shared_ptr y = normalize(term->right); + do { + while (normalize_tail(term)) {} + normalize(term->left); + } while (term->type != TYPE_UNION && + (term->right->type != TYPE_PRIMITIVE || term->left->type == TYPE_UNION)); + normalize(term->right); - shared_ptr t1(term); - if (x != term->left || y != term->right) t1.reset(new CSGTerm(term->type, x, y)); - - shared_ptr t2; - while (1) { - t2 = normalize_tail(t1); - if (t1 == t2) break; - t1 = t2; - } - - return t1; + return term; } -shared_ptr CSGTerm::normalize_tail(shared_ptr &term) +bool CSGTerm::normalize_tail(shared_ptr &term) { + if (term->type == TYPE_UNION) return false; // Don't normalize outer union + // Part A: The 'x . (y . z)' expressions shared_ptr x = term->left; @@ -141,7 +139,10 @@ shared_ptr CSGTerm::normalize_tail(shared_ptr &term) shared_ptr(new CSGTerm(TYPE_INTERSECTION, x, y)), z); } - if (result) return shared_ptr(result); + if (result) { + term.reset(result); + return true; + } // Part B: The '(x . y) . z' expressions @@ -168,9 +169,12 @@ shared_ptr CSGTerm::normalize_tail(shared_ptr &term) new CSGTerm(TYPE_INTERSECTION, y, z)); } - if (result) return shared_ptr(result); + if (result) { + term.reset(result); + return true; + } - return term; + return false; } std::string CSGTerm::dump() diff --git a/src/csgterm.h b/src/csgterm.h index 18958391..1583c62d 100644 --- a/src/csgterm.h +++ b/src/csgterm.h @@ -32,7 +32,7 @@ public: ~CSGTerm(); static shared_ptr normalize(shared_ptr &term); - static shared_ptr normalize_tail(shared_ptr &term); + static bool normalize_tail(shared_ptr &term); std::string dump(); }; From 2bfd2a379d8748902ed5a48f9e8a536907f641d5 Mon Sep 17 00:00:00 2001 From: Marius Kintel Date: Wed, 21 Dec 2011 21:59:28 +0100 Subject: [PATCH 29/39] CSG normalization bugfix --- RELEASE_NOTES | 1 + 1 file changed, 1 insertion(+) diff --git a/RELEASE_NOTES b/RELEASE_NOTES index 0de366e4..b9648d2b 100644 --- a/RELEASE_NOTES +++ b/RELEASE_NOTES @@ -21,6 +21,7 @@ o Added import and export of the OFF file format o Now uses standard shortcuts for save, reload and quit on Linux and Windows. F2/F3 will still work but is deprecated. Bugfixes: +o Complex CSG models sometimes took extremely long time to normalize before OpenCSG preview o square() crashed if any of the dimensions were zero o Flush Caches didn't flush cached USE'd modules o STL export should be a bit more robust From 51c28e8a5ba7a3d4897389498e0a2aa606e78cf9 Mon Sep 17 00:00:00 2001 From: Marius Kintel Date: Wed, 21 Dec 2011 22:20:27 +0100 Subject: [PATCH 30/39] fix for normal fix: would fail in some extreme cases (e.g. if there are components with very different orders of magnitude, as may happen when floating point errors fail to produce a 0) --- src/export.cc | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/export.cc b/src/export.cc index 89f60afe..99bce989 100644 --- a/src/export.cc +++ b/src/export.cc @@ -90,12 +90,14 @@ void export_stl(CGAL_Nef_polyhedron *root_N, std::ostream &output, QProgressDial // of vs1-vs2 and vs1-vs3. This has no effect on the resulting unit // normal vector. double dn[6] = { x1-x2, y1-y2, z1-z2, x1-x3, y1-y3, z1-z3 }; - double mindn = 1; - for (int i = 0; i < 6; ++i) { - double dx = abs(dn[i]); - if (dx < mindn && dx != 0) mindn = dx; + double maxdn = 0; + int i; + for (i = 0; i < 6; ++i) { + double dx = dn[i]; + if (dx < 0) dx = -dx; + if (dx > maxdn) maxdn = dx; } - for (int i = 0; i < 6; ++i) dn[i] /= mindn; + for (i = 0; i < 6; ++i) dn[i] /= maxdn; double nx = dn[1]*dn[5] - dn[2]*dn[4]; double ny = dn[2]*dn[3] - dn[0]*dn[5]; double nz = dn[0]*dn[4] - dn[1]*dn[3]; From 91d9d9c4b5e4c0b2c1a5a5796eb3b9323710e74b Mon Sep 17 00:00:00 2001 From: Marius Kintel Date: Wed, 21 Dec 2011 22:47:00 +0100 Subject: [PATCH 31/39] Added note about tree pruning --- src/csgterm.cc | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/csgterm.cc b/src/csgterm.cc index 49f3dbb5..1b9cb1db 100644 --- a/src/csgterm.cc +++ b/src/csgterm.cc @@ -81,6 +81,12 @@ shared_ptr CSGTerm::normalize(shared_ptr &term) if (term->type == TYPE_PRIMITIVE) return term; + // FIXME: We can optimize the normalized tree by pruning based on bounding boxes + // as described in the above mentioned paper: + // 1) If the bounding boxes of two intersected nodes don't intersect, prune the + // intersection node + // 2) If the bounding boxes of two subtracted nodes don't intersect, replace the + // difference node with the positive operator do { while (normalize_tail(term)) {} normalize(term->left); From d7ca192077f127a2d05bed73d1814a8045823335 Mon Sep 17 00:00:00 2001 From: Marius Kintel Date: Thu, 22 Dec 2011 04:09:52 +0100 Subject: [PATCH 32/39] Removed old debug output --- tests/csgtestcore.cc | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/tests/csgtestcore.cc b/tests/csgtestcore.cc index a58c1fd3..469e51cf 100644 --- a/tests/csgtestcore.cc +++ b/tests/csgtestcore.cc @@ -322,10 +322,7 @@ int csgtestcore(int argc, char *argv[], test_type_e test_type) } assert(csgInfo.root_norm_term); - if (csgInfo.root_norm_term.use_count() <= 1) { - fprintf(stderr, "XXX\n"); - } - + csgInfo.root_chain = new CSGChain(); csgInfo.root_chain->import(csgInfo.root_norm_term); fprintf(stderr, "Normalized CSG tree has %d elements\n", int(csgInfo.root_chain->polysets.size())); From 8d5be2c5247f806fb3ec9c9a197ae97b5d565dc7 Mon Sep 17 00:00:00 2001 From: Marius Kintel Date: Thu, 22 Dec 2011 04:12:15 +0100 Subject: [PATCH 33/39] Implemented CSG tree pruning - this should significantly improve performance of difficult models in OpenCSG preview mode --- src/CSGTermEvaluator.cc | 6 +- src/csgterm.cc | 179 +++++++++++++++++++++++++++++----------- src/csgterm.h | 22 +++-- 3 files changed, 150 insertions(+), 57 deletions(-) diff --git a/src/CSGTermEvaluator.cc b/src/CSGTermEvaluator.cc index 1aedfec3..fc76d568 100644 --- a/src/CSGTermEvaluator.cc +++ b/src/CSGTermEvaluator.cc @@ -48,11 +48,11 @@ void CSGTermEvaluator::applyToChildren(const AbstractNode &node, CSGTermEvaluato t1 = t2; } else if (t2 && t1) { if (op == CSGT_UNION) { - t1.reset(new CSGTerm(CSGTerm::TYPE_UNION, t1, t2)); + t1 = CSGTerm::createCSGTerm(CSGTerm::TYPE_UNION, t1, t2); } else if (op == CSGT_DIFFERENCE) { - t1.reset(new CSGTerm(CSGTerm::TYPE_DIFFERENCE, t1, t2)); + t1 = CSGTerm::createCSGTerm(CSGTerm::TYPE_DIFFERENCE, t1, t2); } else if (op == CSGT_INTERSECTION) { - t1.reset(new CSGTerm(CSGTerm::TYPE_INTERSECTION, t1, t2)); + t1 = CSGTerm::createCSGTerm(CSGTerm::TYPE_INTERSECTION, t1, t2); } } } diff --git a/src/csgterm.cc b/src/csgterm.cc index 1b9cb1db..426adcaf 100644 --- a/src/csgterm.cc +++ b/src/csgterm.cc @@ -26,6 +26,7 @@ #include "csgterm.h" #include "polyset.h" +#include "linalg.h" #include /*! @@ -47,29 +48,102 @@ */ -CSGTerm::CSGTerm(const shared_ptr &polyset, const Transform3d &matrix, const double color[4], const std::string &label) - : type(TYPE_PRIMITIVE), polyset(polyset), label(label) +shared_ptr CSGTerm::createCSGTerm(type_e type, shared_ptr left, shared_ptr right) +{ + if (type != TYPE_PRIMITIVE) { + // In case we're creating a CSG terms from a pruned tree, left/right can be NULL + if (!right) { + if (type == TYPE_UNION || type == TYPE_DIFFERENCE) return left; + else return right; + } + if (!left) { + if (type == TYPE_UNION) return right; + else return left; + } + } + + // Pruning the tree. For details, see: + // http://www.cc.gatech.edu/~turk/my_papers/pxpl_csg.pdf + const BoundingBox &leftbox = left->getBoundingBox(); + const BoundingBox &rightbox = right->getBoundingBox(); + if (type == TYPE_INTERSECTION) { + BoundingBox newbox(leftbox.min().cwise().max(rightbox.min()), + leftbox.max().cwise().min(rightbox.max())); + if (newbox.isNull()) { + return shared_ptr(); // Prune entire product + } + } + else if (type == TYPE_DIFFERENCE) { + BoundingBox newbox(leftbox.min().cwise().max(rightbox.min()), + leftbox.max().cwise().min(rightbox.max())); + if (newbox.isNull()) { + return left; // Prune the negative component + } + } + + return shared_ptr(new CSGTerm(type, left, right)); +} + +shared_ptr CSGTerm::createCSGTerm(type_e type, CSGTerm *left, CSGTerm *right) +{ + return createCSGTerm(type, shared_ptr(left), shared_ptr(right)); +} + +CSGTerm::CSGTerm(const shared_ptr &polyset, const Transform3d &matrix, const double color[4], const std::string &label) + : type(TYPE_PRIMITIVE), polyset(polyset), label(label), m(matrix) { - this->m = matrix; for (int i = 0; i < 4; i++) this->color[i] = color[i]; + initBoundingBox(); } CSGTerm::CSGTerm(type_e type, shared_ptr left, shared_ptr right) - : type(type), left(left), right(right) + : type(type), left(left), right(right), m(Transform3d::Identity()) { + initBoundingBox(); } CSGTerm::CSGTerm(type_e type, CSGTerm *left, CSGTerm *right) - : type(type), left(left), right(right) + : type(type), left(left), right(right), m(Transform3d::Identity()) { + initBoundingBox(); } CSGTerm::~CSGTerm() { } +void CSGTerm::initBoundingBox() +{ + if (this->type == TYPE_PRIMITIVE) { + BoundingBox polybox = this->polyset->getBoundingBox(); + this->bbox.extend(this->m * polybox.min()); + this->bbox.extend(this->m * polybox.max()); + } + else { + const BoundingBox &leftbox = this->left->getBoundingBox(); + const BoundingBox &rightbox = this->right->getBoundingBox(); + switch (this->type) { + case TYPE_UNION: + this->bbox.extend(this->m * leftbox.min().cwise().min(rightbox.min())); + this->bbox.extend(this->m * leftbox.max().cwise().max(rightbox.max())); + break; + case TYPE_INTERSECTION: + this->bbox.extend(this->m * leftbox.min().cwise().max(rightbox.min())); + this->bbox.extend(this->m * leftbox.max().cwise().min(rightbox.max())); + break; + case TYPE_DIFFERENCE: + this->bbox.extend(this->m * leftbox.min()); + this->bbox.extend(this->m * leftbox.max()); + break; + case TYPE_PRIMITIVE: + break; + default: + assert(false); + } + } +} -shared_ptr CSGTerm::normalize(shared_ptr &term) +shared_ptr CSGTerm::normalize(shared_ptr term) { // This function implements the CSG normalization // Reference: @@ -79,27 +153,34 @@ shared_ptr CSGTerm::normalize(shared_ptr &term) // 1989. // http://www.cc.gatech.edu/~turk/my_papers/pxpl_csg.pdf - if (term->type == TYPE_PRIMITIVE) return term; + if (term->type == TYPE_PRIMITIVE) { + return term; + } - // FIXME: We can optimize the normalized tree by pruning based on bounding boxes - // as described in the above mentioned paper: - // 1) If the bounding boxes of two intersected nodes don't intersect, prune the - // intersection node - // 2) If the bounding boxes of two subtracted nodes don't intersect, replace the - // difference node with the positive operator do { - while (normalize_tail(term)) {} - normalize(term->left); + while (term && normalize_tail(term)) { } + if (!term || term->type == TYPE_PRIMITIVE) return term; + term->left = normalize(term->left); } while (term->type != TYPE_UNION && (term->right->type != TYPE_PRIMITIVE || term->left->type == TYPE_UNION)); - normalize(term->right); + term->right = normalize(term->right); + + // FIXME: Do we need to take into account any transformation of item here? + if (!term->right) { + if (term->type == TYPE_UNION || term->type == TYPE_DIFFERENCE) return term->left; + else return term->right; + } + if (!term->left) { + if (term->type == TYPE_UNION) return term->right; + else return term->left; + } return term; } bool CSGTerm::normalize_tail(shared_ptr &term) { - if (term->type == TYPE_UNION) return false; // Don't normalize outer union + if (term->type == TYPE_UNION || term->type == TYPE_PRIMITIVE) return false; // Part A: The 'x . (y . z)' expressions @@ -107,46 +188,48 @@ bool CSGTerm::normalize_tail(shared_ptr &term) shared_ptr y = term->right->left; shared_ptr z = term->right->right; - CSGTerm *result = NULL; + shared_ptr result = term; // 1. x - (y + z) -> (x - y) - z if (term->type == TYPE_DIFFERENCE && term->right->type == TYPE_UNION) { - result = new CSGTerm(TYPE_DIFFERENCE, - shared_ptr(new CSGTerm(TYPE_DIFFERENCE, x, y)), + term = createCSGTerm(TYPE_DIFFERENCE, + createCSGTerm(TYPE_DIFFERENCE, x, y), z); + return true; } // 2. x * (y + z) -> (x * y) + (x * z) else if (term->type == TYPE_INTERSECTION && term->right->type == TYPE_UNION) { - result = new CSGTerm(TYPE_UNION, - new CSGTerm(TYPE_INTERSECTION, x, y), - new CSGTerm(TYPE_INTERSECTION, x, z)); + term = createCSGTerm(TYPE_UNION, + createCSGTerm(TYPE_INTERSECTION, x, y), + createCSGTerm(TYPE_INTERSECTION, x, z)); + return true; } // 3. x - (y * z) -> (x - y) + (x - z) else if (term->type == TYPE_DIFFERENCE && term->right->type == TYPE_INTERSECTION) { - result = new CSGTerm(TYPE_UNION, - new CSGTerm(TYPE_DIFFERENCE, x, y), - new CSGTerm(TYPE_DIFFERENCE, x, z)); + term = createCSGTerm(TYPE_UNION, + createCSGTerm(TYPE_DIFFERENCE, x, y), + createCSGTerm(TYPE_DIFFERENCE, x, z)); + return true; } // 4. x * (y * z) -> (x * y) * z else if (term->type == TYPE_INTERSECTION && term->right->type == TYPE_INTERSECTION) { - result = new CSGTerm(TYPE_INTERSECTION, - shared_ptr(new CSGTerm(TYPE_INTERSECTION, x, y)), + term = createCSGTerm(TYPE_INTERSECTION, + createCSGTerm(TYPE_INTERSECTION, x, y), z); + return true; } // 5. x - (y - z) -> (x - y) + (x * z) else if (term->type == TYPE_DIFFERENCE && term->right->type == TYPE_DIFFERENCE) { - result = new CSGTerm(TYPE_UNION, - new CSGTerm(TYPE_DIFFERENCE, x, y), - new CSGTerm(TYPE_INTERSECTION, x, z)); + term = createCSGTerm(TYPE_UNION, + createCSGTerm(TYPE_DIFFERENCE, x, y), + createCSGTerm(TYPE_INTERSECTION, x, z)); + return true; } // 6. x * (y - z) -> (x * y) - z else if (term->type == TYPE_INTERSECTION && term->right->type == TYPE_DIFFERENCE) { - result = new CSGTerm(TYPE_DIFFERENCE, - shared_ptr(new CSGTerm(TYPE_INTERSECTION, x, y)), + term = createCSGTerm(TYPE_DIFFERENCE, + createCSGTerm(TYPE_INTERSECTION, x, y), z); - } - if (result) { - term.reset(result); return true; } @@ -158,28 +241,26 @@ bool CSGTerm::normalize_tail(shared_ptr &term) // 7. (x - y) * z -> (x * z) - y if (term->left->type == TYPE_DIFFERENCE && term->type == TYPE_INTERSECTION) { - result = new CSGTerm(TYPE_DIFFERENCE, - shared_ptr(new CSGTerm(TYPE_INTERSECTION, x, z)), + term = createCSGTerm(TYPE_DIFFERENCE, + createCSGTerm(TYPE_INTERSECTION, x, z), y); + return true; } // 8. (x + y) - z -> (x - z) + (y - z) else if (term->left->type == TYPE_UNION && term->type == TYPE_DIFFERENCE) { - result = new CSGTerm(TYPE_UNION, - new CSGTerm(TYPE_DIFFERENCE, x, z), - new CSGTerm(TYPE_DIFFERENCE, y, z)); + term = createCSGTerm(TYPE_UNION, + createCSGTerm(TYPE_DIFFERENCE, x, z), + createCSGTerm(TYPE_DIFFERENCE, y, z)); + return true; } // 9. (x + y) * z -> (x * z) + (y * z) else if (term->left->type == TYPE_UNION && term->type == TYPE_INTERSECTION) { - result = new CSGTerm(TYPE_UNION, - new CSGTerm(TYPE_INTERSECTION, x, z), - new CSGTerm(TYPE_INTERSECTION, y, z)); - } - - if (result) { - term.reset(result); + term = createCSGTerm(TYPE_UNION, + createCSGTerm(TYPE_INTERSECTION, x, z), + createCSGTerm(TYPE_INTERSECTION, y, z)); return true; } - + return false; } diff --git a/src/csgterm.h b/src/csgterm.h index 1583c62d..4930349f 100644 --- a/src/csgterm.h +++ b/src/csgterm.h @@ -18,23 +18,35 @@ public: TYPE_DIFFERENCE }; + static shared_ptr createCSGTerm(type_e type, shared_ptr left, shared_ptr right); + static shared_ptr createCSGTerm(type_e type, CSGTerm *left, CSGTerm *right); + type_e type; shared_ptr polyset; std::string label; shared_ptr left; shared_ptr right; - Transform3d m; - double color[4]; + BoundingBox bbox; CSGTerm(const shared_ptr &polyset, const Transform3d &matrix, const double color[4], const std::string &label); - CSGTerm(type_e type, shared_ptr left, shared_ptr right); - CSGTerm(type_e type, CSGTerm *left, CSGTerm *right); ~CSGTerm(); - static shared_ptr normalize(shared_ptr &term); + const BoundingBox &getBoundingBox() const { return this->bbox; } + + static shared_ptr normalize(shared_ptr term); static bool normalize_tail(shared_ptr &term); std::string dump(); +private: + CSGTerm(type_e type, shared_ptr left, shared_ptr right); + CSGTerm(type_e type, CSGTerm *left, CSGTerm *right); + + void initBoundingBox(); + + Transform3d m; + double color[4]; + + friend class CSGChain; }; class CSGChain From 9c4efafc6e2f07e96b035c0dd847667240c53851 Mon Sep 17 00:00:00 2001 From: Marius Kintel Date: Thu, 22 Dec 2011 04:16:38 +0100 Subject: [PATCH 34/39] Update test case: Since we're now pruning the normalized tree, subtracted objects which don't touch won't be visible in thrown together mode. Use debug operators in such cases --- .../difference-tests-expected.png | Bin 11600 -> 11463 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/tests/regression/throwntogethertest/difference-tests-expected.png b/tests/regression/throwntogethertest/difference-tests-expected.png index ee75bad904af033d34d3c037f4434796fe7bb465..183700ceb88a502391f6ed6a776f7f7c4f222484 100644 GIT binary patch literal 11463 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%0Ac2;K3UUKJR-2N?syd@Opy5r|{~YpQ+z7gfNdALy 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 literal 11600 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 oe16u8 Date: Thu, 22 Dec 2011 06:36:27 -0600 Subject: [PATCH 35/39] fix crash bug --- tests/csgtestcore.cc | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/tests/csgtestcore.cc b/tests/csgtestcore.cc index 469e51cf..c2be326b 100644 --- a/tests/csgtestcore.cc +++ b/tests/csgtestcore.cc @@ -289,9 +289,10 @@ int csgtestcore(int argc, char *argv[], test_type_e test_type) exit(1); } - QFileInfo fileInfo(filename); - if (!sysinfo_dump) + if (!sysinfo_dump) { + QFileInfo fileInfo(filename); QDir::setCurrent(fileInfo.absolutePath()); + } AbstractNode::resetIndexCounter(); AbstractNode *absolute_root_node = root_module->evaluate(&root_ctx, &root_inst); From cd3d816f93038e9cb35aaf8b8e0852dc8bb4cd49 Mon Sep 17 00:00:00 2001 From: Marius Kintel Date: Fri, 23 Dec 2011 13:57:34 +0100 Subject: [PATCH 36/39] fix for recently introduced bug: If no actual image was generated, we failed to output the expected image --- tests/test_pretty_print.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_pretty_print.py b/tests/test_pretty_print.py index 87ac3df1..5e250523 100755 --- a/tests/test_pretty_print.py +++ b/tests/test_pretty_print.py @@ -158,7 +158,7 @@ def parsetest(teststring): hits = map( lambda pattern: ezsearch(pattern,teststring), patterns ) test = Test(hits[0],hits[1],hits[2]=='Passed',hits[3],hits[4],hits[5],hits[6],hits[7],teststring) if len(test.actualfile) > 0: test.actualfile_data = tryread(test.actualfile) - if len(test.actualfile) > 0: test.expectedfile_data = tryread(test.expectedfile) + if len(test.expectedfile) > 0: test.expectedfile_data = tryread(test.expectedfile) return test def parselog(data): From 03a2da9f4a63d8e384c91b0daf41eecdb9079336 Mon Sep 17 00:00:00 2001 From: Marius Kintel Date: Fri, 23 Dec 2011 14:12:35 +0100 Subject: [PATCH 37/39] Test case for recent CSG regression reported by Ed Nisley --- testdata/scad/bugs/bbox-transform-bug.scad | 9 +++++++++ tests/CMakeLists.txt | 3 ++- .../opencsgtest/bbox-transform-bug-expected.png | Bin 0 -> 5808 bytes .../bbox-transform-bug-expected.png | Bin 0 -> 6400 bytes 4 files changed, 11 insertions(+), 1 deletion(-) create mode 100644 testdata/scad/bugs/bbox-transform-bug.scad create mode 100644 tests/regression/opencsgtest/bbox-transform-bug-expected.png create mode 100644 tests/regression/throwntogethertest/bbox-transform-bug-expected.png diff --git a/testdata/scad/bugs/bbox-transform-bug.scad b/testdata/scad/bugs/bbox-transform-bug.scad new file mode 100644 index 00000000..ccd2eabe --- /dev/null +++ b/testdata/scad/bugs/bbox-transform-bug.scad @@ -0,0 +1,9 @@ +// +// Bug description: The intersection results in an empty object. +// Cause: The rotated bounding box is wrongly calculated, yielding a +// box which don't overlap with the bounding box of the second object. +// +intersection() { + rotate(45) cube(10); + translate([3,2,0]) cube(10); +} diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index e98dd8e3..20a9edec 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -531,7 +531,8 @@ list(APPEND DUMPTEST_FILES ${CMAKE_SOURCE_DIR}/../testdata/scad/misc/escape-test list(APPEND CGALPNGTEST_FILES ${FEATURES_FILES} ${SCAD_DXF_FILES} ${EXAMPLE_FILES}) list(APPEND OPENCSGTEST_FILES ${CGALPNGTEST_FILES}) -list(APPEND THROWNTOGETHERTEST_FILES ${CGALPNGTEST_FILES}) +list(APPEND OPENCSGTEST_FILES ${CMAKE_SOURCE_DIR}/../testdata/scad/bugs/bbox-transform-bug.scad) +list(APPEND THROWNTOGETHERTEST_FILES ${OPENCSGTEST_FILES}) # Disable tests which are known to cause floating point comparison issues # Once we're capable of comparing these across platforms, we can put these back in diff --git a/tests/regression/opencsgtest/bbox-transform-bug-expected.png b/tests/regression/opencsgtest/bbox-transform-bug-expected.png new file mode 100644 index 0000000000000000000000000000000000000000..060b9218514521506d1479f6862bdca81dfee96f GIT binary patch literal 5808 zcmeHL`#)9r8eV(Zn~lgVj1-YunNY5Y7NO+Q9y+>fmqaeP)JPXuJ1P?0tGKUwnpvYS&|I#h=etJP;>Q==r zC&e`%TaqU9KlGkZdW`ycTi}>X3Q>G+X3wQIodvq;YpdcujmYS*xk|c+jU>L^_Y4gw znh=c38WTe_!6FMtIbF-x099RzV%?C!W86tRqTu%AT-=irP0^)j>MTui6}sDSk4L=0 zWwtX%jS803U?G}}l)=hMGlYb5f{iuqsnPb#`aBj#Nvq^R?e4rmo%m1NGW8GH z^)|$hw`Q%F;4J=yCS!lU(xnkU_9}m%;q=5eR-dy8!68{=`p~ayDi-Uk)~0J!HKz#) z!|JmW4NnJ4lg0AJbo2c~@!~k0;o4JAD;)&XG8U)N>Q{}1xV6&P4MxPSHfH*VVTLL` zV?VpaNzU(`ubiYY{I0*FH8wGoH8vg~?A31ilpqr{Uv`9e(!7rBW=)VE^nDr|FEMdU zk=?4wBf3=V-&Tx>UBV9OMG9#022uG^f8dj7zPgn{(`DICK-j4ezx!X}stKDz2XCK` z^k2v~VsT1+wZa=tO>B4T6*s}_=Z+=pYn73?-JT&@$(k?y+vE3i*TYfwMk(po&MQr~ zG(K81)=G9cdWh`l729L7UW|=870&LXUL9nIkaEHo&mVz)ZS#2XpbJVJiY-S^iL1O#jr(xLIY?8_~;y!U?U;X?)pLm8q4*C#ADm`y2kPQDyQFvK_M#bHvUZ;bT<6DlKLj4i5GhfmyR< za83|up%H7|O4fW{Oy5m*ps75XOiJlw5D#OHI@!qlEl&s|?16D^m(ffkgGOiYNxDCc z;o}cJHrMn)VkJnZTi8u!_@Ko<6va#jA9?W6Gu)3*v;%y)Thf3(82DFKKRe8bZwB#m z+mAr;A0d89miAGEuQ+O=9lrJ|5PvVkS3b4?A-@vhM}#b7#K*Df$Mw;R81XSbue|yf zL2-46@9L@Oj_?D-uY4)6A309QJZaDQUu*Z@gC2F=Uc8Ll>QTR4Hf*MlC{L}qjsA$d zK$EtQTi-yAHb06LHaRsxS(g$oXK^AgTG zmh}itF-IPn;mjQEMk&{B^k(MB0DNQ%y_h*#La_$x>XR8o;4h}@%49)j1aq`I+s*=E z1|S<8ERJ}xjLh?XBVfP4t?k)4Nq}L7Ff*%y3Eu-zg{PMb*3Lxe;pxwW+mXh<$WRaL zJRq@wp&1j-V{y#Qd{vop7_c}Jm17zR`6p>IEAy9RK$0AVr;SP$Jfy zVtsLGu2L5Cc@Y?*2YMB-V*mB;n6MtC-_N#E24;U19${wDKdg64h5tonICP`Qk3j~= z?hKign*A7=@!Pp)o?l>OHWm`<>)Q{2$qC3@T$Xnnp*-sA?70f)gvTIrdd5{|VhSL0 z(x#cnxD{zm{1NTP$gIXAuSr7~x*W%5BPY3+Oa<@8Bdi1ANu(j0Lg-2ImIuRk(Lu1-^#9rX0xh?g7Nff z6CrW2Wr%r)`es+xzJJ{@u6S=;IauM$8tw*=Fxh@yVB(&WAligpv;50<>S<~3b$=_7 zbHMtbcD()Gc;%6j{S9a(ye6K!GB|$fIypMWk|iiaoty4tzPThl>-kV5nG2_VAhj}T zo>i%H)6{<&zRKc=R;*M_rffCFyRedVI}Cd?ZCAF9vAtmr#pVq= zldhAPou4p-_v&{2yE^1c+vd#@65dAnLzERWuYqX8gLzA`d=&EN*UIb+=x`>_`sO2g zBFWCdJwqp}xkcB>)H~5FVJyz!6XQ|M=LJv0`aStaFfr^+xy59N*d)bFrELMldVS>X zYv17-(d%7at+3~^)QhdRD<}0G&urfKC5=tCk3yJAVt~>xFsx2&=Cp`jKAXDe>yh|L zO0E1^!P8U+f#?%T9j6n&vs6?fy$i07R5!TY0rAQbKe2{fyl&)0Yy+(w&D|n8-0;J3>9j89`l9WR*o^UdajBPIQv}g!s;dqE&*pE0ITkg`Atq zr3`(gq?|49)Zo9Tk=p(HX{|_At~P3#7Ip1aG|Q?quVvp`6md*$ki79l6Ll=)dbr%q z3kx-$bqM|qH9aY5`Pd?A+3?`!Q^2L%QJ4WD&re%3_g!|J@he6Syy+}fXSDwOt?9=cJ9 z#N8ilyObF<63;nIMv?aw*uCrJR7@JKD3~&W&Kvt7M|>Bhyt`FB4JM?&-m*G~-69Ga zywGn7LoM!oEstu!H?7cHUVEbJx3D*3TBw6KYN7GX2FZ5;n3=96gK^+l)A0#+ZXu>!j4$FbF<(b_9)a&mxsWBc2V6(G1 zj7i}fwDDQ69K0wU)0tgQBB}?_InkD!FNx%Yo*P++m`?k_E@uzY2g3LauQEWsnuV7W zEbu_mB7e@A-UA|Mi!d-+leA>w9hA>$=BL7bn}v zN>h~(LX++7R{e+&4j*yEl>dpHYLkzU&LjI(E8L>6Pfb?~3~V(O1k;wRm^E{zL@mKC znsLvskFY+pT9Sai>|mZblJMuBcFAWS%%0_ES{HlHs=C@|S+)DVThbRtx5UKU>e`!S zDUQkWyE8u0S8g_LLm>>0#`#Z7yebJMo6{SBVFEoihvc}C=-^`idN^dGArK-~G6*ub zEomLxzyzw_MZU-7dog@(lK;yLqCz&CQ)SfqsV6SF=UJhwcQ{sWiBm=%ovg=?^V}1z zwMJqjO7aqKwco!{BRNq~nMvK1?DTXJ6neGzr?>@|?h5k6u&Sijl_9JX>4T{sv{h2e zE{xx%P*ii3<`dQwy#b#J;=aec4htnFwZM| zwiOF3*B7UG<)ElFFCvo}&qjYr?$^^)>F9ZzszlJ!eh9sxlrrd3`OYf9_(EwGF1cMX ztzuVkT*=7e9-htz3m5dN=Ot#cuuGMEQFh7AsAdc1k~1SyJFx1sR;1Vp-~aXp$Cmqe zMq%i0xv7H@F&hm(;rlN(eGn~R(365|#G7h8dlCkh@i>}k{bRCH1}&TWeB?UDT3!YaHWRkyc{N1PL|5}ms zaKocN@T)emYw3!LR10aE`gRe9PY{mdK8^a5=mGJk!}ZQ02DYDp6BwZy$pN35Iak^6+5qS`a*5O|io@Fu$BDf^1VqcgL|0^! z66=+kd7tXX$}~(cpjT&C$_<-^*@*3mhgc|6Y-ct10Ow9>ROFS2cE$SP^|uuX(f_ z&>ikkY3DIhMp%CSSHfq)Elo2$HOq49qHySk?lP$bi1ZkB{YZRZ>WoIjtlwtHC#aVJ zIVM^*5_?QTW=|&+$}EthEFs8b_fE`4*exB(?l!3wE9Qo%>*xzQPlu-snubcJ(Rr(L zjsrd};LCG40!7UT;S_<7h3`i`vM{WdNGnwD)EBf4hey+TLK`bV{pC<$(5)j()o8bh9(#m^NaZ7qB{}L~&Fd z$9La|X>eDjw)*52-NlDL(^YzJn57}wZ1lu(tQ{i;9JJhi!~#~2d;cp+ zpCsSuO^VydMi#Mm;Q@0qlS!Rep8E^XkOe4-fAHTNhBC$@$k1iCQ*BA~tlA+7b{at< zh3X!(ZwA%R^f~C=`%7zKD=M-l(e~C|^D(@b^+39eZFX`BD*hBS2p2NelW5_}B_{zu zF^fsnFU`?~y9>XvlNu;ojA7?}!-}w{R|uvfH(~q{72rJ^aT{Mefk$L6g@TiI>4LjlpuNOJ zZc89!!J2H8|KoFgxVjm~1=r$@4}->h9M5on5)IE&Ai9pVF70yM?j$N%yW})HPXyeL zr{+utTqS_pV|Ire_k6(ZWs_tBrpS?&NqzSWkoWMhen4z~jzTGU7rz~h^ThZ(i8dFj zD)GFq3gY&KAn3iz+||I@^H2#IiHUL)>42gz%Xk(91CkcJX_vYvAMa@v){Sa*Xz0x0 zAcX_vGvG=Nl!)9RXIAKE72Ri~7bpBD8UhE^Vx~uK*Fn~<#WDx)8;a>t#WDj5E zPG)1i@<v!ESXU6Mw@7SU!2;ot&yCt7Tf zb43}CgSsDEI>D{S5Tw5*d&tSA8!Gqzspa_6dXxO?5iVdnvXyK00ycf)cU?{*t4Wk6 z8If220%)>x<++O?6nW5)n$z{<&w~Kk?#LP-K9MGH-TpRtQ$2&;4eBmvfL1G-#X%ln zd*zLC4nRC>a-RkuJb(|BPMv15ElVk};-(5AE@*m`B{%H>PBnTTlB@Ou(_&%MF)ju1_`=?F00-R26<9Zfjs@{as_a?_?9RJ#wB8zkBarc3hO zbwpv9P-Uce8j1G)`X@_n&lOy)_jLbc)LR@d9`z{q<`mIVXlN(1yn|ra2JX4+v;aCL zXJD91mbS-A&~_0LZB&{H7&A^$D7#wOL{9ZC0OxGuzkx^eC8}77rLbn#FS`Lom==~P zu5e954fz-BDKY}97P=m`#=cIY)r=ET#i{y8m+aTX2_=@!gsR1TXHvEL%Pb6kq?{ss zF+gk33u5j#Q1nK8jjVqFmqgomg7?|5muZ)#Q$xS}JOk%5Z^z0+tNEbY*2fuHZMroD z!)Ji*rf>$`{fDU?ML&nz&ok0ZJ9rt+>e6)-X^&Nl1AMHpf#Qgta3W3Jd^Ei^WaJu; zQZUE@iu9!i^vG_O0A2HeP_CdmTd2V|S8&M^ehZfr@UcuG|LJ9uFRbjNkL?NOfR_10 zta6Kgi^kVxRM9jaJ-jR6jU)0EMA=jH29VDi9&8#Xeuk|D!vhIN*}Uf_k$uG1lDWmy znef|C8sLVuTl7!H30=6am(=xn86S(-7_na7=8iI-#K6;0xMgii6KfU7FKYbA$_NU` zJ4RdMmxcBIF}P9VRAv3J7>IY2GK1_>@X{5zD(OsQ1*fJ{PA|E~4Z^rswQNq)XCmxZ zCoi5z1GMmh|5K^Xpc(PW1k>7BFu*sC{A(Cs{&6Q(BgKXu;BVDihFvHL|8-r)L0Id4 zpM2VMC9*c|h$XH;d|9JCybRX)Yy!^&fG=D3b$75bPUq&Tr?}Cb=~u4eg3CK|4w1G1 zNxyqV@{mT=ir$?L5;y#^>`Ft;tqsn9Py2+~f&u3@k$PXnD63QHfe#F&%R&!vi$@nrl7Bdo*hHL=rg*f>bwh71^?Pq?rYyX?UOXEG^%RZn2X&Hn7D?T_3@(?aX89ZSUU=)*lL19Ms_$L5 zT}C0iHoT7fJy)4Jdj87UC_oygynRxyM%7}oEgD89g3;t1>*^0hf6Z$ZB&T%klAe5+ zrCo1lh+LsrvbK5NtQ=)!`#Q`yLS|C$TbS)7v3T0ww3kr;=_<9z@;=9-T(3Xf#M;|; z=zXa6M?(oqAdg#>AKlsGG=0w`j9nYnp5{t-^0&0)6gD`MHCCJV5st#xj6{k@ITe{Y z2o#}w6;~yf!3gMX963mbLoqU60S`$A8I8WhK&n$=shqB^%iVMaS#xUm=uYpC@axr+aL z9=w4y8bt=ELFDDEyw^#xTg*HsP1hLsat5M#>Q!XVzld&YXr%=UBZsCE^v4+3Mp}my2ki+&ina>_A{S2*}$CC>MT8Flw2l z48xbygLV8-jXO+a7k?6+4L!q<3!J7u;QX Date: Fri, 23 Dec 2011 14:27:07 +0100 Subject: [PATCH 38/39] Added suggestion --- doc/TODO.txt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/doc/TODO.txt b/doc/TODO.txt index 190d7428..4fac889a 100644 --- a/doc/TODO.txt +++ b/doc/TODO.txt @@ -166,6 +166,9 @@ o Mesh optimization on STL export - Remove super small triangles (all sides are short) - Replace super thin triangles (one h is short) o Misc + - center as default: Very often, center=true is used everywhere. + Make a global variable ($center?) control this to beautify code + and the avoid typical errors when forgetting to specify center - Go through default values of parameters (e.g. cube() has x,y,z=1 while linear_extrude() has height=100) - Add support for symbolic names to child() statement - Add 'lines' object type for non-solid 2d drawings From 9fa18d53921ed7b2da4892d12958a6705f5a960b Mon Sep 17 00:00:00 2001 From: Marius Kintel Date: Fri, 23 Dec 2011 14:33:40 +0100 Subject: [PATCH 39/39] Fixed CSG regression reported by Ed Nisley; bounding boxes are now transformed correctly --- openscad.pro | 1 + src/csgterm.cc | 21 ++++++------------ src/linalg.h | 2 ++ tests/CMakeLists.txt | 1 + .../bbox-transform-bug-expected.png | Bin 5808 -> 5777 bytes .../opencsgtest/transform-tests-expected.png | Bin 17407 -> 15379 bytes .../bbox-transform-bug-expected.png | Bin 6400 -> 6285 bytes .../intersection_for-tests-expected.png | Bin 5947 -> 8797 bytes .../transform-tests-expected.png | Bin 14734 -> 15379 bytes 9 files changed, 11 insertions(+), 14 deletions(-) diff --git a/openscad.pro b/openscad.pro index ac498072..50a419dc 100644 --- a/openscad.pro +++ b/openscad.pro @@ -232,6 +232,7 @@ SOURCES += src/openscad.cc \ src/CSGTermEvaluator.cc \ src/Tree.cc \ src/mathc99.cc \ + src/linalg.cc \ src/PolySetCache.cc \ src/PolySetEvaluator.cc diff --git a/src/csgterm.cc b/src/csgterm.cc index 426adcaf..56fcbb5e 100644 --- a/src/csgterm.cc +++ b/src/csgterm.cc @@ -115,25 +115,22 @@ CSGTerm::~CSGTerm() void CSGTerm::initBoundingBox() { if (this->type == TYPE_PRIMITIVE) { - BoundingBox polybox = this->polyset->getBoundingBox(); - this->bbox.extend(this->m * polybox.min()); - this->bbox.extend(this->m * polybox.max()); + this->bbox = this->m * this->polyset->getBoundingBox(); } else { const BoundingBox &leftbox = this->left->getBoundingBox(); const BoundingBox &rightbox = this->right->getBoundingBox(); switch (this->type) { case TYPE_UNION: - this->bbox.extend(this->m * leftbox.min().cwise().min(rightbox.min())); - this->bbox.extend(this->m * leftbox.max().cwise().max(rightbox.max())); + this->bbox = this->m * BoundingBox(leftbox.min().cwise().min(rightbox.min()), + leftbox.max().cwise().max(rightbox.max())); break; case TYPE_INTERSECTION: - this->bbox.extend(this->m * leftbox.min().cwise().max(rightbox.min())); - this->bbox.extend(this->m * leftbox.max().cwise().min(rightbox.max())); + this->bbox = this->m * BoundingBox(leftbox.min().cwise().max(rightbox.min()), + leftbox.max().cwise().min(rightbox.max())); break; case TYPE_DIFFERENCE: - this->bbox.extend(this->m * leftbox.min()); - this->bbox.extend(this->m * leftbox.max()); + this->bbox = this->m * leftbox; break; case TYPE_PRIMITIVE: break; @@ -330,11 +327,7 @@ BoundingBox CSGChain::getBoundingBox() const if (types[i] != CSGTerm::TYPE_DIFFERENCE) { BoundingBox psbox = polysets[i]->getBoundingBox(); if (!psbox.isNull()) { - Eigen::Transform3d t; - // Column-major vs. Row-major - t = matrices[i]; - bbox.extend(t * psbox.min()); - bbox.extend(t * psbox.max()); + bbox.extend(matrices[i] * psbox); } } } diff --git a/src/linalg.h b/src/linalg.h index a83949e7..c1a14d12 100644 --- a/src/linalg.h +++ b/src/linalg.h @@ -13,4 +13,6 @@ using Eigen::Matrix3d; using Eigen::Matrix4d; using Eigen::Transform3d; +BoundingBox operator*(const Transform3d &m, const BoundingBox &box); + #endif diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 20a9edec..a8ab9b9d 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -244,6 +244,7 @@ add_definitions(-DOPENSCAD_TESTING) set(CORE_SOURCES tests-common.cc ../src/mathc99.cc + ../src/linalg.cc ../src/handle_dep.cc ../src/value.cc ../src/expr.cc diff --git a/tests/regression/opencsgtest/bbox-transform-bug-expected.png b/tests/regression/opencsgtest/bbox-transform-bug-expected.png index 060b9218514521506d1479f6862bdca81dfee96f..52e4f2a4059052f655aa8ce2e815390d55950bd6 100644 GIT binary patch literal 5777 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 literal 17407 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 diff --git a/tests/regression/throwntogethertest/bbox-transform-bug-expected.png b/tests/regression/throwntogethertest/bbox-transform-bug-expected.png index f65e09cbe82a9b7026ba93d892ea9b3895548a7f..dd55c915b274abca4f49a3cec3baf0c7b117817f 100644 GIT binary patch literal 6285 zcmeHMdpML^+kc+N3}aB^SfR)%hZr3kc8VuN5+=uz!xS6s-(h26DLdUfxpg20XS*p`ct zJlE}Hi9;dXWs07ndPpjRF5jJHj~KF4lIA!sW>Zs8iW%{_IF z$T-Rhnz%_|i8;?!$gWk6NbL6LI^%nu*8jbP$(lUbqM@`8pDUj@78mCl5yjOCo!fcC zadxrpW#)>5#Y`{6*{wA|NOj_WUU5vanM`6HW{qb$4d^p|?DKg4hVFItr{pYbvDs>k z&-#J~1^T5*VX-YK6 zzETHz_2;3w>#D|~*AU}t?1iP2fXUJ+d0qjwE?C^pfx&Z&^jbgi{&G2K?ul>r{ySH3J{L!$$i7sDD}4P zyleJ^Xa)1rlsdN%Gn?E09W|zWTYpFu=bYYf9|J~QR~Zwos~@KJ2>BYdGFqF-LOcDf zRP#-H9=27_Ro$7m_M2?=*N;v&kiU+_rPOxvb;}DE8Vj0(m2YC(ueOcVMu~GSw642L zxbl5!=)7}(-iYg(FP*CS4krtHbwjC54lNfbw6%=(sb&w6AG;`B1wS0};73{UG+(Ky zGh6TWmqL!-1L_?^NRw&rhl%KtJ!Pw?0W-<{*O7_S;?aOA@#UGzwWWkB$8X+lSveB# z`uLwnNAv{Ey|VKkLR8637s`WUL<#+siALyTT8Z^*tEX<8mb~XoIg)QNB{6_5B4!NW`DAk&@Jek$>@&H1E~fHqRH6G zK^bn5n9HeuCgiw0|JX=XA@4u$$nKusORX(HxC)>g)wqrUjn=6(W}Ht z79%kKJb|5Gn%T**%(FVc7=4H@W%cEFBeAD6&V$5Rh|$?SE~5qFziVn96cN$b!9k~+ zWk}f5;fVrne<4L$F>@}QEJ{%!-#QFV6d3o%QE2iyJj8(7KT+`X&rSJq5M@LC!f~7$ zv%$Se9H)B=j)9}%<7_{Bk?`ZK`H42Wz@$@5&|NUxi^?y)UO)-Y(=T&VNvm*rnoH-s>Ky5s4#O#!QwSm4-H@&e5{dc zJ#9p&9eJTnF_!J>>hb9~S^E~WUEH0DHL(2wFawiJ-C>6Zkp3vkcqcH+!8Ez`3@}-K zIQq8X`D@s>$p=Rd^jBJgj2i?MH}r0552G!s<`BX~p}fSEcdNnUPctOcjkw!Q;Ps!WF=s09^6f_Y&|60B*WUqz~Y_08VROP5FTa`D$s;43r1; zDov|blhgou=_{+!005;y2TP@g9)}V{xB~^g@tGtrARdTN|gHZxvD+cdZQEF`MOylIYKDs#9x;;gHH(( ztnW!W^D>x4<&~1o+>WCv z3+h@Wo#_Qdd0Q#@yMr!gNIZGpu8v}E)LG3;=ZkcKVrDSpNP82GzH;yIIDFpiF9paG z?5-bDVI%>9l+9&r;6jM{km&mDk;lNC1CtZtA^F3{1uC^#Enf#r4pgeQT^TT0o;Z5; z#Ix%X_+WsynxJ4yDLs#p-|TA9Wqv9^?cDs(^%h^20D>b_J@dSR3&dZ9(FG;-OqApWz_>$ItGveDRx2;Y%%8g{9J1J*UR zr$bXE`r_#Nmmki6Y5fS8@_a>sbOqyeCv+aP+wYFMbivaOlOl(Nd%*n9M!zbK?$bxX;c$m#BG<#=0+d)tZfMG72ulXSl3CcE2r$)pJjAR%KwP6GbD;Z$3E-~e zA@n05dnvS=YNLKckoN3s#;s{36tkd0ivNxXv8qbQw(ZL;pDzsuQq&*A;65tHjC;s$ zMYpDpt(M%*nDIus3;OEA*lvt+j9xvnh;kKC<0Z+VSOz6v?)Yz`RfO7`BwZ8}!5h~W zDzG6e4)(YbWE56DKmL`@uDzlPx$q`idXMcy@1DN90L8kg0dxC~s*=WyZ#)i90e}0N zzHgw=wgQ$1eqm0DLtCH!N&{AHCxyMTT?xn~wka@>6za#3div7Uka%hN$etk606}3` zm6U$5Y$HL+qkdxfn{iAZWN5Y~AK}J>H$LZ#@7NLY%=wy3gxiBfiF=-Sv`sE0y_5@< z<7_WjalI>ip%)Uq*j5i`?}Xp)^<)=ZN0uF*vOqBnTJ?+-{%D3qjXC#1j>d>E5)4L{ z+>bJ)-hMsOVq&MTyNowk2a`%S38PUT*QaSTO)pXyZ0^^Ks>nafp=oX*TY@d!sVqx% z4PEmZqLiPQPUj`!_ng_A0gF*#L@eL^s|&`IyePF_`}gtx8tiRNZh14ieAL)B+5i^> zkU~!RHgQNV`nK`K0$F)&!JwA*wG}(P5s%F&hwy#es*#?v9lTP$x8@zot4LUE(kc`y zfVvc{d_KDwJ&~6msNC*Dw(w0jcaDf01kz`V3Z(yFtGY54JCZ`X&8)VnPd3DmQxGKZ zFi|RIuh@ucu4MHw26P02BTpVo{z7MuP}UdV`ylti6knk`$gRJ_Fd4O&aV_hvBY&un z?{zJ;x$hv^??OW!J?_QSC2wYv8&odqUe}XHQih9;Dk!$QLJYaHL5)60a(%KH*B<8E z?~1HerQTkC&sni}g<$YjZhgFsC(^kiS&8cjZqL}^Uzc!bHF6J+D7Eh(h5Y@9#j+6_ z!t%R|Kz`A7oR%=tQpNz(WTeEVy@SraO-AODyCJW;A6$L34b`;Rv0rgYPcSGBeSdWg zu<1|l9k3(N+*)SMIa1RO0+7NwtSwM41O_CAxya z?4u7J^XNSE7kyf!@#wQ`t!0y(znnqaP}7_BXI}WiyeGd=LeJ&OeG?w174+g+jwU%qrlWC%aA-! zJ3%_VuKO&>lN(5u_mB7e@A-UA|Mi!d-+leA>w9hA>$=BL7bn}v zN>h~(LX++7R{e+&4j*yEl>dpHYLkzU&LjI(E8L>6Pfb?~3~V(O1k;wRm^E{zL@mKC znsLvskFY+pT9Sai>|mZblJMuBcFAWS%%0_ES{HlHs=C@|S+)DVThbRtx5UKU>e`!S zDUQkWyE8u0S8g_LLm>>0#`#Z7yebJMo6{SBVFEoihvc}C=-^`idN^dGArK-~G6*ub zEomLxzyzw_MZU-7dog@(lK;yLqCz&CQ)SfqsV6SF=UJhwcQ{sWiBm=%ovg=?^V}1z zwMJqjO7aqKwco!{BRNq~nMvK1?DTXJ6neGzr?>@|?h5k6u&Sijl_9JX>4T{sv{h2e zE{xx%P*ii3<`dQwy#b#J;=aec4htnFwZM| zwiOF3*B7UG<)ElFFCvo}&qjYr?$^^)>F9ZzszlJ!eh9sxlrrd3`OYf9_(EwGF1cMX ztzuVkT*=7e9-htz3m5dN=Ot#cuuGMEQFh7AsAdc1k~1SyJFx1sR;1Vp-~aXp$Cmqe zMq%i0xv7H@F&hm(;rlN(eGn~R(365|#G7h8dlCkh@i>}k{bRCH1}&TWeB?UDT3!YaHWRkyc{N1PL|5}ms zaKocN@T)emYw3!LR10aE`gRe9PY{mdK8^a5=mGJk!}ZQ02DYDp6BwZy$pN35Iak^6+5qS`a*5O|io@Fu$BDf^1VqcgL|0^! z66=+kd7tXX$}~(cpjT&C$_<-^*@*3mhgc|6Y-ct10Ow9>ROFS2cE$SP^|uuX(f_ z&>ikkY3DIhMp%CSSHfq)Elo2$HOq49qHySk?lP$bi1ZkB{YZRZ>WoIjtlwtHC#aVJ zIVM^*5_?QTW=|&+$}EthEFs8b_fE`4*exB(?l!3wE9Qo%>*xzQPlu-snubcJ(Rr(L zjsrd};LCG40!7UT;S_<7h3`i`vM{WdNGnwD)EBf4hey+TLK`bV{pC<$(5)j()o8bh9(#m^NaZ7qB{}L~&Fd z$9La|X>eDjw)*52-NlDL(^YzJn57}wZ1lu(tQ{i;9JJhi!~#~2d;cp+ zpCsSuO^VydMi#Mm;Q@0qlS!Rep8E^XkOe4-fAHTNhBC$@$k1iCQ*BA~tlA+7b{at< zh3X!(ZwA%R^f~C=`%7zKD=M-l(e~C|^D(@b^+39eZFX`BD*hBS2p2NelW5_}B_{zu zF^fsnFU`?~y9>XvlNu;ojA7?}!-}w{R|uvfH(~q{72rJ^aT{Mefk$L6g@TiI>4LjlpuNOJ zZc89!!J2H8|KoFgxVjm~1=r$@4}->h9M5on5)IE&Ai9pVF70yM?j$N%yW})HPXyeL zr{+utTqS_pV|Ire_k6(ZWs_tBrpS?&NqzSWkoWMhen4z~jzTGU7rz~h^ThZ(i8dFj zD)GFq3gY&KAn3iz+||I@^H2#IiHUL)>42gz%Xk(91CkcJX_vYvAMa@v){Sa*Xz0x0 zAcX_vGvG=Nl!)9RXIAKE72Ri~7bpBD8UhE^Vx~uK*Fn~<#WDx)8;a>t#WDj5E zPG)1i@<v!ESXU6Mw@7SU!2;ot&yCt7Tf zb43}CgSsDEI>D{S5Tw5*d&tSA8!Gqzspa_6dXxO?5iVdnvXyK00ycf)cU?{*t4Wk6 z8If220%)>x<++O?6nW5)n$z{<&w~Kk?#LP-K9MGH-TpRtQ$2&;4eBmvfL1G-#X%ln zd*zLC4nRC>a-RkuJb(|BPMv15ElVk};-(5AE@*m`B{%H>PBnTTlB@Ou(_&%MF)ju1_`=?F00-R26<9Zfjs@{as_a?_?9RJ#wB8zkBarc3hO zbwpv9P-Uce8j1G)`X@_n&lOy)_jLbc)LR@d9`z{q<`mIVXlN(1yn|ra2JX4+v;aCL zXJD91mbS-A&~_0LZB&{H7&A^$D7#wOL{9ZC0OxGuzkx^eC8}77rLbn#FS`Lom==~P zu5e954fz-BDKY}97P=m`#=cIY)r=ET#i{y8m+aTX2_=@!gsR1TXHvEL%Pb6kq?{ss zF+gk33u5j#Q1nK8jjVqFmqgomg7?|5muZ)#Q$xS}JOk%5Z^z0+tNEbY*2fuHZMroD z!)Ji*rf>$`{fDU?ML&nz&ok0ZJ9rt+>e6)-X^&Nl1AMHpf#Qgta3W3Jd^Ei^WaJu; zQZUE@iu9!i^vG_O0A2HeP_CdmTd2V|S8&M^ehZfr@UcuG|LJ9uFRbjNkL?NOfR_10 zta6Kgi^kVxRM9jaJ-jR6jU)0EMA=jH29VDi9&8#Xeuk|D!vhIN*}Uf_k$uG1lDWmy znef|C8sLVuTl7!H30=6am(=xn86S(-7_na7=8iI-#K6;0xMgii6KfU7FKYbA$_NU` zJ4RdMmxcBIF}P9VRAv3J7>IY2GK1_>@X{5zD(OsQ1*fJ{PA|E~4Z^rswQNq)XCmxZ zCoi5z1GMmh|5K^Xpc(PW1k>7BFu*sC{A(Cs{&6Q(BgKXu;BVDihFvHL|8-r)L0Id4 zpM2VMC9*c|h$XH;d|9JCybRX)Yy!^&fG=D3b$75bPUq&Tr?}Cb=~u4eg3CK|4w1G1 zNxyqV@{mT=ir$?L5;y#^>`Ft;tqsn9Py2+~f&u3@k$PXnD63QHfe#F&%R&!vi$@nrl7Bdo*hHL=rg*f>bwh71^?Pq?rYyX?UOXEG^%RZn2X&Hn7D?T_3@(?aX89ZSUU=)*lL19Ms_$L5 zT}C0iHoT7fJy)4Jdj87UC_oygynRxyM%7}oEgD89g3;t1>*^0hf6Z$ZB&T%klAe5+ zrCo1lh+LsrvbK5NtQ=)!`#Q`yLS|C$TbS)7v3T0ww3kr;=_<9z@;=9-T(3Xf#M;|; z=zXa6M?(oqAdg#>AKlsGG=0w`j9nYnp5{t-^0&0)6gD`MHCCJV5st#xj6{k@ITe{Y z2o#}w6;~yf!3gMX963mbLoqU60S`$A8I8WhK&n$=shqB^%iVMaS#xUm=uYpC@axr+aL z9=w4y8bt=ELFDDEyw^#xTg*HsP1hLsat5M#>Q!XVzld&YXr%=UBZsCE^v4+3Mp}my2ki+&ina>_A{S2*}$CC>MT8Flw2l z48xbygLV8-jXO+a7k?6+4L!q<3!J7u;QX-q683#N-t8Bq5_FxL!>B5haemT8z6#6kpxlfVg;oJkAf&A zh|(cBqTrFPQUfH)L3)!CASAhq|Gndl@xI)TZ;Us_$(PKrv)5X4tvTm!&iPxp>1cmI zT0&6*f*@&|gL{uc5CTL5!mfTrD_ZA65D~K3yZhKBc%skY74?*t`1DdYLAGaeYv9oj zVVfT7yO(Ud;&yK$WnX!qyuyBBiqw%u_EPU`a1!pWyC+jr3oswk_4iyAVz+L*YKRKh z_TmOHeAhP4vw-HQ=qX-w=By~vDl_?D2EV#x$Iw!hRnCyWl5>H|vnnf(95fPbBGaI_ z7$msCus2wu3r+x4ot zzMaDs$!yhgit%D4##P{Z)|W*t{Y_f#8 z=TjwMHV;d86RQE9QgIMK);Bchb5CUWI^unAGW3Fph5)u6CqsWsR8`>c z2MvhOR|+DHvRGufC}#92JI&TZljNDBwFpB0@$0D~0MZgUJmfLDa}`q+H{c;@v-p+zwj+B#&`KW|AgSUW0N1z#pmc4MkqJQOv)V+cB<5Ykl)z-fbfcNgA(X9Op8CxKBfFWbb#-!CDYDCENO1LW!-)$vA?o;=d))L7+ zTVR;6Hm_EeNT!FwaBI}{#zb&FO5nin`Y0y>F<;W6e;M7B$f`q_B2A8dz+wX__W4;h z5f8S1HMj`T#A4%dt_cfZ=gU)B5*x59wYLksdn&KSv9H+f^`7z~Lv#JRXDMpa2BPKK zXr6(M;T<^)FI1uR0Sy{{<(3^)MKd(75kJYuph2!JUmrxREBn3VV5hAv)w|()h{88I z*cwAS`};Gp&6N}V%!N0k_U>^zvm#)T-j%tRofgp3TXQWG>R8r?ZB7xU8LS#)O;C_` zH}6jKexEC>rUnOlf~EiP^isXOhMMs978QR zQyJh(*GpOGP#iYiQxH_?t_r{J%N!|=Uf{)!l($g*mSgWu7PTE9N5=}Cwv3g~_y7I0 z9oT5}#dYNn*X8=5duvfPh)=Ki3BwLXHORtUk0Y4znfb!OkJa_$50F;%BlNWob^8&- zXG@pYn&?yW29Ji#FeO;pH>Rj(;sEWCe9~ELyn56^H89xLzr$vitKW#q9!@^=`4bvG zGp`yE(zO8-K&(mACqgH`DKiINyrf$6-SZ_wca$PZ^l{DPm>tJi6m+Ui$Ct(KHzG$C zW9ng_$EK$yiPxB-fQ}s#d+A4Dkqo`9&NH(^ry*j;!2@RKPPdq3D9#3GCEGa@-|)Kn z=P~>G#&sw!669JmC9{upfNbf7^2igu6#n3*sxZ?&V_@Vi7E9Z&cwV%9!7bgdo+b|Q zC;|Kbkey!ZsM^;bFmJG7Ff7taUgtgU?T-VrsF7n0vvQDr#L)ZlC+`>U-^^%M(Z*On z=Kt&o{c0)}gZ_S!(*Lx*=nXYXA-nDK;V+L*o?ToCz@&KjN|vDlOPTrk<^EO=g0Ma3 zn9tUBc>~)m)D<^7Il;jq8 zrer{rzh?5IU{$!?W5VcdVLKJCy{>;JZlN_o2KgHe6mYC<@a<_$d!1u^xMpn0MgBA~ z&K!j86Yn}#OZFX@B>MK{c#z6n5F4h7zXdrN(ZcF;hyAa)y;DF5#aI&g;Wu0n6{NJS zWr}qC*UWfMjZ=x=S-nUL#usZJ2b!Pf!Pl-{ENgDNO|lB3SK_M8m2Wv7w!S_$b6coM z!`)^jv_x9Z#MFJXx>QfP|9oT5is!4SWsEFViz`Eq%f4qNDz{8^!k{aa2w!@a5?Cl2 zJ2}Y(TZS4QP{dv|Go(*lu;$KYS``ErTO0)I#B=L&s-wgWRa{GId+}*H6`^K~=}jRx znqdSalnz-EAxaHmy|A8{1sD5Q5O$$l$(-(BZ$m!^l7sYIz_K#y($~KxF$rJm%+R)z z(9ddtYDh19#~_w1DQ1E8#+F^;`M(i`EdPGA=fp#9m#UIi?-6lg>s=7l*~fYI+y7~i z6pW~@j8|XFQJ(&wN%A}``j{z-?k?F)KMMTmiDRm?M~ryLP~(SQX+0e6zA9Wjb+eSy zJyR?{_?N;BgDHTM5pTyAf11J}Iz+NmqYSO_ji`H2R|@#J8!*^0EhOk;v<04F!%p5V zd=Y4#YSEQZmAVZ}v-WsD$QGSH@t4Y)JGRA^$9>YoKlr@%X3QW&SL?zjTQCJ9FIF-P z4|Xq<-dd32>fc6{EL5P%yxa{E#eZ3%uuG6npzq*1E_)(l=2mLFLSWy-PZ@e;QvS9R ziQ*mSduOzw3xw8gK{6M|Cr;$ZLf6~OLVYtOO}^ep%Go64KH2=R97j`+YFMzGoXup< z-jhQOf^YvQ{}Pr9bD_4I-&5oU(Dv*ZnWwHV2!zECE0|W))@x=Cr~0T)n}3NUXiqPD z9eq-dvYqoCKhu}kRv-Na5AkFNmGR>V^s)Vuv*@l0&ip=Ozu$-t#=XF6`4+qe%Jxp* zAjtK7P$x-?uju}|j;na3#@FZ7XB2Jh-1|ui&*rxmeE&t;*yE8I*3NtN%AYEzX_s#Y zY=HDHz7*_uA8BnUTp7C1!Ynn69e3hrvv-)~@ptfJgWD0V_h!^q3E=0YIqYacV=QvE zk9pbXlD{4is#7c(!fq#^nDeQm3%L*bYq>|g2E%X1W--ne(x9^Bz<9XY5-!*@JTpVa z#Y35E-FRmTj`}r&Bn51oEU_`%+EE4ajO0^uOCF+YX*C~M71Z1u@4~fs$mCGn;SJ_G z7!8NH4jHejap59oPL<&SGSqma*x@CaX%wQvxcXOIsn~!ft3&WbvW0O7h8=PKT`_T% zs%sh-S8}o$U`}p&E$cbu8`19<2;Ima$%R{s=(2}?l}cBBL-bG$+XQ6-#x}e9OU)YQ z%5RN@7BkKX<&+>-=#4a@jg%-XV*`V>}%BB(JVclgY$(1ICf z?#?7+Iv75E8}W$Q8pa(ZeRrFbGCg$V_T!q}J_R)Bscr!C2|9_o^;o~KaQmMxuWQ>F zZVWs@*gn5N&AlyPufszV^J;^4lIqE+XLS>Hr;4Qzy#lC7u?m1TuehGtSp%^f^V_`|Xc8Degs# zRQ(d48R@^soN*RqX~B+>>4cKK03B@SHjMKNlD*mGLxirtK7;JeM9R;sJBjaR#%D#! zxf|ba*Ih-$j=6QHPWeHBHg&SE&{9?AqPU^AKs1p`>Y>bkQMil_6U(U&E=L8@&z$2( zzbhHeG|}rCr8@T&#tbXh>gIo9b*o+O27Vft9g#yIWPhuZ-aRlTsCrjPeu_G_@1<@j?5g3WwcNy zWB61)vL01xS7qz~y!8V6OktBRowJW>uw32ZRKA>iYC=?gUy~(9YD|EJv!3W$sxXFm zt>b@R2(vbP)+iGUYF0D#ibal_8Tv@4;9#cc@MSRN>Hka_`k%OZRSmBSMz0u*wEncE2$5gbbxW(waLVI`;}H1lb{VF+RsWr)3>Vw}2mzKBkUQ zqzG=0YGd;FVru^+K<4lAgE8c1d%vr71@#$()$W&9Xtjmpx`wPoci*1d@{|VN$SOs+ z+fxmV7%df~pc4ZMt$m}Ev!BRWH{NZ6WF~%HgS0M;8sQcwbCNFIfu@*cY1*TFf>x*N z9cefuP<2X@_U)gF8*v*t1m_Ku8fpD5BBMez!kM{BeK6X~3rfrGIw|$8WHOQ6eGIeL zT_E|Epe2_c1awz2Q-{9n^*DGXsZ)T2_XMhAVwW`&mMr+WQ)zYvtYqM38WJ??Xfs{N zew&pVW~V!^{<5VN%9|o+c>IwJU^x%y|DC!UdK?LAjr0QkwZJZObCilS?c2vabu7me zr7JVnIu}8(zT15U%>tdDACdK(+R;;M%q?hVHrh$aNhtAwp9q>%EeE0$3^ztZN`3U; zsSfrFoVlZ;qzsSGY9VHZLFePy2zNL;PZ4_gG}i_n+h<^0TUStuw8J4OCq5GhhaRB^ zbQ$UA;E*tb5**FxIIoWUI-J@&l5XttbChyY3nOvut{teYv#ZvNbBv)cBP|b!6BQJ) zy%M{Q)!WWId~{Wn|L#@Ztf{nx(oW9K9jG~OnXiX3YovXG9i#BZxEQTt%h6n5RlI24 zNs{*GE`|*zuXI^HNipHGhrn(%VxjS#?WhfEps9B ziej)0na8t*8&IkFLjTvkbjL2&%|s|^IKQY6a6q58}?`b_4T{nknXkpOJCm#ChWK= zw3ch21`=ibr>i|kZ1s`?#dhYKuLsC{^If)7#6eV7sv`U*&QIkHDqN4W2r1vod8WaY z@kvQ;LnGL*2x~m6s!0}2PQ7fTi=;~4h-zSDxGkcT@P7?H+bU4w-7N4=dD)s ztdN~mVj8UltR`OU3fD3?I3iZ5W&D22H4CV#>`mgver48{jWxs&4Z}ZJ-MTntm^J?W z$RzaqqO;emnD@#Ug)o)2VnugM3&O61W+AdZ)(|@IxopQ;a}Qp<_!D@awUpc~NJ+Ta zRmrY*Z0d@o;6d>FBOxBeWpC$_Z=Q@LIO2nX^P;V}Fzeh8JIZ-+hIV1RnZ9H3WHQo= zmb*2Rpme2Ze*_x=b>XvV3FJ|dFw{!HQLEYXBTM0+0Y!r5z0*HK7uyJy(@cW>?iQaj z3c-98CL?r#%CjF5NJFx4y~cw9JV-pJ)0Z!SdR}0FhZ)TBZIhaePZd)d^taR?tWK89 zMh!^jW5lSmSc&U$Lzq7~t1QA=s@FD*3&A188mB@7#z+MzqdSmRqOHa)c~oxF$mcsU$k+kmH3 z&nz&_;l2$hr%%qRQ!cyn?01gQq6IoPPJ~vAOmFN@5}r>LB;6>gOPh$O-X37U*V_;x z&Uo4iUtAj)(#Lrjq`8R!%8V|2XO_!a#$4ftuF2h10#bn)0=#(U8E5IM->z7R?N%3x z*=v~7!f(Anv2)ZW``_D(s4Hw2d!?3@=1Qf^*CT5Ql8d)}{G{1-SSeeon;`Y6=bUGj`coVWS=C9F(5?_ z@%Yhg(z~gaw=MkO*3%KFPpp5!ne7>QrUphJ`<#~l_8f(y?TbmB>W!3gT`u(6QL2{ zZ0ql!L~ze_t}{_U;W`ER1=pv|(CVWlvSGbAP&*>d*4C*vVOx=g%f9af#&U3Ic_Zl+ z^fWkPC8PcmEu5M-dEjoG<#^hkhse+|BNNL&4uLT@b=l}~L{l|MMeEwQ{&0*uz}|f+ z%{4{mrCfQ5OqE{zMoxU-w&^jtUwGJ!I44=ptz$oKt5&Tv?W)PDOj z=Mc|)=uh{mfyh31{6;l9x1&snF+9~#utPJ{%y)ewSkJ=K~!i@}CD-^5yNr7rO~ zqsP@D_lZXLSw&y^Wan-7<<898aYJwInCL z(_S4R+8a#e{^JY|bZYI`9Q#}yIp=9xjz07}Vll6#(~tXOIJh9~GADUATJa_vEMnJW ztPld(0;64sEjnSoQ??3ixLgB(Bf|AE`VeM(<#Ab>i=_Md5b@U20gbm=qeu|eS#x5A zhR|m*DOPd02>&CkROG}D{dfruxms~S*4)$Q8#rUteoh5wFm`JGiM=YqP)+e1W z)?8P?G3hu3WKf!~<8ZT~?PTM}t$c|xR97dv8~aX=n?N6&JZoqMGvL?Ovcv8^HmgT* zd`yh&GGXk7RO0k*#`S58>}>%3k})ZI-3@(1ZA_J5YQlFKUsihWnL(UD?8}#$FHS!N zLsNI;(Y>%IZN?ZzO2rC#@sID9RVTZ+15z~qVqMivxl6wWC{rOF-*RHqG1;n(D&oM0 zP&4T%WD#IZL@KXWuZxO--g>6H0M$sRf{vHE=J@KB zksEN)4XNpX_H1PWx`25d^!GHD9!Q+Go9w}T)G!5*h8*kl;3mr_33O1OPHKX6=l+Lc z1j7t%L0Rovybi3p3>Z5B&rz%%7XuIK7a>w)d{46J^b%aOE+_IA-d^?i6dayif5KU zH~bzzvj+aTc~wmSI)}}Q#lfccU@cUhOYB3-Uz(09OgnyQ_V=TJ!o`OW@Xl54^I1jW z47x|YOLJ3@rW4=zy^|cxhzXJ+TQQdD6{cRA6SW9|kIg>&y#;%GuKX8AuNgZ4 literal 5947 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 diff --git a/tests/regression/throwntogethertest/transform-tests-expected.png b/tests/regression/throwntogethertest/transform-tests-expected.png index a120581c7448bf418fae110294d516dd6fec09ab..52f433049542549afc5fea129c8c4458540dbfb7 100644 GIT binary patch literal 15379 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 literal 14734 zcmeIZS5%W**fp9E3>FXt6={M6!Gd%mAVsC9h{S>*9jVenkq$}F4TuN`N|UN6h|-ka z64(^!MS2ar7lA-}_*dNDW*!8hq;y;J`XgWH+IWzg$wJU1?WK<_T;u1NCo;w79-O&w2OWMq zjDIA?NWsyV;9Xs{Q|yH(ikwj%FCMQZ`^!!|`|v!lCTUF%WiR`z$R(?Kyx7yHB;HOL zS7DcIGn#9Vbf?(WS}8oH`;s3oGu&`+Q z4Uq`QDi=HC3%?&p_!HF7-1qGlh=4FuO&{Y>heFZS~fekANob3DZOk^Y1|IgxRc@`UaE!tQJ4h|LY>Ya|LS`qbf6U$S8C zfo`L~u4~)!-;pS0e;0{CMFr-nMZ4^D;EgQ?1J$CtGCOKYPVDt)J726Q|Ga0pEVXfp zDZMA$txrC8H+k&J%$@bd1GOek1gb{N7pQ-hPdsBr@&YW`E>aj+Z}L8bXTd zz0k!!p)YzM?ozUU;xKP4{HCsRofn}^{=k!?#nGF@qw#Dz^<6xDaah7x#HXVKLZAzU zNE4h)j21Z%wBh(bK0|Vum#aJ=rUDu%I55>XXW-u#1j#JrhK?$7iYn_6?&7TIw6 zy+dU9AR^%O@sRH+%U?On<1^6JbUN&*b|T62s){L!WB6FB*tcvIiFI1QP2*DNw7I;- zSOol4vIDlfM(tho*1s#<))%ZamM+D|dTsBuV*NU;aJ3ZFB|HSP?dDt~goIMJTujPXiV{C8}>7 z3c9)Buelim-v1r{7isJy1~nCu4xzu!xz|j3$5aAVwsg zWK5se#+M)Wn_)&_$Baz$BjABk_%Q)>^<1ce4rKY?wl4J}e*zAws>r;nb}L2=?vy8DaE8$dSaTeVki4$ia3!Jy5%Fl)%}zIt)Mmxw-xOk z6AY&&&o1))lA6cKP#e)o)RO8Yiw0&?yPz$My$3t={D!7=_b!r62Wl@`xi)x;Wq9rx* z7?(x|`N<1^;Olc$mkG~V%RkFI?>D6tm9613L?yBfz;`=0Mgn`Gj?tje2`rz+Rl zG+{U&g=eg;lM`?wX}s&f&IFzA!M5{CUGpVt6wcuedF|k@fqc%nzqYtYYOau)i)O}V z?J=WjO%Q`1G^px|^8%us&>rlV=Rz3wDz}h;U$`#JU@kAZ9yvI)h?Gwei~LdfS=Fu>5ZF~yz zDN(T3;tg}Um(U*TEt#ypeUpVR0;20$u&2G@QhW8S5ebIBy0|@qGrrL;*R3x*`%w8B zvSdAr{-~zuL>Q!&gE8L{$^EF0enG)5behM2+Hny{Z3pLuCbSQg<{WV%RNjqmG- zee9M6OU_+-yk`2NILkk7%|Gp*p7)zd{%$<}_T_`crNbk*jB5C+(RR~2HW?$oq!w^O z43Bj|{8#d#lq{nrODBZ+q@EcyR(9-JEr^{KT)x(YJp-zFR;}V_a%*H8MfdDZU@fEO z<4-}$7OaCtoUEu0p02z-mXJx1Wt1_5r(6v6VwO;wGwIHa84Am7nClvKr(3XMXE>__+&7-W8pfoa z5fkJYZAJLANV0yJqUG-Ng?!=i#x5TD_@PJB`ONb_WH8TWJ4vRw->p}c4¥f|8>C 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 ZGSW)YS3l3cWc?0uTkD=?{te3){|5pf%Mbtn