From c9a9b3c9d0d4fed0b02d9935923bfd7dcbc45d1e Mon Sep 17 00:00:00 2001 From: Mattes D Date: Tue, 14 Apr 2020 16:43:21 +0200 Subject: Bindings: Allow coercion between Vector3 subtypes. (#4646) In manually bound functions, allows one to use any Vector3 value, as well as a {x, y, z} table, in Lua as any Vector3 parameter. Has example in Debuggers' /vector command. Unfortunately doesn't work in auto-bindings. --- src/Bindings/BindingsProcessor.lua | 77 +++++++++++++++++++++++--------------- 1 file changed, 47 insertions(+), 30 deletions(-) (limited to 'src/Bindings/BindingsProcessor.lua') diff --git a/src/Bindings/BindingsProcessor.lua b/src/Bindings/BindingsProcessor.lua index db3735338..c0de50f43 100644 --- a/src/Bindings/BindingsProcessor.lua +++ b/src/Bindings/BindingsProcessor.lua @@ -74,7 +74,20 @@ local access = -- Map of classname -> true local g_HasCustomPushImplementation = { - cEntity = true + cEntity = true, +} + + + + + +--- Defines classes that have a custom manual GetStackValue() implementation and should not generate the automatic one +-- Map of classname -> true +local g_HasCustomGetImplementation = +{ + Vector3d = true, + Vector3f = true, + Vector3i = true, } @@ -209,13 +222,15 @@ local function OutputLuaStateHelpers(a_Package) f:write("// This file expects to be included form inside the cLuaState class definition\n") f:write("\n\n\n\n\n") for _, item in ipairs(types) do - if not(g_HasCustomPushImplementation[item.name]) then + if not(g_HasCustomPushImplementation[item.lname]) then f:write("void Push(" .. item.name .. " * a_Value);\n") end end for _, item in ipairs(types) do - f:write("bool GetStackValue(int a_StackPos, Ptr" .. item.lname .. " & a_ReturnedVal);\n") - f:write("bool GetStackValue(int a_StackPos, ConstPtr" .. item.lname .. " & a_ReturnedVal);\n") + if not(g_HasCustomGetImplementation[item.lname]) then + f:write("bool GetStackValue(int a_StackPos, Ptr" .. item.lname .. " & a_ReturnedVal);\n") + f:write("bool GetStackValue(int a_StackPos, ConstPtr" .. item.lname .. " & a_ReturnedVal);\n") + end end f:write("\n\n\n\n\n") f:close() @@ -231,38 +246,40 @@ local function OutputLuaStateHelpers(a_Package) f:write("#include \"Globals.h\"\n#include \"LuaState.h\"\n#include \"tolua++/include/tolua++.h\"\n") f:write("\n\n\n\n\n") for _, item in ipairs(types) do - if not(g_HasCustomPushImplementation[item.name]) then + if not(g_HasCustomPushImplementation[item.lname]) then f:write("void cLuaState::Push(" .. item.name .. " * a_Value)\n{\n\tASSERT(IsValid());\n") f:write("\ttolua_pushusertype(m_LuaState, a_Value, \"" .. item.name .. "\");\n"); f:write("}\n\n\n\n\n\n") end end for _, item in ipairs(types) do - f:write("bool cLuaState::GetStackValue(int a_StackPos, Ptr" .. item.lname .. " & a_ReturnedVal)\n{\n\tASSERT(IsValid());\n") - f:write("\tif (lua_isnil(m_LuaState, a_StackPos))\n\t{\n") - f:write("\t\ta_ReturnedVal = nullptr;\n") - f:write("\t\treturn false;\n\t}\n") - f:write("\ttolua_Error err;\n") - f:write("\tif (tolua_isusertype(m_LuaState, a_StackPos, \"" .. item.name .. "\", false, &err))\n") - f:write("\t{\n") - f:write("\t\ta_ReturnedVal = *(static_cast<" .. item.name .. " **>(lua_touserdata(m_LuaState, a_StackPos)));\n") - f:write("\t\treturn true;\n"); - f:write("\t}\n") - f:write("\treturn false;\n") - f:write("}\n\n\n\n\n\n") - - f:write("bool cLuaState::GetStackValue(int a_StackPos, ConstPtr" .. item.lname .. " & a_ReturnedVal)\n{\n\tASSERT(IsValid());\n") - f:write("\tif (lua_isnil(m_LuaState, a_StackPos))\n\t{\n") - f:write("\t\ta_ReturnedVal = nullptr;\n") - f:write("\t\treturn false;\n\t}\n") - f:write("\ttolua_Error err;\n") - f:write("\tif (tolua_isusertype(m_LuaState, a_StackPos, \"const " .. item.name .. "\", false, &err))\n") - f:write("\t{\n") - f:write("\t\ta_ReturnedVal = *(static_cast(lua_touserdata(m_LuaState, a_StackPos)));\n") - f:write("\t\treturn true;\n"); - f:write("\t}\n") - f:write("\treturn false;\n") - f:write("}\n\n\n\n\n\n") + if not(g_HasCustomGetImplementation[item.lname]) then + f:write("bool cLuaState::GetStackValue(int a_StackPos, Ptr" .. item.lname .. " & a_ReturnedVal)\n{\n\tASSERT(IsValid());\n") + f:write("\tif (lua_isnil(m_LuaState, a_StackPos))\n\t{\n") + f:write("\t\ta_ReturnedVal = nullptr;\n") + f:write("\t\treturn false;\n\t}\n") + f:write("\ttolua_Error err;\n") + f:write("\tif (tolua_isusertype(m_LuaState, a_StackPos, \"" .. item.name .. "\", false, &err))\n") + f:write("\t{\n") + f:write("\t\ta_ReturnedVal = *(static_cast<" .. item.name .. " **>(lua_touserdata(m_LuaState, a_StackPos)));\n") + f:write("\t\treturn true;\n"); + f:write("\t}\n") + f:write("\treturn false;\n") + f:write("}\n\n\n\n\n\n") + + f:write("bool cLuaState::GetStackValue(int a_StackPos, ConstPtr" .. item.lname .. " & a_ReturnedVal)\n{\n\tASSERT(IsValid());\n") + f:write("\tif (lua_isnil(m_LuaState, a_StackPos))\n\t{\n") + f:write("\t\ta_ReturnedVal = nullptr;\n") + f:write("\t\treturn false;\n\t}\n") + f:write("\ttolua_Error err;\n") + f:write("\tif (tolua_isusertype(m_LuaState, a_StackPos, \"const " .. item.name .. "\", false, &err))\n") + f:write("\t{\n") + f:write("\t\ta_ReturnedVal = *(static_cast(lua_touserdata(m_LuaState, a_StackPos)));\n") + f:write("\t\treturn true;\n"); + f:write("\t}\n") + f:write("\treturn false;\n") + f:write("}\n\n\n\n\n\n") + end end f:close() end -- cgit v1.2.3