]> gitweb.factorcode.org Git - factor.git/blob - extra/jamshred/jamshred.factor
Merge branch 'fix-bloom-filters-test' of git://github.com/alec/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 arrays calendar jamshred.game jamshred.gl jamshred.player jamshred.log kernel math math.constants math.rectangles math.vectors namespaces sequences threads ui ui.backend ui.gadgets ui.gadgets.worlds ui.gestures ui.render ;
4 IN: jamshred
5
6 TUPLE: jamshred-gadget < gadget { jamshred jamshred } last-hand-loc ;
7
8 : <jamshred-gadget> ( jamshred -- gadget )
9     jamshred-gadget new swap >>jamshred ;
10
11 CONSTANT: default-width 800
12 CONSTANT: default-height 600
13
14 M: jamshred-gadget pref-dim*
15     drop default-width default-height 2array ;
16
17 M: jamshred-gadget draw-gadget* ( gadget -- )
18     [ jamshred>> ] [ dim>> first2 draw-jamshred ] bi ;
19
20 : jamshred-loop ( gadget -- )
21     dup jamshred>> quit>> [
22         drop
23     ] [
24         [ jamshred>> jamshred-update ]
25         [ relayout-1 ]
26         [ 100 milliseconds sleep jamshred-loop ] tri 
27     ] if ;
28
29 M: jamshred-gadget graft* ( gadget -- )
30     [ find-gl-context init-graphics ]
31     [ [ jamshred-loop ] curry in-thread ] bi ;
32
33 M: jamshred-gadget ungraft* ( gadget -- )
34     dup find-gl-context cleanup-graphics jamshred>> t swap (>>quit) ;
35
36 : jamshred-restart ( jamshred-gadget -- )
37     <jamshred> >>jamshred drop ;
38
39 : pix>radians ( n m -- theta )
40     / pi 4 * * ; ! 2 / / pi 2 * * ;
41
42 : x>radians ( x gadget -- theta )
43     #! translate motion of x pixels to an angle
44     dim>> first pix>radians neg ;
45
46 : y>radians ( y gadget -- theta )
47     #! translate motion of y pixels to an angle
48     dim>> second pix>radians ;
49
50 : (handle-mouse-motion) ( jamshred-gadget mouse-motion -- )
51     dupd [ first swap x>radians ] [ second swap y>radians ] 2bi
52     rot jamshred>> mouse-moved ;
53     
54 : handle-mouse-motion ( jamshred-gadget -- )
55     hand-loc get [
56         over last-hand-loc>> [
57             v- (handle-mouse-motion) 
58         ] [ 2drop ] if* 
59     ] 2keep >>last-hand-loc drop ;
60
61 : handle-mouse-scroll ( jamshred-gadget -- )
62     jamshred>> scroll-direction get
63     [ first mouse-scroll-x ]
64     [ second mouse-scroll-y ] 2bi ;
65
66 : quit ( gadget -- )
67     [ f set-fullscreen ] [ close-window ] bi ;
68
69 jamshred-gadget H{
70     { T{ key-down f f "r" } [ jamshred-restart ] }
71     { T{ key-down f f " " } [ jamshred>> toggle-running ] }
72     { T{ key-down f f "f" } [ toggle-fullscreen ] }
73     { T{ key-down f f "UP" } [ jamshred>> jamshred-player 1 swap change-player-speed ] }
74     { T{ key-down f f "DOWN" } [ jamshred>> jamshred-player -1 swap change-player-speed ] }
75     { T{ key-down f f "LEFT" } [ jamshred>> 1 jamshred-roll ] }
76     { T{ key-down f f "RIGHT" } [ jamshred>> -1 jamshred-roll ] }
77     { T{ key-down f f "q" } [ quit ] }
78     { motion [ handle-mouse-motion ] }
79     { mouse-scroll [ handle-mouse-scroll ] }
80 } set-gestures
81
82 : jamshred-window ( -- )
83     [ <jamshred> <jamshred-gadget> "Jamshred" open-window ] with-ui ;
84
85 MAIN: jamshred-window