X-Git-Url: https://git.cinelerra-gg.org/git/?a=blobdiff_plain;f=cinelerra-5.1%2Fcinelerra%2Fplayback3d.C;h=e9b087fb16636af0075899302e9ace701f002720;hb=e5efe8eb05910bbd7e002f351c5468d894b0c71d;hp=7ed23652c61d1e23d5337c3b50f7364976116244;hpb=9fed7535470aa37781733db836068da3b4c17a0d;p=goodguy%2Fcinelerra.git diff --git a/cinelerra-5.1/cinelerra/playback3d.C b/cinelerra-5.1/cinelerra/playback3d.C index 7ed23652..e9b087fb 100644 --- a/cinelerra-5.1/cinelerra/playback3d.C +++ b/cinelerra-5.1/cinelerra/playback3d.C @@ -38,6 +38,7 @@ #include "pluginclient.h" #include "pluginvclient.h" #include "edlsession.h" +#include "track.h" #include "transportque.inc" #include "vframe.h" @@ -295,14 +296,35 @@ static const char *feather_frag = " }\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 = @@ -1203,10 +1225,12 @@ static void combineData(GLdouble coords[3], 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; } @@ -1271,9 +1295,11 @@ void Playback3D::do_mask_sync(Playback3DCommand *command) 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. @@ -1429,20 +1455,18 @@ void Playback3D::do_mask_sync(Playback3DCommand *command) 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);