package platform import "core:time" Time_State :: struct { start_time: time.Time, last_frame_time: time.Time, delta: f32, total: f64, frame_count: u64, target_fps: i32, fps: i32, fps_counter: i32, fps_timer: f64, } init_time :: proc(state: ^Time_State) { now := time.now() state.start_time = now state.last_frame_time = now state.delta = 0 state.total = 0 state.frame_count = 0 state.target_fps = 0 state.fps = 0 state.fps_counter = 0 state.fps_timer = 0 } update_time :: proc(state: ^Platform_State) { now := time.now() elapsed := time.duration_seconds(time.diff(state.time.last_frame_time, now)) state.time.delta = f32(elapsed) state.time.total = time.duration_seconds(time.diff(state.time.start_time, now)) state.time.last_frame_time = now state.time.frame_count += 1 // FPS counter state.time.fps_counter += 1 state.time.fps_timer += elapsed if state.time.fps_timer >= 1.0 { state.time.fps = state.time.fps_counter state.time.fps_counter = 0 state.time.fps_timer -= 1.0 } } set_target_fps :: proc(state: ^Platform_State, fps: i32) { state.time.target_fps = fps } get_frame_time :: proc(state: ^Platform_State) -> f32 { return state.time.delta } get_time :: proc(state: ^Platform_State) -> f64 { return state.time.total } get_fps :: proc(state: ^Platform_State) -> i32 { return state.time.fps } wait_for_target_fps :: proc(state: ^Platform_State) { if state.time.target_fps <= 0 { return } target_frame_time := 1.0 / f64(state.time.target_fps) now := time.now() elapsed := time.duration_seconds(time.diff(state.time.last_frame_time, now)) remaining := target_frame_time - elapsed if remaining > 0 { time.sleep(time.Duration(remaining * f64(time.Second))) } }