blob: c071c44b8cfd68ed085a23f07ffd0a8eb85e964d [file] [log] [blame]
#include "rive/math/math_types.hpp"
#include "rive/data_bind/converters/data_converter_operation.hpp"
#include "rive/data_bind/data_values/data_value_number.hpp"
#include "rive/data_bind/data_values/data_value_symbol_list_index.hpp"
#include <cmath>
using namespace rive;
DataValue* DataConverterOperation::convertValue(DataValue* input, float value)
{
if (input->is<DataValueNumber>() || input->is<DataValueSymbolListIndex>())
{
float inputValue =
input->is<DataValueNumber>()
? input->as<DataValueNumber>()->value()
: (float)(input->as<DataValueSymbolListIndex>()->value());
float resultValue = value;
switch (op())
{
case ArithmeticOperation::add:
resultValue = inputValue + resultValue;
break;
case ArithmeticOperation::subtract:
resultValue = inputValue - resultValue;
break;
case ArithmeticOperation::multiply:
resultValue = inputValue * resultValue;
break;
case ArithmeticOperation::divide:
resultValue = inputValue / resultValue;
break;
case ArithmeticOperation::modulo:
resultValue = math::positive_mod(inputValue, resultValue);
break;
case ArithmeticOperation::squareRoot:
resultValue = sqrtf(inputValue);
break;
case ArithmeticOperation::power:
resultValue = powf(inputValue, resultValue);
break;
case ArithmeticOperation::exp:
resultValue = exp(inputValue);
break;
case ArithmeticOperation::log:
resultValue = log(inputValue);
break;
case ArithmeticOperation::cosine:
resultValue = cos(inputValue);
break;
case ArithmeticOperation::sine:
resultValue = sin(inputValue);
break;
case ArithmeticOperation::tangent:
resultValue = tan(inputValue);
break;
case ArithmeticOperation::acosine:
resultValue = acos(inputValue);
break;
case ArithmeticOperation::asine:
resultValue = asin(inputValue);
break;
case ArithmeticOperation::atangent:
resultValue = atan(inputValue);
break;
case ArithmeticOperation::atangent2:
resultValue = atan2(inputValue, resultValue);
break;
case ArithmeticOperation::round:
resultValue = roundf(inputValue);
break;
case ArithmeticOperation::floor:
resultValue = floorf(inputValue);
break;
case ArithmeticOperation::ceil:
resultValue = ceilf(inputValue);
break;
}
m_output.value(resultValue);
}
else
{
m_output.value(DataValueNumber::defaultValue);
}
return &m_output;
}
DataValue* DataConverterOperation::reverseConvertValue(DataValue* input,
float value)
{
auto output = new DataValueNumber();
if (input->is<DataValueNumber>())
{
float inputValue = input->as<DataValueNumber>()->value();
float resultValue = value;
switch (op())
{
case ArithmeticOperation::add:
resultValue = inputValue - resultValue;
break;
case ArithmeticOperation::subtract:
resultValue = inputValue + resultValue;
break;
case ArithmeticOperation::multiply:
resultValue = inputValue / resultValue;
break;
case ArithmeticOperation::divide:
resultValue = inputValue * resultValue;
break;
//
case ArithmeticOperation::modulo:
resultValue = inputValue; // No reverse operation for modulo
break;
case ArithmeticOperation::squareRoot:
resultValue = powf(inputValue, 2);
break;
case ArithmeticOperation::power:
resultValue = powf(inputValue, 1 / resultValue);
break;
case ArithmeticOperation::exp:
resultValue = log(inputValue);
break;
case ArithmeticOperation::log:
resultValue = exp(inputValue);
break;
case ArithmeticOperation::cosine:
resultValue = acos(inputValue);
break;
case ArithmeticOperation::sine:
resultValue = asin(inputValue);
break;
case ArithmeticOperation::tangent:
resultValue = atan(inputValue);
break;
case ArithmeticOperation::acosine:
resultValue = cos(inputValue);
break;
case ArithmeticOperation::asine:
resultValue = sin(inputValue);
break;
case ArithmeticOperation::atangent:
resultValue = tan(inputValue);
break;
case ArithmeticOperation::atangent2:
resultValue = inputValue; // No reverse operation for atan2
break;
case ArithmeticOperation::round:
case ArithmeticOperation::floor:
case ArithmeticOperation::ceil:
resultValue = inputValue; // No reverse operation
break;
}
output->value(resultValue);
}
return output;
}