diff options
author | Jude Melton-Houghton <jwmhjwmh@gmail.com> | 2022-10-18 18:01:44 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-10-18 18:01:44 -0400 |
commit | b38ffdec279bcded98e34f5116c8d676aa9f73a7 (patch) | |
tree | 31cafdb009b2f81b61a96286a3800a8e408f8f3d /src/script/common | |
parent | 23e9f5db4330a6efee5270160a3959422926ce77 (diff) | |
download | minetest-b38ffdec279bcded98e34f5116c8d676aa9f73a7.tar.xz |
Implement vector and node conversion in Lua (#12609)
Co-authored-by: sfan5 <sfan5@live.de>
Diffstat (limited to 'src/script/common')
-rw-r--r-- | src/script/common/c_content.cpp | 44 | ||||
-rw-r--r-- | src/script/common/c_content.h | 6 | ||||
-rw-r--r-- | src/script/common/c_converter.cpp | 120 | ||||
-rw-r--r-- | src/script/common/c_internal.h | 8 |
4 files changed, 66 insertions, 112 deletions
diff --git a/src/script/common/c_content.cpp b/src/script/common/c_content.cpp index 928717a05..cbe2d328c 100644 --- a/src/script/common/c_content.cpp +++ b/src/script/common/c_content.cpp @@ -1175,43 +1175,27 @@ NodeBox read_nodebox(lua_State *L, int index) } /******************************************************************************/ -MapNode readnode(lua_State *L, int index, const NodeDefManager *ndef) +MapNode readnode(lua_State *L, int index) { - lua_getfield(L, index, "name"); - if (!lua_isstring(L, -1)) - throw LuaError("Node name is not set or is not a string!"); - std::string name = lua_tostring(L, -1); - lua_pop(L, 1); - - u8 param1 = 0; - lua_getfield(L, index, "param1"); - if (!lua_isnil(L, -1)) - param1 = lua_tonumber(L, -1); - lua_pop(L, 1); - - u8 param2 = 0; - lua_getfield(L, index, "param2"); - if (!lua_isnil(L, -1)) - param2 = lua_tonumber(L, -1); - lua_pop(L, 1); - - content_t id = CONTENT_IGNORE; - if (!ndef->getId(name, id)) - throw LuaError("\"" + name + "\" is not a registered node!"); - - return {id, param1, param2}; + lua_pushvalue(L, index); + lua_rawgeti(L, LUA_REGISTRYINDEX, CUSTOM_RIDX_READ_NODE); + lua_insert(L, -2); + lua_call(L, 1, 3); + content_t content = lua_tointeger(L, -3); + u8 param1 = lua_tointeger(L, -2); + u8 param2 = lua_tointeger(L, -1); + lua_pop(L, 3); + return MapNode(content, param1, param2); } /******************************************************************************/ -void pushnode(lua_State *L, const MapNode &n, const NodeDefManager *ndef) +void pushnode(lua_State *L, const MapNode &n) { - lua_createtable(L, 0, 3); - lua_pushstring(L, ndef->get(n).name.c_str()); - lua_setfield(L, -2, "name"); + lua_rawgeti(L, LUA_REGISTRYINDEX, CUSTOM_RIDX_PUSH_NODE); + lua_pushinteger(L, n.getContent()); lua_pushinteger(L, n.getParam1()); - lua_setfield(L, -2, "param1"); lua_pushinteger(L, n.getParam2()); - lua_setfield(L, -2, "param2"); + lua_call(L, 3, 1); } /******************************************************************************/ diff --git a/src/script/common/c_content.h b/src/script/common/c_content.h index ade3e4c1e..457b3f840 100644 --- a/src/script/common/c_content.h +++ b/src/script/common/c_content.h @@ -129,10 +129,8 @@ void read_inventory_list (lua_State *L, int tableindex, Inventory *inv, const char *name, IGameDef *gdef, int forcesize=-1); -MapNode readnode (lua_State *L, int index, - const NodeDefManager *ndef); -void pushnode (lua_State *L, const MapNode &n, - const NodeDefManager *ndef); +MapNode readnode (lua_State *L, int index); +void pushnode (lua_State *L, const MapNode &n); void read_groups (lua_State *L, int index, diff --git a/src/script/common/c_converter.cpp b/src/script/common/c_converter.cpp index 69da35b73..90b78a081 100644 --- a/src/script/common/c_converter.cpp +++ b/src/script/common/c_converter.cpp @@ -48,17 +48,19 @@ extern "C" { } \ } while (0) -#define CHECK_POS_COORD(name) CHECK_TYPE(-1, "vector coordinate " name, LUA_TNUMBER) +#define CHECK_POS_COORD(index, name) CHECK_TYPE(index, "vector coordinate " name, LUA_TNUMBER) #define CHECK_POS_TAB(index) CHECK_TYPE(index, "vector", LUA_TTABLE) /** - * A helper which sets the vector metatable for the table on top of the stack + * A helper which calls CUSTOM_RIDX_READ_VECTOR with the argument at the given index */ -static void set_vector_metatable(lua_State *L) +static void read_v3_aux(lua_State *L, int index) { - lua_rawgeti(L, LUA_REGISTRYINDEX, CUSTOM_RIDX_VECTOR_METATABLE); - lua_setmetatable(L, -2); + lua_pushvalue(L, index); + lua_rawgeti(L, LUA_REGISTRYINDEX, CUSTOM_RIDX_READ_VECTOR); + lua_insert(L, -2); + lua_call(L, 1, 3); } // Retrieve an integer vector where all components are optional @@ -79,14 +81,11 @@ static bool getv3intfield(lua_State *L, int index, void push_v3f(lua_State *L, v3f p) { - lua_createtable(L, 0, 3); + lua_rawgeti(L, LUA_REGISTRYINDEX, CUSTOM_RIDX_PUSH_VECTOR); lua_pushnumber(L, p.X); - lua_setfield(L, -2, "x"); lua_pushnumber(L, p.Y); - lua_setfield(L, -2, "y"); lua_pushnumber(L, p.Z); - lua_setfield(L, -2, "z"); - set_vector_metatable(L); + lua_call(L, 3, 1); } void push_v2f(lua_State *L, v2f p) @@ -160,12 +159,12 @@ v2f check_v2f(lua_State *L, int index) v2f p; CHECK_POS_TAB(index); lua_getfield(L, index, "x"); - CHECK_POS_COORD("x"); + CHECK_POS_COORD(-1, "x"); p.X = lua_tonumber(L, -1); CHECK_FLOAT(p.X, "x"); lua_pop(L, 1); lua_getfield(L, index, "y"); - CHECK_POS_COORD("y"); + CHECK_POS_COORD(-1, "y"); p.Y = lua_tonumber(L, -1); CHECK_FLOAT(p.Y, "y"); lua_pop(L, 1); @@ -174,78 +173,48 @@ v2f check_v2f(lua_State *L, int index) v3f read_v3f(lua_State *L, int index) { - v3f pos; - CHECK_POS_TAB(index); - lua_getfield(L, index, "x"); - pos.X = lua_tonumber(L, -1); - lua_pop(L, 1); - lua_getfield(L, index, "y"); - pos.Y = lua_tonumber(L, -1); - lua_pop(L, 1); - lua_getfield(L, index, "z"); - pos.Z = lua_tonumber(L, -1); - lua_pop(L, 1); - return pos; + read_v3_aux(L, index); + float x = lua_tonumber(L, -3); + float y = lua_tonumber(L, -2); + float z = lua_tonumber(L, -1); + lua_pop(L, 3); + return v3f(x, y, z); } v3f check_v3f(lua_State *L, int index) { - v3f pos; - CHECK_POS_TAB(index); - lua_getfield(L, index, "x"); - CHECK_POS_COORD("x"); - pos.X = lua_tonumber(L, -1); - CHECK_FLOAT(pos.X, "x"); - lua_pop(L, 1); - lua_getfield(L, index, "y"); - CHECK_POS_COORD("y"); - pos.Y = lua_tonumber(L, -1); - CHECK_FLOAT(pos.Y, "y"); - lua_pop(L, 1); - lua_getfield(L, index, "z"); - CHECK_POS_COORD("z"); - pos.Z = lua_tonumber(L, -1); - CHECK_FLOAT(pos.Z, "z"); - lua_pop(L, 1); - return pos; + read_v3_aux(L, index); + CHECK_POS_COORD(-3, "x"); + CHECK_POS_COORD(-2, "y"); + CHECK_POS_COORD(-1, "z"); + float x = lua_tonumber(L, -3); + float y = lua_tonumber(L, -2); + float z = lua_tonumber(L, -1); + lua_pop(L, 3); + return v3f(x, y, z); } v3d read_v3d(lua_State *L, int index) { - v3d pos; - CHECK_POS_TAB(index); - lua_getfield(L, index, "x"); - pos.X = lua_tonumber(L, -1); - lua_pop(L, 1); - lua_getfield(L, index, "y"); - pos.Y = lua_tonumber(L, -1); - lua_pop(L, 1); - lua_getfield(L, index, "z"); - pos.Z = lua_tonumber(L, -1); - lua_pop(L, 1); - return pos; + read_v3_aux(L, index); + double x = lua_tonumber(L, -3); + double y = lua_tonumber(L, -2); + double z = lua_tonumber(L, -1); + lua_pop(L, 3); + return v3d(x, y, z); } v3d check_v3d(lua_State *L, int index) { - v3d pos; - CHECK_POS_TAB(index); - lua_getfield(L, index, "x"); - CHECK_POS_COORD("x"); - pos.X = lua_tonumber(L, -1); - CHECK_FLOAT(pos.X, "x"); - lua_pop(L, 1); - lua_getfield(L, index, "y"); - CHECK_POS_COORD("y"); - pos.Y = lua_tonumber(L, -1); - CHECK_FLOAT(pos.Y, "y"); - lua_pop(L, 1); - lua_getfield(L, index, "z"); - CHECK_POS_COORD("z"); - pos.Z = lua_tonumber(L, -1); - CHECK_FLOAT(pos.Z, "z"); - lua_pop(L, 1); - return pos; + read_v3_aux(L, index); + CHECK_POS_COORD(-3, "x"); + CHECK_POS_COORD(-2, "y"); + CHECK_POS_COORD(-1, "z"); + double x = lua_tonumber(L, -3); + double y = lua_tonumber(L, -2); + double z = lua_tonumber(L, -1); + lua_pop(L, 3); + return v3d(x, y, z); } void push_ARGB8(lua_State *L, video::SColor color) @@ -274,14 +243,11 @@ v3f checkFloatPos(lua_State *L, int index) void push_v3s16(lua_State *L, v3s16 p) { - lua_createtable(L, 0, 3); + lua_rawgeti(L, LUA_REGISTRYINDEX, CUSTOM_RIDX_PUSH_VECTOR); lua_pushinteger(L, p.X); - lua_setfield(L, -2, "x"); lua_pushinteger(L, p.Y); - lua_setfield(L, -2, "y"); lua_pushinteger(L, p.Z); - lua_setfield(L, -2, "z"); - set_vector_metatable(L); + lua_call(L, 3, 1); } v3s16 read_v3s16(lua_State *L, int index) diff --git a/src/script/common/c_internal.h b/src/script/common/c_internal.h index 95ffe7d3b..5cbcbb7db 100644 --- a/src/script/common/c_internal.h +++ b/src/script/common/c_internal.h @@ -56,8 +56,14 @@ enum { CUSTOM_RIDX_CURRENT_MOD_NAME, CUSTOM_RIDX_BACKTRACE, CUSTOM_RIDX_HTTP_API_LUA, - CUSTOM_RIDX_VECTOR_METATABLE, CUSTOM_RIDX_METATABLE_MAP, + + // The following four functions are implemented in Lua because LuaJIT can + // trace them and optimize tables/string better than from the C API. + CUSTOM_RIDX_READ_VECTOR, + CUSTOM_RIDX_PUSH_VECTOR, + CUSTOM_RIDX_READ_NODE, + CUSTOM_RIDX_PUSH_NODE, }; |