Skip to main content

luaur_vm/functions/
luaopen_vector.rs

1//! Node: `cxx:Function:Luau.VM:VM/src/lveclib.cpp:341:luaopen_vector`
2//! Source: `VM/src/lveclib.cpp:301-359` (hand-ported)
3
4use crate::functions::createmetatable_lveclib::createmetatable;
5use crate::functions::lua_l_register::lua_l_register;
6use crate::functions::lua_pushvector_lapi::lua_pushvector_lua_state_f32_f32_f32_f32;
7use crate::functions::lua_pushvector_lapi_alt_b::lua_pushvector_lua_state_f32_f32_f32;
8use crate::functions::lua_setfield::lua_setfield;
9use crate::functions::vector_abs::vector_abs;
10use crate::functions::vector_angle::vector_angle;
11use crate::functions::vector_ceil::vector_ceil;
12use crate::functions::vector_clamp::vector_clamp;
13use crate::functions::vector_create::vector_create;
14use crate::functions::vector_cross::vector_cross;
15use crate::functions::vector_dot::vector_dot;
16use crate::functions::vector_floor::vector_floor;
17use crate::functions::vector_lerp::vector_lerp;
18use crate::functions::vector_magnitude::vector_magnitude;
19use crate::functions::vector_max::vector_max;
20use crate::functions::vector_min::vector_min;
21use crate::functions::vector_normalize::vector_normalize;
22use crate::functions::vector_sign::vector_sign;
23use crate::macros::lua_vector_size::LUA_VECTOR_SIZE;
24use crate::records::lua_l_reg::LuaLReg;
25use crate::type_aliases::lua_state::lua_State;
26
27struct VectorFuncs([LuaLReg; 15]);
28unsafe impl Sync for VectorFuncs {}
29
30static VECTOR_FUNCS: VectorFuncs = VectorFuncs([
31    LuaLReg {
32        name: c"create".as_ptr(),
33        func: Some(vector_create),
34    },
35    LuaLReg {
36        name: c"magnitude".as_ptr(),
37        func: Some(vector_magnitude),
38    },
39    LuaLReg {
40        name: c"normalize".as_ptr(),
41        func: Some(vector_normalize),
42    },
43    LuaLReg {
44        name: c"cross".as_ptr(),
45        func: Some(vector_cross),
46    },
47    LuaLReg {
48        name: c"dot".as_ptr(),
49        func: Some(vector_dot),
50    },
51    LuaLReg {
52        name: c"angle".as_ptr(),
53        func: Some(vector_angle),
54    },
55    LuaLReg {
56        name: c"floor".as_ptr(),
57        func: Some(vector_floor),
58    },
59    LuaLReg {
60        name: c"ceil".as_ptr(),
61        func: Some(vector_ceil),
62    },
63    LuaLReg {
64        name: c"abs".as_ptr(),
65        func: Some(vector_abs),
66    },
67    LuaLReg {
68        name: c"sign".as_ptr(),
69        func: Some(vector_sign),
70    },
71    LuaLReg {
72        name: c"clamp".as_ptr(),
73        func: Some(vector_clamp),
74    },
75    LuaLReg {
76        name: c"max".as_ptr(),
77        func: Some(vector_max),
78    },
79    LuaLReg {
80        name: c"min".as_ptr(),
81        func: Some(vector_min),
82    },
83    LuaLReg {
84        name: c"lerp".as_ptr(),
85        func: Some(vector_lerp),
86    },
87    LuaLReg {
88        name: core::ptr::null(),
89        func: None,
90    },
91]);
92
93#[allow(non_snake_case)]
94pub unsafe fn luaopen_vector(L: *mut lua_State) -> core::ffi::c_int {
95    lua_l_register(L, c"vector".as_ptr(), VECTOR_FUNCS.0.as_ptr());
96
97    if LUA_VECTOR_SIZE == 4 {
98        lua_pushvector_lua_state_f32_f32_f32_f32(L, 0.0, 0.0, 0.0, 0.0);
99        lua_setfield(L, -2, c"zero".as_ptr());
100        lua_pushvector_lua_state_f32_f32_f32_f32(L, 1.0, 1.0, 1.0, 1.0);
101        lua_setfield(L, -2, c"one".as_ptr());
102    } else {
103        lua_pushvector_lua_state_f32_f32_f32(L, 0.0, 0.0, 0.0);
104        lua_setfield(L, -2, c"zero".as_ptr());
105        lua_pushvector_lua_state_f32_f32_f32(L, 1.0, 1.0, 1.0);
106        lua_setfield(L, -2, c"one".as_ptr());
107    }
108
109    createmetatable(L);
110
111    1
112}