diff --git a/doc/ru/scripting/builtins/libvecn.md b/doc/ru/scripting/builtins/libvecn.md index 9f20dfed..bc847bf9 100644 --- a/doc/ru/scripting/builtins/libvecn.md +++ b/doc/ru/scripting/builtins/libvecn.md @@ -31,6 +31,9 @@ vecn.add(a: vector, b: vector) -- возвращает результат сложения вектора и скаляра vecn.add(a: vector, b: number) + +-- записывает результат сложения двух векторов в dst +vec.add(a: vector, b: vector, dst: vector) ``` #### Вычитание - *vecn.sub(...)* @@ -41,6 +44,9 @@ vecn.sub(a: vector, b: vector) -- возвращает результат вычитания скаляра из вектора vecn.sub(a: vector, b: number) + +-- записывает результат вычитания двух векторов в dst +vec.sub(a: vector, b: vector, dst: vector) ``` #### Умножение - *vecn.mul(...)* @@ -58,6 +64,9 @@ vecn.mul(a: vector, b: number) ```lua -- возвращает результат инверсии (противоположный) вектора vecn.inverse(a: vector) + +-- записывает инвертированный вектор в dst +vec.inverse(v: vector, dst: vector) ``` #### Деление - *vecn.div(...)* @@ -68,6 +77,9 @@ vecn.div(a: vector, b: vector) -- возвращает результат деления вектора на скаляр vecn.div(a: vector, b: number) + +-- записывает результат деления двух векторов в dst +vec.div(a: vector, b: vector, dst: vector) ``` #### Нормализация - *vecn.norm(...)* @@ -75,12 +87,17 @@ vecn.div(a: vector, b: number) ```lua -- возвращает нормализованный вектор vecn.normalize(a: vector) + +-- записывает нормализованный вектор в dst +vec.normalize(v: vector, dst: vector) ``` + #### Длина вектора - *vecn.len(...)* ```lua -- возвращает длину вектора vecn.length(a: vector) + ``` #### Абсолютное значение - *vecn.abs(...)* @@ -88,6 +105,9 @@ vecn.length(a: vector) ```lua -- возвращает вектор с абсолютными значениями vecn.abs(a: vector) + +-- записывает абсолютное значение вектора в dst +vec.abs(v: vector, dst: vector) ``` #### Округление - *vecn.round(...)* @@ -95,6 +115,9 @@ vecn.abs(a: vector) ```lua -- возвращает вектор с округленными значениями vecn.round(a: vector) + +-- записывает округленный вектор в dst +vec.round(v: vector, dst: vector) ``` #### Степень - *vecn.pow(...)* @@ -102,6 +125,9 @@ vecn.round(a: vector) ```lua -- возвращает вектор с элементами, возведенными в степень vecn.pow(a: vector, b: number) + +-- записывает вектор, возведенный в степень, в dst +vec.pow(v: vector, exponent: number, dst: vector) ``` #### Скалярное произведение - *vecn.dot(...)* diff --git a/src/logic/scripting/lua/libvecn.cpp b/src/logic/scripting/lua/libvecn.cpp index 9d92084c..a045f84c 100644 --- a/src/logic/scripting/lua/libvecn.cpp +++ b/src/logic/scripting/lua/libvecn.cpp @@ -72,51 +72,100 @@ static int l_scalar_op(lua::State* L) { template static int l_pow(lua::State* L) { uint argc = lua::gettop(L); - if (argc == 2 || argc == 3) { - const auto& a = lua::tovec(L, 1); // vector - bool is_b_scalar = lua::isnumber(L, 2); - if (is_b_scalar || (argc == 3 && lua::isnumber(L, 2))) { - - const auto& b = is_b_scalar - ? lua::tonumber(L, 2) // scalar (pow) - : lua::tovec(L, 2)[0]; // vector (pow) + if (argc != 2 && argc != 3) { + throw std::runtime_error("invalid arguments number (2 or 3 expected)"); + } + const auto& a = lua::tovec(L, 1); //vector + if (lua::isnumber(L, 2)) { // scalar second operand overload + const auto& b = lua::tonumber(L, 2); //scalar (pow) + if (argc == 2) { glm::vec result_vector; - for (int i = 0; i < n; i++) { result_vector[i] = pow(a[i], b); } - - if (argc == 2) { - lua::createtable(L, n, 0); - for (uint i = 0; i < n; i++) { - lua::pushnumber(L, result_vector[i]); - lua::rawseti(L, i+1); - } - return 1; - - } else { - return lua::setvec(L, 3, result_vector); + lua::createtable(L, n, 0); + for (uint i = 0; i < n; i++) { + lua::pushnumber(L, result_vector[i]); + lua::rawseti(L, i+1); } + return 1; } else { - throw std::runtime_error("invalid arguments number (2 or 3 expected)"); + glm::vec result_vector; + for (int i = 0; i < n; i++) { + result_vector[i] = pow(a[i], b); + } + lua::pushvalue(L, 3); + lua::createtable(L, n, 0); + for (uint i = 0; i < n; i++) { + lua::pushnumber(L, result_vector[i]); + lua::rawseti(L, i+1); + } + lua_settable(L, 3); + return 0; } } else { + const auto& b = lua::tovec(L, 2); //vector + if (argc == 2) { + glm::vec result_vector; + for (int i = 0; i < n; i++) { + result_vector[i] = pow(a[i], b[i]); + } + lua::createtable(L, n, 0); + for (uint i = 0; i < n; i++) { + lua::pushnumber(L, result_vector[i]); + lua::rawseti(L, i+1); + } + return 1; + } else { + glm::vec result_vector; + for (int i = 0; i < n; i++) { + result_vector[i] = pow(a[i], b[i]); + } + lua::pushvalue(L, 3); + lua::createtable(L, n, 0); + for (uint i = 0; i < n; i++) { + lua::pushnumber(L, result_vector[i]); + lua::rawseti(L, i+1); + } + lua_settable(L, 3); + return 0; + } + } +} + +template +static int l_dot(lua::State* L) { + uint argc = lua::gettop(L); + if (argc != 2 && argc != 3) { throw std::runtime_error("invalid arguments number (2 or 3 expected)"); } + const auto& a = lua::tovec(L, 1); + const auto& b = lua::tovec(L, 2); + if (argc == 2) { + lua::pushnumber(L, glm::dot(a, b)); + return 1; + } else { + lua::pushnumber(L, glm::dot(a, b)); + lua_settable(L, 3); + return 0; + } } template static int l_inverse(lua::State* L) { uint argc = lua::gettop(L); + if (argc != 1 && argc != 2) { + throw std::runtime_error("invalid arguments number (1 or 2 expected)"); + } + const auto& _vector = lua::tovec(L, 1); //vector + glm::vec result_vector; + + for (int i = 0; i < n; i++) { + result_vector[i] = -_vector[i]; + } + if (argc == 1) { - const auto& _vector = lua::tovec(L, 1); //vector - glm::vec result_vector; - - for (int i = 0; i < n; i++) { - result_vector[i] = -_vector[i]; - } - lua::createtable(L, n, 0); for (uint i = 0; i < n; i++) { lua::pushnumber(L, result_vector[i]); @@ -124,20 +173,14 @@ static int l_inverse(lua::State* L) { } return 1; } else { - throw std::runtime_error("invalid arguments number (1 expected)"); - } -} - -template -static int l_dot(lua::State* L) { - uint argc = lua::gettop(L); - if (argc == 2 || argc == 3) { - const auto& a = lua::tovec(L, 1); - const auto& b = lua::tovec(L, 2); - lua::pushnumber(L, glm::dot(a, b)); - return 1; - } else { - throw std::runtime_error("invalid arguments number (2 or 3 expected)"); + lua::pushvalue(L, 2); + lua::createtable(L, n, 0); + for (uint i = 0; i < n; i++) { + lua::pushnumber(L, result_vector[i]); + lua::rawseti(L, i+1); + } + lua_settable(L, 2); + return 0; } }