diff --git a/Source/Core/DolphinQt/Config/Mapping/IOWindow.cpp b/Source/Core/DolphinQt/Config/Mapping/IOWindow.cpp index 3412022f6b..0ba47bcacc 100644 --- a/Source/Core/DolphinQt/Config/Mapping/IOWindow.cpp +++ b/Source/Core/DolphinQt/Config/Mapping/IOWindow.cpp @@ -356,6 +356,10 @@ void IOWindow::CreateMainLayout() m_functions_combo->addItem(QStringLiteral("atan2")); m_functions_combo->addItem(QStringLiteral("sqrt")); m_functions_combo->addItem(QStringLiteral("pow")); + m_functions_combo->addItem(QStringLiteral("floor")); + m_functions_combo->addItem(QStringLiteral("ceil")); + m_functions_combo->addItem(QStringLiteral("round")); + m_functions_combo->addItem(QStringLiteral("trunc")); m_functions_combo->addItem(QStringLiteral("min")); m_functions_combo->addItem(QStringLiteral("max")); m_functions_combo->addItem(QStringLiteral("clamp")); diff --git a/Source/Core/InputCommon/ControlReference/FunctionExpression.cpp b/Source/Core/InputCommon/ControlReference/FunctionExpression.cpp index 603298de93..9dc9608ed1 100644 --- a/Source/Core/InputCommon/ControlReference/FunctionExpression.cpp +++ b/Source/Core/InputCommon/ControlReference/FunctionExpression.cpp @@ -220,6 +220,66 @@ private: ControlState GetValue() override { return std::pow(GetArg(0).GetValue(), GetArg(1).GetValue()); } }; +// usage: floor(expression) +class FloorExpression : public FunctionExpression +{ +private: + ArgumentValidation ValidateArguments() override + { + if (GetArgCount() == 1) + return ArgumentsAreValid{}; + else + return ExpectedArguments{"expression"}; + } + + ControlState GetValue() override { return std::floor(GetArg(0).GetValue()); } +}; + +// usage: ceil(expression) +class CeilExpression : public FunctionExpression +{ +private: + ArgumentValidation ValidateArguments() override + { + if (GetArgCount() == 1) + return ArgumentsAreValid{}; + else + return ExpectedArguments{"expression"}; + } + + ControlState GetValue() override { return std::ceil(GetArg(0).GetValue()); } +}; + +// usage: round(expression) +class RoundExpression : public FunctionExpression +{ +private: + ArgumentValidation ValidateArguments() override + { + if (GetArgCount() == 1) + return ArgumentsAreValid{}; + else + return ExpectedArguments{"expression"}; + } + + ControlState GetValue() override { return std::round(GetArg(0).GetValue()); } +}; + +// usage: trunc(expression) +class TruncExpression : public FunctionExpression +{ +private: + ArgumentValidation ValidateArguments() override + { + if (GetArgCount() == 1) + return ArgumentsAreValid{}; + else + return ExpectedArguments{"expression"}; + } + + ControlState GetValue() override { return std::trunc(GetArg(0).GetValue()); } +}; + // usage: min(a, b) class MinExpression : public FunctionExpression { @@ -660,6 +720,14 @@ std::unique_ptr MakeFunctionExpression(std::string_view name return std::make_unique(); if (name == "pow") return std::make_unique(); + if (name == "floor") + return std::make_unique(); + if (name == "ceil") + return std::make_unique(); + if (name == "round") + return std::make_unique(); + if (name == "trunc") + return std::make_unique(); if (name == "min") return std::make_unique(); if (name == "max")