blob: 43f944424bfa95be0b52404a78c5000d28608943 [file]
#ifdef WITH_RIVE_SCRIPTING
#include "rive/lua/rive_lua_libs.hpp"
#include "lualib.h"
using namespace rive;
static const char* hit_listener_type_string(int raw)
{
switch (static_cast<ListenerType>(raw))
{
case ListenerType::enter:
return "pointerEnter";
case ListenerType::exit:
return "pointerExit";
case ListenerType::down:
return "pointerDown";
case ListenerType::up:
return "pointerUp";
case ListenerType::move:
return "pointerMove";
case ListenerType::click:
return "click";
case ListenerType::drag:
return "pointerDrag";
default:
return "unknown";
}
return "unknown";
}
static void pointer_event_direct_id(void* udata, void* result)
{
lua_userdatadirectfield_setnumber(
result,
(double)((ScriptedPointerEvent*)udata)->m_id);
}
static void pointer_event_direct_position(void* udata, void* result)
{
auto* self = (ScriptedPointerEvent*)udata;
lua_userdatadirectfield_setvector(result,
self->m_position.x,
self->m_position.y,
0.0f
#if LUA_VECTOR_SIZE == 4
,
0.0f
#endif
);
}
static void pointer_event_direct_previousPosition(void* udata, void* result)
{
auto* self = (ScriptedPointerEvent*)udata;
lua_userdatadirectfield_setvector(result,
self->m_previousPosition.x,
self->m_previousPosition.y,
0.0f
#if LUA_VECTOR_SIZE == 4
,
0.0f
#endif
);
}
static void pointer_event_direct_timeStamp(void* udata, void* result)
{
lua_userdatadirectfield_setnumber(
result,
((ScriptedPointerEvent*)udata)->m_timeStamp);
}
static int pointer_event_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 pointerEvent = lua_torive<ScriptedPointerEvent>(L, 1);
switch (atom)
{
case (int)LuaAtoms::id:
lua_pushunsigned(L, (unsigned)pointerEvent->m_id);
return 1;
case (int)LuaAtoms::position:
lua_pushvector2(L,
pointerEvent->m_position.x,
pointerEvent->m_position.y);
return 1;
case (int)LuaAtoms::previousPosition:
lua_pushvector2(L,
pointerEvent->m_previousPosition.x,
pointerEvent->m_previousPosition.y);
return 1;
case (int)LuaAtoms::type:
lua_pushstring(
L,
hit_listener_type_string(pointerEvent->m_hitListenerType));
return 1;
case (int)LuaAtoms::timeStamp:
lua_pushnumber(L, pointerEvent->m_timeStamp);
return 1;
}
luaL_error(L,
"%s is not a valid field of %s",
luaL_checkstring(L, 1),
ScriptedPointerEvent::luaName);
return 0;
}
static int pointer_event_hit(lua_State* L)
{
auto pointerEvent = lua_torive<ScriptedPointerEvent>(L, 1);
if (lua_isboolean(L, 2))
{
pointerEvent->m_hitResult =
lua_toboolean(L, 2) ? HitResult::hit : HitResult::hitOpaque;
}
else
{
pointerEvent->m_hitResult = HitResult::hitOpaque;
}
return 0;
}
static int pointer_event_namecall(lua_State* L)
{
int atom;
const char* str = lua_namecallatom(L, &atom);
if (str != nullptr)
{
switch (atom)
{
case (int)LuaAtoms::hit:
return pointer_event_hit(L);
}
}
luaL_error(L,
"%s is not a valid method of %s",
luaL_checkstring(L, 1),
ScriptedPointerEvent::luaName);
return 0;
}
static int pointer_event_new(lua_State* L)
{
int id = luaL_checkinteger(L, 1);
auto vec = lua_checkvec2d(L, 2);
lua_newrive<ScriptedPointerEvent>(L, id, Vec2D(vec->x, vec->y));
return 1;
}
static const luaL_Reg pointerEventsStaticMethods[] = {
{"new", pointer_event_new},
{nullptr, nullptr}};
int luaopen_rive_input(lua_State* L)
{
{
luaL_register(L,
ScriptedPointerEvent::luaName,
pointerEventsStaticMethods);
}
{
lua_register_rive<ScriptedPointerEvent>(L);
lua_pushcfunction(L, pointer_event_index, nullptr);
lua_setfield(L, -2, "__index");
lua_pushcfunction(L, pointer_event_namecall, nullptr);
lua_setfield(L, -2, "__namecall");
lua_setreadonly(L, -1, true);
lua_pop(L, 1); // pop the metatable
lua_registeruserdatadirectfieldget(L,
ScriptedPointerEvent::luaTag,
"id",
pointer_event_direct_id);
lua_registeruserdatadirectfieldget(L,
ScriptedPointerEvent::luaTag,
"position",
pointer_event_direct_position);
lua_registeruserdatadirectfieldget(
L,
ScriptedPointerEvent::luaTag,
"previousPosition",
pointer_event_direct_previousPosition);
lua_registeruserdatadirectfieldget(L,
ScriptedPointerEvent::luaTag,
"timeStamp",
pointer_event_direct_timeStamp);
}
rive_lua_register_listener_invocation_types(L);
return 1;
}
#endif