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