#include "api_lua.hpp" #include template class Op> static int l_binop(lua::State* L) { uint argc = lua::gettop(L); auto a = lua::tovec(L, 1); auto b = lua::tovec(L, 2); Op op; switch (argc) { case 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; case 3: return lua::setvec(L, 3, op(a, b)); default: { throw std::runtime_error("invalid arguments number (2 or 3 expected)"); } } } 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 3: return lua::setvec(L, 3, 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)); } const luaL_Reg vec2lib [] = { {"add", lua::wrap>}, {"sub", lua::wrap>}, {"mul", lua::wrap>}, {"div", lua::wrap>}, {"normalize", lua::wrap>}, {"length", 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>}, {NULL, NULL} }; const luaL_Reg vec4lib [] = { {"add", lua::wrap>}, {"sub", lua::wrap>}, {"mul", lua::wrap>}, {"div", lua::wrap>}, {"normalize", lua::wrap>}, {"length", lua::wrap>}, {NULL, NULL} };