ndless_sdl/gfx/
framerate.rs

1pub mod ll {
2	/// Structure holding the state and timing information of the framerate
3	/// controller.
4	#[repr(C)]
5	#[derive(Debug, Copy, Clone, Default)]
6	pub struct FPSmanager {
7		pub framecount: u32,
8		pub rateticks: f32,
9		pub lastticks: u32,
10		pub rate: u32,
11	}
12
13	extern "C" {
14		pub fn SDL_initFramerate(manager: *mut FPSmanager);
15		pub fn SDL_setFramerate(manager: *mut FPSmanager, rate: u32) -> cty::c_int;
16		pub fn SDL_getFramerate(manager: *mut FPSmanager) -> cty::c_int;
17		pub fn SDL_getFramecount(manager: *mut FPSmanager) -> cty::c_int;
18		pub fn SDL_framerateDelay(manager: *mut FPSmanager);
19	}
20}
21
22/// Example:
23/// ```
24/// let manager = FPS::new();
25/// manager.framerate(60); // 60 FPS
26/// loop {
27///     println!("loop");
28///     manager.delay();
29/// }
30/// ```
31#[derive(Debug)]
32pub struct FPS {
33	manager: ll::FPSmanager,
34}
35
36impl Default for FPS {
37	fn default() -> Self {
38		let mut manager: ll::FPSmanager = Default::default();
39		unsafe { ll::SDL_initFramerate(&mut manager) };
40		Self { manager }
41	}
42}
43
44impl FPS {
45	pub fn new() -> Self {
46		Default::default()
47	}
48	pub fn delay(&mut self) {
49		unsafe { ll::SDL_framerateDelay(&mut self.manager) }
50	}
51	pub fn framerate(&mut self, rate: u32) {
52		unsafe {
53			ll::SDL_setFramerate(&mut self.manager, rate);
54		}
55	}
56	pub fn get_framerate(&self) -> u32 {
57		self.manager.rate
58	}
59	pub fn frame_count(&self) -> u32 {
60		self.manager.framecount
61	}
62}