#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 =
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);