Skip to main content

gizmo_scripting/
api_time.rs

1//! Time API — Lua'ya sunulan zaman fonksiyonları
2//!
3//! Delta time, toplam süre ve FPS bilgilerine erişim sağlar.
4
5use mlua::prelude::*;
6
7/// Time API fonksiyonlarını Lua'ya kaydeder
8pub fn register_time_api(lua: &Lua) -> Result<(), LuaError> {
9    crate::api_table::register_protected(lua, "time", |time_table| {
10
11    time_table.raw_set("_dt", 0.0f32)?;
12    time_table.raw_set("_elapsed", 0.0f32)?;
13    time_table.raw_set("_fps", 60.0f32)?;
14
15
16    // Lua helper fonksiyonları
17    lua.load(
18        r#"
19        function time.dt()
20            return time._dt
21        end
22        
23        function time.elapsed()
24            return time._elapsed
25        end
26        
27        function time.fps()
28            return time._fps
29        end
30    "#,
31    )
32    .exec()?;
33
34        Ok(())
35    })
36}
37
38/// Her frame zaman verisini günceller
39pub fn update_time_api(lua: &Lua, dt: f32, elapsed: f32, fps: f32) -> Result<(), LuaError> {
40    // The real table, not the global: the global is a read-only proxy so a script cannot
41    // rewrite the API (see `api_table`), and the engine's per-frame writes go behind it.
42    let time_table = crate::api_table::raw(lua, "time")?;
43    time_table.raw_set("_dt", dt)?;
44    time_table.raw_set("_elapsed", elapsed)?;
45    time_table.raw_set("_fps", fps)?;
46    Ok(())
47}
48
49#[cfg(test)]
50mod tests {
51    use super::*;
52    use mlua::Lua;
53
54    fn eval_f32(lua: &Lua, expr: &str) -> f32 {
55        lua.load(format!("return {expr}")).eval().unwrap()
56    }
57
58    /// Kayıt sonrası varsayılanlar: dt=0, elapsed=0, fps=60. Getter'lar bunları okumalı.
59    #[test]
60    fn defaults_after_register() {
61        let lua = Lua::new();
62        register_time_api(&lua).unwrap();
63        assert_eq!(eval_f32(&lua, "time.dt()"), 0.0);
64        assert_eq!(eval_f32(&lua, "time.elapsed()"), 0.0);
65        assert_eq!(eval_f32(&lua, "time.fps()"), 60.0);
66    }
67
68    /// update_time_api getter'lara yansımalı ve önceki değerleri EZMELİ (overwrite).
69    #[test]
70    fn update_reflects_and_overwrites() {
71        let lua = Lua::new();
72        register_time_api(&lua).unwrap();
73
74        update_time_api(&lua, 0.016, 1.5, 62.5).unwrap();
75        assert!((eval_f32(&lua, "time.dt()") - 0.016).abs() < 1e-6);
76        assert!((eval_f32(&lua, "time.elapsed()") - 1.5).abs() < 1e-6);
77        assert!((eval_f32(&lua, "time.fps()") - 62.5).abs() < 1e-6);
78
79        // İkinci güncelleme öncekini tamamen ezmeli.
80        update_time_api(&lua, 0.033, 9.0, 30.0).unwrap();
81        assert!((eval_f32(&lua, "time.dt()") - 0.033).abs() < 1e-6);
82        assert!((eval_f32(&lua, "time.elapsed()") - 9.0).abs() < 1e-6);
83        assert!((eval_f32(&lua, "time.fps()") - 30.0).abs() < 1e-6);
84    }
85}