IN: game.loop
TUPLE: game-loop
- { tick-length integer read-only }
+ { tick-interval-micros integer read-only }
delegate
{ last-tick integer }
thread
last-tick>> system-micros swap - ;
: tick-slice ( loop -- slice )
- [ since-last-tick ] [ tick-length>> ] bi /f 1.0 min ;
+ [ since-last-tick ] [ tick-interval-micros>> ] bi /f 1.0 min ;
CONSTANT: MAX-FRAMES-TO-SKIP 5
: increment-tick ( loop -- )
[ 1 + ] change-tick-number
- dup tick-length>> [ + ] curry change-last-tick
+ dup tick-interval-micros>> [ + ] curry change-last-tick
drop ;
: ?tick ( loop count -- )
[ system-micros >>last-tick drop ] [
- over [ since-last-tick ] [ tick-length>> ] bi >=
+ over [ since-last-tick ] [ tick-interval-micros>> ] bi >=
[ [ drop increment-tick ] [ drop tick ] [ 1 - ?tick ] 2tri ]
[ 2drop ] if
] if-zero ;
f >>thread
drop ;
-: <game-loop> ( tick-length delegate -- loop )
+: <game-loop> ( tick-interval-micros delegate -- loop )
system-micros f f 0 0 system-micros 0 0
game-loop boa ;
game-loop
{ tick-slice float initial: 0.0 } ;
-GENERIC: tick-length ( world -- micros )
+GENERIC: tick-interval-micros ( world -- micros )
M: game-world draw*
swap >>tick-slice relayout-1 yield ;
M: game-world begin-world
open-game-input
- dup [ tick-length ] [ ] bi <game-loop> [ >>game-loop ] keep start-loop
+ dup [ tick-interval-micros ] [ ] bi <game-loop> [ >>game-loop ] keep start-loop
drop ;
M: game-world end-world
close-game-input
drop ;
+TUPLE: game-attributes < world-attributes
+ { tick-interval-micros fixnum read-only } ;
+
[ sobel>> framebuffer>> ] [ dim>> ] bi resize-framebuffer ;
M: bunny-world pref-dim* drop { 1024 768 } ;
-M: bunny-world tick-length drop 1000000 60 /i ;
+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 ;
} <render-set> render ;
M: raytrace-world pref-dim* drop { 1024 768 } ;
-M: raytrace-world tick-length drop 1000000 60 /i ;
+M: raytrace-world tick-interval-micros drop 1000000 60 /i ;
M: raytrace-world wasd-movement-speed drop 1/4. ;
: raytrace-window ( -- )
float-4{ 0.0 0.0 0.0 1.0 } >>velocity
VELOCITY-MODIFIER-NORMAL >>velocity-modifier ;
-M: terrain-world tick-length
+M: terrain-world tick-interval-micros
drop 1000000 60 /i ;
: frustum ( dim -- -x x -y y near far )