#include "pluginclient.h"
#include "pluginvclient.h"
#include "edlsession.h"
+#include "track.h"
#include "transportque.inc"
#include "vframe.h"
" }\n"
"}\n";
-static const char *alpha_frag =
+static const char *multiply_mask4_frag =
"uniform sampler2D tex;\n"
- "uniform sampler2D tex2;\n"
- "uniform vec2 tex2_dimensions;\n"
- "void main() {\n" \
+ "uniform sampler2D tex1;\n"
+ "void main()\n"
+ "{\n"
" gl_FragColor = texture2D(tex, gl_TexCoord[0].st);\n"
- " vec4 canvas = texture2D(tex2, gl_FragCoord.xy / tex2_dimensions);\n"
- " gl_FragColor.a = canvas.a;\n"
+ " gl_FragColor.a *= texture2D(tex1, gl_TexCoord[0].st).r;\n"
+ "}\n";
+
+static const char *multiply_mask3_frag =
+ "uniform sampler2D tex;\n"
+ "uniform sampler2D tex1;\n"
+ "void main()\n"
+ "{\n"
+ " gl_FragColor = texture2D(tex, gl_TexCoord[0].st);\n"
+ " float a = texture2D(tex1, gl_TexCoord[0].st).r;\n"
+ " gl_FragColor.rgb *= vec3(a, a, a);\n"
+ "}\n";
+
+static const char *multiply_yuvmask3_frag =
+ "uniform sampler2D tex;\n"
+ "uniform sampler2D tex1;\n"
+ "void main()\n"
+ "{\n"
+ " gl_FragColor = texture2D(tex, gl_TexCoord[0].st);\n"
+ " float a = texture2D(tex1, gl_TexCoord[0].st).r;\n"
+ " gl_FragColor.gb -= vec2(0.5, 0.5);\n"
+ " gl_FragColor.rgb *= vec3(a, a, a);\n"
+ " gl_FragColor.gb += vec2(0.5, 0.5);\n"
"}\n";
static const char *fade_rgba_frag =
BC_SynchronousCommand::copy_from(command);
}
-//#define GL_BUG 1
-#ifdef GL_BUG
-static void GLAPIENTRY glDebugCallback(GLenum source, GLenum type,
- GLuint id, GLenum severity, GLsizei length, const GLchar* message,
- const void* userParam)
-{
- fprintf(stderr, "GL CALLBACK: %s type = 0x%x, severity = 0x%x, message = %s\n",
- ( type == GL_DEBUG_TYPE_ERROR ? "** GL ERROR **" : "" ),
- type, severity, message );
-}
-#endif
-
Playback3D::Playback3D(MWindow *mwindow)
: BC_Synchronous()
{
this->mwindow = mwindow;
temp_texture = 0;
-#ifdef GL_BUG
- //Enabling OpenGL debug output
- // this does not work
- glDebugMessageControl(GL_DONT_CARE, GL_DONT_CARE, GL_DONT_CARE, 0, 0, GL_TRUE);
- glEnable(GL_DEBUG_OUTPUT);
- glEnable(GL_DEBUG_OUTPUT_SYNCHRONOUS);
- glDebugMessageCallback(glDebugCallback, 0);
- glEnable(GL_DEBUG_OUTPUT);
-#endif
}
Playback3D::~Playback3D()
write_buffer_sync((Playback3DCommand*)command);
break;
- case Playback3DCommand::FINISH_OUTPUT:
- finish_output_sync((Playback3DCommand*)command);
- break;
-
case Playback3DCommand::CLEAR_OUTPUT:
clear_output_sync((Playback3DCommand*)command);
break;
command->canvas->lock_canvas("Playback3D::copy_from_sync");
if( window ) {
window->enable_opengl();
+ glFinish();
int w = command->input->get_w();
int h = command->input->get_h();
BC_WindowBase *window =
command->canvas->lock_canvas("Playback3D::write_buffer_sync");
if( window ) {
+ window->enable_opengl();
// Update hidden cursor
window->update_video_cursor();
-// Make sure OpenGL is enabled first.
- window->enable_opengl();
-
+ command->frame->enable_opengl();
+ command->frame->init_screen();
//printf("Playback3D::write_buffer_sync 1 %d\n", window->get_id());
- int flip_y = 0, frame_state = command->frame->get_opengl_state();
- switch( frame_state ) {
-// Upload texture and composite to screen
- case VFrame::RAM:
- flip_y = 1;
- case VFrame::SCREEN:
- command->frame->to_texture();
- window->enable_opengl();
-// Composite texture to screen and swap buffer
- case VFrame::TEXTURE:
- if( !flip_y ) {
- int fh1 = command->frame->get_h()-1;
- float in_y1 = fh1 - command->in_y1;
- float in_y2 = fh1 - command->in_y2;
- command->in_y1 = in_y2;
- command->in_y2 = in_y1;
- }
- draw_output(command, flip_y);
- break;
- default:
- printf("Playback3D::write_buffer_sync unknown state\n");
- break;
+ int frame_state = command->frame->get_opengl_state();
+ if( frame_state != VFrame::TEXTURE )
+ command->frame->to_texture();
+ if( frame_state != VFrame::RAM ) {
+ command->in_y1 = command->frame->get_h() - command->in_y1;
+ command->in_y2 = command->frame->get_h() - command->in_y2;
}
+ window->enable_opengl();
+ draw_output(command, 1);
command->frame->set_opengl_state(frame_state);
}
command->canvas->unlock_canvas();
//printf("Playback3D::draw_output 2 %f,%f %f,%f -> %f,%f %f,%f\n",
-// command->in_x1,
-// command->in_y1,
-// command->in_x2,
-// command->in_y2,
-// command->out_x1,
-// command->out_y1,
-// command->out_x2,
-// command->out_y2);
+// command->in_x1, command->in_y1, command->in_x2, command->in_y2,
+// command->out_x1, command->out_y1, command->out_x2, command->out_y2);
glUseProgram(0);
}
-void Playback3D::finish_output(Canvas *canvas)
-{
- Playback3DCommand command;
- command.canvas = canvas;
- command.command = Playback3DCommand::FINISH_OUTPUT;
- send_command(&command);
-}
-
-void Playback3D::finish_output_sync(Playback3DCommand *command)
-{
-#ifdef HAVE_GL
- BC_WindowBase *window =
- command->canvas->lock_canvas("Playback3D::finish_output_sync");
- if( window ) {
- command->canvas->get_canvas()->enable_opengl();
- glFinish();
- }
- command->canvas->unlock_canvas();
-#endif
-}
-
-
void Playback3D::clear_output(Canvas *canvas, VFrame *output)
{
Playback3DCommand command;
vertex[1] = coords[1];
vertex[2] = coords[2];
for( int i=3; i<6; ++i ) {
- vertex[i] = weight[0] * vertex_data[0][i] +
- weight[1] * vertex_data[1][i] +
- weight[2] * vertex_data[2][i] +
- weight[3] * vertex_data[3][i];
+ GLdouble v = 0;
+ for( int k=0; k<4; ++k ) {
+ if( !weight[k] || !vertex_data[k] ) continue;
+ v += weight[k] * vertex_data[k][i];
+ }
+ vertex[i] = v;
}
*outData = vertex;
}
glClearColor(bg, bg, bg, bg);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+ int show_mask = command->keyframe_set->track->masks;
for(int k = 0; k < total_submasks; k++) {
MaskPointSet &points = point_set[k];
MaskEdge &edge = *edges.append(new MaskEdge());
+ if( !((show_mask>>k) & 1) ) continue;
int first_point = 0;
// Need to tabulate every vertex in persistent memory because
// gluTessVertex doesn't copy them.
glDrawBuffers(0, 0);
glBindFramebuffer(GL_FRAMEBUFFER, 0);
- unsigned int shader = VFrame::make_shader(0, alpha_frag, 0);
+ const char *alpha_shader = BC_CModels::has_alpha(color_model) ?
+ multiply_mask4_frag :
+ !BC_CModels::is_yuv(color_model) ?
+ multiply_mask3_frag :
+ multiply_yuvmask3_frag;
+ unsigned int shader = VFrame::make_shader(0, alpha_shader, 0);
glUseProgram(shader);
if( shader > 0 ) {
command->frame->bind_texture(0);
in->BC_Texture::bind(1);
glUniform1i(glGetUniformLocation(shader, "tex"), 0);
- glUniform1i(glGetUniformLocation(shader, "tex2"), 1);
- glUniform2f(glGetUniformLocation(shader, "tex2_dimensions"),
- (float)in->get_texture_w(),
- (float)in->get_texture_h());
-// if( BC_CModels::components(color_model ) == 4) {
-// glEnable(GL_BLEND);
-// glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
-// }
+ glUniform1i(glGetUniformLocation(shader, "tex1"), 1);
}
command->frame->draw_texture();
command->frame->set_opengl_state(VFrame::SCREEN);