Date: Sat, 18 May 2013 19:01:35 +0200
Subject: credit tony theodore
diff --git a/scripts/release-common.sh b/scripts/release-common.sh
index 5c63ccd..9e56263 100755
--- a/scripts/release-common.sh
+++ b/scripts/release-common.sh
@@ -12,7 +12,7 @@
# -d Version date (e.g. -d 2010.01.23)
# -c Build with commit info
# -mingw32 Cross-compile for win32 using MXE
-# -mingw64 Cross-compile for win64 using MXE
+# -mingw64 Cross-compile for win64 using Tony Theodore's MXE fork
#
# If no version string or version date is given, todays date will be used (YYYY-MM-DD)
# If only verion date is given, it will be used also as version string.
diff --git a/src/AboutDialog.html b/src/AboutDialog.html
index 946f5e7..2ec691d 100644
--- a/src/AboutDialog.html
+++ b/src/AboutDialog.html
@@ -107,7 +107,7 @@ OpenSCAD Maintainer: Marius Kintel
-Mailing list, bug reports, testing, contribs, &c
+Mailing list, bug reports, testing, contribs, help, &c
nop head, Triffid Hunter, Len Trigg, Kliment Yanev, Christian Siefkes,
@@ -117,7 +117,7 @@ Brett Sutton, hmnapier, Eero af Heurlin, caliston, 5263, ghost, 42loop,
uniqx, Michael Thomson, Michael Ivko, Pierre Doucet, myglc2, Alan Cox,
Peter Falke, Michael Ambrus, Gordon Wrigley, Ed Nisley, Stony Smith,
Pasca Andrei, David Goodenough, William A Adams, mrrobinson, 1i7,
-benhowes, 5263, Craig Trader, Miro Hrončok, ... and many others
+benhowes, 5263, Craig Trader, Miro Hrončok, Tony Theodore ... and many others
Hosting & resources
--
cgit v0.10.1
From 2c5b09a0a79609b5cf02f1abc9dca0cb27677f79 Mon Sep 17 00:00:00 2001
From: don bright
Date: Sat, 18 May 2013 19:03:08 +0200
Subject: zip silent
diff --git a/scripts/release-common.sh b/scripts/release-common.sh
index 9e56263..7d36907 100755
--- a/scripts/release-common.sh
+++ b/scripts/release-common.sh
@@ -142,7 +142,7 @@ case $OS in
. ./scripts/setenv-mingw-xbuild.sh $ARCH
TARGET=release
ZIP="zip"
- ZIPARGS="-r"
+ ZIPARGS="-r -q"
;;
esac
--
cgit v0.10.1
From 6509f0838269de67e6b84759ef36f0078f6e65f7 Mon Sep 17 00:00:00 2001
From: Don Bright
Date: Sat, 18 May 2013 14:37:04 -0500
Subject: allow 'upload only' and 'dryrun' debugging options
diff --git a/scripts/builder.sh b/scripts/builder.sh
index 6a9fd54..984a651 100755
--- a/scripts/builder.sh
+++ b/scripts/builder.sh
@@ -12,12 +12,24 @@
#
# todo - detect failure and stop
-DRYRUN=1
-
init_variables()
{
STARTPATH=$PWD
export STARTPATH
+ if [ "`echo $* | grep uploadonly`" ]; then
+ UPLOADONLY=1
+ DATECODE=`date +"%Y.%m.%d"`
+ else
+ UPLOADONLY=
+ fi
+ if [ "`echo $* | grep dry`" ]; then
+ DRYRUN=1
+ else
+ DRYRUN=
+ fi
+ export UPLOADONLY
+ export DRYRUN
+ export DATECODE
}
check_starting_path()
@@ -198,15 +210,17 @@ check_ssh_agent()
fi
}
-init_variables
+init_variables $*
check_ssh_agent
check_starting_path
read_username_from_user
read_password_from_user
get_source_code
-build_win32
-build_win64
+if [ ! $UPLOADONLY ]; then
+ build_win32
+ build_win64
+fi
upload_win32
upload_win64
update_win_www_download_links
--
cgit v0.10.1
From ca4fb9238fa50fc11efdc36070bdd38f77148ff5 Mon Sep 17 00:00:00 2001
From: Don Bright
Date: Sat, 18 May 2013 15:40:01 -0500
Subject: update readme
diff --git a/README.md b/README.md
index 5bbe8b6..73eea87 100644
--- a/README.md
+++ b/README.md
@@ -188,14 +188,14 @@ http://en.wikibooks.org/wiki/OpenSCAD_User_Manual/Building_on_Windows
To cross-build, first make sure that you have development tools
installed to get GCC. Then after you've cloned this git repository,
-start a new clean shell and run the script that sets up the environment
+start a new clean bash shell and run the script that sets up the environment
variables.
- source ./scripts/setenv-mingw-xbuild.sh
+ source ./scripts/setenv-mingw-xbuild.sh 32
Then run the script to download & compile all the prerequisite libraries above:
- ./scripts/mingw-x-build-dependencies.sh
+ ./scripts/mingw-x-build-dependencies.sh 32
Note that this process can take several hours, as it uses the
http://mxe.cc system to cross-build many libraries. After it is
@@ -208,7 +208,9 @@ If you wish you can only build the openscad.exe binary:
cd mingw32
qmake .. CONFIG+=mingw-cross-env
make
-
+
+For a 64-bit Windows cross-build, replace 32 with 64 in the above instructions.
+
### Compilation
First, run 'qmake' from Qt4 to generate a Makefile. On some systems you need to
diff --git a/scripts/builder.sh b/scripts/builder.sh
index 984a651..9850bcc 100755
--- a/scripts/builder.sh
+++ b/scripts/builder.sh
@@ -45,7 +45,7 @@ get_source_code()
git clone http://github.com/openscad/openscad.git
cd openscad
git submodule update --init # MCAD
- git checkout issue341
+ #git checkout branch ##debugging
}
build_win32()
@@ -104,8 +104,8 @@ upload_win32()
SUMMARY1="Windows x86-32 Snapshot Zipfile"
SUMMARY2="Windows x86-32 Snapshot Installer"
BASEDIR=./mingw32/
- WIN32_PACKAGEFILE1=OpenSCAD-$DATECODE-x86-32.zip
- WIN32_PACKAGEFILE2=OpenSCAD-$DATECODE-x86-32-Installer.exe
+ WIN32_PACKAGEFILE1=OpenSCAD-$DATECODE-x86-32-Installer.exe
+ WIN32_PACKAGEFILE2=OpenSCAD-$DATECODE-x86-32.zip
upload_win_generic "$SUMMARY1" $USERNAME $BASEDIR/$WIN32_PACKAGEFILE1
upload_win_generic "$SUMMARY2" $USERNAME $BASEDIR/$WIN32_PACKAGEFILE2
export WIN32_PACKAGEFILE1
@@ -123,8 +123,8 @@ upload_win64()
SUMMARY1="Windows x86-64 Snapshot Zipfile"
SUMMARY2="Windows x86-64 Snapshot Installer"
BASEDIR=./mingw64/
- WIN64_PACKAGEFILE1=OpenSCAD-$DATECODE-x86-64.zip
- WIN64_PACKAGEFILE2=OpenSCAD-$DATECODE-x86-64-Installer.exe
+ WIN64_PACKAGEFILE1=OpenSCAD-$DATECODE-x86-64-Installer.exe
+ WIN64_PACKAGEFILE2=OpenSCAD-$DATECODE-x86-64.zip
upload_win_generic "$SUMMARY1" $USERNAME $BASEDIR/$WIN64_PACKAGEFILE1
upload_win_generic "$SUMMARY2" $USERNAME $BASEDIR/$WIN64_PACKAGEFILE2
export WIN64_PACKAGEFILE1
@@ -192,7 +192,7 @@ update_win_www_download_links()
PAGER=cat git diff
if [ ! $DRYRUN ]; then
git commit -a -m 'builder.sh - updated snapshot links'
- git push origin
+ git push origin master
else
echo dry run, not updating www links
fi
--
cgit v0.10.1
From 5a647f963a2dbe2344fe64d98ea5bd42f8f3e806 Mon Sep 17 00:00:00 2001
From: Don Bright
Date: Sat, 18 May 2013 16:04:59 -0500
Subject: bold a single about box line
diff --git a/src/AboutDialog.html b/src/AboutDialog.html
index 2ec691d..005f61f 100644
--- a/src/AboutDialog.html
+++ b/src/AboutDialog.html
@@ -67,7 +67,7 @@ Please visit this link for a copy of the license: Marius Kintel
+OpenSCAD Maintainer: Marius Kintel
--
cgit v0.10.1
From fab07bafdaacf931314673e396111a9670dccc0e Mon Sep 17 00:00:00 2001
From: Marius Kintel
Date: Tue, 21 May 2013 19:21:00 -0400
Subject: Added recursion example. Fixes #346
diff --git a/examples/example024.scad b/examples/example024.scad
new file mode 100644
index 0000000..1502ec7
--- /dev/null
+++ b/examples/example024.scad
@@ -0,0 +1,32 @@
+// Menger Sponge
+// By Nathan Hellweg, Emmett Lalish and Marius Kintel May 13, 2013
+// CC-BY-SA license
+
+// Size of edge of sponge
+D=100;
+// Fractal depth (number of iterations)
+n=3;
+
+module menger() {
+ difference() {
+ cube(D, center=true);
+ for (v=[[0,0,0], [0,0,90], [0,90,0]])
+ rotate(v) menger_negative(side=D, maxside=D, level=n);
+ }
+}
+
+module menger_negative(side=1, maxside=1, level=1) {
+ l=side/3;
+ cube([maxside*1.1, l, l], center=true);
+ if (level > 1) {
+ for (i=[-1:1], j=[-1:1])
+ if (i || j)
+ translate([0, i*l, j*l])
+ menger_negative(side=l, maxside=maxside, level=level-1);
+ }
+}
+
+difference() {
+ rotate([45, atan(1/sqrt(2)), 0]) menger();
+ translate([0,0,-D]) cube(2*D, center=true);
+}
--
cgit v0.10.1
From 71ab237aada8db602045063f0f1c6082ef06972a Mon Sep 17 00:00:00 2001
From: Marius Kintel
Date: Tue, 21 May 2013 21:26:51 -0400
Subject: Added tests for linear extrude with scale. Should mostly fix #273
diff --git a/testdata/scad/features/linear_extrude-scale-tests.scad b/testdata/scad/features/linear_extrude-scale-tests.scad
deleted file mode 100644
index 9a82c9d..0000000
--- a/testdata/scad/features/linear_extrude-scale-tests.scad
+++ /dev/null
@@ -1,17 +0,0 @@
-difference() {
- linear_extrude(height=40, scale=[0, 0]) {
- square(10, center=true);
- translate([10,0]) circle(10);
- }
- translate([0,0,35]) sphere(10);
-}
-
-/*
-Test case ideas:
-o off-center starting point
-o Concave polygon
-o Disjoint polygons
-o multi-rotation twist
-o zero scales, zero scales in only one axis (for the above cases)
-o boolean operations on scaled extrusion (including zero scale)
-*/
diff --git a/testdata/scad/features/linear_extrude-scale-zero-tests.scad b/testdata/scad/features/linear_extrude-scale-zero-tests.scad
new file mode 100644
index 0000000..8a85203
--- /dev/null
+++ b/testdata/scad/features/linear_extrude-scale-zero-tests.scad
@@ -0,0 +1,56 @@
+// test cases for linear extrude with scale
+// by TakeItAndRun 2013
+
+// syntax: linear_extrude(height=a, slices=b, twist=c, scale=[x,y])
+
+a=3;
+b=20;
+c=0;
+x=1;
+y=1;
+
+module linear_extrudes_of_different_shapes(a=a,b=b,c=c,x=x,y=y) {
+ translate(00*[4,0,0])
+ // linear_extrude of shape with hole
+ linear_extrude(height=a, slices=b, twist=c, scale=[x,y])
+ difference() {
+ square(2,true); square(1,true);
+ }
+
+ translate(01*[4,0,0])
+ // linear_extrude of disjoint polygons shapes
+ linear_extrude(height=a, slices=b, twist=c, scale=[x,y]) {
+ translate([1,0,0]) square(1,true);
+ translate([-1,0,0]) square(1,true);
+ }
+
+ translate(02*[4,0,0])
+ // linear_extrude with a coplanar face
+ linear_extrude(height=a, slices=b, twist=c, scale=[x,y]) {
+ translate([.5,0,0])square();
+ translate([-.5,0,0])square();
+ }
+
+ translate(03*[4,0,0])
+ // linear_extrude with internal hole and one coplanar edge
+ linear_extrude(height=a, slices=b, twist=c, scale=[x,y])
+ difference() {
+ square(2,true);
+ translate([-0.5,0,0]) square(1,true);
+ }
+}
+
+
+// Test varying parameters
+translate(00*[0,3,0])
+linear_extrudes_of_different_shapes(c=0,x=0,y=y);
+translate(01*[0,3,0])
+linear_extrudes_of_different_shapes(c=0,x=x,y=0);
+translate(02*[0,3,0])
+linear_extrudes_of_different_shapes(c=0,x=0,y=0);
+translate(03*[0,3,0])
+linear_extrudes_of_different_shapes(c=180,x=0,y=y);
+translate(04*[0,3,0])
+linear_extrudes_of_different_shapes(c=180,x=x,y=0);
+translate(05*[0,3,0])
+linear_extrudes_of_different_shapes(c=180,x=0,y=0);
diff --git a/testdata/scad/features/linear_extrude-tests.scad b/testdata/scad/features/linear_extrude-tests.scad
index 67d892f..528eea2 100644
--- a/testdata/scad/features/linear_extrude-tests.scad
+++ b/testdata/scad/features/linear_extrude-tests.scad
@@ -12,4 +12,13 @@ translate([31.5,2.5,0]) linear_extrude(height=10, twist=-45) polygon(points = [[
translate([0,20,0]) linear_extrude(height=20, twist=45, slices=2) square([10,10]);
translate([19,20,0]) linear_extrude(height=20, twist=45, slices=10) square([10,10]);
-translate([-15,0,0]) linear_extrude(5) square([10,10]);
+translate([0,-15,0]) linear_extrude(5) square([10,10]);
+
+// scale given as a scalar
+translate([-25,-10,0]) linear_extrude(height=10, scale=2) square(5, center=true);
+// scale given as a 3-dim vector
+translate([-15,20,0]) linear_extrude(height=20, scale=[4,5,6]) square(10);
+// scale is negative
+translate([-10,5,0]) linear_extrude(height=15, scale=-2) square(10, center=true);
+// scale given as undefined
+translate([-15,-15,0]) linear_extrude(height=10, scale=var_undef) square(10);
diff --git a/tests/regression/cgalpngtest/linear_extrude-scale-zero-tests-expected.png b/tests/regression/cgalpngtest/linear_extrude-scale-zero-tests-expected.png
new file mode 100644
index 0000000..3b1c934
Binary files /dev/null and b/tests/regression/cgalpngtest/linear_extrude-scale-zero-tests-expected.png differ
diff --git a/tests/regression/cgalpngtest/linear_extrude-tests-expected.png b/tests/regression/cgalpngtest/linear_extrude-tests-expected.png
index 7d3ea2c..c85142e 100644
Binary files a/tests/regression/cgalpngtest/linear_extrude-tests-expected.png and b/tests/regression/cgalpngtest/linear_extrude-tests-expected.png differ
diff --git a/tests/regression/dumptest/linear_extrude-scale-zero-tests-expected.txt b/tests/regression/dumptest/linear_extrude-scale-zero-tests-expected.txt
new file mode 100644
index 0000000..950c724
--- /dev/null
+++ b/tests/regression/dumptest/linear_extrude-scale-zero-tests-expected.txt
@@ -0,0 +1,253 @@
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) {
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) {
+ linear_extrude(height = 3, center = false, convexity = 1, twist = 0, slices = 20, scale = [0, 1], $fn = 0, $fa = 12, $fs = 2) {
+ difference() {
+ square(size = [2, 2], center = true);
+ square(size = [1, 1], center = true);
+ }
+ }
+ }
+ multmatrix([[1, 0, 0, 4], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) {
+ linear_extrude(height = 3, center = false, convexity = 1, twist = 0, slices = 20, scale = [0, 1], $fn = 0, $fa = 12, $fs = 2) {
+ multmatrix([[1, 0, 0, 1], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) {
+ square(size = [1, 1], center = true);
+ }
+ multmatrix([[1, 0, 0, -1], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) {
+ square(size = [1, 1], center = true);
+ }
+ }
+ }
+ multmatrix([[1, 0, 0, 8], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) {
+ linear_extrude(height = 3, center = false, convexity = 1, twist = 0, slices = 20, scale = [0, 1], $fn = 0, $fa = 12, $fs = 2) {
+ multmatrix([[1, 0, 0, 0.5], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) {
+ square(size = [1, 1], center = false);
+ }
+ multmatrix([[1, 0, 0, -0.5], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) {
+ square(size = [1, 1], center = false);
+ }
+ }
+ }
+ multmatrix([[1, 0, 0, 12], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) {
+ linear_extrude(height = 3, center = false, convexity = 1, twist = 0, slices = 20, scale = [0, 1], $fn = 0, $fa = 12, $fs = 2) {
+ difference() {
+ square(size = [2, 2], center = true);
+ multmatrix([[1, 0, 0, -0.5], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) {
+ square(size = [1, 1], center = true);
+ }
+ }
+ }
+ }
+ }
+ }
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, 3], [0, 0, 1, 0], [0, 0, 0, 1]]) {
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) {
+ linear_extrude(height = 3, center = false, convexity = 1, twist = 0, slices = 20, scale = [1, 0], $fn = 0, $fa = 12, $fs = 2) {
+ difference() {
+ square(size = [2, 2], center = true);
+ square(size = [1, 1], center = true);
+ }
+ }
+ }
+ multmatrix([[1, 0, 0, 4], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) {
+ linear_extrude(height = 3, center = false, convexity = 1, twist = 0, slices = 20, scale = [1, 0], $fn = 0, $fa = 12, $fs = 2) {
+ multmatrix([[1, 0, 0, 1], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) {
+ square(size = [1, 1], center = true);
+ }
+ multmatrix([[1, 0, 0, -1], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) {
+ square(size = [1, 1], center = true);
+ }
+ }
+ }
+ multmatrix([[1, 0, 0, 8], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) {
+ linear_extrude(height = 3, center = false, convexity = 1, twist = 0, slices = 20, scale = [1, 0], $fn = 0, $fa = 12, $fs = 2) {
+ multmatrix([[1, 0, 0, 0.5], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) {
+ square(size = [1, 1], center = false);
+ }
+ multmatrix([[1, 0, 0, -0.5], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) {
+ square(size = [1, 1], center = false);
+ }
+ }
+ }
+ multmatrix([[1, 0, 0, 12], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) {
+ linear_extrude(height = 3, center = false, convexity = 1, twist = 0, slices = 20, scale = [1, 0], $fn = 0, $fa = 12, $fs = 2) {
+ difference() {
+ square(size = [2, 2], center = true);
+ multmatrix([[1, 0, 0, -0.5], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) {
+ square(size = [1, 1], center = true);
+ }
+ }
+ }
+ }
+ }
+ }
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, 6], [0, 0, 1, 0], [0, 0, 0, 1]]) {
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) {
+ linear_extrude(height = 3, center = false, convexity = 1, twist = 0, slices = 20, scale = [0, 0], $fn = 0, $fa = 12, $fs = 2) {
+ difference() {
+ square(size = [2, 2], center = true);
+ square(size = [1, 1], center = true);
+ }
+ }
+ }
+ multmatrix([[1, 0, 0, 4], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) {
+ linear_extrude(height = 3, center = false, convexity = 1, twist = 0, slices = 20, scale = [0, 0], $fn = 0, $fa = 12, $fs = 2) {
+ multmatrix([[1, 0, 0, 1], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) {
+ square(size = [1, 1], center = true);
+ }
+ multmatrix([[1, 0, 0, -1], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) {
+ square(size = [1, 1], center = true);
+ }
+ }
+ }
+ multmatrix([[1, 0, 0, 8], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) {
+ linear_extrude(height = 3, center = false, convexity = 1, twist = 0, slices = 20, scale = [0, 0], $fn = 0, $fa = 12, $fs = 2) {
+ multmatrix([[1, 0, 0, 0.5], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) {
+ square(size = [1, 1], center = false);
+ }
+ multmatrix([[1, 0, 0, -0.5], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) {
+ square(size = [1, 1], center = false);
+ }
+ }
+ }
+ multmatrix([[1, 0, 0, 12], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) {
+ linear_extrude(height = 3, center = false, convexity = 1, twist = 0, slices = 20, scale = [0, 0], $fn = 0, $fa = 12, $fs = 2) {
+ difference() {
+ square(size = [2, 2], center = true);
+ multmatrix([[1, 0, 0, -0.5], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) {
+ square(size = [1, 1], center = true);
+ }
+ }
+ }
+ }
+ }
+ }
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, 9], [0, 0, 1, 0], [0, 0, 0, 1]]) {
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) {
+ linear_extrude(height = 3, center = false, convexity = 1, twist = 180, slices = 20, scale = [0, 1], $fn = 0, $fa = 12, $fs = 2) {
+ difference() {
+ square(size = [2, 2], center = true);
+ square(size = [1, 1], center = true);
+ }
+ }
+ }
+ multmatrix([[1, 0, 0, 4], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) {
+ linear_extrude(height = 3, center = false, convexity = 1, twist = 180, slices = 20, scale = [0, 1], $fn = 0, $fa = 12, $fs = 2) {
+ multmatrix([[1, 0, 0, 1], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) {
+ square(size = [1, 1], center = true);
+ }
+ multmatrix([[1, 0, 0, -1], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) {
+ square(size = [1, 1], center = true);
+ }
+ }
+ }
+ multmatrix([[1, 0, 0, 8], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) {
+ linear_extrude(height = 3, center = false, convexity = 1, twist = 180, slices = 20, scale = [0, 1], $fn = 0, $fa = 12, $fs = 2) {
+ multmatrix([[1, 0, 0, 0.5], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) {
+ square(size = [1, 1], center = false);
+ }
+ multmatrix([[1, 0, 0, -0.5], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) {
+ square(size = [1, 1], center = false);
+ }
+ }
+ }
+ multmatrix([[1, 0, 0, 12], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) {
+ linear_extrude(height = 3, center = false, convexity = 1, twist = 180, slices = 20, scale = [0, 1], $fn = 0, $fa = 12, $fs = 2) {
+ difference() {
+ square(size = [2, 2], center = true);
+ multmatrix([[1, 0, 0, -0.5], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) {
+ square(size = [1, 1], center = true);
+ }
+ }
+ }
+ }
+ }
+ }
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, 12], [0, 0, 1, 0], [0, 0, 0, 1]]) {
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) {
+ linear_extrude(height = 3, center = false, convexity = 1, twist = 180, slices = 20, scale = [1, 0], $fn = 0, $fa = 12, $fs = 2) {
+ difference() {
+ square(size = [2, 2], center = true);
+ square(size = [1, 1], center = true);
+ }
+ }
+ }
+ multmatrix([[1, 0, 0, 4], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) {
+ linear_extrude(height = 3, center = false, convexity = 1, twist = 180, slices = 20, scale = [1, 0], $fn = 0, $fa = 12, $fs = 2) {
+ multmatrix([[1, 0, 0, 1], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) {
+ square(size = [1, 1], center = true);
+ }
+ multmatrix([[1, 0, 0, -1], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) {
+ square(size = [1, 1], center = true);
+ }
+ }
+ }
+ multmatrix([[1, 0, 0, 8], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) {
+ linear_extrude(height = 3, center = false, convexity = 1, twist = 180, slices = 20, scale = [1, 0], $fn = 0, $fa = 12, $fs = 2) {
+ multmatrix([[1, 0, 0, 0.5], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) {
+ square(size = [1, 1], center = false);
+ }
+ multmatrix([[1, 0, 0, -0.5], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) {
+ square(size = [1, 1], center = false);
+ }
+ }
+ }
+ multmatrix([[1, 0, 0, 12], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) {
+ linear_extrude(height = 3, center = false, convexity = 1, twist = 180, slices = 20, scale = [1, 0], $fn = 0, $fa = 12, $fs = 2) {
+ difference() {
+ square(size = [2, 2], center = true);
+ multmatrix([[1, 0, 0, -0.5], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) {
+ square(size = [1, 1], center = true);
+ }
+ }
+ }
+ }
+ }
+ }
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, 15], [0, 0, 1, 0], [0, 0, 0, 1]]) {
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) {
+ linear_extrude(height = 3, center = false, convexity = 1, twist = 180, slices = 20, scale = [0, 0], $fn = 0, $fa = 12, $fs = 2) {
+ difference() {
+ square(size = [2, 2], center = true);
+ square(size = [1, 1], center = true);
+ }
+ }
+ }
+ multmatrix([[1, 0, 0, 4], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) {
+ linear_extrude(height = 3, center = false, convexity = 1, twist = 180, slices = 20, scale = [0, 0], $fn = 0, $fa = 12, $fs = 2) {
+ multmatrix([[1, 0, 0, 1], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) {
+ square(size = [1, 1], center = true);
+ }
+ multmatrix([[1, 0, 0, -1], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) {
+ square(size = [1, 1], center = true);
+ }
+ }
+ }
+ multmatrix([[1, 0, 0, 8], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) {
+ linear_extrude(height = 3, center = false, convexity = 1, twist = 180, slices = 20, scale = [0, 0], $fn = 0, $fa = 12, $fs = 2) {
+ multmatrix([[1, 0, 0, 0.5], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) {
+ square(size = [1, 1], center = false);
+ }
+ multmatrix([[1, 0, 0, -0.5], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) {
+ square(size = [1, 1], center = false);
+ }
+ }
+ }
+ multmatrix([[1, 0, 0, 12], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) {
+ linear_extrude(height = 3, center = false, convexity = 1, twist = 180, slices = 20, scale = [0, 0], $fn = 0, $fa = 12, $fs = 2) {
+ difference() {
+ square(size = [2, 2], center = true);
+ multmatrix([[1, 0, 0, -0.5], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) {
+ square(size = [1, 1], center = true);
+ }
+ }
+ }
+ }
+ }
+ }
+
diff --git a/tests/regression/dumptest/linear_extrude-tests-expected.txt b/tests/regression/dumptest/linear_extrude-tests-expected.txt
index c031ed8..c867388 100644
--- a/tests/regression/dumptest/linear_extrude-tests-expected.txt
+++ b/tests/regression/dumptest/linear_extrude-tests-expected.txt
@@ -29,9 +29,29 @@
square(size = [10, 10], center = false);
}
}
- multmatrix([[1, 0, 0, -15], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, -15], [0, 0, 1, 0], [0, 0, 0, 1]]) {
linear_extrude(height = 5, center = false, convexity = 1, scale = [1, 1], $fn = 0, $fa = 12, $fs = 2) {
square(size = [10, 10], center = false);
}
}
+ multmatrix([[1, 0, 0, -25], [0, 1, 0, -10], [0, 0, 1, 0], [0, 0, 0, 1]]) {
+ linear_extrude(height = 10, center = false, convexity = 1, scale = [2, 2], $fn = 0, $fa = 12, $fs = 2) {
+ square(size = [5, 5], center = true);
+ }
+ }
+ multmatrix([[1, 0, 0, -15], [0, 1, 0, 20], [0, 0, 1, 0], [0, 0, 0, 1]]) {
+ linear_extrude(height = 20, center = false, convexity = 1, scale = [1, 1], $fn = 0, $fa = 12, $fs = 2) {
+ square(size = [10, 10], center = false);
+ }
+ }
+ multmatrix([[1, 0, 0, -10], [0, 1, 0, 5], [0, 0, 1, 0], [0, 0, 0, 1]]) {
+ linear_extrude(height = 15, center = false, convexity = 1, scale = [0, 0], $fn = 0, $fa = 12, $fs = 2) {
+ square(size = [10, 10], center = true);
+ }
+ }
+ multmatrix([[1, 0, 0, -15], [0, 1, 0, -15], [0, 0, 1, 0], [0, 0, 0, 1]]) {
+ linear_extrude(height = 10, center = false, convexity = 1, scale = [1, 1], $fn = 0, $fa = 12, $fs = 2) {
+ square(size = [10, 10], center = false);
+ }
+ }
diff --git a/tests/regression/opencsgtest/linear_extrude-scale-zero-tests-expected.png b/tests/regression/opencsgtest/linear_extrude-scale-zero-tests-expected.png
new file mode 100644
index 0000000..22e94ad
Binary files /dev/null and b/tests/regression/opencsgtest/linear_extrude-scale-zero-tests-expected.png differ
diff --git a/tests/regression/opencsgtest/linear_extrude-tests-expected.png b/tests/regression/opencsgtest/linear_extrude-tests-expected.png
index b929d09..cbbdc11 100644
Binary files a/tests/regression/opencsgtest/linear_extrude-tests-expected.png and b/tests/regression/opencsgtest/linear_extrude-tests-expected.png differ
diff --git a/tests/regression/throwntogethertest/linear_extrude-scale-zero-tests-expected.png b/tests/regression/throwntogethertest/linear_extrude-scale-zero-tests-expected.png
new file mode 100644
index 0000000..22e94ad
Binary files /dev/null and b/tests/regression/throwntogethertest/linear_extrude-scale-zero-tests-expected.png differ
diff --git a/tests/regression/throwntogethertest/linear_extrude-tests-expected.png b/tests/regression/throwntogethertest/linear_extrude-tests-expected.png
index fddeeb8..cbbdc11 100644
Binary files a/tests/regression/throwntogethertest/linear_extrude-tests-expected.png and b/tests/regression/throwntogethertest/linear_extrude-tests-expected.png differ
--
cgit v0.10.1
From 1c480a554ad4094bfb2337d915be33393a679e13 Mon Sep 17 00:00:00 2001
From: don bright
Date: Thu, 23 May 2013 19:16:04 -0700
Subject: make dependency build work for OpenCSG without qmake
diff --git a/scripts/uni-build-dependencies.sh b/scripts/uni-build-dependencies.sh
index bfc830f..67df0b7 100755
--- a/scripts/uni-build-dependencies.sh
+++ b/scripts/uni-build-dependencies.sh
@@ -408,11 +408,25 @@ build_opencsg()
OPENCSG_QMAKE=qmake-qt4
elif [ "`command -v qmake4`" ]; then
OPENCSG_QMAKE=qmake4
- else
+ elif [ "`command -v qmake`" ]; then
OPENCSG_QMAKE=qmake
+ else
+ echo qmake not found... using standard OpenCSG makefiles
+ OPENCSG_QMAKE=make
+ cp Makefile Makefile.bak
+ cp src/Makefile src/Makefile.bak
+
+ cat Makefile.bak | sed s/example// |sed s/glew// > Makefile
+ cat src/Makefile.bak | sed s@^INCPATH.*@INCPATH\ =\ -I$BASEDIR/include\ -I../include\ -I..\ -I.@ > src/Makefile
+ cp src/Makefile src/Makefile.bak2
+ cat src/Makefile.bak2 | sed s@^LIBS.*@LIBS\ =\ -L$BASEDIR/lib\ -L/usr/X11R6/lib\ -lGLU\ -lGL@ > src/Makefile
+ tmp=$version
+ build_glu 9.0.0 # todo - autodetect the need for glu
+ version=$tmp
fi
cd $BASEDIR/src/OpenCSG-$version/src
+ OPENCSG_QMAKE=make
$OPENCSG_QMAKE
cd $BASEDIR/src/OpenCSG-$version
@@ -562,7 +576,7 @@ fi
build_eigen 3.1.1
build_gmp 5.0.5
build_mpfr 3.1.1
-build_boost 1.49.0
+build_boost 1.53.0
# NB! For CGAL, also update the actual download URL in the function
build_cgal 4.1
build_glew 1.9.0
--
cgit v0.10.1
From f95941bbba15c016e8ceba55accd79f98c171aa9 Mon Sep 17 00:00:00 2001
From: don bright
Date: Thu, 23 May 2013 19:31:49 -0700
Subject: update cmake to work with custom built GLU in $BASEDIR
diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt
index 9821d70..39dc341 100644
--- a/tests/CMakeLists.txt
+++ b/tests/CMakeLists.txt
@@ -252,6 +252,18 @@ endif()
# OpenGL
find_package(OpenGL REQUIRED)
+if (NOT OPENGL_GLU_FOUND)
+ message(STATUS "GLU not found in system paths...searching $ENV{OPENSCAD_LIBRARIES} ")
+ find_library(OPENGL_glu_LIBRARY GLU HINTS $ENV{OPENSCAD_LIBRARIES}/lib)
+ if (NOT OPENGL_glu_LIBRARY)
+ message(FATAL "GLU library not found")
+ endif()
+ set(OPENGL_LIBRARIES ${OPENGL_glu_LIBRARY} ${OPENGL_LIBRARIES})
+ message(STATUS "OpenGL LIBRARIES: ")
+ foreach(GLLIB ${OPENGL_LIBRARIES})
+ message(STATUS " " ${GLLIB})
+ endforeach()
+endif()
# OpenCSG
if (NOT $ENV{OPENCSGDIR} STREQUAL "")
--
cgit v0.10.1
From 85a6cf92feebd75f817e68bbfd53807d3d2fd1fd Mon Sep 17 00:00:00 2001
From: don bright
Date: Thu, 23 May 2013 19:35:44 -0700
Subject: remove debugging assignment
diff --git a/scripts/uni-build-dependencies.sh b/scripts/uni-build-dependencies.sh
index 67df0b7..60dbb74 100755
--- a/scripts/uni-build-dependencies.sh
+++ b/scripts/uni-build-dependencies.sh
@@ -426,7 +426,6 @@ build_opencsg()
fi
cd $BASEDIR/src/OpenCSG-$version/src
- OPENCSG_QMAKE=make
$OPENCSG_QMAKE
cd $BASEDIR/src/OpenCSG-$version
--
cgit v0.10.1
From 27ce04ef90533ef2f6ad80c3c8b6748a23cdc624 Mon Sep 17 00:00:00 2001
From: Marius Kintel
Date: Fri, 24 May 2013 15:16:58 -0400
Subject: Related to #372. Fixes crash on systems where the stack size for new
threads is to small
diff --git a/src/cgalworker.cc b/src/cgalworker.cc
index 96fead9..f011262 100644
--- a/src/cgalworker.cc
+++ b/src/cgalworker.cc
@@ -9,6 +9,7 @@
CGALWorker::CGALWorker()
{
this->thread = new QThread();
+ if (this->thread->stackSize() < 1024*1024) this->thread->setStackSize(1024*1024);
connect(this->thread, SIGNAL(started()), this, SLOT(work()));
moveToThread(this->thread);
}
--
cgit v0.10.1
From e1766faeeda4218a453121ec81f8007cc1a1734d Mon Sep 17 00:00:00 2001
From: Marius Kintel
Date: Fri, 24 May 2013 18:40:09 -0400
Subject: Initial implementation of improved operator handling. Provides the
bulk of work for #304
diff --git a/src/CSGTermEvaluator.cc b/src/CSGTermEvaluator.cc
index 4624d4c..9fc3147 100644
--- a/src/CSGTermEvaluator.cc
+++ b/src/CSGTermEvaluator.cc
@@ -57,6 +57,7 @@ void CSGTermEvaluator::applyToChildren(const AbstractNode &node, CSGTermEvaluato
}
}
if (t1 && node.modinst->isHighlight()) {
+ t1->flag = CSGTerm::FLAG_HIGHLIGHT;
this->highlights.push_back(t1);
}
if (t1 && node.modinst->isBackground()) {
@@ -95,6 +96,7 @@ static shared_ptr evaluate_csg_term_from_ps(const State &state,
stream << node.name() << node.index();
shared_ptr t(new CSGTerm(ps, state.matrix(), state.color(), stream.str()));
if (modinst->isHighlight()) {
+ t->flag = CSGTerm::FLAG_HIGHLIGHT;
highlights.push_back(t);
}
if (modinst->isBackground()) {
diff --git a/src/CsgInfo.h b/src/CsgInfo.h
index fe953b5..774325b 100644
--- a/src/CsgInfo.h
+++ b/src/CsgInfo.h
@@ -57,7 +57,7 @@ public:
if (this->root_norm_term) {
this->root_chain = new CSGChain();
this->root_chain->import(this->root_norm_term);
- PRINTB("Normalized CSG tree has %d elements", int(this->root_chain->polysets.size()));
+ PRINTB("Normalized CSG tree has %d elements", int(this->root_chain->objects.size()));
}
else {
this->root_chain = NULL;
diff --git a/src/OpenCSGRenderer.cc b/src/OpenCSGRenderer.cc
index add90d3..31f27db 100644
--- a/src/OpenCSGRenderer.cc
+++ b/src/OpenCSGRenderer.cc
@@ -77,35 +77,45 @@ void OpenCSGRenderer::renderCSGChain(CSGChain *chain, GLint *shaderinfo,
std::vector primitives;
size_t j = 0;
for (size_t i = 0;; i++) {
- bool last = i == chain->polysets.size();
- if (last || chain->types[i] == CSGTerm::TYPE_UNION) {
+ const CSGChainObject &i_obj = chain->objects[i];
+ bool last = i == chain->objects.size();
+ if (last || i_obj.type == CSGTerm::TYPE_UNION) {
if (j+1 != i) {
OpenCSG::render(primitives);
glDepthFunc(GL_EQUAL);
}
if (shaderinfo) glUseProgram(shaderinfo[0]);
for (; j < i; j++) {
- const Transform3d &m = chain->matrices[j];
- const Color4f &c = chain->colors[j];
+ const CSGChainObject &j_obj = chain->objects[j];
+ const Color4f &c = j_obj.color;
glPushMatrix();
- glMultMatrixd(m.data());
- PolySet::csgmode_e csgmode = chain->types[j] == CSGTerm::TYPE_DIFFERENCE ? PolySet::CSGMODE_DIFFERENCE : PolySet::CSGMODE_NORMAL;
- if (highlight) {
- setColor(COLORMODE_HIGHLIGHT, shaderinfo);
- csgmode = PolySet::csgmode_e(csgmode + 20);
- }
- else if (background) {
- setColor(COLORMODE_BACKGROUND, c.data(), shaderinfo);
+ glMultMatrixd(j_obj.matrix.data());
+ PolySet::csgmode_e csgmode = j_obj.type == CSGTerm::TYPE_DIFFERENCE ? PolySet::CSGMODE_DIFFERENCE : PolySet::CSGMODE_NORMAL;
+ ColorMode colormode = COLORMODE_NONE;
+ if (background) {
+ colormode = COLORMODE_BACKGROUND;
csgmode = PolySet::csgmode_e(csgmode + 10);
- } else if (c[0] >= 0 || c[1] >= 0 || c[2] >= 0 || c[3] >= 0) {
- // User-defined color or alpha from source
- setColor(c.data(), shaderinfo);
- } else if (chain->types[j] == CSGTerm::TYPE_DIFFERENCE) {
- setColor(COLORMODE_CUTOUT, shaderinfo);
+ } else if (j_obj.type == CSGTerm::TYPE_DIFFERENCE) {
+ if (j_obj.flag & CSGTerm::FLAG_HIGHLIGHT) {
+ colormode = COLORMODE_HIGHLIGHT;
+ csgmode = PolySet::csgmode_e(csgmode + 20);
+ }
+ else {
+ colormode = COLORMODE_CUTOUT;
+ }
} else {
- setColor(COLORMODE_MATERIAL, shaderinfo);
+ if (j_obj.flag & CSGTerm::FLAG_HIGHLIGHT) {
+ colormode = COLORMODE_HIGHLIGHT;
+ csgmode = PolySet::csgmode_e(csgmode + 20);
+ }
+ else {
+ colormode = COLORMODE_MATERIAL;
+ }
}
- chain->polysets[j]->render_surface(csgmode, m, shaderinfo);
+
+ setColor(colormode, c.data(), shaderinfo);
+
+ j_obj.polyset->render_surface(csgmode, j_obj.matrix, shaderinfo);
glPopMatrix();
}
if (shaderinfo) glUseProgram(0);
@@ -118,11 +128,11 @@ void OpenCSGRenderer::renderCSGChain(CSGChain *chain, GLint *shaderinfo,
if (last) break;
- OpenCSGPrim *prim = new OpenCSGPrim(chain->types[i] == CSGTerm::TYPE_DIFFERENCE ?
- OpenCSG::Subtraction : OpenCSG::Intersection, chain->polysets[i]->convexity);
- prim->ps = chain->polysets[i];
- prim->m = chain->matrices[i];
- prim->csgmode = chain->types[i] == CSGTerm::TYPE_DIFFERENCE ? PolySet::CSGMODE_DIFFERENCE : PolySet::CSGMODE_NORMAL;
+ OpenCSGPrim *prim = new OpenCSGPrim(i_obj.type == CSGTerm::TYPE_DIFFERENCE ?
+ OpenCSG::Subtraction : OpenCSG::Intersection, i_obj.polyset->convexity);
+ prim->ps = i_obj.polyset;
+ prim->m = i_obj.matrix;
+ prim->csgmode = i_obj.type == CSGTerm::TYPE_DIFFERENCE ? PolySet::CSGMODE_DIFFERENCE : PolySet::CSGMODE_NORMAL;
if (highlight) prim->csgmode = PolySet::csgmode_e(prim->csgmode + 20);
else if (background) prim->csgmode = PolySet::csgmode_e(prim->csgmode + 10);
primitives.push_back(prim);
diff --git a/src/ThrownTogetherRenderer.cc b/src/ThrownTogetherRenderer.cc
index 146d2e1..6151145 100644
--- a/src/ThrownTogetherRenderer.cc
+++ b/src/ThrownTogetherRenderer.cc
@@ -31,6 +31,7 @@
#include "system-gl.h"
#include
+#include
ThrownTogetherRenderer::ThrownTogetherRenderer(CSGChain *root_chain,
CSGChain *highlights_chain,
@@ -62,56 +63,56 @@ void ThrownTogetherRenderer::renderCSGChain(CSGChain *chain, bool highlight,
bool fberror) const
{
glDepthFunc(GL_LEQUAL);
- boost::unordered_map,int> polySetVisitMark;
- for (size_t i = 0; i < chain->polysets.size(); i++) {
- if (polySetVisitMark[std::make_pair(chain->polysets[i].get(), &chain->matrices[i])]++ > 0)
+ boost::unordered_map,int> polySetVisitMark;
+ BOOST_FOREACH(const CSGChainObject &obj, chain->objects) {
+ if (polySetVisitMark[std::make_pair(obj.polyset.get(), &obj.matrix)]++ > 0)
continue;
- const Transform3d &m = chain->matrices[i];
- const Color4f &c = chain->colors[i];
+ const Transform3d &m = obj.matrix;
+ const Color4f &c = obj.color;
glPushMatrix();
glMultMatrixd(m.data());
- PolySet::csgmode_e csgmode = chain->types[i] == CSGTerm::TYPE_DIFFERENCE ? PolySet::CSGMODE_DIFFERENCE : PolySet::CSGMODE_NORMAL;
+ PolySet::csgmode_e csgmode = obj.type == CSGTerm::TYPE_DIFFERENCE ? PolySet::CSGMODE_DIFFERENCE : PolySet::CSGMODE_NORMAL;
if (highlight) {
csgmode = PolySet::csgmode_e(csgmode + 20);
setColor(COLORMODE_HIGHLIGHT);
- chain->polysets[i]->render_surface(csgmode, m);
+ obj.polyset->render_surface(csgmode, m);
if (showedges) {
setColor(COLORMODE_HIGHLIGHT_EDGES);
- chain->polysets[i]->render_edges(csgmode);
+ obj.polyset->render_edges(csgmode);
}
} else if (background) {
csgmode = PolySet::csgmode_e(csgmode + 10);
setColor(COLORMODE_BACKGROUND);
- chain->polysets[i]->render_surface(csgmode, m);
+ obj.polyset->render_surface(csgmode, m);
if (showedges) {
setColor(COLORMODE_BACKGROUND_EDGES);
- chain->polysets[i]->render_edges(csgmode);
+ obj.polyset->render_edges(csgmode);
}
} else if (fberror) {
if (highlight) csgmode = PolySet::csgmode_e(csgmode + 20);
else if (background) csgmode = PolySet::csgmode_e(csgmode + 10);
else csgmode = PolySet::csgmode_e(csgmode);
- chain->polysets[i]->render_surface(csgmode, m);
+ obj.polyset->render_surface(csgmode, m);
} else if (c[0] >= 0 || c[1] >= 0 || c[2] >= 0 || c[3] >= 0) {
setColor(c.data());
- chain->polysets[i]->render_surface(csgmode, m);
+ obj.polyset->render_surface(csgmode, m);
if (showedges) {
glColor4f((c[0]+1)/2, (c[1]+1)/2, (c[2]+1)/2, 1.0);
- chain->polysets[i]->render_edges(csgmode);
+ obj.polyset->render_edges(csgmode);
}
- } else if (chain->types[i] == CSGTerm::TYPE_DIFFERENCE) {
+ } else if (obj.type == CSGTerm::TYPE_DIFFERENCE) {
setColor(COLORMODE_CUTOUT);
- chain->polysets[i]->render_surface(csgmode, m);
+ obj.polyset->render_surface(csgmode, m);
if (showedges) {
setColor(COLORMODE_CUTOUT_EDGES);
- chain->polysets[i]->render_edges(csgmode);
+ obj.polyset->render_edges(csgmode);
}
} else {
setColor(COLORMODE_MATERIAL);
- chain->polysets[i]->render_surface(csgmode, m);
+ obj.polyset->render_surface(csgmode, m);
if (showedges) {
setColor(COLORMODE_MATERIAL_EDGES);
- chain->polysets[i]->render_edges(csgmode);
+ obj.polyset->render_edges(csgmode);
}
}
glPopMatrix();
diff --git a/src/csgterm.cc b/src/csgterm.cc
index aed97b2..7852715 100644
--- a/src/csgterm.cc
+++ b/src/csgterm.cc
@@ -28,6 +28,7 @@
#include "polyset.h"
#include "linalg.h"
#include
+#include
/*!
\class CSGTerm
@@ -103,19 +104,19 @@ shared_ptr CSGTerm::createCSGTerm(type_e type, CSGTerm *left, CSGTerm *
}
CSGTerm::CSGTerm(const shared_ptr &polyset, const Transform3d &matrix, const Color4f &color, const std::string &label)
- : type(TYPE_PRIMITIVE), polyset(polyset), label(label), m(matrix), color(color)
+ : type(TYPE_PRIMITIVE), polyset(polyset), label(label), flag(CSGTerm::FLAG_NONE), m(matrix), color(color)
{
initBoundingBox();
}
CSGTerm::CSGTerm(type_e type, shared_ptr left, shared_ptr right)
- : type(type), left(left), right(right), m(Transform3d::Identity())
+ : type(type), left(left), right(right), flag(CSGTerm::FLAG_NONE), m(Transform3d::Identity())
{
initBoundingBox();
}
CSGTerm::CSGTerm(type_e type, CSGTerm *left, CSGTerm *right)
- : type(type), left(left), right(right), m(Transform3d::Identity())
+ : type(type), left(left), right(right), flag(CSGTerm::FLAG_NONE), m(Transform3d::Identity())
{
initBoundingBox();
}
@@ -181,26 +182,14 @@ std::string CSGTerm::dump()
return dump.str();
}
-CSGChain::CSGChain()
-{
-}
-
-void CSGChain::add(const shared_ptr &polyset, const Transform3d &m, const Color4f &color, CSGTerm::type_e type, std::string label)
-{
- polysets.push_back(polyset);
- matrices.push_back(m);
- colors.push_back(color);
- types.push_back(type);
- labels.push_back(label);
-}
-
-void CSGChain::import(shared_ptr term, CSGTerm::type_e type)
+void CSGChain::import(shared_ptr term, CSGTerm::type_e type, CSGTerm::Flag flag)
{
+ CSGTerm::Flag newflag = (CSGTerm::Flag)(term->flag | flag);
if (term->type == CSGTerm::TYPE_PRIMITIVE) {
- add(term->polyset, term->m, term->color, type, term->label);
+ this->objects.push_back(CSGChainObject(term->polyset, term->m, term->color, type, term->label, newflag));
} else {
- import(term->left, type);
- import(term->right, term->type);
+ import(term->left, type, newflag);
+ import(term->right, term->type, newflag);
}
}
@@ -208,21 +197,20 @@ std::string CSGChain::dump(bool full)
{
std::stringstream dump;
- for (size_t i = 0; i < types.size(); i++)
- {
- if (types[i] == CSGTerm::TYPE_UNION) {
- if (i != 0) dump << "\n";
+ BOOST_FOREACH(const CSGChainObject &obj, this->objects) {
+ if (obj.type == CSGTerm::TYPE_UNION) {
+ if (&obj != &this->objects.front()) dump << "\n";
dump << "+";
}
- else if (types[i] == CSGTerm::TYPE_DIFFERENCE)
+ else if (obj.type == CSGTerm::TYPE_DIFFERENCE)
dump << " -";
- else if (types[i] == CSGTerm::TYPE_INTERSECTION)
+ else if (obj.type == CSGTerm::TYPE_INTERSECTION)
dump << " *";
- dump << labels[i];
+ dump << obj.label;
if (full) {
- dump << " polyset: \n" << polysets[i]->dump() << "\n";
- dump << " matrix: \n" << matrices[i].matrix() << "\n";
- dump << " color: \n" << colors[i] << "\n";
+ dump << " polyset: \n" << obj.polyset->dump() << "\n";
+ dump << " matrix: \n" << obj.matrix.matrix() << "\n";
+ dump << " color: \n" << obj.color << "\n";
}
}
dump << "\n";
@@ -232,11 +220,11 @@ std::string CSGChain::dump(bool full)
BoundingBox CSGChain::getBoundingBox() const
{
BoundingBox bbox;
- for (size_t i=0;igetBoundingBox();
+ BOOST_FOREACH(const CSGChainObject &obj, this->objects) {
+ if (obj.type != CSGTerm::TYPE_DIFFERENCE) {
+ BoundingBox psbox = obj.polyset->getBoundingBox();
if (!psbox.isNull()) {
- bbox.extend(matrices[i] * psbox);
+ bbox.extend(obj.matrix * psbox);
}
}
}
diff --git a/src/csgterm.h b/src/csgterm.h
index 566ebc3..94878e5 100644
--- a/src/csgterm.h
+++ b/src/csgterm.h
@@ -18,6 +18,12 @@ public:
TYPE_DIFFERENCE
};
+ enum Flag {
+ FLAG_NONE = 0x00,
+ FLAG_BACKGROUND = 0x01,
+ FLAG_HIGHLIGHT = 0x03
+ };
+
static shared_ptr createCSGTerm(type_e type, shared_ptr left, shared_ptr right);
static shared_ptr createCSGTerm(type_e type, CSGTerm *left, CSGTerm *right);
@@ -27,6 +33,7 @@ public:
shared_ptr left;
shared_ptr right;
BoundingBox bbox;
+ Flag flag;
CSGTerm(const shared_ptr &polyset, const Transform3d &matrix, const Color4f &color, const std::string &label);
~CSGTerm();
@@ -46,19 +53,34 @@ private:
friend class CSGChain;
};
+class CSGChainObject
+{
+public:
+ CSGChainObject(shared_ptr polyset,
+ const Transform3d &matrix,
+ const Color4f &color,
+ CSGTerm::type_e type,
+ const std::string &label,
+ CSGTerm::Flag flag = CSGTerm::FLAG_NONE)
+ : polyset(polyset), matrix(matrix), color(color), type(type), label(label), flag(flag) {}
+
+ shared_ptr polyset;
+ Transform3d matrix;
+ Color4f color;
+ CSGTerm::type_e type;
+ std::string label;
+ CSGTerm::Flag flag;
+};
+
class CSGChain
{
public:
- std::vector > polysets;
- std::vector matrices;
- std::vector colors;
- std::vector types;
- std::vector labels;
+ std::vector objects;
- CSGChain();
+ CSGChain() {};
- void add(const shared_ptr &polyset, const Transform3d &m, const Color4f &color, CSGTerm::type_e type, std::string label);
- void import(shared_ptr term, CSGTerm::type_e type = CSGTerm::TYPE_UNION);
+ void import(shared_ptr term, CSGTerm::type_e type = CSGTerm::TYPE_UNION,
+ CSGTerm::Flag flag = CSGTerm::FLAG_NONE);
std::string dump(bool full = false);
BoundingBox getBoundingBox() const;
diff --git a/src/mainwin.cc b/src/mainwin.cc
index da3501d..1ac96fa 100644
--- a/src/mainwin.cc
+++ b/src/mainwin.cc
@@ -771,14 +771,14 @@ void MainWindow::compileCSG(bool procevents)
}
if (this->root_chain &&
- (this->root_chain->polysets.size() >
+ (this->root_chain->objects.size() >
Preferences::inst()->getValue("advanced/openCSGLimit").toUInt())) {
- PRINTB("WARNING: Normalized tree has %d elements!", this->root_chain->polysets.size());
+ PRINTB("WARNING: Normalized tree has %d elements!", this->root_chain->objects.size());
PRINT("WARNING: OpenCSG rendering has been disabled.");
}
else {
PRINTB("Normalized CSG tree has %d elements",
- (this->root_chain ? this->root_chain->polysets.size() : 0));
+ (this->root_chain ? this->root_chain->objects.size() : 0));
this->opencsgRenderer = new OpenCSGRenderer(this->root_chain,
this->highlights_chain,
this->background_chain,
diff --git a/src/renderer.cc b/src/renderer.cc
index 77dcde9..7c4f8d7 100644
--- a/src/renderer.cc
+++ b/src/renderer.cc
@@ -1,49 +1,11 @@
#include "renderer.h"
#include "rendersettings.h"
-#include "linalg.h"
-void Renderer::setColor(const float color[4], GLint *shaderinfo) const
+bool Renderer::getColor(Renderer::ColorMode colormode, Color4f &col) const
{
- Color4f col = RenderSettings::inst()->color(RenderSettings::OPENCSG_FACE_FRONT_COLOR);
- float c[4] = {color[0], color[1], color[2], color[3]};
- if (c[0] < 0) c[0] = col[0];
- if (c[1] < 0) c[1] = col[1];
- if (c[2] < 0) c[2] = col[2];
- if (c[3] < 0) c[3] = col[3];
- glColor4fv(c);
- if (shaderinfo) {
- glUniform4f(shaderinfo[1], c[0], c[1], c[2], c[3]);
- glUniform4f(shaderinfo[2], (c[0]+1)/2, (c[1]+1)/2, (c[2]+1)/2, 1.0);
- }
-}
-
-void Renderer::setColor(ColorMode colormode, const float color[4], GLint *shaderinfo) const
-{
- if (colormode == COLORMODE_BACKGROUND &&
- color[0] >= 0 || color[1] >= 0 || color[2] >= 0 || color[3] >= 0) {
-
- Color4f col;
- col.setRgb(180, 180, 180, 255);
- float c[4] = {color[0], color[1], color[2], color[3]};
- if (c[0] < 0) c[0] = col[0];
- if (c[1] < 0) c[1] = col[1];
- if (c[2] < 0) c[2] = col[2];
- if (c[3] < 0) c[3] = col[3];
-
- c[3] /= 2; // Background objects are half-transparent
- setColor(c, shaderinfo);
- }
- else {
- setColor(colormode, shaderinfo);
- }
-}
-
-void Renderer::setColor(ColorMode colormode, GLint *shaderinfo) const
-{
- Color4f col;
switch (colormode) {
case COLORMODE_NONE:
- return;
+ return false;
break;
case COLORMODE_MATERIAL:
col = RenderSettings::inst()->color(RenderSettings::OPENCSG_FACE_FRONT_COLOR);
@@ -52,7 +14,7 @@ void Renderer::setColor(ColorMode colormode, GLint *shaderinfo) const
col = RenderSettings::inst()->color(RenderSettings::OPENCSG_FACE_BACK_COLOR);
break;
case COLORMODE_HIGHLIGHT:
- col.setRgb(255, 157, 81, 128);
+ col.setRgb(255, 81, 81, 128);
break;
case COLORMODE_BACKGROUND:
col.setRgb(180, 180, 180, 128);
@@ -70,19 +32,51 @@ void Renderer::setColor(ColorMode colormode, GLint *shaderinfo) const
col.setRgb(150, 150, 150, 128);
break;
default:
- return;
+ return false;
break;
}
- float rgba[4];
- rgba[0] = col[0];
- rgba[1] = col[1];
- rgba[2] = col[2];
- rgba[3] = col[3];
- glColor4fv(rgba);
+ return true;
+}
+
+void Renderer::setColor(const float color[4], GLint *shaderinfo) const
+{
+ Color4f col = RenderSettings::inst()->color(RenderSettings::OPENCSG_FACE_FRONT_COLOR);
+ float c[4] = {color[0], color[1], color[2], color[3]};
+ if (c[0] < 0) c[0] = col[0];
+ if (c[1] < 0) c[1] = col[1];
+ if (c[2] < 0) c[2] = col[2];
+ if (c[3] < 0) c[3] = col[3];
+ glColor4fv(c);
#ifdef ENABLE_OPENCSG
if (shaderinfo) {
- glUniform4f(shaderinfo[1], col[0], col[1], col[2], 1.0f);
- glUniform4f(shaderinfo[2], (col[0]+1)/2, (col[1]+1)/2, (col[2]+1)/2, 1.0f);
+ glUniform4f(shaderinfo[1], c[0], c[1], c[2], c[3]);
+ glUniform4f(shaderinfo[2], (c[0]+1)/2, (c[1]+1)/2, (c[2]+1)/2, 1.0);
}
#endif
}
+
+void Renderer::setColor(ColorMode colormode, const float color[4], GLint *shaderinfo) const
+{
+ Color4f basecol;
+ if (getColor(colormode, basecol)) {
+ if (colormode == COLORMODE_BACKGROUND) {
+ basecol = Color4f(color[0] >= 0 ? color[0] : basecol[0],
+ color[1] >= 0 ? color[1] : basecol[1],
+ color[2] >= 0 ? color[2] : basecol[2],
+ color[3] >= 0 ? color[3] : basecol[3]);
+ }
+ else if (colormode != COLORMODE_HIGHLIGHT) {
+ basecol = Color4f(color[0] >= 0 ? color[0] : basecol[0],
+ color[1] >= 0 ? color[1] : basecol[1],
+ color[2] >= 0 ? color[2] : basecol[2],
+ color[3] >= 0 ? color[3] : basecol[3]);
+ }
+ setColor(basecol.data(), shaderinfo);
+ }
+}
+
+void Renderer::setColor(ColorMode colormode, GLint *shaderinfo) const
+{
+ float c[4] = {-1,-1,-1,-1};
+ setColor(colormode, c, shaderinfo);
+}
diff --git a/src/renderer.h b/src/renderer.h
index 24c1d94..f70b4e1 100644
--- a/src/renderer.h
+++ b/src/renderer.h
@@ -2,6 +2,7 @@
#define RENDERER_H_
#include "system-gl.h"
+#include "linalg.h"
#ifdef _MSC_VER // NULL
#include
@@ -25,6 +26,7 @@ public:
COLORMODE_BACKGROUND_EDGES
};
+ virtual bool getColor(ColorMode colormode, Color4f &col) const;
virtual void setColor(const float color[4], GLint *shaderinfo = NULL) const;
virtual void setColor(ColorMode colormode, GLint *shaderinfo = NULL) const;
virtual void setColor(ColorMode colormode, const float color[4], GLint *shaderinfo = NULL) const;
--
cgit v0.10.1
From 3baefed148d27eafd19ccef4b96eaaeb4a5fbb1a Mon Sep 17 00:00:00 2001
From: Marius Kintel
Date: Sat, 25 May 2013 13:09:57 -0400
Subject: Tuning of highlight and background modifiers
diff --git a/src/OpenCSGRenderer.cc b/src/OpenCSGRenderer.cc
index 31f27db..b4acf82 100644
--- a/src/OpenCSGRenderer.cc
+++ b/src/OpenCSGRenderer.cc
@@ -93,7 +93,12 @@ void OpenCSGRenderer::renderCSGChain(CSGChain *chain, GLint *shaderinfo,
PolySet::csgmode_e csgmode = j_obj.type == CSGTerm::TYPE_DIFFERENCE ? PolySet::CSGMODE_DIFFERENCE : PolySet::CSGMODE_NORMAL;
ColorMode colormode = COLORMODE_NONE;
if (background) {
- colormode = COLORMODE_BACKGROUND;
+ if (j_obj.flag & CSGTerm::FLAG_HIGHLIGHT) {
+ colormode = COLORMODE_HIGHLIGHT;
+ }
+ else {
+ colormode = COLORMODE_BACKGROUND;
+ }
csgmode = PolySet::csgmode_e(csgmode + 10);
} else if (j_obj.type == CSGTerm::TYPE_DIFFERENCE) {
if (j_obj.flag & CSGTerm::FLAG_HIGHLIGHT) {
diff --git a/src/ThrownTogetherRenderer.cc b/src/ThrownTogetherRenderer.cc
index 6151145..6be30dc 100644
--- a/src/ThrownTogetherRenderer.cc
+++ b/src/ThrownTogetherRenderer.cc
@@ -53,9 +53,9 @@ void ThrownTogetherRenderer::draw(bool /*showfaces*/, bool showedges) const
glDisable(GL_CULL_FACE);
}
if (this->background_chain)
- renderCSGChain(this->background_chain, false, true, showedges, false);
+ renderCSGChain(this->background_chain, false, true, showedges, false);
if (this->highlights_chain)
- renderCSGChain(this->highlights_chain, true, false, showedges, false);
+ renderCSGChain(this->highlights_chain, true, false, showedges, false);
}
void ThrownTogetherRenderer::renderCSGChain(CSGChain *chain, bool highlight,
@@ -72,49 +72,54 @@ void ThrownTogetherRenderer::renderCSGChain(CSGChain *chain, bool highlight,
glPushMatrix();
glMultMatrixd(m.data());
PolySet::csgmode_e csgmode = obj.type == CSGTerm::TYPE_DIFFERENCE ? PolySet::CSGMODE_DIFFERENCE : PolySet::CSGMODE_NORMAL;
+ ColorMode colormode = COLORMODE_NONE;
+ ColorMode edge_colormode = COLORMODE_NONE;
+
if (highlight) {
csgmode = PolySet::csgmode_e(csgmode + 20);
- setColor(COLORMODE_HIGHLIGHT);
- obj.polyset->render_surface(csgmode, m);
- if (showedges) {
- setColor(COLORMODE_HIGHLIGHT_EDGES);
- obj.polyset->render_edges(csgmode);
- }
+ colormode = COLORMODE_HIGHLIGHT;
+ edge_colormode = COLORMODE_HIGHLIGHT_EDGES;
} else if (background) {
- csgmode = PolySet::csgmode_e(csgmode + 10);
- setColor(COLORMODE_BACKGROUND);
- obj.polyset->render_surface(csgmode, m);
- if (showedges) {
- setColor(COLORMODE_BACKGROUND_EDGES);
- obj.polyset->render_edges(csgmode);
+ if (obj.flag & CSGTerm::FLAG_HIGHLIGHT) {
+ colormode = COLORMODE_HIGHLIGHT;
}
+ else {
+ colormode = COLORMODE_BACKGROUND;
+ }
+ csgmode = PolySet::csgmode_e(csgmode + 10);
+ edge_colormode = COLORMODE_BACKGROUND_EDGES;
} else if (fberror) {
if (highlight) csgmode = PolySet::csgmode_e(csgmode + 20);
else if (background) csgmode = PolySet::csgmode_e(csgmode + 10);
else csgmode = PolySet::csgmode_e(csgmode);
- obj.polyset->render_surface(csgmode, m);
- } else if (c[0] >= 0 || c[1] >= 0 || c[2] >= 0 || c[3] >= 0) {
- setColor(c.data());
- obj.polyset->render_surface(csgmode, m);
- if (showedges) {
- glColor4f((c[0]+1)/2, (c[1]+1)/2, (c[2]+1)/2, 1.0);
- obj.polyset->render_edges(csgmode);
- }
} else if (obj.type == CSGTerm::TYPE_DIFFERENCE) {
- setColor(COLORMODE_CUTOUT);
- obj.polyset->render_surface(csgmode, m);
- if (showedges) {
- setColor(COLORMODE_CUTOUT_EDGES);
- obj.polyset->render_edges(csgmode);
+ if (obj.flag & CSGTerm::FLAG_HIGHLIGHT) {
+ colormode = COLORMODE_HIGHLIGHT;
+ csgmode = PolySet::csgmode_e(csgmode + 20);
+ }
+ else {
+ colormode = COLORMODE_CUTOUT;
}
+ edge_colormode = COLORMODE_CUTOUT_EDGES;
} else {
- setColor(COLORMODE_MATERIAL);
- obj.polyset->render_surface(csgmode, m);
- if (showedges) {
- setColor(COLORMODE_MATERIAL_EDGES);
- obj.polyset->render_edges(csgmode);
+ if (obj.flag & CSGTerm::FLAG_HIGHLIGHT) {
+ colormode = COLORMODE_HIGHLIGHT;
+ csgmode = PolySet::csgmode_e(csgmode + 20);
+ }
+ else {
+ colormode = COLORMODE_MATERIAL;
}
+ edge_colormode = COLORMODE_MATERIAL_EDGES;
}
+
+ setColor(colormode, c.data());
+ obj.polyset->render_surface(csgmode, m);
+ if (showedges) {
+ // FIXME? glColor4f((c[0]+1)/2, (c[1]+1)/2, (c[2]+1)/2, 1.0);
+ setColor(edge_colormode);
+ obj.polyset->render_edges(csgmode);
+ }
+
glPopMatrix();
}
}
--
cgit v0.10.1
From 794b80ffcfa356b294e2e0c202ece005f2d0009c Mon Sep 17 00:00:00 2001
From: Marius Kintel
Date: Sat, 25 May 2013 13:11:09 -0400
Subject: Modified tests for #304
diff --git a/testdata/scad/features/background-modifier.scad b/testdata/scad/features/background-modifier.scad
index 5430472..d67270e 100644
--- a/testdata/scad/features/background-modifier.scad
+++ b/testdata/scad/features/background-modifier.scad
@@ -3,3 +3,8 @@ difference() {
%cylinder(h=30, r=6, center=true);
}
%if (true) cube([25,6,3], center=true);
+
+%translate([0,-9,0]) difference() {
+ color("green") cube([10,4,10], center=true);
+ color("red") translate([0,-2,0]) sphere(3);
+}
diff --git a/testdata/scad/features/highlight-and-background-modifier.scad b/testdata/scad/features/highlight-and-background-modifier.scad
index 5dca703..d97408b 100644
--- a/testdata/scad/features/highlight-and-background-modifier.scad
+++ b/testdata/scad/features/highlight-and-background-modifier.scad
@@ -1,10 +1,31 @@
difference() {
sphere(r=10);
%#cylinder(h=30, r=6, center=true);
- %#if (true) cube([6,25,3], center=true);
+ %#if (true) cube([25,6,3], center=true);
}
-translate([13,0,0]) difference() {
- sphere(r=10);
- #%cylinder(h=30, r=6, center=true);
- #%if (true) cube([6,25,3], center=true);
+%#translate([0,-9,0]) difference() {
+ color("green") cube([10,4,10], center=true);
+ color("red") translate([0,-2,0]) sphere(3);
+}
+%translate([13,0,0]){
+ difference() {
+ sphere(r=10);
+ cylinder(h=30, r=6, center=true);
+ if (true) cube([25,6,3], center=true);
+ }
+ #translate([0,-9,0]) difference() {
+ color("green") cube([10,4,10], center=true);
+ color("red") translate([0,-2,0]) sphere(3);
+ }
+}
+#translate([26,0,0]){
+ difference() {
+ sphere(r=10);
+ cylinder(h=30, r=6, center=true);
+ if (true) cube([25,6,3], center=true);
+ }
+ %translate([0,-9,0]) difference() {
+ color("green") cube([10,4,10], center=true);
+ color("red") translate([0,-2,0]) sphere(3);
+ }
}
diff --git a/testdata/scad/features/highlight-modifier.scad b/testdata/scad/features/highlight-modifier.scad
index f228d08..2141f58 100644
--- a/testdata/scad/features/highlight-modifier.scad
+++ b/testdata/scad/features/highlight-modifier.scad
@@ -3,3 +3,8 @@ difference() {
#cylinder(h=30, r=6, center=true);
}
#if (true) cube([25,6,3], center=true);
+
+#translate([0,-9,0]) difference() {
+ color("green") cube([10,4,10], center=true);
+ color("red") translate([0,-2,0]) sphere(3);
+}
diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt
index 39dc341..b696f2e 100644
--- a/tests/CMakeLists.txt
+++ b/tests/CMakeLists.txt
@@ -833,10 +833,7 @@ disable_tests(cgalpngtest_child-background
cgalpngtest_testcolornames
openscad-cgalpng_child-background
openscad-cgalpng_highlight-and-background-modifier
- openscad-cgalpng_testcolornames
- throwntogethertest_child-background
- throwntogethertest_highlight-and-background-modifier
- throwntogethertest_testcolornames)
+ openscad-cgalpng_testcolornames)
# Test config handling
diff --git a/tests/regression/cgalpngtest/highlight-modifier-expected.png b/tests/regression/cgalpngtest/highlight-modifier-expected.png
index e220aa1..2fc7678 100644
Binary files a/tests/regression/cgalpngtest/highlight-modifier-expected.png and b/tests/regression/cgalpngtest/highlight-modifier-expected.png differ
diff --git a/tests/regression/dumptest/background-modifier-expected.txt b/tests/regression/dumptest/background-modifier-expected.txt
index ed769b3..5861bef 100644
--- a/tests/regression/dumptest/background-modifier-expected.txt
+++ b/tests/regression/dumptest/background-modifier-expected.txt
@@ -5,4 +5,16 @@
%group() {
cube(size = [25, 6, 3], center = true);
}
+ %multmatrix([[1, 0, 0, 0], [0, 1, 0, -9], [0, 0, 1, 0], [0, 0, 0, 1]]) {
+ difference() {
+ color([0, 0.501961, 0, 1]) {
+ cube(size = [10, 4, 10], center = true);
+ }
+ color([1, 0, 0, 1]) {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, -2], [0, 0, 1, 0], [0, 0, 0, 1]]) {
+ sphere($fn = 0, $fa = 12, $fs = 2, r = 3);
+ }
+ }
+ }
+ }
diff --git a/tests/regression/dumptest/highlight-and-background-modifier-expected.txt b/tests/regression/dumptest/highlight-and-background-modifier-expected.txt
index 20c82cc..eb8931c 100644
--- a/tests/regression/dumptest/highlight-and-background-modifier-expected.txt
+++ b/tests/regression/dumptest/highlight-and-background-modifier-expected.txt
@@ -2,15 +2,60 @@
sphere($fn = 0, $fa = 12, $fs = 2, r = 10);
%cylinder($fn = 0, $fa = 12, $fs = 2, h = 30, r1 = 6, r2 = 6, center = true);
%group() {
- cube(size = [6, 25, 3], center = true);
+ cube(size = [25, 6, 3], center = true);
}
}
- multmatrix([[1, 0, 0, 13], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) {
+ %multmatrix([[1, 0, 0, 0], [0, 1, 0, -9], [0, 0, 1, 0], [0, 0, 0, 1]]) {
+ difference() {
+ color([0, 0.501961, 0, 1]) {
+ cube(size = [10, 4, 10], center = true);
+ }
+ color([1, 0, 0, 1]) {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, -2], [0, 0, 1, 0], [0, 0, 0, 1]]) {
+ sphere($fn = 0, $fa = 12, $fs = 2, r = 3);
+ }
+ }
+ }
+ }
+ %multmatrix([[1, 0, 0, 13], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) {
+ difference() {
+ sphere($fn = 0, $fa = 12, $fs = 2, r = 10);
+ cylinder($fn = 0, $fa = 12, $fs = 2, h = 30, r1 = 6, r2 = 6, center = true);
+ group() {
+ cube(size = [25, 6, 3], center = true);
+ }
+ }
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, -9], [0, 0, 1, 0], [0, 0, 0, 1]]) {
+ difference() {
+ color([0, 0.501961, 0, 1]) {
+ cube(size = [10, 4, 10], center = true);
+ }
+ color([1, 0, 0, 1]) {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, -2], [0, 0, 1, 0], [0, 0, 0, 1]]) {
+ sphere($fn = 0, $fa = 12, $fs = 2, r = 3);
+ }
+ }
+ }
+ }
+ }
+ multmatrix([[1, 0, 0, 26], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) {
difference() {
sphere($fn = 0, $fa = 12, $fs = 2, r = 10);
- %cylinder($fn = 0, $fa = 12, $fs = 2, h = 30, r1 = 6, r2 = 6, center = true);
- %group() {
- cube(size = [6, 25, 3], center = true);
+ cylinder($fn = 0, $fa = 12, $fs = 2, h = 30, r1 = 6, r2 = 6, center = true);
+ group() {
+ cube(size = [25, 6, 3], center = true);
+ }
+ }
+ %multmatrix([[1, 0, 0, 0], [0, 1, 0, -9], [0, 0, 1, 0], [0, 0, 0, 1]]) {
+ difference() {
+ color([0, 0.501961, 0, 1]) {
+ cube(size = [10, 4, 10], center = true);
+ }
+ color([1, 0, 0, 1]) {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, -2], [0, 0, 1, 0], [0, 0, 0, 1]]) {
+ sphere($fn = 0, $fa = 12, $fs = 2, r = 3);
+ }
+ }
}
}
}
diff --git a/tests/regression/dumptest/highlight-modifier-expected.txt b/tests/regression/dumptest/highlight-modifier-expected.txt
index c6204bd..c0a29ad 100644
--- a/tests/regression/dumptest/highlight-modifier-expected.txt
+++ b/tests/regression/dumptest/highlight-modifier-expected.txt
@@ -5,4 +5,16 @@
group() {
cube(size = [25, 6, 3], center = true);
}
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, -9], [0, 0, 1, 0], [0, 0, 0, 1]]) {
+ difference() {
+ color([0, 0.501961, 0, 1]) {
+ cube(size = [10, 4, 10], center = true);
+ }
+ color([1, 0, 0, 1]) {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, -2], [0, 0, 1, 0], [0, 0, 0, 1]]) {
+ sphere($fn = 0, $fa = 12, $fs = 2, r = 3);
+ }
+ }
+ }
+ }
diff --git a/tests/regression/opencsgtest/background-modifier-expected.png b/tests/regression/opencsgtest/background-modifier-expected.png
index 2505331..9cf7db0 100644
Binary files a/tests/regression/opencsgtest/background-modifier-expected.png and b/tests/regression/opencsgtest/background-modifier-expected.png differ
diff --git a/tests/regression/opencsgtest/highlight-and-background-modifier-expected.png b/tests/regression/opencsgtest/highlight-and-background-modifier-expected.png
index 8febe76..c1c7313 100644
Binary files a/tests/regression/opencsgtest/highlight-and-background-modifier-expected.png and b/tests/regression/opencsgtest/highlight-and-background-modifier-expected.png differ
diff --git a/tests/regression/opencsgtest/highlight-modifier-expected.png b/tests/regression/opencsgtest/highlight-modifier-expected.png
index af01e5b..1021c22 100644
Binary files a/tests/regression/opencsgtest/highlight-modifier-expected.png and b/tests/regression/opencsgtest/highlight-modifier-expected.png differ
diff --git a/tests/regression/throwntogethertest/background-modifier-expected.png b/tests/regression/throwntogethertest/background-modifier-expected.png
index 2505331..499b92f 100644
Binary files a/tests/regression/throwntogethertest/background-modifier-expected.png and b/tests/regression/throwntogethertest/background-modifier-expected.png differ
diff --git a/tests/regression/throwntogethertest/highlight-and-background-modifier-expected.png b/tests/regression/throwntogethertest/highlight-and-background-modifier-expected.png
new file mode 100644
index 0000000..e95f763
Binary files /dev/null and b/tests/regression/throwntogethertest/highlight-and-background-modifier-expected.png differ
diff --git a/tests/regression/throwntogethertest/highlight-modifier-expected.png b/tests/regression/throwntogethertest/highlight-modifier-expected.png
index 7973d82..e8d4e62 100644
Binary files a/tests/regression/throwntogethertest/highlight-modifier-expected.png and b/tests/regression/throwntogethertest/highlight-modifier-expected.png differ
--
cgit v0.10.1
From 199409c42b569716978ac6705a5894239dc744e3 Mon Sep 17 00:00:00 2001
From: Marius Kintel
Date: Sat, 25 May 2013 13:30:38 -0400
Subject: re-disabled some nonsensical test combinations
diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt
index b696f2e..14416ce 100644
--- a/tests/CMakeLists.txt
+++ b/tests/CMakeLists.txt
@@ -833,7 +833,8 @@ disable_tests(cgalpngtest_child-background
cgalpngtest_testcolornames
openscad-cgalpng_child-background
openscad-cgalpng_highlight-and-background-modifier
- openscad-cgalpng_testcolornames)
+ openscad-cgalpng_testcolornames
+ throwntogethertest_highlight-and-background-modifier)
# Test config handling
--
cgit v0.10.1
From 85d465617a84135a74a780a7ffabb22a6ab921c2 Mon Sep 17 00:00:00 2001
From: Marius Kintel
Date: Sat, 25 May 2013 14:01:45 -0400
Subject: Updated tests as part of #304
diff --git a/tests/regression/opencsgtest/difference-tests-expected.png b/tests/regression/opencsgtest/difference-tests-expected.png
index a6d863a..8db2742 100644
Binary files a/tests/regression/opencsgtest/difference-tests-expected.png and b/tests/regression/opencsgtest/difference-tests-expected.png differ
diff --git a/tests/regression/throwntogethertest/difference-tests-expected.png b/tests/regression/throwntogethertest/difference-tests-expected.png
index 0a27c90..7a61f42 100644
Binary files a/tests/regression/throwntogethertest/difference-tests-expected.png and b/tests/regression/throwntogethertest/difference-tests-expected.png differ
--
cgit v0.10.1
From e60744776193d5dc3f22e7a4a9f3afa8b8664e30 Mon Sep 17 00:00:00 2001
From: Marius Kintel
Date: Sat, 25 May 2013 10:51:21 -0700
Subject: Added expected files for example024
diff --git a/tests/regression/cgalpngtest/example024-expected.png b/tests/regression/cgalpngtest/example024-expected.png
new file mode 100644
index 0000000..8e69808
Binary files /dev/null and b/tests/regression/cgalpngtest/example024-expected.png differ
diff --git a/tests/regression/dumptest/example024-expected.txt b/tests/regression/dumptest/example024-expected.txt
new file mode 100644
index 0000000..e7d6e8b
--- /dev/null
+++ b/tests/regression/dumptest/example024-expected.txt
@@ -0,0 +1,1869 @@
+ difference() {
+ multmatrix([[0.81649658092, 0.40824829046, 0.40824829046, 0], [0, 0.70710678118, -0.70710678118, 0], [-0.57735026919, 0.57735026919, 0.57735026919, 0], [0, 0, 0, 1]]) {
+ group() {
+ difference() {
+ cube(size = [100, 100, 100], center = true);
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 33.3333, 33.3333], center = true);
+ group() {
+ group() {
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, -33.33333333333], [0, 0, 1, -33.33333333333], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 11.1111, 11.1111], center = true);
+ group() {
+ group() {
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, -11.11111111111], [0, 0, 1, -11.11111111111], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, -11.11111111111], [0, 0, 1, 0], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, -11.11111111111], [0, 0, 1, 11.11111111111], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, -11.11111111111], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ group();
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 11.11111111111], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, 11.11111111111], [0, 0, 1, -11.11111111111], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, 11.11111111111], [0, 0, 1, 0], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, 11.11111111111], [0, 0, 1, 11.11111111111], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, -33.33333333333], [0, 0, 1, 0], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 11.1111, 11.1111], center = true);
+ group() {
+ group() {
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, -11.11111111111], [0, 0, 1, -11.11111111111], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, -11.11111111111], [0, 0, 1, 0], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, -11.11111111111], [0, 0, 1, 11.11111111111], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, -11.11111111111], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ group();
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 11.11111111111], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, 11.11111111111], [0, 0, 1, -11.11111111111], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, 11.11111111111], [0, 0, 1, 0], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, 11.11111111111], [0, 0, 1, 11.11111111111], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, -33.33333333333], [0, 0, 1, 33.33333333333], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 11.1111, 11.1111], center = true);
+ group() {
+ group() {
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, -11.11111111111], [0, 0, 1, -11.11111111111], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, -11.11111111111], [0, 0, 1, 0], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, -11.11111111111], [0, 0, 1, 11.11111111111], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, -11.11111111111], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ group();
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 11.11111111111], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, 11.11111111111], [0, 0, 1, -11.11111111111], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, 11.11111111111], [0, 0, 1, 0], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, 11.11111111111], [0, 0, 1, 11.11111111111], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, -33.33333333333], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 11.1111, 11.1111], center = true);
+ group() {
+ group() {
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, -11.11111111111], [0, 0, 1, -11.11111111111], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, -11.11111111111], [0, 0, 1, 0], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, -11.11111111111], [0, 0, 1, 11.11111111111], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, -11.11111111111], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ group();
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 11.11111111111], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, 11.11111111111], [0, 0, 1, -11.11111111111], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, 11.11111111111], [0, 0, 1, 0], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, 11.11111111111], [0, 0, 1, 11.11111111111], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ group();
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 33.33333333333], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 11.1111, 11.1111], center = true);
+ group() {
+ group() {
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, -11.11111111111], [0, 0, 1, -11.11111111111], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, -11.11111111111], [0, 0, 1, 0], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, -11.11111111111], [0, 0, 1, 11.11111111111], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, -11.11111111111], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ group();
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 11.11111111111], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, 11.11111111111], [0, 0, 1, -11.11111111111], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, 11.11111111111], [0, 0, 1, 0], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, 11.11111111111], [0, 0, 1, 11.11111111111], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, 33.33333333333], [0, 0, 1, -33.33333333333], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 11.1111, 11.1111], center = true);
+ group() {
+ group() {
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, -11.11111111111], [0, 0, 1, -11.11111111111], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, -11.11111111111], [0, 0, 1, 0], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, -11.11111111111], [0, 0, 1, 11.11111111111], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, -11.11111111111], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ group();
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 11.11111111111], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, 11.11111111111], [0, 0, 1, -11.11111111111], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, 11.11111111111], [0, 0, 1, 0], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, 11.11111111111], [0, 0, 1, 11.11111111111], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, 33.33333333333], [0, 0, 1, 0], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 11.1111, 11.1111], center = true);
+ group() {
+ group() {
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, -11.11111111111], [0, 0, 1, -11.11111111111], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, -11.11111111111], [0, 0, 1, 0], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, -11.11111111111], [0, 0, 1, 11.11111111111], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, -11.11111111111], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ group();
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 11.11111111111], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, 11.11111111111], [0, 0, 1, -11.11111111111], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, 11.11111111111], [0, 0, 1, 0], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, 11.11111111111], [0, 0, 1, 11.11111111111], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, 33.33333333333], [0, 0, 1, 33.33333333333], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 11.1111, 11.1111], center = true);
+ group() {
+ group() {
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, -11.11111111111], [0, 0, 1, -11.11111111111], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, -11.11111111111], [0, 0, 1, 0], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, -11.11111111111], [0, 0, 1, 11.11111111111], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, -11.11111111111], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ group();
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 11.11111111111], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, 11.11111111111], [0, 0, 1, -11.11111111111], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, 11.11111111111], [0, 0, 1, 0], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, 11.11111111111], [0, 0, 1, 11.11111111111], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ multmatrix([[0, -1, 0, 0], [1, 0, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 33.3333, 33.3333], center = true);
+ group() {
+ group() {
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, -33.33333333333], [0, 0, 1, -33.33333333333], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 11.1111, 11.1111], center = true);
+ group() {
+ group() {
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, -11.11111111111], [0, 0, 1, -11.11111111111], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, -11.11111111111], [0, 0, 1, 0], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, -11.11111111111], [0, 0, 1, 11.11111111111], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, -11.11111111111], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ group();
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 11.11111111111], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, 11.11111111111], [0, 0, 1, -11.11111111111], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, 11.11111111111], [0, 0, 1, 0], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, 11.11111111111], [0, 0, 1, 11.11111111111], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, -33.33333333333], [0, 0, 1, 0], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 11.1111, 11.1111], center = true);
+ group() {
+ group() {
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, -11.11111111111], [0, 0, 1, -11.11111111111], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, -11.11111111111], [0, 0, 1, 0], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, -11.11111111111], [0, 0, 1, 11.11111111111], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, -11.11111111111], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ group();
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 11.11111111111], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, 11.11111111111], [0, 0, 1, -11.11111111111], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, 11.11111111111], [0, 0, 1, 0], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, 11.11111111111], [0, 0, 1, 11.11111111111], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, -33.33333333333], [0, 0, 1, 33.33333333333], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 11.1111, 11.1111], center = true);
+ group() {
+ group() {
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, -11.11111111111], [0, 0, 1, -11.11111111111], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, -11.11111111111], [0, 0, 1, 0], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, -11.11111111111], [0, 0, 1, 11.11111111111], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, -11.11111111111], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ group();
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 11.11111111111], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, 11.11111111111], [0, 0, 1, -11.11111111111], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, 11.11111111111], [0, 0, 1, 0], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, 11.11111111111], [0, 0, 1, 11.11111111111], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, -33.33333333333], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 11.1111, 11.1111], center = true);
+ group() {
+ group() {
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, -11.11111111111], [0, 0, 1, -11.11111111111], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, -11.11111111111], [0, 0, 1, 0], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, -11.11111111111], [0, 0, 1, 11.11111111111], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, -11.11111111111], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ group();
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 11.11111111111], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, 11.11111111111], [0, 0, 1, -11.11111111111], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, 11.11111111111], [0, 0, 1, 0], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, 11.11111111111], [0, 0, 1, 11.11111111111], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ group();
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 33.33333333333], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 11.1111, 11.1111], center = true);
+ group() {
+ group() {
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, -11.11111111111], [0, 0, 1, -11.11111111111], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, -11.11111111111], [0, 0, 1, 0], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, -11.11111111111], [0, 0, 1, 11.11111111111], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, -11.11111111111], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ group();
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 11.11111111111], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, 11.11111111111], [0, 0, 1, -11.11111111111], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, 11.11111111111], [0, 0, 1, 0], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, 11.11111111111], [0, 0, 1, 11.11111111111], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, 33.33333333333], [0, 0, 1, -33.33333333333], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 11.1111, 11.1111], center = true);
+ group() {
+ group() {
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, -11.11111111111], [0, 0, 1, -11.11111111111], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, -11.11111111111], [0, 0, 1, 0], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, -11.11111111111], [0, 0, 1, 11.11111111111], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, -11.11111111111], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ group();
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 11.11111111111], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, 11.11111111111], [0, 0, 1, -11.11111111111], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, 11.11111111111], [0, 0, 1, 0], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, 11.11111111111], [0, 0, 1, 11.11111111111], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, 33.33333333333], [0, 0, 1, 0], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 11.1111, 11.1111], center = true);
+ group() {
+ group() {
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, -11.11111111111], [0, 0, 1, -11.11111111111], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, -11.11111111111], [0, 0, 1, 0], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, -11.11111111111], [0, 0, 1, 11.11111111111], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, -11.11111111111], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ group();
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 11.11111111111], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, 11.11111111111], [0, 0, 1, -11.11111111111], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, 11.11111111111], [0, 0, 1, 0], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, 11.11111111111], [0, 0, 1, 11.11111111111], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, 33.33333333333], [0, 0, 1, 33.33333333333], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 11.1111, 11.1111], center = true);
+ group() {
+ group() {
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, -11.11111111111], [0, 0, 1, -11.11111111111], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, -11.11111111111], [0, 0, 1, 0], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, -11.11111111111], [0, 0, 1, 11.11111111111], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, -11.11111111111], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ group();
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 11.11111111111], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, 11.11111111111], [0, 0, 1, -11.11111111111], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, 11.11111111111], [0, 0, 1, 0], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, 11.11111111111], [0, 0, 1, 11.11111111111], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ multmatrix([[0, 0, 1, 0], [0, 1, 0, 0], [-1, 0, 0, 0], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 33.3333, 33.3333], center = true);
+ group() {
+ group() {
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, -33.33333333333], [0, 0, 1, -33.33333333333], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 11.1111, 11.1111], center = true);
+ group() {
+ group() {
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, -11.11111111111], [0, 0, 1, -11.11111111111], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, -11.11111111111], [0, 0, 1, 0], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, -11.11111111111], [0, 0, 1, 11.11111111111], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, -11.11111111111], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ group();
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 11.11111111111], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, 11.11111111111], [0, 0, 1, -11.11111111111], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, 11.11111111111], [0, 0, 1, 0], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, 11.11111111111], [0, 0, 1, 11.11111111111], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, -33.33333333333], [0, 0, 1, 0], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 11.1111, 11.1111], center = true);
+ group() {
+ group() {
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, -11.11111111111], [0, 0, 1, -11.11111111111], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, -11.11111111111], [0, 0, 1, 0], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, -11.11111111111], [0, 0, 1, 11.11111111111], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, -11.11111111111], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ group();
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 11.11111111111], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, 11.11111111111], [0, 0, 1, -11.11111111111], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, 11.11111111111], [0, 0, 1, 0], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, 11.11111111111], [0, 0, 1, 11.11111111111], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, -33.33333333333], [0, 0, 1, 33.33333333333], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 11.1111, 11.1111], center = true);
+ group() {
+ group() {
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, -11.11111111111], [0, 0, 1, -11.11111111111], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, -11.11111111111], [0, 0, 1, 0], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, -11.11111111111], [0, 0, 1, 11.11111111111], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, -11.11111111111], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ group();
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 11.11111111111], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, 11.11111111111], [0, 0, 1, -11.11111111111], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, 11.11111111111], [0, 0, 1, 0], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, 11.11111111111], [0, 0, 1, 11.11111111111], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, -33.33333333333], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 11.1111, 11.1111], center = true);
+ group() {
+ group() {
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, -11.11111111111], [0, 0, 1, -11.11111111111], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, -11.11111111111], [0, 0, 1, 0], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, -11.11111111111], [0, 0, 1, 11.11111111111], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, -11.11111111111], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ group();
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 11.11111111111], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, 11.11111111111], [0, 0, 1, -11.11111111111], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, 11.11111111111], [0, 0, 1, 0], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, 11.11111111111], [0, 0, 1, 11.11111111111], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ group();
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 33.33333333333], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 11.1111, 11.1111], center = true);
+ group() {
+ group() {
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, -11.11111111111], [0, 0, 1, -11.11111111111], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, -11.11111111111], [0, 0, 1, 0], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, -11.11111111111], [0, 0, 1, 11.11111111111], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, -11.11111111111], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ group();
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 11.11111111111], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, 11.11111111111], [0, 0, 1, -11.11111111111], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, 11.11111111111], [0, 0, 1, 0], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, 11.11111111111], [0, 0, 1, 11.11111111111], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, 33.33333333333], [0, 0, 1, -33.33333333333], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 11.1111, 11.1111], center = true);
+ group() {
+ group() {
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, -11.11111111111], [0, 0, 1, -11.11111111111], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, -11.11111111111], [0, 0, 1, 0], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, -11.11111111111], [0, 0, 1, 11.11111111111], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, -11.11111111111], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ group();
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 11.11111111111], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, 11.11111111111], [0, 0, 1, -11.11111111111], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, 11.11111111111], [0, 0, 1, 0], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, 11.11111111111], [0, 0, 1, 11.11111111111], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, 33.33333333333], [0, 0, 1, 0], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 11.1111, 11.1111], center = true);
+ group() {
+ group() {
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, -11.11111111111], [0, 0, 1, -11.11111111111], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, -11.11111111111], [0, 0, 1, 0], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, -11.11111111111], [0, 0, 1, 11.11111111111], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, -11.11111111111], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ group();
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 11.11111111111], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, 11.11111111111], [0, 0, 1, -11.11111111111], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, 11.11111111111], [0, 0, 1, 0], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, 11.11111111111], [0, 0, 1, 11.11111111111], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, 33.33333333333], [0, 0, 1, 33.33333333333], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 11.1111, 11.1111], center = true);
+ group() {
+ group() {
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, -11.11111111111], [0, 0, 1, -11.11111111111], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, -11.11111111111], [0, 0, 1, 0], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, -11.11111111111], [0, 0, 1, 11.11111111111], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, -11.11111111111], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ group();
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 11.11111111111], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, 11.11111111111], [0, 0, 1, -11.11111111111], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, 11.11111111111], [0, 0, 1, 0], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ group() {
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, 11.11111111111], [0, 0, 1, 11.11111111111], [0, 0, 0, 1]]) {
+ group() {
+ cube(size = [110, 3.7037, 3.7037], center = true);
+ group();
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ multmatrix([[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, -100], [0, 0, 0, 1]]) {
+ cube(size = [200, 200, 200], center = true);
+ }
+ }
+
diff --git a/tests/regression/opencsgtest/example024-expected.png b/tests/regression/opencsgtest/example024-expected.png
new file mode 100644
index 0000000..dfbe847
Binary files /dev/null and b/tests/regression/opencsgtest/example024-expected.png differ
diff --git a/tests/regression/throwntogethertest/example024-expected.png b/tests/regression/throwntogethertest/example024-expected.png
new file mode 100644
index 0000000..ffa2360
Binary files /dev/null and b/tests/regression/throwntogethertest/example024-expected.png differ
--
cgit v0.10.1