2 USING: kernel namespaces threads math math.order math.vectors
17 self pos ori turtle opengl.camera
18 lsys.tortoise lsys.tortoise.graphics
19 lsys.strings.rewrite lsys.strings.interpret
20 combinators.short-circuit accessors ;
23 ! lsys.strings.rewrite
24 ! lsys.strings.interpret
28 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
32 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
36 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
40 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
44 black set-clear-color GL_COLOR_BUFFER_BIT glClear
48 GL_PROJECTION glMatrixMode
50 -1 1 -1 1 1.5 200 glFrustum
52 GL_MODELVIEW glMatrixMode
58 GL_FRONT_AND_BACK GL_LINE glPolygonMode
60 white color>raw glColor4d
64 GL_LINES glBegin { 0 0 0 } gl-vertex { 0 0 1 } gl-vertex glEnd
70 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
73 slate> find-gl-context
74 model> GL_COMPILE glNewList result> interpret glEndList ;
77 tortoise-stack> delete-all
83 [ display ] closed-quot slate> set-slate-action
86 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
88 USING: hashtables namespaces.lib ui.gadgets.handler ;
90 : camera-action ( quot -- quot )
91 [ drop [ ] camera> with-self slate> relayout-1 ] make* closed-quot ;
100 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
102 : lsys-controller ( -- )
108 [ "Load" <label> reverse-video-theme ]
110 [ "Models" <label> [ drop model-chooser ] closed-quot <bevel-button> ]
111 [ "Scenes" <label> [ drop scene-chooser ] closed-quot <bevel-button> ]
113 [ "Model" <label> reverse-video-theme ]
115 [ "Iterate" <label> [ drop iterate build-model ] closed-quot <bevel-button> ]
116 [ "Build model" <label> [ drop build-model ] closed-quot <bevel-button> ]
118 [ "Camera" <label> reverse-video-theme ]
120 [ "Turn left" <label> [ 5 turn-left ] camera-action <bevel-button> ]
121 [ "Turn right" <label> [ 5 turn-right ] camera-action <bevel-button> ]
122 [ "Pitch down" <label> [ 5 pitch-down ] camera-action <bevel-button> ]
123 [ "Pitch up" <label> [ 5 pitch-up ] camera-action <bevel-button> ]
125 [ "Forward - a" <label> [ 1 step-turtle ] camera-action <bevel-button> ]
126 [ "Backward - z" <label> [ -1 step-turtle ] camera-action <bevel-button> ]
128 [ "Roll left - q" <label> [ 5 roll-left ] camera-action <bevel-button> ]
129 [ "Roll right - w" <label> [ 5 roll-right ] camera-action <bevel-button> ]
131 [ "Strafe left - (alt)" <label> [ 1 strafe-left ] camera-action <bevel-button> ]
132 [ "Strafe right - (alt)" <label> [ 1 strafe-right ] camera-action <bevel-button> ]
133 [ "Strafe down - (alt)" <label> [ 1 strafe-up ] camera-action <bevel-button> ]
134 [ "Strafe up - (alt)" <label> [ 1 strafe-down ] camera-action <bevel-button> ]
136 [ "View 1 - 1" <label>
137 [ pos> norm reset-turtle 90 turn-left step-turtle 180 turn-left ]
138 camera-action <bevel-button> ]
140 [ "View 2 - 2" <label>
141 [ pos> norm reset-turtle 90 pitch-up step-turtle 180 pitch-down ]
142 camera-action <bevel-button> ]
144 [ "View 3 - 3" <label>
145 [ pos> norm reset-turtle step-turtle 180 turn-left ]
146 camera-action <bevel-button> ]
148 [ "View 4 - 4" <label>
149 [ pos> norm reset-turtle 45 turn-left 45 pitch-up step-turtle 180 turn-left ]
150 camera-action <bevel-button> ]
154 [ call add-gadget ] each
156 "L-system control" open-window ;
158 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
163 { 400 400 } clone slate> set-slate-pdim
169 { T{ key-down f f "LEFT" } [ [ 5 turn-left ] camera-action ] }
170 { T{ key-down f f "RIGHT" } [ [ 5 turn-right ] camera-action ] }
171 { T{ key-down f f "UP" } [ [ 5 pitch-down ] camera-action ] }
172 { T{ key-down f f "DOWN" } [ [ 5 pitch-up ] camera-action ] }
174 { T{ key-down f f "a" } [ [ 1 step-turtle ] camera-action ] }
175 { T{ key-down f f "z" } [ [ -1 step-turtle ] camera-action ] }
177 { T{ key-down f f "q" } [ [ 5 roll-left ] camera-action ] }
178 { T{ key-down f f "w" } [ [ 5 roll-right ] camera-action ] }
180 { T{ key-down f { A+ } "LEFT" } [ [ 1 strafe-left ] camera-action ] }
181 { T{ key-down f { A+ } "RIGHT" } [ [ 1 strafe-right ] camera-action ] }
182 { T{ key-down f { A+ } "UP" } [ [ 1 strafe-up ] camera-action ] }
183 { T{ key-down f { A+ } "DOWN" } [ [ 1 strafe-down ] camera-action ] }
185 { T{ key-down f f "1" }
186 [ [ pos> norm reset-turtle 90 turn-left step-turtle 180 turn-left ]
189 { T{ key-down f f "2" }
190 [ [ pos> norm reset-turtle 90 pitch-up step-turtle 180 pitch-down ]
193 { T{ key-down f f "3" }
194 [ [ pos> norm reset-turtle step-turtle 180 turn-left ]
197 { T{ key-down f f "4" }
198 [ [ pos> norm reset-turtle 45 turn-left 45 pitch-up step-turtle 180 turn-left ]
201 } [ make* ] map >hashtable >>table
203 "L-system view" open-window
207 slate> find-gl-context
213 reset-turtle 45 turn-left 45 pitch-up 5 step-turtle 180 turn-left
220 V{ } clone >tortoise-stack
230 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
232 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
234 : koch ( -- ) lparser-dialect [ 90 >angle ] >model-values
236 H{ { "K" "[[a|b] '(0.41)f'(2.439) |<(60) [a|b]]" }
237 { "k" "[ c'(0.5) K]" }
238 { "a" "[d <(120) d <(120) d ]" }
240 { "e" "[^ '(.2887)f'(3.4758) &(180) +z{.-(120)f-(120)f}]" }
241 { "d" "[^ '(.2887)f'(3.4758) &(109.5111) +zk{.-(120)f-(120)f}]" }
246 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
248 : spiral-0 ( -- ) lparser-dialect [ 10 >angle 5 >thickness ] >model-values
252 H{ { "P" "[A]>>>>>>>>>[cB]>>>>>>>>>[ccC]>>>>>>>>>[cccD]" }
256 { "D" "F!>^+F>^+;'D" }
259 : spiral-0-scene ( -- )
263 [ reset-turtle 90 turn-left 16 step-turtle 180 turn-left ]
264 camera> with-self slate> relayout-1 ;
266 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
268 : tree-5 ( -- ) lparser-dialect [ 5 >angle 1 >thickness ] >model-values
272 H{ { "S" "FFR>(60)R>(60)R>(60)R>(60)R>(60)R>(30)S" }
283 { "F" "'(1.25)F'(.8)" }
286 : tree-5-scene ( -- )
290 [ reset-turtle 90 pitch-down -70 step-turtle 50 strafe-up ] camera> with-self
293 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
295 : abop-1 ( -- ) lparser-dialect [ 45 >angle 5 >thickness ] >model-values
297 H{ { "A" "F[&'(.8)!BL]>(137)'!(.9)A" }
298 { "B" "F[-'(.8)!(.9)$CL]'!(.9)C" }
299 { "C" "F[+'(.8)!(.9)$BL]'!(.9)B" }
301 { "L" "~c(8){+(30)f-(120)f-(120)f}" }
304 "c(12)FFAL" >result ;
306 : abop-1-scene ( -- )
311 90 pitch-up 7 step-turtle 90 pitch-down 4 step-turtle 90 pitch-down ]
312 camera> with-self slate> relayout-1 ;
314 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
316 : abop-2 ( -- ) lparser-dialect [ 30 >angle 5 >thickness ] >model-values
318 H{ { "A" "F[&'(.7)!BL]>(137)[&'(.6)!BL]>(137)'(.9)!(.9)A" }
319 { "B" "F[-'(.7)!(.9)$CL]'(.9)!(.9)C" }
320 { "C" "F[+'(.7)!(.9)$BL]'(.9)!(.9)B" }
322 { "L" "~c(8){+(45)f(.1)-(45)f(.1)-(45)f(.1)+(45)|+(45)f(.1)-(45)f(.1)-(45)f(.1)}" }
328 : abop-2-scene ( -- )
332 [ reset-turtle { 0 4 4 } >pos 90 pitch-down ]
333 camera> with-self slate> relayout-1 ;
335 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
337 : abop-3 ( -- ) lparser-dialect [ 30 >angle 5 >thickness ] >model-values
339 H{ { "A" "!(.9)t(.4)FB>(94)B>(132)B" }
340 { "B" "[&t(.4)F$A]" }
341 { "F" "'(1.25)F'(.8)" }
346 : abop-3-scene ( -- )
347 abop-3 11 iterations build-model
348 [ reset-turtle { 0 47 29 } >pos 90 pitch-down ] camera> with-self
351 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
353 : abop-4 ( -- ) lparser-dialect [ 18 >angle 5 >thickness ] >model-values
355 H{ { "N" "FII[&(60)rY]>(90)[&(45)'(0.8)rA]>(90)[&(60)rY]>(90)[&(45)'(0.8)rD]!FIK" }
356 { "Y" "[c(4){++l.--l.--l.++|++l.--l.--l.}]" }
358 { "K" "[!c(2)FF>w>(72)w>(72)w>(72)w>(72)w]" }
359 { "w" "[c(2)^!F][c(5)&(72){-(54)f(3)+(54)f(3)|-(54)f(3)+(54)f(3)}]" }
386 "c(12)&(20)N" >result ;
388 : abop-4-scene ( -- )
389 abop-4 21 iterations build-model
392 { { 0.57 -0.14 -0.80 } { -0.81 -0.18 -0.54 } { -0.07 0.97 -0.22 } }
394 ] camera> with-self slate> relayout-1 ;
396 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
398 : abop-5 ( -- ) lparser-dialect [ 5 >angle 5 >thickness ] >model-values
400 H{ { "a" "F[+(45)l][-(45)l]^;ca" }
409 { "F" "'(1.17)F'(.855)" }
412 "&(90)+(90)a" >result ;
414 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
416 : abop-6 ( -- ) lparser-dialect [ 5 >angle 5 >thickness ] >model-values
418 "&(90)+(90)FFF[-(120)'(.6)x][-(60)'(.8)x][+(120)'(.6)x][+(60)'(.8)x]x" >result
420 H{ { "a" "F[cdx][cex]F!(.9)a" }
426 { "F" "'(1.25)F'(.8)" }
429 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
431 : airhorse ( -- ) lparser-dialect [ 10 >angle 5 >thickness ] >model-values
437 { "B" "[[''aH]|[g]]" }
440 { "s" "[::cc!!!!&&[FFcccZ]^^^^FFcccZ]" }
441 { "t" "[c!!!!&[FF]^^FF]" }
451 { "V" "[cc!!!&(90)[Zp]|[Zp]]" }
452 { "p" "h>(120)h>(120)h" }
453 { "h" "[+(40)!F'''p]" }
455 { "H" "[cccci[>(50)dcFFF][<(50)ecFFF]]" }
460 { "W" "[%[!!cb][<<<!!cb][>>>!!cb]]" }
462 { "l" "[-cc{--z++z++z--|--z++z++z}]" }
465 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
473 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
475 : model-chooser ( -- )
478 [ "abop-1" <label> [ drop abop-1 build-model ] closed-quot <bevel-button> ]
479 [ "abop-2" <label> [ drop abop-2 build-model ] closed-quot <bevel-button> ]
480 [ "abop-3" <label> [ drop abop-3 build-model ] closed-quot <bevel-button> ]
481 [ "abop-4" <label> [ drop abop-4 build-model ] closed-quot <bevel-button> ]
482 [ "abop-5" <label> [ drop abop-5 build-model ] closed-quot <bevel-button> ]
483 [ "abop-6" <label> [ drop abop-6 build-model ] closed-quot <bevel-button> ]
484 [ "tree-5" <label> [ drop tree-5 build-model ] closed-quot <bevel-button> ]
485 [ "airhorse" <label> [ drop airhorse build-model ] closed-quot <bevel-button> ]
486 [ "spiral-0" <label> [ drop spiral-0 build-model ] closed-quot <bevel-button> ]
487 [ "koch" <label> [ drop koch build-model ] closed-quot <bevel-button> ]
489 [ call add-gadget ] each
491 "L-system models" open-window ;
493 : scene-chooser ( -- )
496 [ "abop-1" <label> [ drop abop-1-scene ] closed-quot <bevel-button> ]
497 [ "abop-2" <label> [ drop abop-2-scene ] closed-quot <bevel-button> ]
498 [ "tree-5" <label> [ drop tree-5-scene ] closed-quot <bevel-button> ]
500 [ call add-gadget ] each
502 "L-system scenes" open-window ;
504 : lsys-window* ( -- )
505 [ lsys-controller lsys-viewer ] with-ui ;