]> git.sesse.net Git - casparcg/commitdiff
Changed meaning of frame variable in scene to a continously animating variable. The...
authorHelge Norberg <helge.norberg@svt.se>
Tue, 19 Jan 2016 12:56:03 +0000 (13:56 +0100)
committerHelge Norberg <helge.norberg@svt.se>
Tue, 19 Jan 2016 12:56:03 +0000 (13:56 +0100)
core/producer/scene/expression_parser.cpp
core/producer/scene/scene_producer.cpp
core/producer/scene/scene_producer.h
core/producer/scene/xml_scene_producer.cpp
modules/psd/psd_scene_producer.cpp

index 2fb5b42ccb1031cdcebb6cf96d4d8fa8dbfff75c..8d55ef76712334e3f72ea206e78c1fdc8d6d44fd 100644 (file)
@@ -118,7 +118,7 @@ boost::any create_animate_function(const std::vector<boost::any>& params, const
                        << msg_info(L"animate() function requires three parameters: to_animate, duration, tweener"));
 
        auto to_animate         = require<double>(params.at(0));
-       auto frame_counter      = var_repo(L"frame").as<int64_t>().as<double>();
+       auto frame_counter      = var_repo(L"frame").as<double>();
        auto duration           = require<double>(params.at(1));
        auto tw                         = require<std::wstring>(params.at(2)).transformed([](const std::wstring& s) { return tweener(s); });
 
index 84161ad1ca173f1135267334b1833077e6a555b8..fd99bb96b299f327fc221c3480f5c5dd37551f39 100644 (file)
@@ -123,7 +123,8 @@ struct scene_producer::impl
        video_format_desc                                                                               format_desc_;
        std::list<layer>                                                                                layers_;
        interaction_aggregator                                                                  aggregator_;
-       binding<int64_t>                                                                                frame_number_;
+       binding<double>                                                                                 frame_number_;
+       binding<int64_t>                                                                                timeline_frame_number_;
        binding<double>                                                                                 speed_;
        mutable tbb::atomic<int64_t>                                                    m_x_;
        mutable tbb::atomic<int64_t>                                                    m_y_;
@@ -149,10 +150,14 @@ struct scene_producer::impl
                store_variable(L"scene_speed", speed_variable);
                speed_ = speed_variable->value();
                
-               auto frame_variable = std::make_shared<core::variable_impl<int64_t>>(L"-1", true, -1);
+               auto frame_variable = std::make_shared<core::variable_impl<double>>(L"-1", true, -1);
                store_variable(L"frame", frame_variable);
                frame_number_ = frame_variable->value();
 
+               auto timeline_frame_variable = std::make_shared<core::variable_impl<int64_t>>(L"-1", false, -1);
+               store_variable(L"timeline_frame", timeline_frame_variable);
+               timeline_frame_number_ = timeline_frame_variable->value();
+
                auto mouse_x_variable = std::make_shared<core::variable_impl<int64_t>>(L"0", false, 0);
                auto mouse_y_variable = std::make_shared<core::variable_impl<int64_t>>(L"0", false, 0);
                store_variable(L"mouse_x", mouse_x_variable);
@@ -212,9 +217,9 @@ struct scene_producer::impl
                return variable_names_;
        }
 
-       binding<int64_t> frame()
+       binding<int64_t> timeline_frame()
        {
-               return frame_number_;
+               return timeline_frame_number_;
        }
 
        frame_transform get_transform(const layer& layer) const
