Clean up some duplication
[factor/jcg.git] / extra / cfdg / cfdg.factor
blob3168b4b27d8bff6a90a9e3fd885506cec465ce11
2 USING: kernel alien.c-types combinators namespaces make arrays
3        sequences splitting
4        math math.functions math.vectors math.trig
5        opengl.gl opengl.glu opengl ui ui.gadgets.slate
6        vars colors self self.slots
7        random-weighted colors.hsv cfdg.gl accessors
8        ui.gadgets.handler ui.gestures assocs ui.gadgets macros
9        specialized-arrays.double ;
11 QUALIFIED: syntax
13 IN: cfdg
15 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
17 SELF-SLOTS: hsva
19 : clear-color ( color -- ) gl-clear-color GL_COLOR_BUFFER_BIT glClear ;
21 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
23 ! if (adjustment < 0)
24 !   base + base * adjustment
26 ! if (adjustment > 0)
27 !   base + (1 - base) * adjustment
29 : adjust ( val num -- val ) dup 0 > [ 1 pick - * + ] [ dupd * + ] if ;
31 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
33 : hue ( num -- ) hue-> + 360 mod ->hue ;
35 : saturation ( num -- ) saturation-> swap adjust ->saturation ;
36 : brightness ( num -- ) value->      swap adjust ->value ;
37 : alpha      ( num -- ) alpha->      swap adjust ->alpha ;
39 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
41 : h   ( num -- ) hue ;
42 : sat ( num -- ) saturation ;
43 : b   ( num -- ) brightness ;
44 : a   ( num -- ) alpha ;
46 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
48 VAR: color-stack
50 : init-color-stack ( -- ) V{ } clone >color-stack ;
52 : push-color ( -- ) self> color-stack> push   self> clone >self ;
54 : pop-color ( -- ) color-stack> pop dup >self gl-color ;
56 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
58 ! : double-nth* ( c-array indices -- seq ) swap [ double-nth ] curry map ;
60 : double-nth* ( c-array indices -- seq )
61   swap byte-array>double-array [ nth ] curry map ;
63 : check-size ( modelview -- num ) { 0 1 4 5 } double-nth* [ abs ] map supremum ;
65 VAR: threshold
67 : iterate? ( -- ? ) get-modelview-matrix check-size threshold> > ;
69 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
71 ! cos 2a   sin 2a  0  0
72 ! sin 2a  -cos 2a  0  0
73 !      0        0  1  0
74 !      0        0  0  1
76 ! column major order
78 : gl-flip ( angle -- ) deg>rad dup dup dup
79   [ 2 * cos ,   2 * sin ,       0 ,   0 ,
80     2 * sin ,   2 * cos neg ,   0 ,   0 ,
81           0 ,             0 ,   1 ,   0 , 
82           0 ,             0 ,   0 ,   1 , ]
83   double-array{ } make underlying>> glMultMatrixd ;
85 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
87 : circle ( -- )
88   self> gl-color
89   gluNewQuadric dup 0 0.5 20 10 gluDisk gluDeleteQuadric ;
91 : triangle ( -- )
92   self> gl-color
93   GL_POLYGON glBegin
94     0    0.577 glVertex2d
95     0.5 -0.289 glVertex2d
96    -0.5 -0.289 glVertex2d
97   glEnd ;
99 : square ( -- )
100   self> gl-color
101   GL_POLYGON glBegin
102     -0.5  0.5 glVertex2d
103      0.5  0.5 glVertex2d
104      0.5 -0.5 glVertex2d
105     -0.5 -0.5 glVertex2d
106   glEnd ;
108 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
110 : size ( scale -- ) dup 1 glScaled ;
112 : size* ( scale-x scale-y -- ) 1 glScaled ;
114 : rotate ( angle -- ) 0 0 1 glRotated ;
116 : x ( x -- ) 0 0 glTranslated ;
118 : y ( y -- ) 0 swap 0 glTranslated ;
120 : flip ( angle -- ) gl-flip ;
122 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
124 : s  ( scale -- ) size ;
125 : s* ( scale-x scale-y -- ) size* ;
126 : r  ( angle -- ) rotate ;
127 : f  ( angle -- ) flip ;
129 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
131 : do ( quot -- )
132   push-modelview-matrix
133   push-color
134   call
135   pop-modelview-matrix
136   pop-color ; inline
138 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
140 : recursive ( quot -- ) iterate? swap when ; inline
142 : multi ( seq -- ) random-weighted* call ;
144 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
146 : [rules] ( seq -- quot )
147   [ unclip swap [ [ do ] curry ] map concat 2array ] map
148   [ call-random-weighted ] swap prefix
149   [ when ] swap prefix
150   [ iterate? ] swap append ;
152 MACRO: rules ( seq -- quot ) [rules] ;
154 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
156 : [rule] ( seq -- quot )
157   [ [ do ] swap prefix ] map concat
158   [ when ] swap prefix
159   [ iterate? ] prepend ;
161 MACRO: rule ( seq -- quot ) [rule] ;
163 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
165 VAR: background
167 : set-initial-background ( -- ) T{ hsva f 0 0 1 1 } clone >self ;
169 : set-background ( -- )
170   set-initial-background
171   background> call
172   self> clear-color ;
174 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
176 USING: rewrite-closures ;
178 VAR: viewport ! { left width bottom height }
180 VAR: start-shape
182 : set-initial-color ( -- ) T{ hsva f 0 0 0 1 } clone >self ;
184 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
186 SYMBOL: dlist
188 ! : build-model-dlist ( -- )
189 !   1 glGenLists dlist set
190 !   dlist get GL_COMPILE_AND_EXECUTE glNewList
191 !   start-shape> call
192 !   glEndList ;
194 : build-model-dlist ( -- )
195   1 glGenLists dlist set
196   dlist get GL_COMPILE_AND_EXECUTE glNewList
198   set-initial-color
200   self> gl-color
202   start-shape> call
203       
204   glEndList ;
206 : display ( -- )
208   GL_PROJECTION glMatrixMode
209   glLoadIdentity
210   viewport> first  dup  viewport> second  +
211   viewport> third  dup  viewport> fourth  + gluOrtho2D
213   GL_MODELVIEW glMatrixMode
214   glLoadIdentity
216   set-background
218   GL_COLOR_BUFFER_BIT glClear
220   init-modelview-matrix-stack
221   init-color-stack
223   dlist get not
224     [ build-model-dlist ]
225     [ dlist get glCallList ]
226   if ;
228 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
230 : delete-dlist ( -- ) dlist get [ dlist get 1 glDeleteLists dlist off ] when ;
232 : cfdg-window* ( -- slate )
233   C[ display ] <slate>
234     { 500 500 }       >>pdim
235     C[ delete-dlist ] >>ungraft
236   dup "CFDG" open-window ;
238 : cfdg-window ( -- slate ) [ cfdg-window* ] with-ui ;
240 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
242 SYMBOL: the-slate
244 : rebuild ( -- ) delete-dlist the-slate get relayout-1 ;
246 : <cfdg-gadget> ( -- slate )
247   C[ display ] <slate>
248     dup the-slate set
249     { 500 500 } >>pdim
250     C[ dlist get [ dlist get 1 glDeleteLists ] when ] >>ungraft
251   <handler>
252     H{ } clone
253       T{ key-down f f "ENTER" } C[ drop rebuild ] swap pick set-at
254       T{ button-down } C[ drop rebuild ] swap pick set-at
255     >>table ;
257 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
259 USE: fry
261 : cfdg-window. ( quot -- )
262   '[ [ @ <cfdg-gadget> "CFDG" open-window ] with-scope ] with-ui ;