blob: a7b05794f0db8d07c8f9f2c30c529abb5ff63c11 [file] [log] [blame]
#include "rive/animation/listener_trigger_change.hpp"
#include "rive/animation/nested_input.hpp"
#include "rive/animation/nested_trigger.hpp"
#include "rive/animation/nested_state_machine.hpp"
#include "rive/animation/state_machine_instance.hpp"
#include "rive/animation/state_machine_trigger.hpp"
#include "rive/animation/state_machine_input_instance.hpp"
#include "rive/core/field_types/core_callback_type.hpp"
using namespace rive;
bool ListenerTriggerChange::validateInputType(const StateMachineInput* input) const
{
// A null input is valid as the StateMachine can attempt to limp along if we
// introduce new input types that old conditions are expected to handle in
// newer runtimes. The older runtimes will just evaluate them to true.
return input == nullptr || input->is<StateMachineTrigger>();
}
bool ListenerTriggerChange::validateNestedInputType(const NestedInput* input) const
{
// A null nested input is valid as the StateMachine can attempt to limp along if we
// introduce new input types that old conditions are expected to handle in
// newer runtimes. The older runtimes will just evaluate them to true.
return input == nullptr || input->is<NestedTrigger>();
}
void ListenerTriggerChange::perform(StateMachineInstance* stateMachineInstance,
Vec2D position) const
{
if (nestedInputId() != Core::emptyId)
{
auto nestedInputInstance = stateMachineInstance->artboard()->resolve(nestedInputId());
if (nestedInputInstance == nullptr)
{
return;
}
auto nestedTriggerInput = static_cast<NestedTrigger*>(nestedInputInstance);
if (nestedTriggerInput != nullptr)
{
nestedTriggerInput->fire(CallbackData(stateMachineInstance, 0));
}
}
else
{
auto inputInstance = stateMachineInstance->input(inputId());
if (inputInstance == nullptr)
{
return;
}
// If it's not null, it must be our correct type (why we validate at load time).
auto triggerInput = static_cast<SMITrigger*>(inputInstance);
if (triggerInput != nullptr)
{
triggerInput->fire();
}
}
}