#include "api_lua.hpp" #include #include template class Op> static int l_binop(lua::State* L) { uint argc = lua::gettop(L); if (argc != 2 && argc != 3) { throw std::runtime_error("invalid arguments number (2 or 3 expected)"); } auto a = lua::tovec(L, 1); if (lua::isnumber(L, 2)) { // scalar second operand overload auto b = lua::tonumber(L, 2); Op op; if (argc == 2) { lua::createtable(L, n, 0); for (uint i = 0; i < n; i++) { lua::pushnumber(L, op(a[i], b)); lua::rawseti(L, i+1); } return 1; } else { return lua::setvec(L, 3, op(a, glm::vec(b))); } } else { auto b = lua::tovec(L, 2); Op op; if (argc == 2) { lua::createtable(L, n, 0); for (uint i = 0; i < n; i++) { lua::pushnumber(L, op(a[i], b[i])); lua::rawseti(L, i+1); } return 1; } else { return lua::setvec(L, 3, op(a, b)); } } } template(*func)(const glm::vec&)> static int l_unaryop(lua::State* L) { uint argc = lua::gettop(L); auto vec = func(lua::tovec(L, 1)); switch (argc) { case 1: lua::createtable(L, n, 0); for (uint i = 0; i < n; i++) { lua::pushnumber(L, vec[i]); lua::rawseti(L, i+1); } return 1; case 2: return lua::setvec(L, 2, vec); default: { throw std::runtime_error("invalid arguments number (1 or 2 expected)"); } } } template&)> static int l_scalar_op(lua::State* L) { auto vec = lua::tovec(L, 1); if (lua::gettop(L) != 1) { throw std::runtime_error("invalid arguments number (1 expected)"); } return lua::pushnumber(L, func(vec)); } template static int l_tostring(lua::State* L) { auto vec = lua::tovec(L, 1); if (lua::gettop(L) != 1) { throw std::runtime_error("invalid arguments number (1 expected)"); } std::stringstream ss; ss << "vec" << std::to_string(n) << "{"; for (int i = 0; i < n; i++) { if (i > 0) { ss << ", "; } ss << vec[i]; } ss << "}"; return lua::pushstring(L, ss.str()); } const luaL_Reg vec2lib [] = { {"add", lua::wrap>}, {"sub", lua::wrap>}, {"mul", lua::wrap>}, {"div", lua::wrap>}, {"normalize", lua::wrap>}, {"length", lua::wrap>}, {"tostring", lua::wrap>}, {NULL, NULL} }; const luaL_Reg vec3lib [] = { {"add", lua::wrap>}, {"sub", lua::wrap>}, {"mul", lua::wrap>}, {"div", lua::wrap>}, {"normalize", lua::wrap>}, {"length", lua::wrap>}, {"tostring", lua::wrap>}, {NULL, NULL} }; const luaL_Reg vec4lib [] = { {"add", lua::wrap>}, {"sub", lua::wrap>}, {"mul", lua::wrap>}, {"div", lua::wrap>}, {"normalize", lua::wrap>}, {"length", lua::wrap>}, {"tostring", lua::wrap>}, {NULL, NULL} };