mask tool/gui rework, plugin_cuda CUDA_PATH fix, raise filebox/tool guis on open...
[goodguy/cinelerra.git] / cinelerra-5.1 / cinelerra / playback3d.C
index 7ed23652c61d1e23d5337c3b50f7364976116244..e9b087fb16636af0075899302e9ace701f002720 100644 (file)
@@ -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);