So what I am trying to do is implement my c++ vec3 into lua. But I have issues overwriting any value. Also I am aware that im not really using the orignal vector class. I guess there are better ways to implement this.
What I want to do:
Lua:
testvec = vec3(17,33,-822);
print(tostring(testvec.x)); // works fine
testvec.x = 1337; // exception: attempt to index a vec3 value (global 'vec3')
c++:
static int _set_x(lua_State* L) {
luaL_checkudata(L, 1, LUA_Vector3);
lua_pushnumber(L, luaL_checknumber(L, 2));
lua_setfield(L, -2, "x"); // exception here
return 0;
}
What I execute when creating a new lua_State:
namespace lua_vec3
{
static int _new(lua_State* L)
{
if (lua_gettop(L) == 3)
*reinterpret_cast<Vector3**>(lua_newuserdata(L, sizeof(Vector3*))) = new Vector3(luaL_checknumber(L, 1), luaL_checknumber(L, 2), luaL_checknumber(L, 3));
else
*reinterpret_cast<Vector3**>(lua_newuserdata(L, sizeof(Vector3*))) = new Vector3();
luaL_setmetatable(L, LUA_Vector3);
return 1;
}
static int _delete(lua_State* L) {
delete* reinterpret_cast<Vector3**>(lua_touserdata(L, 1));
return 0;
}
static int _set_x(lua_State* L) {
//(*reinterpret_cast<Vector3**>(luaL_checkudata(L, 1, LUA_Vector3)))->x = (luaL_checknumber(L, 2));
luaL_checkudata(L, 1, LUA_Vector3);
lua_pushnumber(L, luaL_checknumber(L, 2)); lua_setfield(L, -2, "x");
return 0;
}
static int _get_x(lua_State* L) {
//lua_pushnumber(L, (*reinterpret_cast<Vector3**>(luaL_checkudata(L, 1, LUA_Vector3)))->x);
luaL_checkudata(L, 1, LUA_Vector3);
lua_getfield(L, 1, "x");
lua_pushnumber(L, luaL_checknumber(L, -1));
return 1;
}
}
static void register_vector3(lua_State* L)
{
lua_register(L, LUA_Vector3, lua_vec3::_new);
luaL_newmetatable(L, LUA_Vector3);
lua_pushcfunction(L, lua_vec3::_delete); lua_setfield(L, -2, "__gc");
lua_pushvalue(L, -1); lua_setfield(L, -2, "__index");
lua_pushnumber(L, 3.4); lua_setfield(L, -2, "x");
lua_pushcfunction(L, lua_vec3::_set_x); lua_setfield(L, -2, "set_x");
lua_pushcfunction(L, lua_vec3::_get_x); lua_setfield(L, -2, "get_x");
lua_pop(L, 1);
}