USING: kernel namespaces math math.functions math.vectors math.parser hashtables sequences threads colors opengl opengl.gl ui ui.gadgets ui.gadgets.handler ui.gadgets.slate ui.gadgets.theme ui.gadgets.frames ui.gadgets.labels ui.gadgets.buttons ui.gadgets.packs ui.gadgets.grids ui.gestures combinators.cleave assocs.lib vars rewrite-closures boids ; IN: boids.ui ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! draw-boid ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! : point-a ( boid -- a ) boid-pos ; : point-b ( boid -- b ) [ boid-pos ] [ boid-vel normalize* 20 v*n ] bi v+ ; : boid-points ( boid -- point-a point-b ) [ point-a ] [ point-b ] bi ; : draw-boid ( boid -- ) boid-points gl-line ; : draw-boids ( -- ) boids> [ draw-boid ] each ; : display ( -- ) black gl-color draw-boids ; ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! VAR: slate VAR: loop : run ( -- ) slate> rect-dim >world-size iterate-boids slate> relayout-1 yield loop> [ run ] when ; : button* ( string quot -- button ) closed-quot ; : toggle-loop ( -- ) loop> [ loop off ] [ loop on [ run ] in-thread ] if ; VARS: population-label cohesion-label alignment-label separation-label ; ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! : update-population-label ( -- ) "Population: " boids> length number>string append 20 32 pad-right population-label> set-label-string ; : add-10-boids ( -- ) boids> 10 random-boids append >boids update-population-label ; : sub-10-boids ( -- ) boids> 10 tail >boids update-population-label ; ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! : truncate-value ( n -- n ) 10 * round 10 / ; : update-cohesion-label ( -- ) "Cohesion: " cohesion-weight> truncate-value number>string append 20 32 pad-right cohesion-label> set-label-string ; : update-alignment-label ( -- ) "Alignment: " alignment-weight> truncate-value number>string append 20 32 pad-right alignment-label> set-label-string ; : update-separation-label ( -- ) "Separation: " separation-weight> truncate-value number>string append 20 32 pad-right separation-label> set-label-string ; : inc-cohesion-weight ( -- ) cohesion-weight inc* update-cohesion-label ; : dec-cohesion-weight ( -- ) cohesion-weight dec* update-cohesion-label ; : inc-alignment-weight ( -- ) alignment-weight inc* update-alignment-label ; : dec-alignment-weight ( -- ) alignment-weight dec* update-alignment-label ; : inc-separation-weight ( -- ) separation-weight inc* update-separation-label ; : dec-separation-weight ( -- ) separation-weight dec* update-separation-label ; : boids-window* ( -- ) init-variables init-world-size init-boids loop on C[ display ] >slate t slate> set-gadget-clipped? { 600 400 } slate> set-slate-dim C[ [ run ] in-thread ] slate> set-slate-graft C[ loop off ] slate> set-slate-ungraft ""