X-Git-Url: http://git.cinelerra-gg.org/git/?a=blobdiff_plain;f=cinelerra-5.1%2Fplugins%2Fchromakey%2Fchromakey.C;h=fe52fec66e0601302ada2b326646100ddab20857;hb=a6369311556cc1e1877142181d8606e4f68aa803;hp=90934f3e9b27807a2990c2c7d06c0642f0f2834b;hpb=9d832a1fff11b11aaa1108c460690ed05e2bdc05;p=goodguy%2Fhistory.git diff --git a/cinelerra-5.1/plugins/chromakey/chromakey.C b/cinelerra-5.1/plugins/chromakey/chromakey.C index 90934f3e..fe52fec6 100644 --- a/cinelerra-5.1/plugins/chromakey/chromakey.C +++ b/cinelerra-5.1/plugins/chromakey/chromakey.C @@ -19,6 +19,7 @@ * */ +#include "bccolors.h" #include "bcdisplayinfo.h" #include "bcsignals.h" #include "chromakey.h" @@ -39,9 +40,13 @@ +ChromaKeyConfig::ChromaKeyConfig() +{ + reset(); +} +void ChromaKeyConfig::reset() -ChromaKeyConfig::ChromaKeyConfig() { red = 0.0; green = 0.0; @@ -147,6 +152,9 @@ void ChromaKeyWindow::create_objects() y += 30; add_subwindow(use_colorpicker = new ChromaKeyUseColorPicker(plugin, this, x1, y)); + y += use_colorpicker->get_h() + 10; + add_subwindow(new ChromaKeyReset(plugin, this, x, y)); + color_thread = new ChromaKeyColorThread(plugin, this); update_sample(); @@ -246,7 +254,6 @@ int ChromaKeySlope::handle_event() return 1; } - ChromaKeyUseValue::ChromaKeyUseValue(ChromaKey *plugin, int x, int y) : BC_CheckBox(x, y, plugin->config.use_value, _("Use value")) { @@ -259,6 +266,20 @@ int ChromaKeyUseValue::handle_event() return 1; } +ChromaKeyReset::ChromaKeyReset(ChromaKey *plugin, ChromaKeyWindow *gui, int x, int y) + : BC_GenericButton(x, y, _("Reset")) +{ + this->plugin = plugin; + this->gui = gui; +} + +int ChromaKeyReset::handle_event() +{ + plugin->config.reset(); + gui->update_gui(); + plugin->send_configure_change(); + return 1; +} ChromaKeyUseColorPicker::ChromaKeyUseColorPicker(ChromaKey *plugin, ChromaKeyWindow *gui, @@ -364,12 +385,9 @@ void ChromaKeyUnit::process_package(LoadPackage *package) //float max_hue = h + plugin->config.threshold * 360 / 100; -#define RGB_TO_VALUE(r, g, b) \ -((r) * R_TO_Y + (g) * G_TO_Y + (b) * B_TO_Y) - +#define RGB_TO_VALUE(r, g, b) YUV::yuv.rgb_to_y_f((r),(g),(b)) #define OUTER_VARIABLES(plugin) \ - YUV yuv; \ float value = RGB_TO_VALUE(plugin->config.red, \ plugin->config.green, \ plugin->config.blue); \ @@ -380,7 +398,9 @@ void ChromaKeyUnit::process_package(LoadPackage *package) float g_key = plugin->config.green; \ float b_key = plugin->config.blue; \ int y_key, u_key, v_key; \ - yuv.rgb_to_yuv_8((int)(r_key * 0xff), (int)(g_key * 0xff), (int)(b_key * 0xff), y_key, u_key, v_key); \ + YUV::yuv.rgb_to_yuv_8( \ + (int)(r_key * 0xff), (int)(g_key * 0xff), (int)(b_key * 0xff), \ + y_key, u_key, v_key); \ float run = plugin->config.slope / 100; \ float threshold_run = threshold + run; @@ -630,15 +650,20 @@ void ChromaKey::update_gui() { load_configuration(); thread->window->lock_window(); - ((ChromaKeyWindow*)thread->window)->threshold->update(config.threshold); - ((ChromaKeyWindow*)thread->window)->slope->update(config.slope); - ((ChromaKeyWindow*)thread->window)->use_value->update(config.use_value); - ((ChromaKeyWindow*)thread->window)->update_sample(); - + ((ChromaKeyWindow *)(thread->window))->update_gui(); thread->window->unlock_window(); } } +void ChromaKeyWindow::update_gui() +{ + ChromaKeyConfig &config = plugin->config; + threshold->update(config.threshold); + slope->update(config.slope); + use_value->update(config.use_value); + update_sample(); +} + int ChromaKey::handle_opengl() { #ifdef HAVE_GL @@ -662,9 +687,11 @@ int ChromaKey::handle_opengl() "}\n"; static const char *get_rgbvalue_frag = + "uniform vec3 rgb_to_y_vector;\n" + "uniform float yminf;\n" "float get_value(vec4 color)\n" "{\n" - " return dot(color.rgb, vec3(0.29900, 0.58700, 0.11400));\n" + " return dot(color.rgb, rgb_to_y_vector) + yminf;\n" "}\n"; static const char *value_frag = @@ -708,64 +735,56 @@ int ChromaKey::handle_opengl() get_output()->to_texture(); get_output()->enable_opengl(); get_output()->init_screen(); - const char *shader_stack[] = { 0, 0, 0, 0, 0 }; - int current_shader = 0; + const char *shader_stack[16]; + memset(shader_stack,0, sizeof(shader_stack)); + int current_shader = 0; shader_stack[current_shader++] = uniform_frag; - switch(get_output()->get_color_model()) - { - case BC_YUV888: - case BC_YUVA8888: - if(config.use_value) - { - shader_stack[current_shader++] = get_yuvvalue_frag; - shader_stack[current_shader++] = value_frag; - } - else - { - shader_stack[current_shader++] = cube_frag; - } - break; - default: - if(config.use_value) - { - shader_stack[current_shader++] = get_rgbvalue_frag; - shader_stack[current_shader++] = value_frag; - } - else - { - shader_stack[current_shader++] = cube_frag; - } - break; + switch(get_output()->get_color_model()) { + case BC_YUV888: + case BC_YUVA8888: + if( config.use_value ) { + shader_stack[current_shader++] = get_yuvvalue_frag; + shader_stack[current_shader++] = value_frag; + } + else { + shader_stack[current_shader++] = cube_frag; + } + break; + + default: + if(config.use_value) { + shader_stack[current_shader++] = get_rgbvalue_frag; + shader_stack[current_shader++] = value_frag; + } + else { + shader_stack[current_shader++] = cube_frag; + } + break; } SET_TRACE - unsigned int frag = VFrame::make_shader(0, - shader_stack[0], - shader_stack[1], - shader_stack[2], - shader_stack[3], - 0); - get_output()->bind_texture(0); - - if(frag) - { - glUseProgram(frag); - glUniform1i(glGetUniformLocation(frag, "tex"), 0); - glUniform1f(glGetUniformLocation(frag, "min_v"), min_v); - glUniform1f(glGetUniformLocation(frag, "max_v"), max_v); - glUniform1f(glGetUniformLocation(frag, "run"), run); - glUniform1f(glGetUniformLocation(frag, "threshold"), threshold); - glUniform1f(glGetUniformLocation(frag, "threshold_run"), threshold_run); + shader_stack[current_shader] = 0; + unsigned int shader = VFrame::make_shader(shader_stack); + if( shader > 0 ) { + get_output()->bind_texture(0); + glUseProgram(shader); + glUniform1i(glGetUniformLocation(shader, "tex"), 0); + glUniform1f(glGetUniformLocation(shader, "min_v"), min_v); + glUniform1f(glGetUniformLocation(shader, "max_v"), max_v); + glUniform1f(glGetUniformLocation(shader, "run"), run); + glUniform1f(glGetUniformLocation(shader, "threshold"), threshold); + glUniform1f(glGetUniformLocation(shader, "threshold_run"), threshold_run); if(get_output()->get_color_model() != BC_YUV888 && get_output()->get_color_model() != BC_YUVA8888) - glUniform3f(glGetUniformLocation(frag, "key"), + glUniform3f(glGetUniformLocation(shader, "key"), r_key, g_key, b_key); else - glUniform3f(glGetUniformLocation(frag, "key"), + glUniform3f(glGetUniformLocation(shader, "key"), (float)y_key / 0xff, (float)u_key / 0xff, (float)v_key / 0xff); - + if(config.use_value) + BC_GL_RGB_TO_Y(shader); } SET_TRACE