blob: 0cb1338ae1d6a143ba58ace371d25372c60a6e58 [file] [log] [blame]
#include "rive/lua/lua_state.hpp"
#ifdef WITH_RIVE_SCRIPTING
#include "rive/lua/rive_lua_libs.hpp"
#endif
#include "rive/viewmodel/viewmodel.hpp"
#include <stdio.h>
using namespace rive;
#ifdef WITH_RIVE_SCRIPTING
static int viewmodel_new(lua_State* L)
{
// Get the viewModel pointer from the upvalue
ViewModel* viewModel = (ViewModel*)lua_touserdata(L, lua_upvalueindex(1));
if (viewModel)
{
auto instance = viewModel->createInstance();
lua_newrive<ScriptedViewModel>(L, L, ref_rcp(viewModel), instance);
return 1;
}
lua_pushnil(L);
return 1;
}
void LuaState::initializeData(std::vector<ViewModel*>& viewModels)
{
if (state)
{
// create metatable for global Data
luaL_newmetatable(state, "Data");
// push it again as lua_setuserdatametatable pops it
lua_pushvalue(state, -1);
lua_setuserdatametatable(state, LUA_T_COUNT + 31);
lua_pop(state, 1);
lua_getfield(state, luaRegistryIndex, "Data");
lua_setglobal(state, "Data");
// Get the Data metatable back on the stack
lua_getfield(state, luaRegistryIndex, "Data");
for (auto& viewModel : viewModels)
{
// Create a new table for this viewModel
lua_createtable(state, 0, 1);
// Push the viewModel pointer as a light userdata (upvalue)
lua_pushlightuserdata(state, viewModel);
// Create a closure with the viewModel as an upvalue
lua_pushcclosurek(state, viewmodel_new, "new", 1, nullptr);
// Set the function as "new" in the table
lua_setfield(state, -2, "new");
// Set the table as a field in Data metatable using the viewModel
// name
lua_setfield(state, -2, viewModel->name().c_str());
}
// Pop the Data metatable from the stack
lua_pop(state, 1);
}
}
#endif