blob: 9fa981bd6c949505e3ada0ef67e9e288be867374 [file] [log] [blame]
#ifndef _RIVE_TRANSITION_VIEW_MODEL_CONDITION_HPP_
#define _RIVE_TRANSITION_VIEW_MODEL_CONDITION_HPP_
#include "rive/generated/animation/transition_viewmodel_condition_base.hpp"
#include "rive/animation/transition_comparator.hpp"
#include "rive/animation/transition_property_artboard_comparator.hpp"
#include "rive/animation/transition_property_viewmodel_comparator.hpp"
#include "rive/animation/transition_condition_op.hpp"
#include "rive/animation/state_machine_instance.hpp"
#include "rive/data_bind/bindable_property.hpp"
#include "rive/data_bind/bindable_property_artboard.hpp"
#include "rive/data_bind/bindable_property_asset.hpp"
#include "rive/data_bind/bindable_property_boolean.hpp"
#include "rive/data_bind/bindable_property_color.hpp"
#include "rive/data_bind/bindable_property_enum.hpp"
#include "rive/data_bind/bindable_property_integer.hpp"
#include "rive/data_bind/bindable_property_number.hpp"
#include "rive/data_bind/bindable_property_string.hpp"
#include "rive/data_bind/bindable_property_trigger.hpp"
#include "rive/animation/transition_self_comparator.hpp"
#include "rive/animation/transition_value_artboard_comparator.hpp"
#include "rive/animation/transition_value_asset_comparator.hpp"
#include "rive/animation/transition_value_number_comparator.hpp"
#include "rive/animation/transition_value_boolean_comparator.hpp"
#include "rive/animation/transition_value_string_comparator.hpp"
#include "rive/animation/transition_value_color_comparator.hpp"
#include "rive/animation/transition_value_enum_comparator.hpp"
#include "rive/animation/transition_value_trigger_comparator.hpp"
#include "rive/animation/artboard_property.hpp"
#include <stdio.h>
namespace rive
{
class ConditionOperation
{
public:
virtual ~ConditionOperation() {}
virtual bool compareNumbers(float a, float b) { return false; };
virtual bool compareBooleans(bool a, bool b) { return false; }
virtual bool compareStrings(const std::string& a, const std::string& b)
{
return false;
}
virtual bool compareInts(int a, int b) { return false; }
virtual bool compareUints32(uint32_t a, uint32_t b) { return false; }
protected:
template <typename T> bool equal(T left, T right) { return left == right; }
template <typename T> bool notEqual(T left, T right)
{
return left != right;
}
template <typename T> bool lessThanOrEqual(T left, T right)
{
return left <= right;
}
template <typename T> bool lessThan(T left, T right)
{
return left < right;
}
template <typename T> bool greaterThanOrEqual(T left, T right)
{
return left >= right;
}
template <typename T> bool greaterThan(T left, T right)
{
return left > right;
}
};
class ConditionOperationEqual : public ConditionOperation
{
public:
bool compareNumbers(float a, float b) override
{
return equal<float>(a, b);
}
bool compareBooleans(bool a, bool b) override { return equal<bool>(a, b); }
bool compareStrings(const std::string& a, const std::string& b) override
{
return equal<std::string>(a, b);
}
bool compareInts(int a, int b) override { return equal<int>(a, b); }
bool compareUints32(uint32_t a, uint32_t b) override
{
return equal<uint32_t>(a, b);
}
};
class ConditionOperationNotEqual : public ConditionOperation
{
public:
bool compareNumbers(float a, float b) override
{
return notEqual<float>(a, b);
}
bool compareBooleans(bool a, bool b) override
{
return notEqual<bool>(a, b);
}
bool compareStrings(const std::string& a, const std::string& b) override
{
return notEqual<std::string>(a, b);
}
bool compareInts(int a, int b) override { return notEqual<int>(a, b); }
bool compareUints32(uint32_t a, uint32_t b) override
{
return notEqual<uint32_t>(a, b);
}
};
class ConditionOperationLessThanOrEqual : public ConditionOperation
{
public:
bool compareNumbers(float a, float b) override
{
return lessThanOrEqual<float>(a, b);
}
};
class ConditionOperationLessThan : public ConditionOperation
{
public:
bool compareNumbers(float a, float b) override
{
return lessThan<float>(a, b);
}
};
class ConditionOperationGreaterThanOrEqual : public ConditionOperation
{
public:
bool compareNumbers(float a, float b) override
{
return greaterThanOrEqual<float>(a, b);
}
};
class ConditionOperationGreaterThan : public ConditionOperation
{
public:
bool compareNumbers(float a, float b) override
{
return greaterThan<float>(a, b);
}
};
class ConditionComparand
{};
class ConditionComparandNumber : public ConditionComparand
{
public:
virtual ~ConditionComparandNumber() {}
virtual float value(const StateMachineInstance* stateMachineInstance) = 0;
};
class ConditionComparandNumberBindable : public ConditionComparandNumber
{
public:
ConditionComparandNumberBindable(BindablePropertyNumber* property) :
m_bindableProperty(property)
{}
float value(const StateMachineInstance* stateMachineInstance) override
{
auto bindableInstance =
stateMachineInstance->bindablePropertyInstance(m_bindableProperty);
if (bindableInstance)
{
return bindableInstance->as<BindablePropertyNumber>()
->propertyValue();
}
return 0;
}
private:
BindablePropertyNumber* m_bindableProperty;
};
class ConditionComparandArtboardProperty : public ConditionComparandNumber
{
public:
ConditionComparandArtboardProperty(
TransitionPropertyArtboardComparator* property) :
m_transitionPropertyArtboardComparator(property)
{}
float value(const StateMachineInstance* stateMachineInstance) override
{
auto artboard = stateMachineInstance->artboard();
if (artboard != nullptr)
{
auto property = static_cast<ArtboardProperty>(
m_transitionPropertyArtboardComparator->propertyType());
switch (property)
{
case ArtboardProperty::width:
return artboard->layoutWidth();
break;
case ArtboardProperty::height:
return artboard->layoutHeight();
break;
case ArtboardProperty::ratio:
return artboard->layoutWidth() / artboard->layoutHeight();
break;
default:
break;
}
}
return 0;
}
private:
TransitionPropertyArtboardComparator*
m_transitionPropertyArtboardComparator;
};
class ConditionComparandNumberBindableInteger : public ConditionComparandNumber
{
public:
ConditionComparandNumberBindableInteger(BindablePropertyInteger* property) :
m_bindableProperty(property)
{}
float value(const StateMachineInstance* stateMachineInstance) override
{
auto bindableInstance =
stateMachineInstance->bindablePropertyInstance(m_bindableProperty);
if (bindableInstance)
{
return (float)bindableInstance->as<BindablePropertyInteger>()
->propertyValue();
}
return 0;
}
private:
BindablePropertyInteger* m_bindableProperty;
};
class ConditionComparandNumberValue : public ConditionComparandNumber
{
public:
ConditionComparandNumberValue(TransitionValueNumberComparator* value) :
m_value(value)
{}
float value(const StateMachineInstance* stateMachineInstance) override
{
return m_value->value();
}
private:
TransitionValueNumberComparator* m_value;
};
class ConditionComparandBoolean : public ConditionComparand
{
public:
virtual ~ConditionComparandBoolean() {}
virtual bool value(const StateMachineInstance* stateMachineInstance) = 0;
};
class ConditionComparandBooleanBindable : public ConditionComparandBoolean
{
public:
ConditionComparandBooleanBindable(BindablePropertyBoolean* property) :
m_bindableProperty(property)
{}
bool value(const StateMachineInstance* stateMachineInstance) override
{
auto bindableInstance =
stateMachineInstance->bindablePropertyInstance(m_bindableProperty);
if (bindableInstance)
{
return bindableInstance->as<BindablePropertyBoolean>()
->propertyValue();
}
return false;
}
private:
BindablePropertyBoolean* m_bindableProperty;
};
class ConditionComparandBooleanValue : public ConditionComparandBoolean
{
public:
ConditionComparandBooleanValue(TransitionValueBooleanComparator* value) :
m_value(value)
{}
bool value(const StateMachineInstance* stateMachineInstance) override
{
return m_value->value();
}
private:
TransitionValueBooleanComparator* m_value;
};
class ConditionComparandString : public ConditionComparand
{
public:
virtual ~ConditionComparandString() {}
virtual std::string value(
const StateMachineInstance* stateMachineInstance) = 0;
};
class ConditionComparandStringBindable : public ConditionComparandString
{
public:
ConditionComparandStringBindable(BindablePropertyString* property) :
m_bindableProperty(property)
{}
std::string value(const StateMachineInstance* stateMachineInstance) override
{
auto bindableInstance =
stateMachineInstance->bindablePropertyInstance(m_bindableProperty);
if (bindableInstance)
{
return bindableInstance->as<BindablePropertyString>()
->propertyValue();
}
return std::string{};
}
private:
BindablePropertyString* m_bindableProperty;
};
class ConditionComparandStringValue : public ConditionComparandString
{
public:
ConditionComparandStringValue(TransitionValueStringComparator* value) :
m_value(value)
{}
std::string value(const StateMachineInstance* stateMachineInstance) override
{
return m_value->value();
}
private:
TransitionValueStringComparator* m_value;
};
class ConditionComparandColor : public ConditionComparand
{
public:
virtual ~ConditionComparandColor() {}
virtual int value(const StateMachineInstance* stateMachineInstance) = 0;
};
class ConditionComparandColorBindable : public ConditionComparandColor
{
public:
ConditionComparandColorBindable(BindablePropertyColor* property) :
m_bindableProperty(property)
{}
int value(const StateMachineInstance* stateMachineInstance) override
{
auto bindableInstance =
stateMachineInstance->bindablePropertyInstance(m_bindableProperty);
if (bindableInstance)
{
return bindableInstance->as<BindablePropertyColor>()
->propertyValue();
}
return 0;
}
private:
BindablePropertyColor* m_bindableProperty;
};
class ConditionComparandColorValue : public ConditionComparandColor
{
public:
ConditionComparandColorValue(TransitionValueColorComparator* value) :
m_value(value)
{}
int value(const StateMachineInstance* stateMachineInstance) override
{
return m_value->value();
}
private:
TransitionValueColorComparator* m_value;
};
class ConditionComparandUint32 : public ConditionComparand
{
public:
virtual ~ConditionComparandUint32() {}
virtual uint32_t value(
const StateMachineInstance* stateMachineInstance) = 0;
};
class ConditionComparandEnumBindable : public ConditionComparandUint32
{
public:
ConditionComparandEnumBindable(BindablePropertyEnum* property) :
m_bindableProperty(property)
{}
uint32_t value(const StateMachineInstance* stateMachineInstance) override
{
auto bindableInstance =
stateMachineInstance->bindablePropertyInstance(m_bindableProperty);
if (bindableInstance)
{
return bindableInstance->as<BindablePropertyEnum>()
->propertyValue();
}
return 0;
}
private:
BindablePropertyEnum* m_bindableProperty;
};
class ConditionComparandEnumValue : public ConditionComparandUint32
{
public:
ConditionComparandEnumValue(TransitionValueEnumComparator* value) :
m_value(value)
{}
uint32_t value(const StateMachineInstance* stateMachineInstance) override
{
return m_value->value();
}
private:
TransitionValueEnumComparator* m_value;
};
class ConditionComparandTriggerBindable : public ConditionComparandUint32
{
public:
ConditionComparandTriggerBindable(BindablePropertyTrigger* property) :
m_bindableProperty(property)
{}
uint32_t value(const StateMachineInstance* stateMachineInstance) override
{
auto bindableInstance =
stateMachineInstance->bindablePropertyInstance(m_bindableProperty);
if (bindableInstance)
{
return bindableInstance->as<BindablePropertyTrigger>()
->propertyValue();
}
return 0;
}
private:
BindablePropertyTrigger* m_bindableProperty;
};
class ConditionComparandTriggerValue : public ConditionComparandUint32
{
public:
ConditionComparandTriggerValue(TransitionValueTriggerComparator* value) :
m_value(value)
{}
uint32_t value(const StateMachineInstance* stateMachineInstance) override
{
return m_value->value();
}
private:
TransitionValueTriggerComparator* m_value;
};
class ConditionComparandIntegerBindable : public ConditionComparandUint32
{
public:
ConditionComparandIntegerBindable(BindablePropertyInteger* property) :
m_bindableProperty(property)
{}
uint32_t value(const StateMachineInstance* stateMachineInstance) override
{
auto bindableInstance =
stateMachineInstance->bindablePropertyInstance(m_bindableProperty);
if (bindableInstance)
{
return bindableInstance->as<BindablePropertyInteger>()
->propertyValue();
}
return 0;
}
private:
BindablePropertyInteger* m_bindableProperty;
};
class ConditionComparandAssetBindable : public ConditionComparandUint32
{
public:
ConditionComparandAssetBindable(BindablePropertyAsset* property) :
m_bindableProperty(property)
{}
uint32_t value(const StateMachineInstance* stateMachineInstance) override
{
auto bindableInstance =
stateMachineInstance->bindablePropertyInstance(m_bindableProperty);
if (bindableInstance)
{
return bindableInstance->as<BindablePropertyAsset>()
->propertyValue();
}
return 0;
}
private:
BindablePropertyAsset* m_bindableProperty;
};
class ConditionComparandAssetValue : public ConditionComparandUint32
{
public:
ConditionComparandAssetValue(TransitionValueAssetComparator* value) :
m_value(value)
{}
uint32_t value(const StateMachineInstance* stateMachineInstance) override
{
return m_value->value();
}
private:
TransitionValueAssetComparator* m_value;
};
class ConditionComparandArtboardBindable : public ConditionComparandUint32
{
public:
ConditionComparandArtboardBindable(BindablePropertyArtboard* property) :
m_bindableProperty(property)
{}
uint32_t value(const StateMachineInstance* stateMachineInstance) override
{
auto bindableInstance =
stateMachineInstance->bindablePropertyInstance(m_bindableProperty);
if (bindableInstance)
{
return bindableInstance->as<BindablePropertyArtboard>()
->propertyValue();
}
return 0;
}
private:
BindablePropertyArtboard* m_bindableProperty;
};
class ConditionComparandArtboardValue : public ConditionComparandUint32
{
public:
ConditionComparandArtboardValue(TransitionValueArtboardComparator* value) :
m_value(value)
{}
uint32_t value(const StateMachineInstance* stateMachineInstance) override
{
return m_value->value();
}
private:
TransitionValueArtboardComparator* m_value;
};
class ConditionComparison
{
public:
ConditionComparison(ConditionOperation* op) : m_operation(op) {}
virtual ~ConditionComparison() { delete m_operation; }
virtual bool compare(const StateMachineInstance* stateMachineInstance,
StateMachineLayerInstance* layerInstance) = 0;
bool compareNumbers(float left, float right);
bool compareBooleans(bool left, bool right);
bool compareStrings(const std::string& left, const std::string& right);
bool compareColors(int left, int right);
bool compareUints32(uint32_t left, uint32_t right);
protected:
ConditionOperation* m_operation;
};
class TransitionViewModelCondition : public TransitionViewModelConditionBase
{
protected:
TransitionComparator* m_leftComparator;
TransitionComparator* m_rightComparator;
ConditionComparison* m_comparison = nullptr;
public:
~TransitionViewModelCondition();
bool evaluate(const StateMachineInstance* stateMachineInstance,
StateMachineLayerInstance* layerInstance) const override;
void useInLayer(const StateMachineInstance* stateMachineInstance,
StateMachineLayerInstance* layerInstance) const override;
TransitionComparator* leftComparator() const { return m_leftComparator; };
TransitionComparator* rightComparator() const { return m_rightComparator; };
void comparator(TransitionComparator* value)
{
if (m_leftComparator == nullptr)
{
m_leftComparator = value;
}
else
{
m_rightComparator = value;
}
};
TransitionConditionOp op() const
{
return (TransitionConditionOp)opValue();
}
ConditionOperation* operation(TransitionConditionOp op);
void initialize();
};
} // namespace rive
#endif