HOOK: beep ui-backend ( -- )
-: parse-main-window ( class -- attributes quot )
- "{" expect dup all-slots parse-tuple-literal-slots
- parse-definition ;
+: parse-main-window-attributes ( class -- attributes )
+ "{" expect dup all-slots parse-tuple-literal-slots ;
: define-main-window ( word attributes quot -- )
[
] [ 2drop current-vocab (>>main) ] 3bi ;
SYNTAX: MAIN-WINDOW:
- CREATE world-attributes parse-main-window define-main-window ;
+ CREATE
+ world-attributes parse-main-window-attributes
+ parse-definition
+ define-main-window ;
-USING: accessors game.input game.loop kernel math ui.gadgets
-ui.gadgets.worlds ui.gestures threads ;
+USING: accessors combinators fry game.input game.loop generic kernel math
+parser sequences ui ui.gadgets ui.gadgets.worlds ui.gestures threads
+words ;
IN: game.worlds
TUPLE: game-world < world
TUPLE: game-attributes < world-attributes
{ tick-interval-micros fixnum read-only } ;
+: verify-game-attributes ( attributes -- )
+ world-class>> { f world } member?
+ [ "GAME: must be given a custom world-class" throw ] when ;
+
+: define-game-tick-interval-micros ( attributes -- )
+ [ world-class>> \ tick-interval-micros create-method ]
+ [ tick-interval-micros>> '[ drop _ ] ] bi
+ define ;
+
+: define-game-methods ( attributes -- )
+ {
+ [ verify-game-attributes ]
+ [ define-game-tick-interval-micros ]
+ } cleave ;
+
+: define-game ( word attributes -- )
+ [ [ ] define-main-window ]
+ [ nip define-game-methods ] 2bi ;
+
+SYNTAX: GAME:
+ CREATE
+ game-attributes parse-main-window-attributes
+ define-game ;
math.matrices math.vectors.simd math.parser math.vectors
method-chains namespaces sequences splitting threads ui ui.gadgets
ui.gadgets.worlds ui.pixel-formats specialized-arrays
-specialized-vectors ;
+specialized-vectors literals ;
FROM: alien.c-types => float ;
SPECIALIZED-ARRAY: float
SPECIALIZED-VECTOR: uint
AFTER: bunny-world resize-world
[ sobel>> framebuffer>> ] [ dim>> ] bi resize-framebuffer ;
-M: bunny-world pref-dim* drop { 1024 768 } ;
-M: bunny-world tick-interval-micros drop 1000000 60 /i ;
M: bunny-world wasd-movement-speed drop 1/160. ;
M: bunny-world wasd-near-plane drop 1/32. ;
M: bunny-world wasd-far-plane drop 256.0 ;
-: bunny-window ( -- )
- [
- f T{ world-attributes
- { world-class bunny-world }
- { title "Bunny" }
- { pixel-format-attributes {
- windowed
- double-buffered
- T{ depth-bits { value 24 } }
- } }
- { grab-input? t }
- } open-window
- ] with-ui ;
-
-MAIN: bunny-window
+GAME: bunny-game {
+ { world-class bunny-world }
+ { title "Bunny" }
+ { pixel-format-attributes {
+ windowed
+ double-buffered
+ T{ depth-bits { value 24 } }
+ } }
+ { grab-input? t }
+ { pref-dim { 1024 768 } }
+ { tick-interval-micros $[ 1,000,000 60 /i ] }
+ }
{ "vertex-array" [ vertex-array>> ] }
} <render-set> render ;
-M: raytrace-world pref-dim* drop { 1024 768 } ;
-M: raytrace-world tick-interval-micros drop 1000000 60 /i ;
M: raytrace-world wasd-movement-speed drop 1/4. ;
-: raytrace-window ( -- )
- [
- f T{ world-attributes
- { world-class raytrace-world }
- { title "Raytracing" }
- { pixel-format-attributes {
- windowed
- double-buffered
- } }
- { grab-input? t }
- } open-window
- ] with-ui ;
-
-MAIN: raytrace-window
+GAME: raytrace-game {
+ { world-class raytrace-world }
+ { title "Raytracing" }
+ { pixel-format-attributes {
+ windowed
+ double-buffered
+ } }
+ { grab-input? t }
+ { pref-dim { 1024 768 } }
+ { tick-interval-micros $[ 1,000,000 60 /i ] }
+ }
float-4{ 0.0 0.0 0.0 1.0 } >>velocity
VELOCITY-MODIFIER-NORMAL >>velocity-modifier ;
-M: terrain-world tick-interval-micros
- drop 1000000 60 /i ;
-
: frustum ( dim -- -x x -y y near far )
dup first2 min v/n
NEAR-PLANE FOV / v*n first2 [ [ neg ] keep ] bi@
] with-gl-program ]
} cleave gl-error ;
-M: terrain-world pref-dim* drop { 1024 768 } ;
-
-: terrain-window ( -- )
- [
- f T{ world-attributes
- { world-class terrain-world }
- { title "Terrain" }
- { pixel-format-attributes {
- windowed
- double-buffered
- T{ depth-bits { value 24 } }
- } }
- { grab-input? t }
- } open-window
- ] with-ui ;
-
-MAIN: terrain-window
+GAME: terrain-game {
+ { world-class terrain-world }
+ { title "Terrain" }
+ { pixel-format-attributes {
+ windowed
+ double-buffered
+ T{ depth-bits { value 24 } }
+ } }
+ { grab-input? t }
+ { pref-dim { 1024 768 } }
+ { tick-interval-micros $[ 1,000,000 60 /i ] }
+ }