@@ -329,8 +334,8 @@ struct scene_producer::impl
                if (std::abs(frame_fraction_) >= 1.0)
                {
                        int64_t delta = static_cast<int64_t>(frame_fraction_);
-                       auto previous_frame = frame_number_.get();
-                       auto next_frame = frame_number_.get() + delta;
+                       auto previous_frame = timeline_frame_number_.get();
+                       auto next_frame = timeline_frame_number_.get() + delta;
                        auto marker = find_first_stop_or_jump_or_remove(previous_frame + 1, next_frame);
 
                        if (marker && marker->second.action == mark_action::remove)
@@ -341,7 +346,7 @@ struct scene_producer::impl
                        {
                                if (marker->second.action == mark_action::stop)
                                {
-                                       frame_number_.set(marker->first);
+                                       timeline_frame_number_.set(marker->first);
                                        frame_fraction_ = 0.0;
                                        paused_ = true;
                                }
@@ -352,7 +357,7 @@ struct scene_producer::impl
                        }
                        else
                        {
-                               frame_number_.set(next_frame);
+                               timeline_frame_number_.set(next_frame);
                                frame_fraction_ -= delta;
                        }
 
@@ -365,14 +370,16 @@ struct scene_producer::impl
                if (removed_)
                        return draw_frame::empty();
 
+               mouse_x_.set(m_x_);
+               mouse_y_.set(m_y_);
+
                if (!paused_)
                        advance();
 
-               for (auto& timeline : timelines_)
-                       timeline.second.on_frame(frame_number_.get());
+               frame_number_.set(frame_number_.get() + speed_.get());
 
-               mouse_x_.set(m_x_);
-               mouse_y_.set(m_y_);
+               for (auto& timeline : timelines_)
+                       timeline.second.on_frame(timeline_frame_number_.get());
 
                std::vector<draw_frame> frames;
 
@@ -470,11 +477,11 @@ struct scene_producer::impl
 
        void next()
        {
-               auto marker = find_first_start(frame_number_.get() + 1);
+               auto marker = find_first_start(timeline_frame_number_.get() + 1);
 
                if (marker)
                {
-                       frame_number_.set(marker->first - 1);
+                       timeline_frame_number_.set(marker->first - 1);
                        frame_fraction_ = 0.0;
                        paused_ = false;
                        going_to_mark_ = true;
@@ -491,7 +498,7 @@ struct scene_producer::impl
                {
                        if (marker.second.label_argument == marker_name && marker.second.action == mark_action::start)
                        {
-                               frame_number_.set(marker.first + offset);
+                               timeline_frame_number_.set(marker.first + offset);
                                frame_fraction_ = 0.0;
                                paused_ = false;
                                going_to_mark_ = true;
@@ -502,7 +509,7 @@ struct scene_producer::impl
 
                if (marker_name == L"intro")
                {
-                       frame_number_.set(offset);
+                       timeline_frame_number_.set(offset);
                        frame_fraction_ = 0.0;
                        paused_ = false;
                        going_to_mark_ = true;
@@ -531,6 +538,7 @@ struct scene_producer::impl
                info.add(L"type", L"scene");
                info.add(L"producer-name", name());
                info.add(L"frame-number", frame_number_.get());
+               info.add(L"timeline-frame-number", timeline_frame_number_.get());
 
                for (auto& var : variables_)
                {
@@ -591,9 +599,9 @@ void scene_producer::reverse_layers() {
        impl_->reverse_layers();
 }
 
-binding<int64_t> scene_producer::frame()
+binding<int64_t> scene_producer::timeline_frame()
 {
-       return impl_->frame();
+       return impl_->timeline_frame();
 }
 
 draw_frame scene_producer::receive_impl()
index 074bc97a9f965be5ab34441dc2386d4b9b657b82..ccfad7fe9c8c2a742272543428754123fa276a64 100644 (file)
@@ -130,7 +130,7 @@ public:
                        const spl::shared_ptr<frame_producer>& producer, const std::wstring& name);
        void reverse_layers();
 
-       binding<int64_t> frame();
+       binding<int64_t> timeline_frame();
        binding<double> speed();
 
        template<typename T> binding<T>& create_variable(
index 1fe9e38290dbc3abaa9884d6262c6a2831867c60..5eacb6c368f92359bdfe35703f16d27b6e57ae4f 100644 (file)
@@ -206,26 +206,29 @@ spl::shared_ptr<core::frame_producer> create_xml_scene_producer(
                }
        }
 
-       for (auto& elem : root | witerate_children(L"scene.timelines") | welement_context_iteration)
+       if (root.get_child_optional(L"scene.timelines"))
        {
-               ptree_verify_element_name(elem, L"timeline");
+               for (auto& elem : root | witerate_children(L"scene.timelines") | welement_context_iteration)
+               {
+                       ptree_verify_element_name(elem, L"timeline");
 
-               auto& variable = scene->get_variable(ptree_get<std::wstring>(elem.second, L"<xmlattr>.variable"));
+                       auto& variable = scene->get_variable(ptree_get<std::wstring>(elem.second, L"<xmlattr>.variable"));
 
-               for (auto& k : elem.second)
-               {
-                       if (k.first == L"<xmlattr>")
-                               continue;
+                       for (auto& k : elem.second)
+                       {
+                               if (k.first == L"<xmlattr>")
+                                       continue;
 
-                       ptree_verify_element_name(k, L"keyframe");
+                               ptree_verify_element_name(k, L"keyframe");
 
-                       auto easing     = k.second.get(L"<xmlattr>.easing", L"");
-                       auto at         = ptree_get<int64_t>(k.second, L"<xmlattr>.at");
+                               auto easing = k.second.get(L"<xmlattr>.easing", L"");
+                               auto at = ptree_get<int64_t>(k.second, L"<xmlattr>.at");
 
-                       if (variable.is<double>())
-                               scene->add_keyframe(variable.as<double>(), ptree_get_value<double>(k.second), at, easing);
-                       else if (variable.is<int>())
-                               scene->add_keyframe(variable.as<int>(), ptree_get_value<int>(k.second), at, easing);
+                               if (variable.is<double>())
+                                       scene->add_keyframe(variable.as<double>(), ptree_get_value<double>(k.second), at, easing);
+                               else if (variable.is<int>())
+                                       scene->add_keyframe(variable.as<int>(), ptree_get_value<int>(k.second), at, easing);
+                       }
                }
        }
 
index f372419b52bfac04712ca700b643baebce0c17bd..577ee790eda2b4e493eef964a9faf7bbde0534a7 100644 (file)
@@ -283,7 +283,7 @@ void create_timelines(
        auto start_frame = get_frame_number(format_desc, start);
        auto end_frame = get_frame_number(format_desc, end);
 
-       layer.hidden = scene->frame() < start_frame || scene->frame() > end_frame;
+       layer.hidden = scene->timeline_frame() < start_frame || scene->timeline_frame() > end_frame;
 
        auto tracklist = timeline.get_child_optional(L"trackList");