2 USING: accessors arrays assocs calendar colors
3 combinators.short-circuit kernel locals math math.functions
4 math.matrices math.order math.parser math.trig math.vectors
5 opengl opengl.demo-support opengl.gl sbufs sequences strings
6 threads ui.gadgets ui.gadgets.worlds ui.gestures ui.render ;
8 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
12 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
14 TUPLE: <turtle> pos ori angle length thickness color vertices saved ;
16 DEFER: default-L-parser-values
18 : reset-turtle ( turtle -- turtle )
20 3 identity-matrix >>ori
24 default-L-parser-values ;
26 : turtle ( -- turtle ) <turtle> new reset-turtle ;
28 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
30 :: step-turtle ( TURTLE LENGTH -- turtle )
33 TURTLE pos>> TURTLE ori>> { 0 0 LENGTH } m.v v+
36 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
40 [let | ANGLE [ ANGLE deg>rad ] |
42 [let | A [ ANGLE cos ]
55 [let | ANGLE [ ANGLE deg>rad ] |
57 [let | A [ ANGLE cos ]
70 [let | ANGLE [ ANGLE deg>rad ] |
72 [let | A [ ANGLE cos ]
83 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
85 :: apply-rotation ( TURTLE ROTATION -- turtle )
87 TURTLE TURTLE ori>> ROTATION m. >>ori ;
89 : rotate-x ( turtle angle -- turtle ) Rx apply-rotation ;
90 : rotate-y ( turtle angle -- turtle ) Ry apply-rotation ;
91 : rotate-z ( turtle angle -- turtle ) Rz apply-rotation ;
93 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
95 : pitch-up ( turtle angle -- turtle ) neg rotate-x ;
96 : pitch-down ( turtle angle -- turtle ) rotate-x ;
98 : turn-left ( turtle angle -- turtle ) rotate-y ;
99 : turn-right ( turtle angle -- turtle ) neg rotate-y ;
101 : roll-left ( turtle angle -- turtle ) neg rotate-z ;
102 : roll-right ( turtle angle -- turtle ) rotate-z ;
104 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
106 : V ( -- V ) { 0 1 0 } ;
108 : X ( turtle -- 3array ) ori>> [ first ] map ;
109 : Y ( turtle -- 3array ) ori>> [ second ] map ;
110 : Z ( turtle -- 3array ) ori>> [ third ] map ;
112 : set-X ( turtle seq -- turtle ) over ori>> [ set-first ] 2each ;
113 : set-Y ( turtle seq -- turtle ) over ori>> [ set-second ] 2each ;
114 : set-Z ( turtle seq -- turtle ) over ori>> [ set-third ] 2each ;
116 :: roll-until-horizontal ( TURTLE -- turtle )
120 V TURTLE Z cross normalize set-X
122 TURTLE Z TURTLE X cross normalize set-Y ;
124 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
126 :: strafe-up ( TURTLE LENGTH -- turtle )
127 TURTLE 90 pitch-up LENGTH step-turtle 90 pitch-down ;
129 :: strafe-down ( TURTLE LENGTH -- turtle )
130 TURTLE 90 pitch-down LENGTH step-turtle 90 pitch-up ;
132 :: strafe-left ( TURTLE LENGTH -- turtle )
133 TURTLE 90 turn-left LENGTH step-turtle 90 turn-right ;
135 :: strafe-right ( TURTLE LENGTH -- turtle )
136 TURTLE 90 turn-right LENGTH step-turtle 90 turn-left ;
138 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
140 : polygon ( vertices -- ) GL_POLYGON glBegin [ first3 glVertex3d ] each glEnd ;
142 : start-polygon ( turtle -- turtle ) dup vertices>> delete-all ;
144 : finish-polygon ( turtle -- turtle ) dup vertices>> polygon ;
146 : polygon-vertex ( turtle -- turtle ) dup [ pos>> ] [ vertices>> ] bi push ;
148 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
150 : record-vertex ( turtle -- turtle ) dup pos>> first3 glVertex3d ;
152 : draw-forward ( turtle length -- turtle )
153 GL_LINES glBegin [ record-vertex ] dip step-turtle record-vertex glEnd ;
155 : move-forward ( turtle length -- turtle ) step-turtle polygon-vertex ;
157 : sneak-forward ( turtle length -- turtle ) step-turtle ;
159 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
161 : scale-length ( turtle m -- turtle ) over length>> * >>length ;
162 : scale-angle ( turtle m -- turtle ) over angle>> * >>angle ;
164 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
166 : set-thickness ( turtle i -- turtle ) dup glLineWidth >>thickness ;
168 : scale-thickness ( turtle m -- turtle )
169 over thickness>> * 0.5 max set-thickness ;
171 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
173 : color-table ( -- colors )
175 T{ rgba f 0 0 0 1 } ! black
176 T{ rgba f 0.5 0.5 0.5 1 } ! grey
177 T{ rgba f 1 0 0 1 } ! red
178 T{ rgba f 1 1 0 1 } ! yellow
179 T{ rgba f 0 1 0 1 } ! green
180 T{ rgba f 0.25 0.88 0.82 1 } ! turquoise
181 T{ rgba f 0 0 1 1 } ! blue
182 T{ rgba f 0.63 0.13 0.94 1 } ! purple
183 T{ rgba f 0.00 0.50 0.00 1 } ! dark green
184 T{ rgba f 0.00 0.82 0.82 1 } ! dark turquoise
185 T{ rgba f 0.00 0.00 0.50 1 } ! dark blue
186 T{ rgba f 0.58 0.00 0.82 1 } ! dark purple
187 T{ rgba f 0.50 0.00 0.00 1 } ! dark red
188 T{ rgba f 0.25 0.25 0.25 1 } ! dark grey
189 T{ rgba f 0.75 0.75 0.75 1 } ! medium grey
190 T{ rgba f 1 1 1 1 } ! white
193 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
195 ! : material-color ( color -- )
196 ! GL_FRONT_AND_BACK GL_AMBIENT_AND_DIFFUSE rot gl-material ;
198 : material-color ( color -- )
199 GL_FRONT_AND_BACK GL_AMBIENT_AND_DIFFUSE rot color>raw 4array gl-material ;
201 : set-color ( turtle i -- turtle )
202 dup color-table nth dup gl-color material-color >>color ;
204 : inc-color ( turtle -- turtle ) dup color>> 1 + set-color ;
206 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
208 : save-turtle ( turtle -- turtle ) dup clone over saved>> push ;
209 : restore-turtle ( turtle -- turtle ) saved>> pop ;
211 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
213 : default-L-parser-values ( turtle -- turtle )
214 1 >>length 45 >>angle 1 >>thickness 2 >>color ;
216 : L-parser-dialect ( -- commands )
219 { "+" [ dup angle>> turn-left ] }
220 { "-" [ dup angle>> turn-right ] }
221 { "&" [ dup angle>> pitch-down ] }
222 { "^" [ dup angle>> pitch-up ] }
223 { "<" [ dup angle>> roll-left ] }
224 { ">" [ dup angle>> roll-right ] }
226 { "|" [ 180.0 rotate-y ] }
227 { "%" [ 180.0 rotate-z ] }
228 { "$" [ roll-until-horizontal ] }
230 { "F" [ dup length>> draw-forward ] }
231 { "Z" [ dup length>> 2 / draw-forward ] }
232 { "f" [ dup length>> move-forward ] }
233 { "z" [ dup length>> 2 / move-forward ] }
234 { "g" [ dup length>> sneak-forward ] }
235 { "." [ polygon-vertex ] }
237 { "[" [ save-turtle ] }
238 { "]" [ restore-turtle ] }
240 { "{" [ start-polygon ] }
241 { "}" [ finish-polygon ] }
243 { "/" [ 1.1 scale-length ] } ! double quote command in lparser
244 { "'" [ 0.9 scale-length ] }
245 { ";" [ 1.1 scale-angle ] }
246 { ":" [ 0.9 scale-angle ] }
247 { "?" [ 1.4 scale-thickness ] }
248 { "!" [ 0.7 scale-thickness ] }
250 { "c" [ dup color>> 1 + color-table length mod set-color ] }
255 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
257 TUPLE: <L-system> < gadget
258 camera display-list pedestal paused commands axiom rules string ;
260 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
262 :: iterate-system ( GADGET -- ) GADGET pedestal>> 0.5 + GADGET (>>pedestal) ;
264 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
266 :: start-rotation-thread ( GADGET -- )
267 GADGET f >>paused drop
272 [ GADGET iterate-system GADGET relayout-1 25 milliseconds sleep t ]
279 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
281 : open-paren ( -- ch ) CHAR: ( ;
282 : close-paren ( -- ch ) CHAR: ) ;
284 : open-paren? ( obj -- ? ) open-paren = ;
285 : close-paren? ( obj -- ? ) close-paren = ;
287 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
289 :: read-instruction ( STRING -- next rest )
291 { [ STRING length 1 > ] [ STRING second open-paren? ] } 0&&
292 [ STRING close-paren STRING index 1 + cut ]
296 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
298 :: iterate-string-loop ( STRING RULES ACCUM -- )
301 STRING read-instruction
303 [let | REST [ ] NEXT [ ] |
305 NEXT 1 head RULES at NEXT or ACCUM push-all
307 REST RULES ACCUM iterate-string-loop ]
311 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
313 :: iterate-string ( STRING RULES -- string )
315 [let | ACCUM [ STRING length 10 * <sbuf> ] |
317 STRING RULES ACCUM iterate-string-loop
321 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
323 :: interpret-string ( STRING COMMANDS -- )
327 STRING read-instruction
329 [let | REST [ ] NEXT [ ] |
331 [let | COMMAND [ NEXT 1 head COMMANDS at ] |
338 NEXT 2 tail 1 head* string>number
346 REST COMMANDS interpret-string ]
350 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
352 :: iterate-L-system-string ( L-SYSTEM -- )
353 L-SYSTEM string>> L-SYSTEM axiom>> or
356 L-SYSTEM (>>string) ;
358 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
360 :: do-camera-look-at ( CAMERA -- )
362 [let | EYE [ CAMERA pos>> ]
363 FOCUS [ CAMERA clone 1 step-turtle pos>> ]
364 UP [ CAMERA clone 90 pitch-up 1 step-turtle pos>> CAMERA pos>> v- ]
367 EYE FOCUS UP gl-look-at ] ;
369 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
371 :: generate-display-list ( L-SYSTEM -- )
373 L-SYSTEM find-gl-context
375 L-SYSTEM display-list>> GL_COMPILE glNewList
378 L-SYSTEM string>> L-SYSTEM axiom>> or
385 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
387 M:: <L-system> draw-gadget* ( L-SYSTEM -- )
393 GL_PROJECTION glMatrixMode
395 -1 1 -1 1 1.5 200 glFrustum
397 GL_MODELVIEW glMatrixMode
401 L-SYSTEM camera>> do-camera-look-at
403 GL_FRONT_AND_BACK GL_LINE glPolygonMode
406 white gl-color GL_LINES glBegin { 0 0 0 } gl-vertex { 0 0 1 } gl-vertex glEnd
410 L-SYSTEM pedestal>> 0 0 1 glRotated
412 L-SYSTEM display-list>> glCallList ;
414 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
416 M:: <L-system> graft* ( L-SYSTEM -- )
418 L-SYSTEM find-gl-context
420 1 glGenLists L-SYSTEM (>>display-list) ;
422 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
424 M:: <L-system> pref-dim* ( L-SYSTEM -- dim ) { 400 400 } ;
426 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
428 :: with-camera ( L-SYSTEM QUOT -- )
429 L-SYSTEM camera>> QUOT call drop
430 L-SYSTEM relayout-1 ;
432 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
436 { T{ key-down f f "LEFT" } [ [ 5 turn-left ] with-camera ] }
437 { T{ key-down f f "RIGHT" } [ [ 5 turn-right ] with-camera ] }
438 { T{ key-down f f "UP" } [ [ 5 pitch-down ] with-camera ] }
439 { T{ key-down f f "DOWN" } [ [ 5 pitch-up ] with-camera ] }
441 { T{ key-down f f "a" } [ [ 1 step-turtle ] with-camera ] }
442 { T{ key-down f f "z" } [ [ -1 step-turtle ] with-camera ] }
444 { T{ key-down f f "q" } [ [ 5 roll-left ] with-camera ] }
445 { T{ key-down f f "w" } [ [ 5 roll-right ] with-camera ] }
447 { T{ key-down f f "r" } [ start-rotation-thread ] }
450 T{ key-down f f "x" }
452 dup iterate-L-system-string
453 dup generate-display-list
462 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
464 : L-system ( -- L-system )
466 <L-system> new-gadget
470 ! turtle 45 turn-left 45 pitch-up 5 step-turtle 180 turn-left >>camera ;
472 turtle 90 pitch-down -5 step-turtle 2 strafe-up >>camera
474 dup start-rotation-thread
478 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!