blob: 835830b5e6f54522102c19cd7d84a414fc858785 [file]
#ifdef WITH_RIVE_SCRIPTING
#include "rive/lua/rive_lua_libs.hpp"
#include "rive/nested_artboard.hpp"
#include "rive/artboard.hpp"
using namespace rive;
void TransitionChild::draw(Renderer* renderer)
{
// Invalidated (post-frame) or not mounted: nothing to draw.
if (m_artboard == nullptr)
{
return;
}
// Place the child by its world transform then draw its content. The
// transition script has already wrapped this call in renderer state
// (opacity / transform / clip) to author the effect. drawInternal does not
// consult isHidden(), so a child excluded from the normal draw loop still
// renders here.
renderer->save();
renderer->transform(m_worldTransform);
m_artboard->drawInternal(renderer);
renderer->restore();
}
float TransitionChild::width() const
{
return m_artboard != nullptr ? m_artboard->width() : 0.0f;
}
float TransitionChild::height() const
{
return m_artboard != nullptr ? m_artboard->height() : 0.0f;
}
static int transition_child_draw(lua_State* L)
{
auto child = lua_torive<TransitionChild>(L, 1);
auto scriptedRenderer = lua_torive<ScriptedRenderer>(L, 2);
auto renderer = scriptedRenderer->validate(L);
child->draw(renderer);
return 0;
}
static int transition_child_namecall(lua_State* L)
{
int atom;
const char* str = lua_namecallatom(L, &atom);
if (str != nullptr)
{
switch (atom)
{
case (int)LuaAtoms::draw:
return transition_child_draw(L);
}
}
luaL_error(L,
"%s is not a valid method of %s",
str,
TransitionChild::luaName);
return 0;
}
static int transition_child_index(lua_State* L)
{
int atom;
const char* key = lua_tostringatom(L, 2, &atom);
if (!key)
{
luaL_typeerrorL(L, 2, lua_typename(L, LUA_TSTRING));
return 0;
}
auto child = lua_torive<TransitionChild>(L, 1);
switch (atom)
{
case (int)LuaAtoms::width:
lua_pushnumber(L, child->width());
return 1;
case (int)LuaAtoms::height:
lua_pushnumber(L, child->height());
return 1;
default:
break;
}
luaL_error(L,
"'%s' is not a valid index of %s",
key,
TransitionChild::luaName);
return 0;
}
int luaopen_rive_transition(lua_State* L)
{
lua_register_rive<TransitionChild>(L);
lua_pushcfunction(L, transition_child_index, nullptr);
lua_setfield(L, -2, "__index");
lua_pushcfunction(L, transition_child_namecall, nullptr);
lua_setfield(L, -2, "__namecall");
lua_setreadonly(L, -1, true);
lua_pop(L, 1); // pop the metatable
return 0;
}
#endif