From a61e1a4dbce39ced7a1da599d87dfcb876613109 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Blot?= Date: Sun, 8 Jul 2018 23:06:33 +0200 Subject: [PATCH] Lua templating reading (part 4): s16, v2s16, v2f (#7512) --- src/script/common/c_converter.cpp | 15 --------- src/script/common/c_converter.h | 2 -- src/script/common/helper.cpp | 54 +++++++++++++++++++++++++++++++ src/script/lua_api/l_noise.cpp | 10 +++--- src/script/lua_api/l_object.cpp | 4 +-- 5 files changed, 61 insertions(+), 24 deletions(-) diff --git a/src/script/common/c_converter.cpp b/src/script/common/c_converter.cpp index 0ee5afa3e..dfd3f5cea 100644 --- a/src/script/common/c_converter.cpp +++ b/src/script/common/c_converter.cpp @@ -113,21 +113,6 @@ v2s16 read_v2s16(lua_State *L, int index) return p; } -v2s16 check_v2s16(lua_State *L, int index) -{ - v2s16 p; - CHECK_POS_TAB(index); - lua_getfield(L, index, "x"); - CHECK_POS_COORD("x"); - p.X = lua_tonumber(L, -1); - lua_pop(L, 1); - lua_getfield(L, index, "y"); - CHECK_POS_COORD("y"); - p.Y = lua_tonumber(L, -1); - lua_pop(L, 1); - return p; -} - void push_v2s16(lua_State *L, v2s16 p) { lua_newtable(L); diff --git a/src/script/common/c_converter.h b/src/script/common/c_converter.h index 04fdb353a..87bc35ac6 100644 --- a/src/script/common/c_converter.h +++ b/src/script/common/c_converter.h @@ -100,8 +100,6 @@ void setboolfield(lua_State *L, int table, const char *fieldname, bool value); v3f checkFloatPos (lua_State *L, int index); -v2f check_v2f (lua_State *L, int index); -v2s16 check_v2s16 (lua_State *L, int index); v3f check_v3f (lua_State *L, int index); v3s16 check_v3s16 (lua_State *L, int index); 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 #include +#include #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(L, -1); + lua_pop(L, 1); + lua_getfield(L, index, "y"); + CHECK_POS_COORD("y"); + p.Y = readParam(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(L, -1); + lua_pop(L, 1); + lua_getfield(L, index, "y"); + CHECK_POS_COORD("y"); + p.Y = readParam(L, -1); + lua_pop(L, 1); + return p; +} + template <> std::string LuaHelper::readParam(lua_State *L, int index) { std::string result; diff --git a/src/script/lua_api/l_noise.cpp b/src/script/lua_api/l_noise.cpp index ac3ddd479..e38d319f4 100644 --- a/src/script/lua_api/l_noise.cpp +++ b/src/script/lua_api/l_noise.cpp @@ -40,7 +40,7 @@ int LuaPerlinNoise::l_get_2d(lua_State *L) { NO_MAP_LOCK_REQUIRED; LuaPerlinNoise *o = checkobject(L, 1); - v2f p = check_v2f(L, 2); + v2f p = readParam(L, 2); lua_Number val = NoisePerlin2D(&o->np, p.X, p.Y, 0); lua_pushnumber(L, val); return 1; @@ -166,7 +166,7 @@ int LuaPerlinNoiseMap::l_get_2d_map(lua_State *L) size_t i = 0; LuaPerlinNoiseMap *o = checkobject(L, 1); - v2f p = check_v2f(L, 2); + v2f p = readParam(L, 2); Noise *n = o->noise; n->perlinMap2D(p.X, p.Y); @@ -189,8 +189,8 @@ int LuaPerlinNoiseMap::l_get_2d_map_flat(lua_State *L) NO_MAP_LOCK_REQUIRED; LuaPerlinNoiseMap *o = checkobject(L, 1); - v2f p = check_v2f(L, 2); - bool use_buffer = lua_istable(L, 3); + v2f p = readParam(L, 2); + bool use_buffer = lua_istable(L, 3); Noise *n = o->noise; n->perlinMap2D(p.X, p.Y); @@ -275,7 +275,7 @@ int LuaPerlinNoiseMap::l_calc_2d_map(lua_State *L) NO_MAP_LOCK_REQUIRED; LuaPerlinNoiseMap *o = checkobject(L, 1); - v2f p = check_v2f(L, 2); + v2f p = readParam(L, 2); Noise *n = o->noise; n->perlinMap2D(p.X, p.Y); diff --git a/src/script/lua_api/l_object.cpp b/src/script/lua_api/l_object.cpp index 1ea7d7ff2..14010533e 100644 --- a/src/script/lua_api/l_object.cpp +++ b/src/script/lua_api/l_object.cpp @@ -458,7 +458,7 @@ int ObjectRef::l_set_animation(lua_State *L) // Do it v2f frames = v2f(1, 1); if (!lua_isnil(L, 2)) - frames = read_v2f(L, 2); + frames = readParam(L, 2); float frame_speed = 15; if (!lua_isnil(L, 3)) frame_speed = lua_tonumber(L, 3); @@ -955,7 +955,7 @@ int ObjectRef::l_set_sprite(lua_State *L) // Do it v2s16 p(0,0); if (!lua_isnil(L, 2)) - p = read_v2s16(L, 2); + p = readParam(L, 2); int num_frames = 1; if (!lua_isnil(L, 3)) num_frames = lua_tonumber(L, 3);