diff --git a/VM/include/llsl.h b/VM/include/llsl.h index 9dde73f5..57de12f2 100644 --- a/VM/include/llsl.h +++ b/VM/include/llsl.h @@ -127,6 +127,9 @@ uint8_t lua_lsl_type(const TValue *tv); int lsl_cast(lua_State *L); int lsl_cast_list_elem(lua_State *L); int lsl_cast_list_elem_poszero(lua_State *L); +int lua_quaternion_tofwd(lua_State *L); +int lua_quaternion_toleft(lua_State *L); +int lua_quaternion_toup(lua_State *L); void conj_quat(float *quat); void rot_vec(const float *vec, const float *rot, float *res); diff --git a/VM/src/lll.cpp b/VM/src/lll.cpp index 18bc43fa..06aa0643 100644 --- a/VM/src/lll.cpp +++ b/VM/src/lll.cpp @@ -896,6 +896,9 @@ static const luaL_Reg lllib[] = { {"ToLower", ll_to_lower}, {"ToUpper", ll_to_upper}, {"GetTime", ll_get_time}, + {"Rot2Fwd", lua_quaternion_tofwd}, + {"Rot2Left", lua_quaternion_toleft}, + {"Rot2Up", lua_quaternion_toup}, {NULL, NULL}, }; diff --git a/VM/src/llsl.cpp b/VM/src/llsl.cpp index 9fa24ff9..e47280e4 100644 --- a/VM/src/llsl.cpp +++ b/VM/src/llsl.cpp @@ -1616,21 +1616,21 @@ static inline void push_rotated_vector(lua_State *L, const float* vec) { lua_pushvector(L, res[0], res[1], res[2]); } -static int lua_quaternion_tofwd(lua_State *L) +int lua_quaternion_tofwd(lua_State *L) { const float vec[3] = {1.0f, 0.0f, 0.0f}; push_rotated_vector(L, vec); return 1; } -static int lua_quaternion_toleft(lua_State *L) +int lua_quaternion_toleft(lua_State *L) { const float vec[3] = {0.0f, 1.0f, 0.0f}; push_rotated_vector(L, vec); return 1; } -static int lua_quaternion_toup(lua_State *L) +int lua_quaternion_toup(lua_State *L) { const float vec[3] = {0.0f, 0.0f, 1.0f}; push_rotated_vector(L, vec); @@ -1644,9 +1644,6 @@ static const luaL_Reg quaternionlib[] = { {"dot", lua_quaternion_dot}, {"slerp", lua_quaternion_slerp}, {"conjugate", lua_quaternion_conjugate}, - {"tofwd", lua_quaternion_tofwd}, - {"toleft", lua_quaternion_toleft}, - {"toup", lua_quaternion_toup}, {NULL, NULL}, }; diff --git a/tests/conformance/quaternion.lua b/tests/conformance/quaternion.lua index 27d93b3c..31bbc393 100644 --- a/tests/conformance/quaternion.lua +++ b/tests/conformance/quaternion.lua @@ -24,14 +24,14 @@ assert(quaternion.conjugate(quat) == quaternion(-quat.x, -quat.y, -quat.z, quat. assert(`{quaternion.slerp(yaw_ninety, quaternion(0, 0, 0, 1), 0.5)}` == "<0, 0, 0.382683, 0.92388>") -- string cast to deal with precision -assert(`{quaternion.tofwd(yaw_ninety)}` == "<0, 1, 0>") -assert(`{quaternion.toleft(yaw_ninety)}` == "<-1, 0, 0>") -assert(`{quaternion.toup(yaw_ninety)}` == "<0, 0, 1>") +assert(`{ll.Rot2Fwd(yaw_ninety)}` == "<0, 1, 0>") +assert(`{ll.Rot2Left(yaw_ninety)}` == "<-1, 0, 0>") +assert(`{ll.Rot2Up(yaw_ninety)}` == "<0, 0, 1>") -- Zero quaternion normalizes to identity before rotation (matches server) -assert(`{quaternion.tofwd(quaternion(0, 0, 0, 0))}` == "<1, 0, 0>") -assert(`{quaternion.toleft(quaternion(0, 0, 0, 0))}` == "<0, 1, 0>") -assert(`{quaternion.toup(quaternion(0, 0, 0, 0))}` == "<0, 0, 1>") +assert(`{ll.Rot2Fwd(quaternion(0, 0, 0, 0))}` == "<1, 0, 0>") +assert(`{ll.Rot2Left(quaternion(0, 0, 0, 0))}` == "<0, 1, 0>") +assert(`{ll.Rot2Up(quaternion(0, 0, 0, 0))}` == "<0, 0, 1>") -- Test that tostring doesn't lose precision for large component values assert(`{vector(123456.5, 0, 0)}` == "<123456.5, 0, 0>")