USING: ui ui.gadgets sequences kernel arrays math colors ui.render math.vectors accessors fry ui.gadgets.packs game-input ui.gadgets.labels ui.gadgets.borders alarms calendar locals strings ui.gadgets.buttons combinators math.parser assocs threads ; IN: joystick-demo : SIZE { 151 151 } ; : INDICATOR-SIZE { 4 4 } ; : FREQUENCY ( -- f ) 30 recip seconds ; TUPLE: axis-gadget < gadget indicator z-indicator pov ; M: axis-gadget pref-dim* drop SIZE ; : (rect-polygon) ( lo hi -- polygon ) 2dup [ [ second ] [ first ] bi* swap 2array ] [ [ first ] [ second ] bi* 2array ] 2bi swapd 4array ; : indicator-polygon ( -- polygon ) { 0 0 } INDICATOR-SIZE (rect-polygon) ; : pov-polygons V{ { pov-neutral { { 70 75 } { 75 70 } { 80 75 } { 75 80 } } } { pov-up { { 70 65 } { 75 60 } { 80 65 } } } { pov-up-right { { 83 60 } { 90 60 } { 90 67 } } } { pov-right { { 85 70 } { 90 75 } { 85 80 } } } { pov-down-right { { 90 83 } { 90 90 } { 83 90 } } } { pov-down { { 70 85 } { 75 90 } { 80 85 } } } { pov-down-left { { 67 90 } { 60 90 } { 60 83 } } } { pov-left { { 65 70 } { 60 75 } { 65 80 } } } { pov-up-left { { 67 60 } { 60 60 } { 60 67 } } } } ; : ( color -- indicator ) indicator-polygon ; : (>loc) ( axisloc -- windowloc ) 0.5 v*n { 0.5 0.5 } v+ SIZE v* [ >integer ] map INDICATOR-SIZE 2 v/n v- ; : (xy>loc) ( x y -- xyloc ) 2array (>loc) ; : (z>loc) ( z -- zloc ) 0.0 swap 2array (>loc) ; : (xyz>loc) ( x y z -- xyloc zloc ) [ [ 0.0 ] unless* ] tri@ [ (xy>loc) ] dip (z>loc) ; : move-axis ( gadget x y z -- ) (xyz>loc) rot tuck [ indicator>> (>>loc) ] [ z-indicator>> (>>loc) ] 2bi* ; : move-pov ( gadget pov -- ) swap pov>> [ interior>> -rot = [ gray ] [ white ] if >>color drop ] with assoc-each ; :: add-pov-gadget ( gadget direction polygon -- gadget direction gadget ) gadget white polygon [ add-gadget ] keep direction swap ; : add-pov-gadgets ( gadget -- gadget ) pov-polygons [ add-pov-gadget ] assoc-map >>pov ; : ( -- gadget ) axis-gadget new-gadget add-pov-gadgets black [ >>z-indicator ] [ add-gadget ] bi red [ >>indicator ] [ add-gadget ] bi dup [ 0.0 0.0 0.0 move-axis ] [ f move-pov ] bi ; TUPLE: joystick-demo-gadget < pack axis raxis controller buttons alarm ; : add-gadget-with-border ( parent child -- parent ) 2 gray >>boundary add-gadget ; : add-controller-label ( gadget controller -- gadget ) [ >>controller ] [ product-string