diff options
author | Loïc Blot <nerzhul@users.noreply.github.com> | 2018-07-08 23:06:33 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-07-08 23:06:33 +0200 |
commit | a61e1a4dbce39ced7a1da599d87dfcb876613109 (patch) | |
tree | 6cd5177133cf93773da851fbe233e2088b67661b /src/script/common/helper.cpp | |
parent | 94cd2bfeac073bf0ff0c384e4921c90f281747b0 (diff) | |
download | minetest-a61e1a4dbce39ced7a1da599d87dfcb876613109.tar.gz minetest-a61e1a4dbce39ced7a1da599d87dfcb876613109.tar.bz2 minetest-a61e1a4dbce39ced7a1da599d87dfcb876613109.zip |
Lua templating reading (part 4): s16, v2s16, v2f (#7512)
Diffstat (limited to 'src/script/common/helper.cpp')
-rw-r--r-- | src/script/common/helper.cpp | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/src/script/common/helper.cpp b/src/script/common/helper.cpp index 9adc56a65..59bde57ab 100644 --- a/src/script/common/helper.cpp +++ b/src/script/common/helper.cpp @@ -20,7 +20,26 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "helper.h" #include <cmath> #include <sstream> +#include <irr_v2d.h> #include "c_types.h" +#include "c_internal.h" + +// imported from c_converter.cpp with pure C++ style +static inline void check_lua_type(lua_State *L, int index, const char *name, int type) +{ + int t = lua_type(L, index); + if (t != type) { + std::string traceback = script_get_backtrace(L); + throw LuaError(std::string("Invalid ") + (name) + " (expected " + + lua_typename(L, (type)) + " got " + lua_typename(L, t) + + ").\n" + traceback); + } +} + +// imported from c_converter.cpp +#define CHECK_POS_COORD(name) \ + check_lua_type(L, -1, "position coordinate '" name "'", LUA_TNUMBER) +#define CHECK_POS_TAB(index) check_lua_type(L, index, "position", LUA_TTABLE) bool LuaHelper::isNaN(lua_State *L, int idx) { @@ -43,6 +62,11 @@ template <> bool LuaHelper::readParam(lua_State *L, int index, const bool &defau return lua_toboolean(L, index) != 0; } +template <> s16 LuaHelper::readParam(lua_State *L, int index) +{ + return lua_tonumber(L, index); +} + template <> float LuaHelper::readParam(lua_State *L, int index) { if (isNaN(L, index)) @@ -51,6 +75,36 @@ template <> float LuaHelper::readParam(lua_State *L, int index) return (float)luaL_checknumber(L, index); } +template <> v2s16 LuaHelper::readParam(lua_State *L, int index) +{ + v2s16 p; + CHECK_POS_TAB(index); + lua_getfield(L, index, "x"); + CHECK_POS_COORD("x"); + p.X = readParam<s16>(L, -1); + lua_pop(L, 1); + lua_getfield(L, index, "y"); + CHECK_POS_COORD("y"); + p.Y = readParam<s16>(L, -1); + lua_pop(L, 1); + return p; +} + +template <> v2f LuaHelper::readParam(lua_State *L, int index) +{ + v2f p; + CHECK_POS_TAB(index); + lua_getfield(L, index, "x"); + CHECK_POS_COORD("x"); + p.X = readParam<float>(L, -1); + lua_pop(L, 1); + lua_getfield(L, index, "y"); + CHECK_POS_COORD("y"); + p.Y = readParam<float>(L, -1); + lua_pop(L, 1); + return p; +} + template <> std::string LuaHelper::readParam(lua_State *L, int index) { std::string result; |