#N canvas 4 2 673 560 10; #X obj 14 66 gemwin; #X obj 14 9 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 0 1 ; #X msg 55 33 destroy; #X obj 14 92 gemhead; #X text 220 17 A tutorial on recursion in Gem; #X text 220 37 (GPL) 2007 Claude Heiland-Allen ; #X obj 30 273 r \$0-recurse; #X obj 14 301 t a a; #X floatatom 72 360 5 0 0 2 count - -; #X obj 72 379 clip 1 6; #N canvas 0 0 368 384 \$0-transformations 0; #X obj 19 19 inlet; #X obj 250 19 inlet; #X obj 19 343 outlet; #X text 299 20 count; #X text 72 19 gem; #X text 74 344 gem; #X obj 19 44 separator; #X obj 19 315 scaleXYZ; #X obj 19 225 translateXYZ; #X obj 19 135 rotateXYZ; #X obj 38 74 tabread \$0-rotate-X; #X obj 57 94 tabread \$0-rotate-Y; #X obj 77 114 tabread \$0-rotate-Z; #X obj 45 164 tabread \$0-translate-X; #X obj 71 184 tabread \$0-translate-Y; #X obj 98 204 tabread \$0-translate-Z; #X obj 36 254 tabread \$0-scale-X; #X obj 53 274 tabread \$0-scale-Y; #X obj 70 294 tabread \$0-scale-Z; #X text 135 230 Transform the recursion branch \,; #X connect 0 0 6 0; #X connect 1 0 10 0; #X connect 1 0 11 0; #X connect 1 0 12 0; #X connect 1 0 13 0; #X connect 1 0 14 0; #X connect 1 0 15 0; #X connect 1 0 16 0; #X connect 1 0 17 0; #X connect 1 0 18 0; #X connect 6 0 9 0; #X connect 7 0 2 0; #X connect 8 0 7 0; #X connect 9 0 8 0; #X connect 10 0 9 1; #X connect 11 0 9 2; #X connect 12 0 9 3; #X connect 13 0 8 1; #X connect 14 0 8 2; #X connect 15 0 8 3; #X connect 16 0 7 1; #X connect 17 0 7 2; #X connect 18 0 7 3; #X restore 63 442 pd \$0-transformations; #N canvas 0 0 679 337 \$0-colourize-and-limit-depth 0; #X obj 297 19 inlet; #X obj 293 298 outlet; #X text 343 299 gem; #X text 347 21 gem; #X obj 436 18 inlet; #X text 487 18 count; #X obj 352 171 v \$0-depth; #X obj 352 191 - 1; #X obj 352 211 max 0; #X obj 352 231 v \$0-depth; #X obj 294 246 spigot; #X obj 264 174 v \$0-depth; #X obj 264 214 v \$0-depth; #X obj 264 194 + 1; #X obj 436 189 v \$0-R; #X obj 436 229 v \$0-R; #X obj 486 189 v \$0-G; #X obj 486 229 v \$0-G; #X obj 536 229 v \$0-B; #X obj 536 189 v \$0-B; #X obj 436 71 tabread \$0-colour-R; #X obj 486 105 tabread \$0-colour-G; #X obj 536 128 tabread \$0-colour-B; #X text 442 248 Transform colours.; #X text 251 271 Limit recursion depth.; #X obj 536 209 + 1; #X obj 486 209 + 1; #X obj 435 209 + 1; #X obj 297 52 t b a b; #X obj 436 167 t b f; #X obj 486 167 t b f; #X obj 536 167 t b f; #X obj 46 18 inlet; #X text 97 18 count; #X obj 46 189 v \$0-R; #X obj 46 229 v \$0-R; #X obj 96 189 v \$0-G; #X obj 96 229 v \$0-G; #X obj 146 229 v \$0-B; #X obj 146 189 v \$0-B; #X obj 46 71 tabread \$0-colour-R; #X obj 96 105 tabread \$0-colour-G; #X obj 146 128 tabread \$0-colour-B; #X obj 46 167 t b f; #X obj 96 167 t b f; #X obj 146 167 t b f; #X text 52 252 Untransform colours.; #X obj 45 209 - 1; #X obj 96 209 - 1; #X obj 146 209 - 1; #X connect 0 0 28 0; #X connect 4 0 20 0; #X connect 4 0 21 0; #X connect 4 0 22 0; #X connect 6 0 7 0; #X connect 7 0 8 0; #X connect 8 0 9 0; #X connect 8 0 10 1; #X connect 10 0 1 0; #X connect 11 0 13 0; #X connect 13 0 12 0; #X connect 14 0 27 0; #X connect 16 0 26 0; #X connect 19 0 25 0; #X connect 20 0 29 0; #X connect 21 0 30 0; #X connect 22 0 31 0; #X connect 25 0 18 0; #X connect 26 0 17 0; #X connect 27 0 15 0; #X connect 28 0 11 0; #X connect 28 1 10 0; #X connect 28 2 6 0; #X connect 29 0 14 0; #X connect 29 1 27 1; #X connect 30 0 16 0; #X connect 30 1 26 1; #X connect 31 0 19 0; #X connect 31 1 25 1; #X connect 32 0 40 0; #X connect 32 0 41 0; #X connect 32 0 42 0; #X connect 34 0 47 0; #X connect 36 0 48 0; #X connect 39 0 49 0; #X connect 40 0 43 0; #X connect 41 0 44 0; #X connect 42 0 45 0; #X connect 43 0 34 0; #X connect 43 1 47 1; #X connect 44 0 36 0; #X connect 44 1 48 1; #X connect 45 0 39 0; #X connect 45 1 49 1; #X connect 47 0 35 0; #X connect 48 0 37 0; #X connect 49 0 38 0; #X restore 14 479 pd \$0-colourize-and-limit-depth; #X obj 14 499 s \$0-recurse; #X obj 14 223 t a b; #N canvas 22 26 435 181 \$0-initialize 0; #X obj 23 20 inlet; #X text 68 19 bang; #X obj 23 122 v \$0-depth; #X obj 23 102 f 4; #X obj 103 122 v \$0-R; #X obj 153 122 v \$0-G; #X obj 203 122 v \$0-B; #X obj 160 21 inlet; #X text 205 20 max depth; #X text 18 146 Initialize the variables: recursion depth and object colours.; #X obj 203 98 f 0; #X obj 153 99 f 0; #X obj 103 98 f 0; #X connect 0 0 3 0; #X connect 0 0 10 0; #X connect 0 0 11 0; #X connect 0 0 12 0; #X connect 3 0 2 0; #X connect 7 0 3 1; #X connect 10 0 6 0; #X connect 11 0 5 0; #X connect 12 0 4 0; #X restore 44 243 pd \$0-initialize; #X floatatom 151 200 5 0 0 2 depth - -; #N canvas 0 0 340 391 \$0-draw-object 0; #X obj 23 14 inlet; #X text 69 13 gem; #X obj 23 67 t a b b b; #X obj 23 321 colorRGB; #X obj 23 358 cube; #X obj 240 291 inlet; #X text 286 291 alpha; #X obj 42 106 v \$0-R; #X obj 120 104 v \$0-G; #X obj 198 104 v \$0-B; #X text 125 76 Normalize the colour range.; #X obj 23 41 separator; #X obj 42 253 expr $f1/$f4 \; $f2/$f4 \; $f3/$f4; #X obj 42 128 expr $f1 \; $f2 \; $f3 \; max(max(max($f1 \, $f2) \, $f3) \, 1); #X connect 0 0 11 0; #X connect 2 0 3 0; #X connect 2 1 7 0; #X connect 2 2 8 0; #X connect 2 3 9 0; #X connect 3 0 4 0; #X connect 5 0 3 4; #X connect 7 0 13 0; #X connect 8 0 13 1; #X connect 9 0 13 2; #X connect 11 0 2 0; #X connect 12 0 3 1; #X connect 12 1 3 2; #X connect 12 2 3 3; #X connect 13 0 12 0; #X connect 13 1 12 1; #X connect 13 2 12 2; #X connect 13 3 12 3; #X restore 44 321 pd \$0-draw-object; #X floatatom 158 279 5 0 0 2 alpha - -; #X obj 158 299 / 100; #N canvas 0 0 650 615 \$0-gui 0; #X obj 11 11 xform-gui 0; #X obj 167 263 t a; #X msg 167 293 \$3 \$1 \$2; #X obj 167 329 unpack f f s; #X obj 246 355 select cR cG cB rX rY rZ tX tY tZ sX sY sZ; #X obj 167 576 tabwrite; #X obj 246 485 symbol \$0-colour-R; #X obj 270 465 symbol \$0-colour-G; #X obj 294 445 symbol \$0-colour-B; #X obj 318 425 symbol \$0-rotate-X; #X obj 342 405 symbol \$0-rotate-Y; #X obj 366 385 symbol \$0-rotate-Z; #X obj 390 485 symbol \$0-translate-X; #X obj 414 465 symbol \$0-translate-Y; #X obj 438 445 symbol \$0-translate-Z; #X obj 462 425 symbol \$0-scale-X; #X obj 486 405 symbol \$0-scale-Y; #X obj 510 385 symbol \$0-scale-Z; #X obj 374 552 list prepend set; #X obj 374 572 list trim; #X obj 495 112 inlet; #X obj 71 11 xform-gui 1; #X obj 131 11 xform-gui 2; #X obj 191 11 xform-gui 3; #X obj 251 11 xform-gui 4; #X obj 311 11 xform-gui 5; #X connect 0 0 1 0; #X connect 1 0 2 0; #X connect 2 0 3 0; #X connect 3 0 5 0; #X connect 3 1 5 1; #X connect 3 2 4 0; #X connect 4 0 6 0; #X connect 4 1 7 0; #X connect 4 2 8 0; #X connect 4 3 9 0; #X connect 4 4 10 0; #X connect 4 5 11 0; #X connect 4 6 12 0; #X connect 4 7 13 0; #X connect 4 8 14 0; #X connect 4 9 15 0; #X connect 4 10 16 0; #X connect 4 11 17 0; #X connect 6 0 18 0; #X connect 7 0 18 0; #X connect 8 0 18 0; #X connect 9 0 18 0; #X connect 10 0 18 0; #X connect 11 0 18 0; #X connect 12 0 18 0; #X connect 13 0 18 0; #X connect 14 0 18 0; #X connect 15 0 18 0; #X connect 16 0 18 0; #X connect 17 0 18 0; #X connect 18 0 19 0; #X connect 19 0 5 0; #X connect 20 0 0 0; #X connect 20 0 21 0; #X connect 20 0 22 0; #X connect 20 0 23 0; #X connect 20 0 24 0; #X connect 20 0 25 0; #X connect 21 0 1 0; #X connect 22 0 1 0; #X connect 23 0 1 0; #X connect 24 0 1 0; #X connect 25 0 1 0; #X coords 0 -1 1 1 362 212 2 10 10; #X restore 275 286 pd \$0-gui; #X text 460 263 transformation parameters; #N canvas 0 0 360 364 \$0-transformation-parameters 0; #X obj 21 318 table \$0-scale-Z 6; #X obj 21 298 table \$0-scale-Y 6; #X obj 21 278 table \$0-scale-X 6; #X obj 21 208 table \$0-translate-X 6; #X obj 21 228 table \$0-translate-Y 6; #X obj 21 248 table \$0-translate-Z 6; #X obj 21 178 table \$0-rotate-Z 6; #X obj 21 158 table \$0-rotate-Y 6; #X obj 21 138 table \$0-rotate-X 6; #X obj 21 68 table \$0-colour-R 6; #X obj 21 88 table \$0-colour-G 6; #X obj 21 108 table \$0-colour-B 6; #X text 21 29 Tables to store transformation parameters.; #X restore 418 506 pd \$0-transformation-parameters; #X obj 14 191 alpha; #X msg 37 164 auto \$1; #X obj 38 139 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 0 1; #N canvas 0 0 471 288 \$0-scene-transformation 0; #X obj 20 20 inlet; #X obj 20 42 t a b; #X obj 20 149 rotateXYZ; #X obj 50 67 f 0; #X obj 88 67 + 1; #X obj 62 98 / 1.618; #X obj 82 122 / 1.618; #X obj 20 217 scale 0.05; #X obj 53 191 inlet; #X obj 20 252 outlet; #X text 152 215 Scale the whole scene.; #X text 158 67 Rotate the whole scene continuously.; #X connect 0 0 1 0; #X connect 1 0 2 0; #X connect 1 1 3 0; #X connect 2 0 7 0; #X connect 3 0 4 0; #X connect 3 0 2 1; #X connect 3 0 5 0; #X connect 4 0 3 1; #X connect 5 0 2 2; #X connect 5 0 6 0; #X connect 6 0 2 3; #X connect 7 0 9 0; #X connect 8 0 7 1; #X restore 14 115 pd \$0-scene-transformation; #X floatatom 158 69 5 0 0 2 scale - -; #X obj 158 89 / 100; #X obj 151 221 clip 0 6; #X text 219 182 Subpatches are used to hide the implementation details of each part of the patch. Further comments are inside.; #X obj 275 260 bng 15 250 50 1 empty empty randomize 17 7 0 10 -262144 -1 -1; #X obj 14 404 nnrepeat 5; #X text 220 77 Another new object is necessary for full effect: [nnrepeat] which outputs the repeat count both before and after the repeated value \, thus we can do and undo actions before and after \, such as colourizing the geos according to the transformations. Allowing different parameters for each transformation means we can create non-symmetric structures with some sort of self-similarity.; #X msg 48 13 create; #X connect 1 0 0 0; #X connect 2 0 0 0; #X connect 3 0 25 0; #X connect 6 0 7 0; #X connect 7 0 31 0; #X connect 7 1 16 0; #X connect 8 0 9 0; #X connect 9 0 31 1; #X connect 10 0 11 1; #X connect 11 0 12 0; #X connect 13 0 7 0; #X connect 13 1 14 0; #X connect 15 0 28 0; #X connect 17 0 18 0; #X connect 18 0 16 1; #X connect 22 0 13 0; #X connect 23 0 22 0; #X connect 24 0 23 0; #X connect 25 0 22 0; #X connect 26 0 27 0; #X connect 27 0 25 1; #X connect 28 0 14 1; #X connect 30 0 19 0; #X connect 31 0 11 0; #X connect 31 1 10 0; #X connect 31 2 10 1; #X connect 31 2 11 2; #X connect 33 0 0 0;