]> git.sesse.net Git - casparcg/commitdiff
2.0.0.2: Added CLIP_RECT and FIX_RECT commands. TODO: Does not work properly with...
authorronag <ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Thu, 20 Jan 2011 19:09:17 +0000 (19:09 +0000)
committerronag <ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Thu, 20 Jan 2011 19:09:17 +0000 (19:09 +0000)
git-svn-id: https://casparcg.svn.sourceforge.net/svnroot/casparcg/server/branches/2.0.0.2@392 362d55ac-95cf-4e76-9f9a-cbaa9c17b72d

core/mixer/image/image_mixer.cpp
core/mixer/image/image_mixer.h
protocol/amcp/AMCPCommandsImpl.cpp
shell/caspar.config
shell/main.cpp

index aa5b2ec73989ed12619b52c7d200a2af8e652f8c..4a7e561182d0b82dffe26b89560018a271a1b59a 100644 (file)
@@ -23,6 +23,7 @@ image_transform::image_transform()
        , mode_(video_mode::invalid)\r
 {\r
        std::fill(pos_.begin(), pos_.end(), 0.0);\r
+       std::fill(size_.begin(), size_.end(), 1.0);\r
        std::fill(uv_.begin(), uv_.end(), 0.0);\r
 }\r
 \r
@@ -63,6 +64,19 @@ std::array<double, 2> image_transform::get_position() const
        return pos_;\r
 }\r
 \r
+void image_transform::set_size(double x, double y)\r
+{\r
+       std::array<double, 2> value = {x, y};\r
+       tbb::spin_mutex::scoped_lock(mutex_);\r
+       size_ = value;\r
+}\r
+\r
+std::array<double, 2> image_transform::get_size() const\r
+{\r
+       tbb::spin_mutex::scoped_lock(mutex_);\r
+       return size_;\r
+}\r
+\r
 void image_transform::set_uv(double left, double top, double right, double bottom)\r
 {\r
        std::array<double, 4> value = {left, top, right, bottom};\r
@@ -101,6 +115,8 @@ image_transform& image_transform::operator*=(const image_transform &other)
        uv_[3] += other.uv_[3];\r
        pos_[0] += other.pos_[0];\r
        pos_[1] += other.pos_[1];\r
+       size_[0] *= other.size_[0];\r
+       size_[1] *= other.size_[1];\r
        return *this;\r
 }\r
 \r
@@ -164,8 +180,6 @@ public:
                auto transform = transform_stack_.top();\r
                context_->begin_invoke([=]\r
                {\r
-                       GL(glLoadIdentity());\r
-                       GL(glTranslated(transform.get_position()[0]*2.0, transform.get_position()[1]*2.0, 0.0));\r
                        GL(glColor4d(1.0, 1.0, 1.0, transform.get_opacity()));\r
                        GL(glViewport(0, 0, format_desc_.width, format_desc_.height));\r
                        kernel_.apply(desc.pix_fmt, transform);\r
@@ -184,12 +198,15 @@ public:
                                device_buffers[n]->bind();\r
                        }\r
 \r
-                       auto t = transform;\r
+                       auto& p = transform.get_position();\r
+                       auto& s = transform.get_size();\r
+                       auto& uv = transform.get_uv();\r
+\r
                        glBegin(GL_QUADS);\r
-                               glTexCoord2d(t.get_uv()[0], t.get_uv()[3]); glVertex2d(-1.0, -1.0);\r
-                               glTexCoord2d(t.get_uv()[2], t.get_uv()[3]); glVertex2d( 1.0, -1.0);\r
-                               glTexCoord2d(t.get_uv()[2], t.get_uv()[1]); glVertex2d( 1.0,  1.0);\r
-                               glTexCoord2d(t.get_uv()[0], t.get_uv()[1]); glVertex2d(-1.0,  1.0);\r
+                               glTexCoord2d(uv[0], uv[3]); glVertex2d( p[0]*2.0-1.0,             p[1]*2.0-1.0);\r
+                               glTexCoord2d(uv[2], uv[3]); glVertex2d((p[0]+s[0])*2.0-1.0,   p[1]*2.0-1.0);\r
+                               glTexCoord2d(uv[2], uv[1]); glVertex2d((p[0]+s[0])*2.0-1.0,  (p[1]+s[1])*2.0-1.0);\r
+                               glTexCoord2d(uv[0], uv[1]); glVertex2d( p[0]*2.0-1.0,            (p[1]+s[1])*2.0-1.0);\r
                        glEnd();\r
                });\r
        }\r
