X-Git-Url: https://git.cinelerra-gg.org/git/?p=goodguy%2Fhistory.git;a=blobdiff_plain;f=cinelerra-5.1%2Fcinelerra%2Fplayback3d.C;h=6d6dee358b5bc18e72fae98e0ed45ce3b131cf59;hp=becf31f6b90bc6bc2bdeee53372e5c523a3255a3;hb=02a79c110b1bce1d500849c82b2098863cd60424;hpb=5ac2037d8e5ab71a1915389cd08b458cfb60d64f diff --git a/cinelerra-5.1/cinelerra/playback3d.C b/cinelerra-5.1/cinelerra/playback3d.C index becf31f6..6d6dee35 100644 --- a/cinelerra-5.1/cinelerra/playback3d.C +++ b/cinelerra-5.1/cinelerra/playback3d.C @@ -27,14 +27,17 @@ #include "canvas.h" #include "clip.h" #include "condition.h" +#include "edl.h" #include "maskautos.h" #include "maskauto.h" #include "mutex.h" +#include "mwindow.h" #include "overlayframe.inc" #include "overlayframe.h" #include "playback3d.h" #include "pluginclient.h" #include "pluginvclient.h" +#include "edlsession.h" #include "transportque.inc" #include "vframe.h" @@ -134,11 +137,11 @@ static const char *rgba_to_yuv_frag = " gl_FragColor = rgba;\n" "}\n"; -static const char *rgba_to_rgb_flatten = - "void main() {\n" - " gl_FragColor.rgb *= gl_FragColor.a;\n" - " gl_FragColor.a = 1.0;\n" - "}\n"; +//static const char *rgba_to_rgb_flatten = +// "void main() {\n" +// " gl_FragColor.rgb *= gl_FragColor.a;\n" +// " gl_FragColor.a = 1.0;\n" +// "}\n"; #define GL_STD_BLEND(FN) \ static const char *blend_##FN##_frag = \ @@ -691,11 +694,13 @@ void Playback3D::draw_output(Playback3DCommand *command, int flip_y) canvas_w = window->get_w(); canvas_h = window->get_h(); VFrame::init_screen(canvas_w, canvas_h); + int color_model = command->frame->get_color_model(); + int is_yuv = BC_CModels::is_yuv(color_model); if(!command->is_cleared) { // If we get here, the virtual console was not used. - init_frame(command); + init_frame(command, 0); } // Texture @@ -703,8 +708,7 @@ void Playback3D::draw_output(Playback3DCommand *command, int flip_y) command->frame->bind_texture(0); // Convert colormodel - unsigned int shader = !BC_CModels::is_yuv(command->frame->get_color_model()) ? 0 : - VFrame::make_shader(0, yuv_to_rgb_frag, 0); + unsigned int shader = is_yuv ? VFrame::make_shader(0, yuv_to_rgb_frag, 0) : 0; if( shader > 0 ) { glUseProgram(shader); // Set texture unit of the texture @@ -713,7 +717,7 @@ void Playback3D::draw_output(Playback3DCommand *command, int flip_y) BC_GL_YUV_TO_RGB(shader); } - if(BC_CModels::components(command->frame->get_color_model()) == 4) + if(BC_CModels::components(color_model) == 4) { glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); @@ -744,13 +748,11 @@ void Playback3D::draw_output(Playback3DCommand *command, int flip_y) } -void Playback3D::init_frame(Playback3DCommand *command) +void Playback3D::init_frame(Playback3DCommand *command, int is_yuv) { #ifdef HAVE_GL - canvas_w = command->canvas->get_canvas()->get_w(); - canvas_h = command->canvas->get_canvas()->get_h(); - - glClearColor(0.0, 0.0, 0.0, 0.0); + float gbuv = is_yuv ? 0.5 : 0.0; + glClearColor(0.0, gbuv, gbuv, 0.0); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); #endif } @@ -773,15 +775,17 @@ void Playback3D::clear_output_sync(Playback3DCommand *command) command->canvas->get_canvas()->lock_window("Playback3D::clear_output_sync"); // If we get here, the virtual console is being used. command->canvas->get_canvas()->enable_opengl(); + int is_yuv = 0; // Using pbuffer for refresh frame. if(command->frame) { command->frame->enable_opengl(); + int color_model = command->canvas->mwindow->edl->session->color_model; + is_yuv = BC_CModels::is_yuv(color_model); } - - init_frame(command); + init_frame(command, is_yuv); command->canvas->get_canvas()->unlock_window(); } command->canvas->unlock_canvas();