]> git.sesse.net Git - casparcg/commitdiff
[scene_producer] Added abs() function to expression language
authorHelge Norberg <helge.norberg@svt.se>
Tue, 31 Jan 2017 12:50:41 +0000 (13:50 +0100)
committerHelge Norberg <helge.norberg@svt.se>
Tue, 31 Jan 2017 12:50:41 +0000 (13:50 +0100)
CHANGELOG
core/producer/scene/expression_parser.cpp

index 41d42c408298aa7138a07197a989ba5558b3a855..e88914889a8a4e09e215c1a0512b67d32fed1167 100644 (file)
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -56,6 +56,8 @@ Producers
   o Layer producer:\r
     + Fixed serious bug where a circular reference of layer producers caused a\r
       stack overflow and server crash.\r
+  o Scene producer:\r
+    + Added abs() function to expression language.\r
 \r
 Mixer\r
 -----\r
index 8d55ef76712334e3f72ea206e78c1fdc8d6d44fd..b9bd66e8cc05b5133d6650733529473ad2711930 100644 (file)
@@ -147,6 +147,17 @@ boost::any create_cos_function(const std::vector<boost::any>& params, const vari
        return angle.transformed([](double a) { return std::cos(a); });
 }
 
+boost::any create_abs_function(const std::vector<boost::any>& params, const variable_repository& var_repo)
+{
+       if (params.size() != 1)
+               CASPAR_THROW_EXCEPTION(user_error()
+                       << msg_info(L"abs() function requires one parameters: value"));
+
+       auto val = require<double>(params.at(0));
+
+       return val.transformed([](double v) { return std::abs(v); });
+}
+
 boost::any parse_function(
                const std::wstring& function_name,
                std::wstring::const_iterator& cursor,
@@ -157,7 +168,8 @@ boost::any parse_function(
        {
                {L"animate",    create_animate_function },
                {L"sin",                create_sin_function },
-               {L"cos",                create_cos_function }
+               {L"cos",                create_cos_function },
+               {L"abs",                create_abs_function }
        };
 
        auto function = FUNCTIONS.find(function_name);
@@ -642,7 +654,7 @@ boost::any ternary(
        auto cond = require<bool>(condition);
        auto t = as_binding(true_value);
        auto f = as_binding(false_value);
-       
+
        // double
        if (is<binding<double>>(t) && is<binding<double>>(f))
                return ternary(cond, as<binding<double>>(t), as<binding<double>>(f));