]> gitweb.factorcode.org Git - factor.git/blob - extra/jamshred/jamshred.factor
Merge branch 'master' of git://factorcode.org/git/factor
[factor.git] / extra / jamshred / jamshred.factor
1 ! Copyright (C) 2007, 2008 Alex Chapman
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: accessors alarms arrays calendar jamshred.game jamshred.gl
4 jamshred.player jamshred.log kernel math math.constants namespaces
5 sequences threads ui ui.backend ui.gadgets ui.gadgets.worlds
6 ui.gestures ui.render math.vectors math.geometry.rect ;
7 IN: jamshred
8
9 TUPLE: jamshred-gadget jamshred last-hand-loc alarm ;
10
11 : <jamshred-gadget> ( jamshred -- gadget )
12     jamshred-gadget construct-gadget swap >>jamshred ;
13
14 : default-width ( -- x ) 800 ;
15 : default-height ( -- y ) 600 ;
16
17 M: jamshred-gadget pref-dim*
18     drop default-width default-height 2array ;
19
20 M: jamshred-gadget draw-gadget* ( gadget -- )
21     [ jamshred>> ] [ rect-dim first2 draw-jamshred ] bi ;
22
23 : jamshred-loop ( gadget -- )
24     dup jamshred>> quit>> [
25         drop
26     ] [
27         [ jamshred>> jamshred-update ]
28         [ relayout-1 ]
29         [ yield jamshred-loop ] tri
30     ] if ;
31
32 : fullscreen ( gadget -- )
33     find-world t swap set-fullscreen* ;
34
35 : no-fullscreen ( gadget -- )
36     find-world f swap set-fullscreen* ;
37
38 : toggle-fullscreen ( world -- )
39     [ fullscreen? not ] keep set-fullscreen* ;
40
41 M: jamshred-gadget graft* ( gadget -- )
42     [ jamshred-loop ] in-thread drop ;
43
44 M: jamshred-gadget ungraft* ( gadget -- )
45     jamshred>> t swap (>>quit) ;
46
47 : jamshred-restart ( jamshred-gadget -- )
48     <jamshred> >>jamshred drop ;
49
50 : pix>radians ( n m -- theta )
51     / pi 4 * * ; ! 2 / / pi 2 * * ;
52
53 : x>radians ( x gadget -- theta )
54     #! translate motion of x pixels to an angle
55     rect-dim first pix>radians neg ;
56
57 : y>radians ( y gadget -- theta )
58     #! translate motion of y pixels to an angle
59     rect-dim second pix>radians ;
60
61 : (handle-mouse-motion) ( jamshred-gadget mouse-motion -- )
62     over jamshred>> >r
63     [ first swap x>radians ] 2keep second swap y>radians
64     r> mouse-moved ;
65     
66 : handle-mouse-motion ( jamshred-gadget -- )
67     hand-loc get [
68         over last-hand-loc>> [
69             v- (handle-mouse-motion) 
70         ] [ 2drop ] if* 
71     ] 2keep >>last-hand-loc drop ;
72
73 : handle-mouse-scroll ( jamshred-gadget -- )
74     jamshred>> scroll-direction get
75     [ first mouse-scroll-x ]
76     [ second mouse-scroll-y ] 2bi ;
77
78 : quit ( gadget -- )
79     [ no-fullscreen ] [ close-window ] bi ;
80
81 jamshred-gadget H{
82     { T{ key-down f f "r" } [ jamshred-restart ] }
83     { T{ key-down f f " " } [ jamshred>> toggle-running ] }
84     { T{ key-down f f "f" } [ find-world toggle-fullscreen ] }
85     { T{ key-down f f "UP" } [ jamshred>> jamshred-player 1 swap change-player-speed ] }
86     { T{ key-down f f "DOWN" } [ jamshred>> jamshred-player -1 swap change-player-speed ] }
87     { T{ key-down f f "LEFT" } [ jamshred>> 1 jamshred-roll ] }
88     { T{ key-down f f "RIGHT" } [ jamshred>> -1 jamshred-roll ] }
89     { T{ key-down f f "q" } [ quit ] }
90     { T{ motion } [ handle-mouse-motion ] }
91     { T{ mouse-scroll } [ handle-mouse-scroll ] }
92 } set-gestures
93
94 : jamshred-window ( -- jamshred )
95     [ <jamshred> dup <jamshred-gadget> "Jamshred" open-window ] with-ui ;
96
97 MAIN: jamshred-window