| #ifdef WITH_RIVE_SCRIPTING | |
| #include "lua.h" | |
| #include "lualib.h" | |
| #include "rive/lua/rive_lua_libs.hpp" | |
| #include "rive/factory.hpp" | |
| using namespace rive; | |
| static void fill_stops(lua_State* L, | |
| std::vector<float>& stops, | |
| std::vector<ColorInt>& colors) | |
| { | |
| luaL_checktype(L, 3, LUA_TTABLE); | |
| int index = 1; | |
| while (true) | |
| { | |
| if (lua_rawgeti(L, 3, index++) != LUA_TTABLE) | |
| { | |
| lua_pop(L, 1); | |
| break; | |
| } | |
| lua_rawgetfield(L, -1, "position"); | |
| float position = float(luaL_checknumber(L, -1)); | |
| lua_pop(L, 1); | |
| lua_rawgetfield(L, -1, "color"); | |
| uint32_t color = luaL_checkunsigned(L, -1); | |
| stops.push_back(position); | |
| colors.push_back(color); | |
| lua_pop(L, 1); | |
| } | |
| } | |
| static int gradient_linear(lua_State* L) | |
| { | |
| auto from = lua_checkvec2d(L, 1); | |
| auto to = lua_checkvec2d(L, 2); | |
| std::vector<float> stops; | |
| std::vector<ColorInt> colors; | |
| fill_stops(L, stops, colors); | |
| ScriptedGradient* gradient = lua_newrive<ScriptedGradient>(L); | |
| ScriptingContext* context = | |
| static_cast<ScriptingContext*>(lua_getthreaddata(L)); | |
| gradient->shader = context->factory()->makeLinearGradient(from->x, | |
| from->y, | |
| to->x, | |
| to->y, | |
| colors.data(), | |
| stops.data(), | |
| stops.size()); | |
| return 1; | |
| } | |
| static int gradient_radial(lua_State* L) | |
| { | |
| auto from = lua_checkvec2d(L, 1); | |
| auto radius = luaL_checknumber(L, 2); | |
| std::vector<float> stops; | |
| std::vector<ColorInt> colors; | |
| fill_stops(L, stops, colors); | |
| ScriptedGradient* gradient = lua_newrive<ScriptedGradient>(L); | |
| ScriptingContext* context = | |
| static_cast<ScriptingContext*>(lua_getthreaddata(L)); | |
| gradient->shader = context->factory()->makeRadialGradient(from->x, | |
| from->y, | |
| radius, | |
| colors.data(), | |
| stops.data(), | |
| stops.size()); | |
| return 1; | |
| } | |
| static const luaL_Reg gradientStaticMethods[] = {{"linear", gradient_linear}, | |
| {"radial", gradient_radial}, | |
| {nullptr, nullptr}}; | |
| int luaopen_rive_gradient(lua_State* L) | |
| { | |
| luaL_register(L, ScriptedGradient::luaName, gradientStaticMethods); | |
| lua_register_rive<ScriptedGradient>(L); | |
| return 1; | |
| } | |
| #endif |