blob: 61a045d5d020aee03c7e2e42552e35bb7455996f [file] [log] [blame]
#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