]> git.sesse.net Git - casparcg/commitdiff
2.0.0.2: Any layer inside mixer can be used as key for layer above.
authorronag <ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Thu, 12 May 2011 08:22:22 +0000 (08:22 +0000)
committerronag <ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Thu, 12 May 2011 08:22:22 +0000 (08:22 +0000)
git-svn-id: https://casparcg.svn.sourceforge.net/svnroot/casparcg/server/branches/2.0.0.2@720 362d55ac-95cf-4e76-9f9a-cbaa9c17b72d

core/mixer/image/image_kernel.cpp
core/mixer/image/image_mixer.cpp
core/producer/frame/image_transform.cpp
core/producer/frame_producer.cpp
protocol/amcp/AMCPCommandsImpl.cpp

index c509f1d5989c4647f48b937ff23f06120fe4c93a..16f494844ea3990addb7349357b34f70104e488f 100644 (file)
@@ -218,6 +218,8 @@ public:
                        "void main()                                                                                                                    "\r
                        "{                                                                                                                                              "\r
                        "       vec4 abgr = texture2D(plane[0], gl_TexCoord[0].st);                                     "\r
+                       "       if(has_separate_key)                                                                                            "\r
+                       "               rgba.b = texture2D(plane[3], gl_TexCoord[0].st).r;                              "\r
                        "       gl_FragColor = abgr.argb * gain;                                                                        "\r
                        "}                                                                                                                                              ");\r
                \r
@@ -226,6 +228,8 @@ public:
                        "void main()                                                                                                                    "       \r
                        "{                                                                                                                                              "\r
                        "       vec4 argb = texture2D(plane[0], gl_TexCoord[0].st);                                     "\r
+                       "       if(has_separate_key)                                                                                            "\r
+                       "               rgba.b = texture2D(plane[3], gl_TexCoord[0].st).r;                              "\r
                        "       gl_FragColor = argb.grab * gl_Color * gain;                                                     "\r
                        "}                                                                                                                                              ");\r
                \r
@@ -234,6 +238,8 @@ public:
                        "void main()                                                                                                                    "\r
                        "{                                                                                                                                              "\r
                        "       vec4 bgra = texture2D(plane[0], gl_TexCoord[0].st);                                     "\r
+                       "       if(has_separate_key)                                                                                            "\r
+                       "               rgba.a = texture2D(plane[3], gl_TexCoord[0].st).r;                              "\r
                        "       gl_FragColor = bgra.rgba * gl_Color * gain;                                                     "\r
                        "}                                                                                                                                              ");\r
                \r
@@ -242,6 +248,8 @@ public:
                        "void main()                                                                                                                    "\r
                        "{                                                                                                                                              "\r
                        "       vec4 rgba = texture2D(plane[0], gl_TexCoord[0].st);                                     "\r
+                       "       if(has_separate_key)                                                                                            "\r
+                       "               rgba.a = texture2D(plane[3], gl_TexCoord[0].st).r;                              "\r
                        "       gl_FragColor = rgba.bgra * gl_Color * gain;                                                     "\r
                        "}                                                                                                                                              ");\r
                \r
@@ -254,7 +262,7 @@ public:
                        "       float cr = texture2D(plane[2], gl_TexCoord[0].st).r;                            "\r
                        "       float a = 1.0;                                                                                                          "       \r
                        "       if(has_separate_key)                                                                                            "\r
-                       "               a = texture2D(plane[3], gl_TexCoord[0].st).r+0.2;                                       "\r
+                       "               a = texture2D(plane[3], gl_TexCoord[0].st).r;                                   "\r
                        "       if(HD)                                                                                                                          "\r
                        "               gl_FragColor = ycbcra_to_bgra_hd(y, cb, cr, a) * gl_Color * gain;"\r
                        "       else                                                                                                                            "\r
index cf895df0a0b97576b74d3c901c8dae6d0be7c5b1..7ca7ec94d38330999272d7f07d907dce3d586f06 100644 (file)
@@ -105,7 +105,6 @@ public:
                auto gpu_frame = boost::polymorphic_downcast<gpu_write_frame*>(&frame);\r
                auto desc = gpu_frame->get_pixel_format_desc();\r
                auto buffers = gpu_frame->get_plane_buffers();\r
-               auto is_key_frame = gpu_frame->get_image_transform().get_is_key();\r
 \r
                auto transform = transform_stack_.top();\r
                context_->begin_invoke([=]\r
@@ -118,7 +117,7 @@ public:
                                device_buffers.push_back(texture);\r
                        }\r
                                                \r
