! Copyright (C) 2008 Eduardo Cavazos. ! Copyright (C) 2011 Anton Gorenko. ! See http://factorcode.org/license.txt for BSD license. USING: accessors arrays boids.simulation calendar classes colors kernel literals math math.functions math.trig models models.range opengl opengl.demo-support opengl.gl sequences threads ui ui.commands ui.gadgets ui.gadgets.borders ui.gadgets.buttons ui.gadgets.frames ui.gadgets.grids ui.gadgets.labeled ui.gadgets.labels ui.gadgets.packs ui.gadgets.sliders ui.render ui.tools.common ; QUALIFIED-WITH: models.range mr IN: boids TUPLE: boids-gadget < gadget paused boids behaviours dt ; CONSTANT: initial-population 100 CONSTANT: initial-dt 5 : initial-behaviours ( -- seq ) 1.0 75 -0.1 1.0 40 -0.5 1.0 25 -1.0 3array ; : ( -- gadget ) boids-gadget new t >>clipped? ${ WIDTH HEIGHT } >>pref-dim initial-population random-boids >>boids initial-behaviours >>behaviours initial-dt >>dt ; M: boids-gadget ungraft* t >>paused drop ; : vec>deg ( vec -- deg ) first2 rect> arg rad>deg ; inline : draw-boid ( boid -- ) dup pos>> [ vel>> vec>deg 0 0 1 glRotated GL_TRIANGLES [ -6.0 4.0 glVertex2f -6.0 -4.0 glVertex2f 8.0 0.0 glVertex2f ] do-state ] with-translation ; : draw-boids ( boids -- ) 0.0 0.0 0.0 0.5 glColor4f [ draw-boid ] each ; M: boids-gadget draw-gadget* ( boids-gadget -- ) boids>> draw-boids ; : iterate-system ( boids-gadget -- ) dup [ boids>> ] [ behaviours>> ] [ dt>> ] tri simulate >>boids drop ; :: start-boids-thread ( gadget -- ) [ [ gadget paused>> ] [ gadget iterate-system gadget relayout-1 10 milliseconds sleep ] until ] in-thread ; TUPLE: range-observer quot ; M: range-observer model-changed [ range-value ] dip quot>> call( value -- ) ; : connect ( range-model quot -- ) range-observer boa swap add-connection ; :: behavior-panel ( behavior -- gadget ) 2 3 white-interior { 2 4 } >>gap { 0 0 } >>filled-cell "weight"