]> git.sesse.net Git - casparcg/commitdiff
git-svn-id: https://casparcg.svn.sourceforge.net/svnroot/casparcg/server/branches...
authorronag <ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Mon, 21 Mar 2011 09:02:02 +0000 (09:02 +0000)
committerronag <ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Mon, 21 Mar 2011 09:02:02 +0000 (09:02 +0000)
common/utility/tweener.h
core/producer/transition/transition_producer.cpp
core/producer/transition/transition_producer.h

index 2cb8905ab8a164619e6eaba67e8513a6f0584351..7de2ed701419edbc21ec1725150d71dc1bda76cc 100644 (file)
@@ -1,3 +1,6 @@
+\r
+// The following code is based on Tweener for actionscript, http://code.google.com/p/tweener/\r
+//\r
 //Disclaimer for Robert Penner's Easing Equations license:\r
 //\r
 //TERMS OF USE - EASING EQUATIONS\r
index 1569019fa32289ea416e5a4b28b4cfb59387b028..489c68652187450f1516efeecd77d094ea9c1c64 100644 (file)
@@ -140,9 +140,9 @@ struct transition_producer::implementation : boost::noncopyable
                if(info_.type == transition::cut)               \r
                        return src_frame != basic_frame::eof() ? src_frame : basic_frame::empty();\r
                                                                                \r
-               double alpha = static_cast<double>(current_frame_)/static_cast<double>(info_.duration);\r
-               double half_alpha_step = 0.5*1.0/static_cast<double>(info_.duration);\r
-               \r
+               double delta1 = info_.tweener(current_frame_*2-1, 0.0, 1.0, info_.duration*2);\r
+               double delta2 = info_.tweener(current_frame_*2, 0.0, 1.0, info_.duration*2);  \r
+\r
                double dir = info_.direction == transition_direction::from_left ? 1.0 : -1.0;           \r
                \r
                // For interlaced transitions. Seperate fields into seperate frames which are transitioned accordingly.\r
@@ -151,36 +151,36 @@ struct transition_producer::implementation : boost::noncopyable
                auto s_frame2 = make_safe<basic_frame>(src_frame);\r
 \r
                s_frame1->get_audio_transform().set_has_audio(false);\r
-               s_frame2->get_audio_transform().set_gain(1.0-alpha);\r
+               s_frame2->get_audio_transform().set_gain(1.0-delta2);\r
 \r
                auto d_frame1 = make_safe<basic_frame>(dest_frame);\r
                auto d_frame2 = make_safe<basic_frame>(dest_frame);\r
                \r
                d_frame1->get_audio_transform().set_has_audio(false);\r
-               d_frame2->get_audio_transform().set_gain(alpha);\r
+               d_frame2->get_audio_transform().set_gain(delta2);\r
 \r
                if(info_.type == transition::mix)\r
                {\r
-                       d_frame1->get_image_transform().set_opacity(alpha-half_alpha_step);     \r
-                       d_frame2->get_image_transform().set_opacity(alpha);     \r
+                       d_frame1->get_image_transform().set_opacity(delta1);    \r
+                       d_frame2->get_image_transform().set_opacity(delta2);    \r
                }\r
                else if(info_.type == transition::slide)\r
                {\r
-                       d_frame1->get_image_transform().set_fill_translation((-1.0+alpha-half_alpha_step)*dir, 0.0);    \r
-                       d_frame2->get_image_transform().set_fill_translation((-1.0+alpha)*dir, 0.0);            \r
+                       d_frame1->get_image_transform().set_fill_translation((-1.0+delta1)*dir, 0.0);   \r
+                       d_frame2->get_image_transform().set_fill_translation((-1.0+delta2)*dir, 0.0);           \r
                }\r
                else if(info_.type == transition::push)\r
                {\r
-                       d_frame1->get_image_transform().set_fill_translation((-1.0+alpha-half_alpha_step)*dir, 0.0);\r
-                       d_frame2->get_image_transform().set_fill_translation((-1.0+alpha)*dir, 0.0);\r
+                       d_frame1->get_image_transform().set_fill_translation((-1.0+delta1)*dir, 0.0);\r
+                       d_frame2->get_image_transform().set_fill_translation((-1.0+delta2)*dir, 0.0);\r
 \r
-                       s_frame1->get_image_transform().set_fill_translation((0.0+alpha-half_alpha_step)*dir, 0.0);     \r
-                       s_frame2->get_image_transform().set_fill_translation((0.0+alpha)*dir, 0.0);             \r
+                       s_frame1->get_image_transform().set_fill_translation((0.0+delta1)*dir, 0.0);    \r
+                       s_frame2->get_image_transform().set_fill_translation((0.0+delta2)*dir, 0.0);            \r
                }\r
                else if(info_.type == transition::wipe)         \r
                {\r
-                       d_frame1->get_image_transform().set_key_scale(alpha-half_alpha_step, 1.0);      \r
-                       d_frame2->get_image_transform().set_key_scale(alpha, 1.0);                      \r
+                       d_frame1->get_image_transform().set_key_scale(delta1, 1.0);     \r
+                       d_frame2->get_image_transform().set_key_scale(delta2, 1.0);                     \r
                }\r
                \r
                auto s_frame = s_frame1->get_image_transform() == s_frame2->get_image_transform() ? s_frame2 : basic_frame::interlace(s_frame1, s_frame2, format_desc_.mode);\r
index 77ff0ffb7a9161836fda35682b2d270f15e7b49c..8c1cf5fbe31c6ccd4f04406f472adcca5185d038 100644 (file)
@@ -21,6 +21,8 @@
 \r
 #include "../frame_producer.h"\r
 \r
+#include <common/utility/tweener.h>\r
+\r
 #include <string>\r
 #include <memory>\r
 \r
@@ -50,7 +52,11 @@ struct transition_direction
 \r
 struct transition_info\r
 {\r
-       transition_info() : type(transition::cut), duration(0), direction(transition_direction::from_left){}\r
+       transition_info() \r
+               : type(transition::cut)\r
+               , duration(0)\r
+               , direction(transition_direction::from_left)\r
+               , tweener(get_tweener(L"linear")){}\r
 \r
        std::wstring name() const\r
        {\r
@@ -68,6 +74,7 @@ struct transition_info
        size_t                                          duration;\r
        transition_direction::type      direction;\r
        transition::type                        type;\r
+       tweener_t                                       tweener;\r
 };\r
 \r
 class transition_producer : public frame_producer\r