-                       if(is_key_frame) // Its a key_frame just bind the texture for use during the next frame.\r
+                       if(transform.get_is_key()) // Its a key_frame just save buffer for next frame.\r
                        {\r
                                if(!device_buffers.empty())                             \r
                                        key_ = device_buffers[0];                               \r
@@ -158,9 +157,9 @@ public:
                                        glTexCoord2d(1.0, 1.0); glVertex2d((f_p[0]+f_s[0])*2.0-1.0, (f_p[1]+f_s[1])*2.0-1.0);\r
                                        glTexCoord2d(0.0, 1.0); glVertex2d( f_p[0]        *2.0-1.0, (f_p[1]+f_s[1])*2.0-1.0);\r
                                glEnd();\r
-                               GL(glDisable(GL_SCISSOR_TEST));\r
-                               \r
-                               key_ = nullptr;\r
+                               GL(glDisable(GL_SCISSOR_TEST));         \r
+\r
+                               key_ = nullptr;         \r
                        }\r
                });\r
        }\r
index b95a53a5bcfc18f871b0c14a5617f7c8303f0564..a620a9d4df3c6345d28128cc72bdda5fd3aca9fe 100644 (file)
@@ -117,7 +117,7 @@ image_transform& image_transform::operator*=(const image_transform &other)
        if(other.mode_ != video_mode::invalid)\r
                mode_ = other.mode_;\r
        gain_ *= other.gain_;\r
-       is_key_ = other.is_key_;\r
+       is_key_ |= other.is_key_;\r
        fill_translation_[0] += other.fill_translation_[0]*fill_scale_[0];\r
        fill_translation_[1] += other.fill_translation_[1]*fill_scale_[1];\r
        fill_scale_[0] *= other.fill_scale_[0];\r
@@ -148,7 +148,7 @@ image_transform tween(double time, const image_transform& source, const image_tr
 \r
        image_transform result; \r
        result.set_mode(dest.get_mode() != video_mode::invalid ? dest.get_mode() : source.get_mode());\r
-       result.set_is_key(dest.get_is_key());\r
+       result.set_is_key(source.get_is_key() | dest.get_is_key());\r
        result.set_gain(do_tween(time, source.get_gain(), dest.get_gain(), duration, tweener));\r
        result.set_opacity(do_tween(time, source.get_opacity(), dest.get_opacity(), duration, tweener));\r
        result.set_fill_translation(do_tween(time, source.get_fill_translation()[0], dest.get_fill_translation()[0], duration, tweener), do_tween(time, source.get_fill_translation()[1], dest.get_fill_translation()[1], duration, tweener));\r
index d1ffab291489ec2d657d52cd260eca0aae5069c1..049409c0e73c2c8c76de5e49a478c2cd15d50242 100644 (file)
@@ -127,7 +127,10 @@ safe_ptr<core::frame_producer> create_producer(const safe_ptr<frame_factory>& my
        catch(...){}\r
 \r
        if(key_producer != frame_producer::empty())\r
+       {\r
+               CASPAR_LOG(info) << "Found and loaded separate key.";\r
                return create_separated_producer(producer, key_producer);\r
+       }       \r
 \r
        return producer;\r
 }\r
index 11b6032816fb479fd11aa5c2e8a58fa85bdd5fa1..cbfc6c0884d9de5d9d8c6b1bbc3b73e799f246f5 100644 (file)
@@ -177,7 +177,22 @@ bool MixerCommand::DoExecute()
        {       \r
                if(_parameters[0] == L"VIDEO")\r
                {\r
-                       if(_parameters[1] == L"OPACITY")\r
+                       if(_parameters[1] == L"IS_KEY")\r
+                       {\r
+                               bool value = lexical_cast_or_default(_parameters.at(2), false);\r
+                               auto transform = [=](image_transform transform) -> image_transform\r
+                               {\r
+                                       transform.set_is_key(value);\r
+                                       return transform;                                       \r
+                               };\r
+\r
+                               int layer = GetLayerIndex(std::numeric_limits<int>::min());\r
+                               if(layer != std::numeric_limits<int>::min())                                    \r
+                                       GetChannel()->mixer()->apply_image_transform(GetLayerIndex(), transform, 0);\r
+                               else\r
+                                       GetChannel()->mixer()->apply_image_transform(transform, 0);\r
+                       }\r
+                       else if(_parameters[1] == L"OPACITY")\r
                        {\r
                                int duration = _parameters.size() > 2 ? lexical_cast_or_default(_parameters[3], 0) : 0;\r
                                std::wstring tween = _parameters.size() > 3 ? _parameters[4] : L"linear";\r