I am pulling my hair out here, I can share an array between Lua and c++, I can even create an array of objects in Lua (using the code below) and access their member functions (eg obj[10]:setPosition(0,0,0) ). What I can't do is send c++ objects to Lua that already exist and have Lua call their respective member functions. For example:
objects = Scene.getAllObjects()
objects[5]:setPosition(0,0,0)
...doesn't work, however, The code below works
for i=1,10 do
objects[i] = Object.new("Box")
objects[i]:setPosition(0,0,0)
end
...which calls the c++ function below
int luaAddNewEditableObject(lua_State * L)
{
const char * name = luaL_checkstring(L, 1);
EditableObject ** udata = (EditableObject **)lua_newuserdata(L, sizeof(void*));
EditableObject *obj = scene->addNewEditableObject(name);
*udata = obj;
luaL_getmetatable(L, "luaL_EditableObject");
lua_setmetatable(L, -2);
return 1;
}
So basically, if it's created in Lua then no problems, but if there are objects that already exist in c++ then I need to get it into a Lua table/array so Lua can do magic to them
Please Help
struct ObjectArray
{
int size;
EditableObject *objects; /* The cpp objects */
};
static int getAllObjects (lua_State *L)
{
//This creates the metatable for array notation
size_t nbytes = sizeof(ObjectArray) + numObjects * sizeof(ObjectArray*);
ObjectArray *objectArray = (ObjectArray*)lua_newuserdata(L, nbytes);
objectArray->size = numObjects;
for (int i = 0; i < numFoos; i++)
{
//This sets the c++ pointers to the lua_newuserdata
objectArray->objects[i] = objects[i];
//So maybe here I need to assign the 'luaL_EditableObject' metatable for each object
//so I can call it's member functions ??
}
luaL_getmetatable(L, "ObjectArray");
lua_setmetatable(L, -2);
return 1;
}
Scene.getAllObjectsreturn? Are you sure it's returning a table of your objects (eg. if you compare metatable of the udata returned byScene.getAllObjectsis it the same asObject.new "Box")?void registerEditableObject() { luaL_Reg regs[] = { { "new", luaAddNewEditableObject }, { "setPosition", luaSetObjectPosition }, { NULL, NULL } }; luaL_newmetatable(L, "luaL_EditableObject"); luaL_register(L, NULL, regs); lua_pushvalue(L, -1); lua_setfield(L, -1, "__index"); lua_setglobal(L, "Object"); }getAllObjects()should return a table/array of whatObject.new("Box")returns, but of already existing objects. But I have no idea of how to go about it. Thanks in advanceObject.new("Box")returns a metatable of a single object but what I need forgetAllObjects()is a metatable of object metatables... if that makes senseScene.getAllobjectsto your question?