From ae62494dd27ec50c5bbd189ee6690b0054a46d41 Mon Sep 17 00:00:00 2001 From: Cogi Asd Date: Mon, 8 Jul 2024 22:10:55 +0300 Subject: [PATCH] final overload for functions --- src/logic/scripting/lua/libvecn.cpp | 105 +++++++++++++++++++--------- 1 file changed, 73 insertions(+), 32 deletions(-) diff --git a/src/logic/scripting/lua/libvecn.cpp b/src/logic/scripting/lua/libvecn.cpp index 64a416fb..d711a13a 100644 --- a/src/logic/scripting/lua/libvecn.cpp +++ b/src/logic/scripting/lua/libvecn.cpp @@ -72,50 +72,91 @@ static int l_scalar_op(lua::State* L) { template static int l_pow(lua::State* L) { uint argc = lua::gettop(L); - if (argc != 2) { - throw std::runtime_error("invalid arguments number (2 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) - glm::vec result_vector; - for (int i = 0; i < n; i++) { - result_vector[i] = pow(a[i], b); + if (argc == 2) { + 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) + glm::vec result_vector; + for (int i = 0; i < n; i++) { + result_vector[i] = pow(a[i], b); + } + 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 { + const auto& b = lua::tovec(L, 2); //vector + 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 if (argc == 3) { + 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) + glm::vec result_vector; + for (int i = 0; i < n; i++) { + result_vector[i] = pow(a[i], b); + } + return lua::setvec(L, 3, result_vector); + } else { + const auto& b = lua::tovec(L, 2); //vector + glm::vec result_vector; + for (int i = 0; i < n; i++) { + result_vector[i] = pow(a[i], b[i]); + } + return lua::setvec(L, 3, result_vector); } - return lua::setvec(L, 1, result_vector); } else { - const auto& b = lua::tovec(L, 2); //vector + throw std::runtime_error("invalid arguments number (2 or 3 expected)"); + } +} + +template +static int l_inverse(lua::State* L) { + uint argc = lua::gettop(L); + 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] = pow(a[i], b[i]); + result_vector[i] = -_vector[i]; } - return lua::setvec(L, 1, 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 (1 expected)"); } } template static int l_dot(lua::State* L) { uint argc = lua::gettop(L); - if (argc != 2) { - throw std::runtime_error("invalid arguments number (2 expected)"); + if (argc == 2) { + const auto& a = lua::tovec(L, 1); + const auto& b = lua::tovec(L, 2); + return lua::pushnumber(L, glm::dot(a, b));; + } else if (argc == 3) { + const auto& a = lua::tovec(L, 1); + const auto& b = lua::tovec(L, 2); + return lua::pushnumber(L, glm::dot(a, b)); + } else { + 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); - return lua::pushnumber(L, glm::dot(a, b)); -} - -template -static int l_inverse(lua::State* L) { - uint argc = lua::gettop(L); - if (argc != 1) { - throw std::runtime_error("invalid arguments number (1 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]; - } - return lua::setvec(L, 1, result_vector); } template