From 85a1fa47c833498f7f5c9c7335dbd0b0983011a0 Mon Sep 17 00:00:00 2001 From: Helge Norberg Date: Tue, 14 Mar 2017 18:44:37 +0100 Subject: [PATCH] [psd] Fixed bug where keyframes where one frame off sometimes in the temporal space. --- modules/psd/psd_scene_producer.cpp | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/modules/psd/psd_scene_producer.cpp b/modules/psd/psd_scene_producer.cpp index cf1662268..89c410f59 100644 --- a/modules/psd/psd_scene_producer.cpp +++ b/modules/psd/psd_scene_producer.cpp @@ -200,12 +200,11 @@ public: } }; -int64_t get_frame_number( +boost::rational get_frame_number( const core::video_format_desc& format_desc, const boost::rational& at_second) { - return static_cast( - boost::rational_cast(at_second) * format_desc.fps); + return at_second * format_desc.framerate; } boost::rational get_rational(const boost::property_tree::wptree& node) @@ -227,7 +226,7 @@ void create_marks_from_comments( for (auto& key : *keylist) { auto time = get_rational(key.second.get_child(L"time")); - auto frame = get_frame_number(format_desc, time); + auto frame = boost::rational_cast(get_frame_number(format_desc, time)); auto text = key.second.get(L"animKey.Vl "); std::vector marks; boost::split(marks, text, boost::is_any_of(",")); @@ -252,7 +251,7 @@ void create_marks( auto time = get_rational(global_timeline.get_child(L"duration")); auto remove_at_frame = get_frame_number(format_desc, time); - scene->add_mark(remove_at_frame, core::scene::mark_action::remove, L""); + scene->add_mark(boost::rational_cast(remove_at_frame), core::scene::mark_action::remove, L""); auto tracklist = global_timeline.get_child_optional(L"globalTrackList"); @@ -283,7 +282,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->timeline_frame() < start_frame || scene->timeline_frame() > end_frame; + layer.hidden = scene->timeline_frame() < boost::rational_cast(start_frame) || scene->timeline_frame() > boost::rational_cast(end_frame); auto tracklist = timeline.get_child_optional(L"trackList"); @@ -320,13 +319,13 @@ void create_timelines( if (tween) { - scene->add_keyframe(layer.position.x, x, frame, L"easeOutSine"); - scene->add_keyframe(layer.position.y, y, frame, L"easeOutSine"); + scene->add_keyframe(layer.position.x, x, boost::rational_cast(frame), L"easeOutSine"); + scene->add_keyframe(layer.position.y, y, boost::rational_cast(frame), L"easeOutSine"); } else { - scene->add_keyframe(layer.position.x, x, frame); - scene->add_keyframe(layer.position.y, y, frame); + scene->add_keyframe(layer.position.x, x, boost::rational_cast(frame)); + scene->add_keyframe(layer.position.y, y, boost::rational_cast(frame)); } } } @@ -348,9 +347,9 @@ void create_timelines( frame = start_frame + frame; // translate to global timeline if (tween) - scene->add_keyframe(opacity, opct, frame, L"easeOutSine"); + scene->add_keyframe(opacity, opct, boost::rational_cast(frame), L"linear"); else - scene->add_keyframe(opacity, opct, frame); + scene->add_keyframe(opacity, opct, boost::rational_cast(frame)); } } else -- 2.39.2