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_;
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);
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
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)
{
if (marker->second.action == mark_action::stop)
{
- frame_number_.set(marker->first);
+ timeline_frame_number_.set(marker->first);
frame_fraction_ = 0.0;
paused_ = true;
}
}
else
{
- frame_number_.set(next_frame);
+ timeline_frame_number_.set(next_frame);
frame_fraction_ -= delta;
}
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;
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;
{
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;
if (marker_name == L"intro")
{
- frame_number_.set(offset);
+ timeline_frame_number_.set(offset);
frame_fraction_ = 0.0;
paused_ = false;
going_to_mark_ = true;
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_)
{
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()
}
}
- 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);
+ }
}
}