index d09c375316c47642380c9e2f860244d5a030bc5a..ef053579db5815bcefb678c8bd6cb79ce8547bc1 100644 (file)
@@ -29,6 +29,9 @@ public:
        void set_position(double x, double y);\r
        std::array<double, 2> get_position() const;\r
 \r
+       void set_size(double x, double ys);\r
+       std::array<double, 2> get_size() const; \r
+\r
        void set_uv(double left, double top, double right, double bottom);\r
        std::array<double, 4> get_uv() const;\r
 \r
@@ -41,6 +44,7 @@ private:
        double opacity_;\r
        double gain_;\r
        std::array<double, 2> pos_;\r
+       std::array<double, 2> size_;\r
        std::array<double, 4> uv_;\r
        video_mode::type mode_;\r
 };\r
index a76c1b82760364f887d1b65f938726e6a2d9423e..6a18be7c7d35364a2003a0b63d937513f260da5b 100644 (file)
@@ -183,6 +183,26 @@ bool MixerCommand::DoExecute()
                                double value = boost::lexical_cast<double>(_parameters[2]);\r
                                GetChannel()->mixer().image(GetLayerIndex()).set_gain(value);\r
                        }\r
+                       else if(_parameters[1] == L"FIX_RECT")\r
+                       {\r
+                               double x        = boost::lexical_cast<double>(_parameters.at(2));\r
+                               double y        = boost::lexical_cast<double>(_parameters.at(3));\r
+                               double x_s      = boost::lexical_cast<double>(_parameters.at(4));\r
+                               double y_s      = boost::lexical_cast<double>(_parameters.at(5));\r
+                               GetChannel()->mixer().image(GetLayerIndex()).set_position(x, y);\r
+                               GetChannel()->mixer().image(GetLayerIndex()).set_size(x_s, y_s);\r
+                               GetChannel()->mixer().image(GetLayerIndex()).set_uv(0.0, 0.0, 0.0, 0.0);\r
+                       }\r
+                       else if(_parameters[1] == L"CLIP_RECT")\r
+                       {\r
+                               double x        = boost::lexical_cast<double>(_parameters.at(2));\r
+                               double y        = boost::lexical_cast<double>(_parameters.at(3));\r
+                               double x_s      = boost::lexical_cast<double>(_parameters.at(4));\r
+                               double y_s      = boost::lexical_cast<double>(_parameters.at(5));\r
+                               GetChannel()->mixer().image(GetLayerIndex()).set_position(x, y);\r
+                               GetChannel()->mixer().image(GetLayerIndex()).set_size(x_s, y_s);\r
+                               GetChannel()->mixer().image(GetLayerIndex()).set_uv(x, -1.0 + y + y_s, -1.0 + x + x_s, y);\r
+                       }\r
                        else if(_parameters[1] == L"RESET")\r
                        {\r
                                GetChannel()->mixer().image(GetLayerIndex()) = image_transform();\r
index c762927a660db21e04a9593c2f8c537ca22a80a5..f1a088d6d198c4c314e147766861aa9ecd24b696 100644 (file)
@@ -16,8 +16,8 @@
           <stretch>uniform</stretch>\r
           <windowed>true</windowed>\r
         </ogl>\r
-        <audio/>\r
-        <!--decklink>\r
+        <!--audio/>\r
+        <decklink>\r
           <device>1</device>\r
           <embedded-audio>true</embedded-audio>\r
         </decklink-->\r
index 734d1e59b1d44a7bc30f05f0ffb3e2ea8114face..a995fe008908dfaa0b054a00b6da20cac51587ea 100644 (file)
@@ -102,7 +102,11 @@ int main(int argc, wchar_t* argv[])
                        std::wstring wcmd;\r
                        std::getline(std::wcin, wcmd); // TODO: It's blocking...\r
                        is_running = wcmd != L"exit" && wcmd != L"q";\r
-                       if(wcmd.substr(0, 1) == L"1")\r
+                       if(wcmd.substr(0, 2) == L"10")\r
+                               wcmd = L"MIXER 1-1 VIDEO CLIP_RECT 0.4 0.4 0.5 0.5";\r
+                       if(wcmd.substr(0, 2) == L"11")\r
+                               wcmd = L"MIXER 1-1 VIDEO FIX_RECT 0.4 0.4 0.5 0.5";\r
+                       else if(wcmd.substr(0, 1) == L"1")\r
                                wcmd = L"LOADBG 1-1 " + wcmd.substr(1, wcmd.length()-1) + L" SLIDE 100 LOOP AUTOPLAY";\r
                        else if(wcmd.substr(0, 1) == L"2")\r
                                wcmd = L"LOADBG 1-1 " + wcmd.substr(1, wcmd.length()-1) + L" PUSH 100 LOOP AUTOPLAY";\r