1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
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)))
}
}