Harbor

branch main
showing the latest snapshot on main
time.odin 1.7 KB · Plain text
platform/time.odin 0644 Raw
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)))
	}
}