]> gitweb.factorcode.org Git - factor.git/blob - extra/boids/boids.factor
boids: remove extra whitespace.
[factor.git] / extra / boids / boids.factor
1 ! Copyright (C) 2008 Eduardo Cavazos.
2 ! Copyright (C) 2011 Anton Gorenko.
3 ! See http://factorcode.org/license.txt for BSD license.
4 USING: accessors arrays boids.simulation calendar classes
5 colors.constants kernel literals locals math math.functions
6 math.trig models namespaces opengl opengl.demo-support opengl.gl
7 sequences threads ui ui.commands ui.gadgets ui.gadgets.borders
8 ui.gadgets.buttons ui.gadgets.frames ui.gadgets.grids
9 ui.gadgets.labeled ui.gadgets.labels ui.gadgets.packs
10 ui.gadgets.sliders ui.gadgets.tracks ui.gadgets.worlds ui.render
11 ui.tools.common ;
12 QUALIFIED-WITH: models.range mr
13 IN: boids
14
15 TUPLE: boids-gadget < gadget paused boids behaviours dt ;
16
17 CONSTANT: initial-population 100
18 CONSTANT: initial-dt 5
19
20 : initial-behaviours ( -- seq )
21     1.0 75 -0.1 <cohesion>
22     1.0 40 -0.5 <alignment>
23     1.0 25 -1.0 <separation>
24     3array ;
25
26 : <boids-gadget> ( -- gadget )
27     boids-gadget new
28         t >>clipped?
29         ${ width height } >>pref-dim
30         initial-population random-boids >>boids
31         initial-behaviours >>behaviours
32         initial-dt >>dt ;
33
34 M: boids-gadget ungraft*
35     t >>paused drop ;
36
37 : vec>deg ( vec -- deg )
38     first2 rect> arg rad>deg ; inline
39
40 : draw-boid ( boid -- )
41     dup pos>> [
42         vel>> vec>deg 0 0 1 glRotated
43         GL_TRIANGLES [
44             -6.0  4.0 glVertex2f
45             -6.0 -4.0 glVertex2f
46             8.0 0.0 glVertex2f
47          ] do-state
48     ] with-translation ;
49
50 : draw-boids ( boids -- )
51     0.0 0.0 0.0 0.5 glColor4f
52     [ draw-boid ] each ;
53
54 M: boids-gadget draw-gadget* ( boids-gadget -- )
55     boids>> draw-boids ;
56
57 : iterate-system ( boids-gadget -- )
58     dup [ boids>> ] [ behaviours>> ] [ dt>> ] tri
59     simulate >>boids drop ;
60
61 :: start-boids-thread ( gadget -- )
62     [
63         [ gadget paused>> ]
64         [
65             gadget iterate-system
66             gadget relayout-1
67             10 milliseconds sleep
68         ] until
69     ] in-thread ;
70
71 TUPLE: range-observer quot ;
72
73 M: range-observer model-changed
74     [ range-value ] dip quot>> call( value -- ) ;
75
76 : connect ( range-model quot -- )
77     range-observer boa swap add-connection ;
78
79 :: behavior-panel ( behavior -- gadget )
80     2 3 <frame> white-interior { 2 4 } >>gap { 0 0 } >>filled-cell
81
82     "weight" <label> { 0 0 } grid-add
83     behavior weight>> 100 * >fixnum 0 0 200 1 mr:<range>
84     dup [ 100.0 / behavior weight<< ] connect
85     horizontal <slider> { 1 0 } grid-add
86
87     "radius" <label> { 0 1 } grid-add
88     behavior radius>> 0 0 100 1 mr:<range>
89     dup [ behavior radius<< ] connect
90     horizontal <slider> { 1 1 } grid-add
91
92     "angle" <label> { 0 2 } grid-add
93     behavior angle-cos>> acos rad>deg >fixnum 0 0 180 1 mr:<range>
94     dup [ deg>rad cos behavior angle-cos<< ] connect
95     horizontal <slider> { 1 2 } grid-add
96
97     { 5 5 } <border> white-interior
98
99     behavior class-of name>> COLOR: gray <framed-labeled-gadget> ;
100
101 :: set-population ( n boids-gadget -- )
102     boids-gadget [
103         dup length n - dup 0 >
104         [ head* ]
105         [ neg random-boids append ] if
106     ] change-boids drop ;
107
108 <PRIVATE
109 : find-boids-gadget ( gadget -- boids-gadget )
110     dup boids-gadget? [ children>> [ boids-gadget? ] find nip ] unless ;
111 PRIVATE>
112
113 : com-pause ( boids-gadget -- )
114     find-boids-gadget
115     dup paused>> not [ >>paused ] keep
116     [ drop ] [ start-boids-thread ] if ;
117
118 : com-randomize ( boids-gadget -- )
119     find-boids-gadget
120     [ length random-boids ] change-boids relayout-1 ;
121
122 :: simulation-panel ( boids-gadget -- gadget )
123     <pile> white-interior
124
125     2 2 <frame> { 2 4 } >>gap { 0 0 } >>filled-cell
126
127     "population" <label> { 0 0 } grid-add
128     initial-population 0 0 200 10 mr:<range>
129     dup [ boids-gadget set-population ] connect
130     horizontal <slider> { 1 0 } grid-add
131
132     "speed" <label> { 0 1 } grid-add
133     boids-gadget dt>> 0 1 10 1 mr:<range>
134     dup [ boids-gadget dt<< ] connect
135     horizontal <slider> { 1 1 } grid-add
136
137     { 5 5 } <border> add-gadget
138
139     <shelf> { 2 2 } >>gap
140     "pause" [ drop boids-gadget com-pause ]
141     <border-button> add-gadget
142     "randomize" [ drop boids-gadget com-randomize ]
143     <border-button> add-gadget
144
145     { 5 5 } <border> add-gadget
146
147     "simulation" COLOR: gray <framed-labeled-gadget> ;
148
149 TUPLE: boids-frame < pack ;
150
151 :: <boids-frame> ( -- boids-frame )
152     boids-frame new horizontal >>orientation
153     <boids-gadget> :> boids-gadget
154     boids-gadget [ start-boids-thread ] keep
155     add-gadget
156
157     <pile> { 5 5 } >>gap 1.0 >>fill
158
159     boids-gadget simulation-panel
160     add-gadget
161
162     boids-gadget behaviours>>
163     [ behavior-panel add-gadget ] each
164
165     { 5 5 } <border> add-gadget ;
166
167 boids-frame "touchbar" f {
168     { f com-pause }
169     { f com-randomize }
170 } define-command-map
171
172 MAIN-WINDOW: boids { { title "Boids" } }
173     <boids-frame> >>gadgets ;