, 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
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
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
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
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
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
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
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
<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
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