blob: 337811adff9d3fe1bec13b980900044851f922e4 [file] [log] [blame]
#ifndef _RIVE_TRANSITION_COMPARATOR_HPP_
#define _RIVE_TRANSITION_COMPARATOR_HPP_
#include "rive/generated/animation/transition_comparator_base.hpp"
#include "rive/animation/transition_condition_op.hpp"
#include "rive/viewmodel/viewmodel_instance.hpp"
#include "rive/viewmodel/viewmodel_instance_value.hpp"
#include <stdio.h>
namespace rive
{
class StateMachineInstance;
class StateMachineLayerInstance;
class TransitionComparator : public TransitionComparatorBase
{
public:
StatusCode import(ImportStack& importStack) override;
virtual bool compare(TransitionComparator* comparand,
TransitionConditionOp operation,
const StateMachineInstance* stateMachineInstance,
StateMachineLayerInstance* layerInstance);
virtual void useInLayer(const StateMachineInstance* stateMachineInstance,
StateMachineLayerInstance* layerInstance) const
{}
protected:
bool compareNumbers(float left, float right, TransitionConditionOp op);
bool compareBooleans(bool left, bool right, TransitionConditionOp op);
bool compareEnums(uint16_t left, uint16_t right, TransitionConditionOp op);
bool compareColors(int left, int right, TransitionConditionOp op);
bool compareStrings(std::string left,
std::string right,
TransitionConditionOp op);
bool compareTriggers(uint32_t left,
uint32_t right,
TransitionConditionOp op);
bool compareIds(uint32_t left, uint32_t right, TransitionConditionOp op);
template <typename T>
bool compareComparables(T left, T right, TransitionConditionOp op)
{
switch (op)
{
case TransitionConditionOp::equal:
return left == right;
case TransitionConditionOp::notEqual:
return left != right;
case TransitionConditionOp::lessThanOrEqual:
return left <= right;
case TransitionConditionOp::lessThan:
return left < right;
case TransitionConditionOp::greaterThanOrEqual:
return left >= right;
case TransitionConditionOp::greaterThan:
return left > right;
default:
return false;
}
}
};
} // namespace rive
#endif