dynamic keyframes, textbox rework, andrea ffmpeg.opts, perpetual chkpt undo, lv2...
[goodguy/history.git] / cinelerra-5.1 / plugins / lens / lens.C
index c345333b381fb036e58626abae57882875491c6c..7649377b7987f3d52b7707d738fb3568c5b33190 100644 (file)
@@ -49,7 +49,7 @@ void LensConfig::reset()
        aspect = 1.0;
        radius = 1.0;
        mode = SPHERICAL_SHRINK;
-       interp = INTERP_BILINEAR;
+       interp = INTERP_DEFAULT;
        center_x = 50.0;
        center_y = 50.0;
        draw_guides = 0;
@@ -392,6 +392,7 @@ LensInterp::LensInterp(LensMain *plugin, int x, int y)
 
 void LensInterp::create_objects()
 {
+       add_item(new LensInterpItem(_("Default"), LensConfig::INTERP_DEFAULT));
        add_item(new LensInterpItem(_("Nearest"), LensConfig::INTERP_NEAREST));
        add_item(new LensInterpItem(_("BiLinear"), LensConfig::INTERP_BILINEAR));
        add_item(new LensInterpItem(_("BiCubic"), LensConfig::INTERP_BICUBIC));
@@ -583,7 +584,7 @@ LensMain::~LensMain()
 NEW_WINDOW_MACRO(LensMain, LensGUI)
 LOAD_CONFIGURATION_MACRO(LensMain, LensConfig)
 int LensMain::is_realtime() { return 1; }
-const char* LensMain::plugin_title() { return _("Lens"); }
+const char* LensMain::plugin_title() { return N_("Lens"); }
 
 void LensMain::update_gui()
 {
@@ -654,7 +655,7 @@ void LensMain::save_data(KeyFrame *keyframe)
 
 
 // cause data to be stored directly in text
-       output.set_shared_output(keyframe->get_data(), MESSAGESIZE);
+       output.set_shared_output(keyframe->xbuf);
        output.tag.set_title("LENS");
        for( int i = 0; i < FOV_CHANNELS; ++i ) {
                sprintf(string, "FOCAL_LENGTH%d", i);
@@ -682,7 +683,7 @@ void LensMain::read_data(KeyFrame *keyframe)
        char string[BCTEXTLEN];
 
 
-       input.set_shared_input(keyframe->get_data(), strlen(keyframe->get_data()));
+       input.set_shared_input(keyframe->xbuf);
 
        int result = 0;
 
@@ -714,31 +715,22 @@ int LensMain::process_buffer(VFrame *frame,
        int64_t start_position,
        double frame_rate)
 {
-       VFrame *input;
        load_configuration();
+       int use_opengl = config.interp != LensConfig::INTERP_DEFAULT ? 0 :
+               get_use_opengl();
+       VFrame *input = use_opengl ? frame :
+               new_temp(frame->get_w(), frame->get_h(), frame->get_color_model());
+       read_frame(input, 0, start_position, frame_rate, use_opengl);
 
-       if( get_use_opengl() ) {
-               input = frame;
-       }
-       else {
-               input = new_temp(frame->get_w(), frame->get_h(), frame->get_color_model());
-       }
-
-       read_frame(input,
-               0,
-               start_position,
-               frame_rate,
-               get_use_opengl());
-
-
-       if( get_use_opengl() ) {
+       if( use_opengl ) {
                run_opengl();
                return 0;
        }
-       else {
-               if( !engine ) engine = new LensEngine(this);
-               engine->process_packages();
-               if( config.draw_guides ) {
+
+       if( !engine ) engine = new LensEngine(this);
+       engine->process_packages();
+
+       if( config.draw_guides ) {
 // Draw center
 #define CENTER_H 20
 #define CENTER_W 20
@@ -767,32 +759,29 @@ int LensMain::process_buffer(VFrame *frame,
        } \
 }
 
-                       int w = get_output()->get_w();
-                       int h = get_output()->get_h();
-                       int center_x = (int)(config.center_x * w / 100);
-                       int center_y = (int)(config.center_y * h / 100);
-                       switch( get_output()->get_color_model() )
-                       {
-                               case BC_RGB_FLOAT:
-                                       DRAW_GUIDES(3, float, 1.0)
-                                       break;
-                               case BC_RGBA_FLOAT:
-                                       DRAW_GUIDES(4, float, 1.0)
-                                       break;
-                               case BC_RGB888:
-                                       DRAW_GUIDES(3, unsigned char, 0xff)
-                                       break;
-                               case BC_RGBA8888:
-                                       DRAW_GUIDES(4, unsigned char, 0xff)
-                                       break;
-                               case BC_YUV888:
-                                       DRAW_GUIDES(3, unsigned char, 0xff)
-                                       break;
-                               case BC_YUVA8888:
-                                       DRAW_GUIDES(4, unsigned char, 0xff)
-                                       break;
-                       }
-
+               int w = get_output()->get_w();
+               int h = get_output()->get_h();
+               int center_x = (int)(config.center_x * w / 100);
+               int center_y = (int)(config.center_y * h / 100);
+               switch( get_output()->get_color_model() ) {
+               case BC_RGB_FLOAT:
+                       DRAW_GUIDES(3, float, 1.0)
+                       break;
+               case BC_RGBA_FLOAT:
+                       DRAW_GUIDES(4, float, 1.0)
+                       break;
+               case BC_RGB888:
+                       DRAW_GUIDES(3, unsigned char, 0xff)
+                       break;
+               case BC_RGBA8888:
+                       DRAW_GUIDES(4, unsigned char, 0xff)
+                       break;
+               case BC_YUV888:
+                       DRAW_GUIDES(3, unsigned char, 0xff)
+                       break;
+               case BC_YUVA8888:
+                       DRAW_GUIDES(4, unsigned char, 0xff)
+                       break;
                }
        }
 
@@ -958,15 +947,14 @@ int LensMain::handle_opengl()
                "uniform vec2 center_coord;\n"
                "uniform vec4 border_color;\n"
                "uniform vec4 r;\n"
-               "uniform float radius;\n"
                "void main()\n"
                "{\n"
                "       vec2 outcoord = gl_TexCoord[0].st * texture_extents;\n"
                "       vec2 coord_diff = outcoord - center_coord;\n"
                "       float z = sqrt(coord_diff.x * coord_diff.x +\n"
                "                                       coord_diff.y * coord_diff.y);\n"
-               "       vec4 radius1 = (vec4(z, z, z, z) / r) * 2.0 * radius;\n"
-               "       vec4 z_in = r * atan(radius1) / (3.14159 / 2.0);\n"
+               "       vec4 radius1 = vec4(z, z, z, z) / r;\n"
+               "       vec4 z_in = r * tan(radius1) / (3.14159 / 2.0);\n"
                "\n"
                "       float angle;\n"
                "       if( coord_diff.x == 0.0 )\n"
@@ -1003,29 +991,29 @@ int LensMain::handle_opengl()
 
        get_output()->to_texture();
        get_output()->enable_opengl();
-       unsigned int frag_shader = 0;
 
-       switch( config.mode )
-       {
+       unsigned int shader = 0;
+       const char *shader_frag = 0;
+       switch( config.mode ) {
        case LensConfig::SPHERICAL_SHRINK:
-               frag_shader = VFrame::make_shader(0, shrink_frag, 0);
+               shader_frag = shrink_frag;
                break;
        case LensConfig::SPHERICAL_STRETCH:
-               frag_shader = VFrame::make_shader(0, stretch_frag, 0);
+               shader_frag = stretch_frag;
                break;
        case LensConfig::RECTILINEAR_STRETCH:
-               frag_shader = VFrame::make_shader(0, rectilinear_stretch_frag, 0);
+               shader_frag = rectilinear_stretch_frag;
                break;
        case LensConfig::RECTILINEAR_SHRINK:
-               frag_shader = VFrame::make_shader(0, rectilinear_shrink_frag, 0);
+               shader_frag = rectilinear_shrink_frag;
                break;
        }
-
-       if( frag_shader > 0 ) {
+       if( shader_frag )
+               shader = VFrame::make_shader(0, shader_frag, 0);
+       if( shader > 0 ) {
                float border_color[] = { 0, 0, 0, 0 };
                if( BC_CModels::is_yuv(get_output()->get_color_model()) ) {
-                       border_color[1] = 0.5;
-                       border_color[2] = 0.5;
+                       border_color[1] = border_color[2] = 0.5;
                }
 
                double x_factor = config.aspect;
@@ -1033,18 +1021,18 @@ int LensMain::handle_opengl()
                if( x_factor < 1 ) x_factor = 1;
                if( y_factor < 1 ) y_factor = 1;
 
-               glUseProgram(frag_shader);
-               glUniform1i(glGetUniformLocation(frag_shader, "tex"), 0);
-               glUniform2f(glGetUniformLocation(frag_shader, "aspect"),
+               glUseProgram(shader);
+               glUniform1i(glGetUniformLocation(shader, "tex"), 0);
+               glUniform2f(glGetUniformLocation(shader, "aspect"),
                        x_factor,
                        y_factor);
-               glUniform2f(glGetUniformLocation(frag_shader, "center_coord"),
+               glUniform2f(glGetUniformLocation(shader, "center_coord"),
                                (GLfloat)get_input()->get_w() * config.center_x / 100.0,
                                (GLfloat)get_input()->get_h() * config.center_y / 100.0);
-               glUniform2f(glGetUniformLocation(frag_shader, "texture_extents"),
+               glUniform2f(glGetUniformLocation(shader, "texture_extents"),
                                (GLfloat)get_input()->get_texture_w(),
                                (GLfloat)get_input()->get_texture_h());
-               glUniform2f(glGetUniformLocation(frag_shader, "image_extents"),
+               glUniform2f(glGetUniformLocation(shader, "image_extents"),
                                (GLfloat)get_input()->get_w(),
                                (GLfloat)get_input()->get_h());
 
@@ -1053,60 +1041,55 @@ int LensMain::handle_opengl()
                float *fov = config.fov;
                float dim;
                float max_z;
-               switch( config.mode )
-               {
-                       case LensConfig::SPHERICAL_SHRINK:
-                               dim = MAX(width, height) * config.radius;
-                               max_z = dim * sqrt(2.0) / 2;
-                               glUniform4fv(glGetUniformLocation(frag_shader, "border_color"),
-                                               1,
-                                               (GLfloat*)border_color);
-                               glUniform4f(glGetUniformLocation(frag_shader, "max_z"),
+               switch( config.mode ) {
+               case LensConfig::SPHERICAL_SHRINK:
+                       dim = MAX(width, height) * config.radius;
+                       max_z = dim * sqrt(2.0) / 2;
+                       glUniform4fv(glGetUniformLocation(shader, "border_color"),
+                                       1, (GLfloat*)border_color);
+                       glUniform4f(glGetUniformLocation(shader, "max_z"),
                                        max_z / fov[0],
                                        max_z / fov[1],
                                        max_z / fov[2],
                                        max_z / fov[3]);
-                               glUniform4f(glGetUniformLocation(frag_shader, "r"),
+                       glUniform4f(glGetUniformLocation(shader, "r"),
                                        (max_z / fov[0]) * 2 / M_PI,
                                        (max_z / fov[1]) * 2 / M_PI,
                                        (max_z / fov[2]) * 2 / M_PI,
                                        (max_z / fov[3]) * 2 / M_PI);
-                               break;
+                       break;
 
-                       case LensConfig::SPHERICAL_STRETCH:
-                               dim = MAX(width, height) * config.radius;
-                               max_z = dim * sqrt(2.0) / 2;
-                               glUniform4f(glGetUniformLocation(frag_shader, "r"),
+               case LensConfig::SPHERICAL_STRETCH:
+                       dim = MAX(width, height) * config.radius;
+                       max_z = dim * sqrt(2.0) / 2;
+                       glUniform4f(glGetUniformLocation(shader, "r"),
                                        max_z / M_PI / (fov[0] / 2.0),
                                        max_z / M_PI / (fov[1] / 2.0),
                                        max_z / M_PI / (fov[2] / 2.0),
                                        max_z / M_PI / (fov[3] / 2.0));
-                               break;
+                       break;
 
-                       case LensConfig::RECTILINEAR_STRETCH:
-                               max_z = sqrt(SQR(width) + SQR(height)) / 2;
-                               glUniform4f(glGetUniformLocation(frag_shader, "r"),
+               case LensConfig::RECTILINEAR_STRETCH:
+                       max_z = sqrt(SQR(width) + SQR(height)) / 2;
+                       glUniform4f(glGetUniformLocation(shader, "r"),
                                        max_z / M_PI / (fov[0] / 2.0),
                                        max_z / M_PI / (fov[1] / 2.0),
                                        max_z / M_PI / (fov[2] / 2.0),
                                        max_z / M_PI / (fov[3] / 2.0));
-                               glUniform1f(glGetUniformLocation(frag_shader, "radius"),
+                       glUniform1f(glGetUniformLocation(shader, "radius"),
                                        config.radius);
-                               break;
+                       break;
 
-                       case LensConfig::RECTILINEAR_SHRINK:
-                               max_z = sqrt(SQR(width) + SQR(height)) / 2;
-                               glUniform4f(glGetUniformLocation(frag_shader, "r"),
-                                       max_z / M_PI / (fov[0] / 2.0),
-                                       max_z / M_PI / (fov[1] / 2.0),
-                                       max_z / M_PI / (fov[2] / 2.0),
-                                       max_z / M_PI / (fov[3] / 2.0));
-                               glUniform1f(glGetUniformLocation(frag_shader, "radius"),
-                                       config.radius);
-                               break;
+               case LensConfig::RECTILINEAR_SHRINK:
+                       max_z = MAX(width, height) / 2 * config.radius;
+                       glUniform4f(glGetUniformLocation(shader, "r"),
+                                       max_z / fov[0],
+                                       max_z / fov[1],
+                                       max_z / fov[2],
+                                       max_z / fov[3]);
+                       break;
                }
 
-
                get_output()->init_screen();
                get_output()->bind_texture(0);
                glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, border_color);
@@ -1115,7 +1098,6 @@ int LensMain::handle_opengl()
                get_output()->draw_texture();
                glUseProgram(0);
 
-
                if( config.draw_guides ) {
                        int w = get_output()->get_w();
                        int h = get_output()->get_h();
@@ -1175,6 +1157,7 @@ int LensMain::handle_opengl()
                        break; \
                } \
                break; \
+       case LensConfig::INTERP_DEFAULT: \
        case LensConfig::INTERP_BILINEAR: \
                switch( icolor_model ) { \
                case BC_RGB888: \