USING: kernel namespaces threads combinators sequences arrays math math.functions math.ranges random opengl.gl opengl.glu vars multi-methods generalizations shuffle ui ui.gestures ui.gadgets combinators combinators.lib combinators.cleave rewrite-closures fry accessors newfx processing.color processing.gadget ; IN: processing ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! : 2random ( a b -- num ) 2dup swap - 100 / random ; : 1random ( b -- num ) 0 swap 2random ; ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! : chance ( fraction -- ? ) 0 1 2random > ; : percent-chance ( percent -- ? ) 100 / chance ; ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! : at-fraction ( seq fraction -- val ) over length 1- * nth-at ; : at-fraction ( seq fraction -- val ) over length 1- * at ; : at-fraction-of ( fraction seq -- val ) swap at-fraction ; ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! VAR: fill-color VAR: stroke-color ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! GENERIC: set-color ( value -- ) METHOD: set-color { number } dup dup glColor3d ; METHOD: set-color { array } dup length { { 2 [ first2 >r dup dup r> glColor4d ] } { 3 [ first3 glColor3d ] } { 4 [ first4 glColor4d ] } } case ; METHOD: set-color { rgba } { [ red>> ] [ green>> ] [ blue>> ] [ alpha>> ] } cleave glColor4d ; ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! : fill ( value -- ) >fill-color ; : stroke ( value -- ) >stroke-color ; : no-fill ( -- ) fill-color> { { [ dup number? ] [ 0 2array fill ] } { [ t ] [ [ drop 0 ] [ length 1- ] [ ] tri set-nth ] } } cond ; : no-stroke ( -- ) stroke-color> { { [ dup number? ] [ 0 2array stroke ] } { [ t ] [ [ drop 0 ] [ length 1- ] [ ] tri set-nth ] } } cond ; ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! : stroke-weight ( w -- ) glLineWidth ; ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! : point* ( x y -- ) stroke-color> set-color GL_POINTS glBegin glVertex2d glEnd ; : point ( seq -- ) first2 point* ; : line ( x1 y1 x2 y2 -- ) stroke-color> set-color GL_LINES glBegin glVertex2d glVertex2d glEnd ; ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! : triangle ( x1 y1 x2 y2 x3 y3 -- ) GL_FRONT_AND_BACK GL_FILL glPolygonMode fill-color> set-color 6 ndup GL_TRIANGLES glBegin glVertex2d glVertex2d glVertex2d glEnd GL_FRONT_AND_BACK GL_LINE glPolygonMode stroke-color> set-color GL_TRIANGLES glBegin glVertex2d glVertex2d glVertex2d glEnd ; ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! : quad-vertices ( x1 y1 x2 y2 x3 y3 x4 y4 -- ) GL_POLYGON glBegin glVertex2d glVertex2d glVertex2d glVertex2d glEnd ; : quad ( x1 y1 x2 y2 x3 y3 x4 y4 -- ) 8 ndup GL_FRONT_AND_BACK GL_FILL glPolygonMode fill-color> set-color quad-vertices GL_FRONT_AND_BACK GL_LINE glPolygonMode stroke-color> set-color quad-vertices ; ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! : rect-vertices ( x y width height -- ) GL_POLYGON glBegin [ 2drop glVertex2d ] 4keep [ drop swap >r + 1- r> glVertex2d ] 4keep [ >r swap >r + 1- r> r> + 1- glVertex2d ] 4keep [ nip + 1- glVertex2d ] 4keep 4drop glEnd ; : rect ( x y width height -- ) 4dup GL_FRONT_AND_BACK GL_FILL glPolygonMode fill-color> set-color rect-vertices GL_FRONT_AND_BACK GL_LINE glPolygonMode stroke-color> set-color rect-vertices ; ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! : ellipse-disk ( x y width height -- ) glPushMatrix >r >r 0 glTranslated r> r> 1 glScaled gluNewQuadric dup 0 0.5 20 1 gluDisk gluDeleteQuadric glPopMatrix ; : ellipse-center ( x y width height -- ) 4dup GL_FRONT_AND_BACK GL_FILL glPolygonMode stroke-color> set-color ellipse-disk GL_FRONT_AND_BACK GL_FILL glPolygonMode fill-color> set-color [ 2 - ] bi@ ! [ stroke-width 1+ - ] bi@ ellipse-disk ; ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! SYMBOL: CENTER SYMBOL: RADIUS SYMBOL: CORNER SYMBOL: CORNERS SYMBOL: ellipse-mode-value : ellipse-mode ( val -- ) ellipse-mode-value set ; : ellipse-radius ( x y hori vert -- ) [ 2 * ] bi@ ellipse-center ; : ellipse-corner ( x y width height -- ) [ drop nip 2 / + ] 4keep [ nip rot drop 2 / + ] 4keep [ >r >r 2drop r> r> ] 4keep 4drop ellipse-center ; : ellipse-corners ( x1 y1 x2 y2 -- ) [ drop nip + 2 / ] 4keep [ nip rot drop + 2 / ] 4keep [ drop nip - abs 1+ ] 4keep [ nip rot drop - abs 1+ ] 4keep 4drop ellipse-center ; : ellipse ( a b c d -- ) ellipse-mode-value get { { CENTER [ ellipse-center ] } { RADIUS [ ellipse-radius ] } { CORNER [ ellipse-corner ] } { CORNERS [ ellipse-corners ] } } case ; ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! : circle ( pos size -- ) [ first2 ] [ dup ] bi* ellipse ; ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! USING: multi-methods ; ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! GENERIC: background ( value -- ) METHOD: background { number } dup dup 1 glClearColor GL_COLOR_BUFFER_BIT glClear ; METHOD: background { array } dup length { { 2 [ first2 >r dup dup r> glClearColor GL_COLOR_BUFFER_BIT glClear ] } { 3 [ first3 1 glClearColor GL_COLOR_BUFFER_BIT glClear ] } { 4 [ first4 glClearColor GL_COLOR_BUFFER_BIT glClear ] } } case ; ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! : translate ( x y -- ) 0 glTranslated ; : rotate ( angle -- ) 0 0 1 glRotated ; ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! : mouse ( -- point ) hand-loc get ; : mouse-x mouse first ; : mouse-y mouse second ; ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! VAR: frame-rate-value : frame-rate ( fps -- ) 1000 swap / >frame-rate-value ; ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! VAR: slate VAR: loop-flag : defaults ( -- ) 0.8 background 0 >stroke-color 1 >fill-color CENTER ellipse-mode 60 frame-rate ; ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! SYMBOL: size-val : size ( seq -- ) size-val set ; : size* ( width height -- ) 2array size-val set ; ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! SYMBOL: setup-action SYMBOL: draw-action ! : setup ( quot -- ) closed-quot setup-action set ; ! : draw ( quot -- ) closed-quot draw-action set ; : setup ( quot -- ) setup-action set ; : draw ( quot -- ) draw-action set ; ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! SYMBOL: key-down-action SYMBOL: key-up-action : key-down ( quot -- ) closed-quot key-down-action set ; : key-up ( quot -- ) closed-quot key-up-action set ; ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! SYMBOL: button-down-action SYMBOL: button-up-action : button-down ( quot -- ) closed-quot button-down-action set ; : button-up ( quot -- ) closed-quot button-up-action set ; ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! : start-processing-thread ( -- ) loop-flag get not [ loop-flag on [ [ loop-flag get ] processing-gadget get frame-rate-value> '[ , relayout-1 , sleep ] [ ] while ] in-thread ] when ; ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! : get-size ( -- size ) processing-gadget get rect-dim ; : width ( -- width ) get-size first ; : height ( -- height ) get-size second ; ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! SYMBOL: setup-called : setup-called? ( -- ? ) setup-called get ; ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! : run ( -- ) loop-flag off 500 sleep size-val get >>dim dup "Processing" open-window 500 sleep defaults setup-called off [ setup-called? not [ setup-action get call setup-called on ] [ draw-action get call ] if ] closed-quot >>action key-down-action get >>key-down key-up-action get >>key-up button-down-action get >>button-down button-up-action get >>button-up processing-gadget set start-processing-thread ;