blob: 64220d2429019194ef08259ed063537e5d299cad [file] [log] [blame]
#ifndef _RIVE_SCRIPT_ASSET_HPP_
#define _RIVE_SCRIPT_ASSET_HPP_
#ifdef WITH_RIVE_SCRIPTING
#include "rive/lua/rive_lua_libs.hpp"
#endif
#include "rive/file.hpp"
#include "rive/generated/assets/script_asset_base.hpp"
#include "rive/simple_array.hpp"
#include <stdio.h>
namespace rive
{
class Artboard;
class Component;
class DataBind;
class File;
class ScriptedObject;
enum ScriptProtocol
{
utility,
node,
layout,
converter,
pathEffect
};
#ifdef WITH_RIVE_SCRIPTING
class ScriptAssetImporter;
#endif
class ScriptInput
{
protected:
ScriptedObject* m_scriptedObject = nullptr;
DataBind* m_dataBind = nullptr;
public:
virtual void initScriptedValue();
virtual bool validateForScriptInit() = 0;
static ScriptInput* from(Core* component);
DataBind* dataBind() { return m_dataBind; }
void dataBind(DataBind* dataBind) { m_dataBind = dataBind; }
ScriptedObject* scriptedObject() { return m_scriptedObject; }
void scriptedObject(ScriptedObject* object) { m_scriptedObject = object; }
};
class OptionalScriptedMethods
{
private:
static const int m_advancesBit = 1 << 0;
static const int m_updatesBit = 1 << 1;
static const int m_measuresBit = 1 << 2;
static const int m_wantsPointerDownBit = 1 << 3;
static const int m_wantsPointerMoveBit = 1 << 4;
static const int m_wantsPointerUpBit = 1 << 5;
static const int m_wantsPointerExitBit = 1 << 6;
static const int m_wantsPointerCancelBit = 1 << 7;
static const int m_drawsBit = 1 << 8;
static const int m_initsBit = 1 << 9;
int m_implementedMethods = 0;
protected:
bool verifyImplementation(ScriptProtocol scriptProtocol,
LuaState* luaState);
public:
int implementedMethods() { return m_implementedMethods; }
void implementedMethods(int implemented)
{
m_implementedMethods = implemented;
}
bool listensToPointerEvents()
{
return (m_implementedMethods &
(m_wantsPointerDownBit | m_wantsPointerMoveBit |
m_wantsPointerUpBit | m_wantsPointerExitBit |
m_wantsPointerCancelBit)) != 0;
}
bool advances() { return (m_implementedMethods & m_advancesBit) != 0; }
bool updates() { return (m_implementedMethods & m_updatesBit) != 0; }
bool measures() { return (m_implementedMethods & m_measuresBit) != 0; }
bool wantsPointerDown()
{
return (m_implementedMethods & m_wantsPointerDownBit) != 0;
}
bool wantsPointerMove()
{
return (m_implementedMethods & m_wantsPointerMoveBit) != 0;
}
bool wantsPointerUp()
{
return (m_implementedMethods & m_wantsPointerUpBit) != 0;
}
bool wantsPointerExit()
{
return (m_implementedMethods & m_wantsPointerExitBit) != 0;
}
bool wantsPointerCancel()
{
return (m_implementedMethods & m_wantsPointerCancelBit) != 0;
}
bool draws() { return (m_implementedMethods & m_drawsBit) != 0; }
bool inits() { return (m_implementedMethods & m_initsBit) != 0; }
};
class ScriptAsset : public ScriptAssetBase, public OptionalScriptedMethods
{
public:
#ifdef WITH_RIVE_SCRIPTING
friend class ScriptAssetImporter;
bool verified() const { return m_verified; }
Span<uint8_t> bytecode() { return m_bytecode; }
#endif
bool initScriptedObject(ScriptedObject* object);
/// Sets the bytecode if the signature verifies.
bool bytecode(Span<uint8_t> bytecode, Span<uint8_t> signature);
/// Bytecode provided via decode should only happen with in-band bytecode.
/// The signature will later be verified once file loading completes, so it
/// is immediately marked as unverified.
bool decode(SimpleArray<uint8_t>& data, Factory* factory) override;
std::string fileExtension() const override { return "lua"; }
void file(File* value) { m_file = value; }
File* file() const { return m_file; }
#ifdef WITH_RIVE_SCRIPTING
LuaState* vm()
{
if (m_file == nullptr)
{
return nullptr;
}
return m_file->scriptingVM();
}
#endif
private:
File* m_file = nullptr;
#ifdef WITH_RIVE_SCRIPTING
bool m_verified = false;
SimpleArray<uint8_t> m_bytecode;
bool m_initted = false;
ScriptProtocol m_scriptProtocol = ScriptProtocol::utility;
#endif
bool initScriptedObjectWith(ScriptedObject* object);
};
} // namespace rive
#endif