X-Git-Url: https://git.cinelerra-gg.org/git/?a=blobdiff_plain;f=cinelerra-5.1%2Fplugins%2Ftracer%2Ftracer.C;h=a25654fe1e4f5a9b6f80bcbfc7b7d707fd71ce8a;hb=HEAD;hp=a40d0c27e8bd4f161a0407bab8c95883e6b21897;hpb=a4091ab5bcfb46773cbabaf1303c427346b35fbe;p=goodguy%2Fcinelerra.git diff --git a/cinelerra-5.1/plugins/tracer/tracer.C b/cinelerra-5.1/plugins/tracer/tracer.C index a40d0c27..a25654fe 100644 --- a/cinelerra-5.1/plugins/tracer/tracer.C +++ b/cinelerra-5.1/plugins/tracer/tracer.C @@ -28,9 +28,13 @@ #include "bccmodels.h" #include "bccolors.h" #include "clip.h" +#include "edl.h" #include "edlsession.h" #include "filexml.h" +#include "keyframe.h" +#include "keyframes.h" #include "tracer.h" +#include "transportque.inc" #include "tracerwindow.h" #include "language.h" #include "vframe.h" @@ -54,11 +58,19 @@ TracerPoint::~TracerPoint() { } +int Tracer::new_point() +{ + EDLSession *session = get_edl()->session; + float x = !session ? 0.f : session->output_w / 2.f; + float y = !session ? 0.f : session->output_h / 2.f; + return config.add_point(x, y); +} + TracerConfig::TracerConfig() { - drag = draw = 1; fill = 0; + draw = 1; fill = 0; feather = 0; radius = 1; - invert = 0; selected = -1; + invert = 0; } TracerConfig::~TracerConfig() { @@ -66,7 +78,6 @@ TracerConfig::~TracerConfig() int TracerConfig::equivalent(TracerConfig &that) { - if( this->drag != that.drag ) return 0; if( this->draw != that.draw ) return 0; if( this->fill != that.fill ) return 0; if( this->feather != that.feather ) return 0; @@ -83,10 +94,8 @@ int TracerConfig::equivalent(TracerConfig &that) void TracerConfig::copy_from(TracerConfig &that) { - this->drag = that.drag; this->draw = that.draw; this->fill = that.fill; - this->selected = that.selected; this->feather = that.feather; this->invert = that.invert; this->radius = that.radius; @@ -135,6 +144,7 @@ Tracer::Tracer(PluginServer *server) bx = 0; by = 0; cx = 0; cy = 0; ex = 0; ey = 0; + drag = 0; selected = 0; } Tracer::~Tracer() @@ -158,15 +168,20 @@ int Tracer::load_configuration1() } LOAD_CONFIGURATION_MACRO(Tracer, TracerConfig); -int Tracer::new_point() +void Tracer::render_gui(void *data) { - EDLSession *session = get_edlsession(); - float x = !session ? 0.f : session->output_w / 2.f; - float y = !session ? 0.f : session->output_h / 2.f; - return config.add_point(x, y); + Tracer *tracer = (Tracer *)data; + tracer->drag = drag; } -void Tracer::save_data(KeyFrame *keyframe) +int Tracer::is_dragging() +{ + drag = 0; + send_render_gui(this); + return drag; +} + +void TracerConfig::save_data(KeyFrame *keyframe) { FileXML output; @@ -174,20 +189,18 @@ void Tracer::save_data(KeyFrame *keyframe) output.set_shared_output(keyframe->xbuf); output.tag.set_title("TRACER"); - output.tag.set_property("DRAG", config.drag); - output.tag.set_property("DRAW", config.draw); - output.tag.set_property("FILL", config.fill); - output.tag.set_property("FEATHER", config.feather); - output.tag.set_property("RADIUS", config.radius); - output.tag.set_property("INVERT", config.invert); - output.tag.set_property("SELECTED", config.selected); + output.tag.set_property("DRAW", draw); + output.tag.set_property("FILL", fill); + output.tag.set_property("FEATHER", feather); + output.tag.set_property("RADIUS", radius); + output.tag.set_property("INVERT", invert); output.append_tag(); output.append_newline(); output.tag.set_title("/TRACER"); output.append_tag(); output.append_newline(); - for( int i=0, n=config.points.size(); ixbuf); - config.points.remove_all_objects(); + points.remove_all_objects(); int result = 0; while( !(result=input.read_tag()) ) { if( input.tag.title_is("TRACER") ) { - config.drag = input.tag.get_property("DRAG", config.drag); - config.draw = input.tag.get_property("DRAW", config.draw); - config.fill = input.tag.get_property("FILL", config.fill); - config.feather = input.tag.get_property("FEATHER", config.feather); - config.radius = input.tag.get_property("RADIUS", config.radius); - config.invert = input.tag.get_property("INVERT", config.invert); - config.selected = input.tag.get_property("SELECTED", 0); - config.limits(); + draw = input.tag.get_property("DRAW", draw); + fill = input.tag.get_property("FILL", fill); + feather = input.tag.get_property("FEATHER", feather); + radius = input.tag.get_property("RADIUS", radius); + invert = input.tag.get_property("INVERT", invert); + limits(); } else if( !strncmp(input.tag.get_title(),"POINT_",6) ) { float x = input.tag.get_property("X", 0.f); float y = input.tag.get_property("Y", 0.f); - config.add_point(x, y); + add_point(x, y); } } } +void Tracer::read_data(KeyFrame *keyframe) +{ + config.read_data(keyframe); +} + +void Tracer::span_keyframes(KeyFrame *src, int64_t start, int64_t end) +{ + TracerConfig src_config; + src_config.read_data(src); + KeyFrames *keyframes = (KeyFrames *)src->autos; + KeyFrame *prev = keyframes->get_prev_keyframe(start, PLAY_FORWARD); + TracerConfig prev_config; + prev_config.read_data(prev); +// Always update the first one + update_parameter(prev_config, src_config, prev); + KeyFrame *curr = (KeyFrame*)prev->next; + while( curr && curr->position < end ) { + update_parameter(prev_config, src_config, curr); + curr = (KeyFrame*)curr->next; + } +} + +void TracerPoint::update_parameter(TracerPoint *prev, TracerPoint *src) +{ + if( prev->x != src->x ) x = src->x; + if( prev->y != src->y ) y = src->y; +} + +void Tracer::update_parameter(TracerConfig &prev_config, TracerConfig &src_config, + KeyFrame *keyframe) +{ + TracerConfig dst_config; + dst_config.read_data(keyframe); + if( prev_config.draw != src_config.draw ) + dst_config.draw = src_config.draw; + if( prev_config.fill != src_config.fill ) + dst_config.fill = src_config.fill; + if( prev_config.feather != src_config.feather ) + dst_config.feather = src_config.feather; + if( prev_config.invert != src_config.invert ) + dst_config.invert = src_config.invert; + if( prev_config.radius != src_config.radius ) + dst_config.radius = src_config.radius; + int src_points = src_config.points.size(); + int dst_points = dst_config.points.size(); + int prev_points = prev_config.points.size(); + int npoints = bmin(prev_points, bmin(src_points, dst_points)); + for( int i=0; iupdate_parameter(prev_point, src_point); + } + dst_config.save_data(keyframe); +} void Tracer::update_gui() { @@ -253,7 +323,7 @@ void Tracer::draw_points() { for( int i=0, n=config.points.size(); iset_pixel_color(config.selected == i ? GREEN : WHITE); + frm->set_pixel_color(selected == i ? GREEN : WHITE); draw_point(pt); } } @@ -651,7 +721,7 @@ int Tracer::process_buffer(VFrame *frame, int64_t start_position, double frame_r if( !edg ) redraw = 1; VFrame::get_temp(edg, w, h, BC_GREY8); if( redraw ) { - edg->clear_frame(); + edg->black_frame(); edg_rows = edg->get_rows(); int n = config.points.size()-1; @@ -667,7 +737,7 @@ int Tracer::process_buffer(VFrame *frame, int64_t start_position, double frame_r TracePoint *pt0 = &points[0], *pt1 = &points[l2]; int cx = (pt0->x+pt1->x)/2, cy = (pt0->y+pt1->y)/2; VFrame::get_temp(msk, w, h, BC_GREY8); - msk->clear_frame(); + msk->black_frame(); msk_rows = msk->get_rows(); FillRegion fill_region(edg, msk); @@ -681,7 +751,7 @@ int Tracer::process_buffer(VFrame *frame, int64_t start_position, double frame_r draw_mask(); if( config.draw && edg ) draw_edge(); - if( config.drag ) + if( is_dragging() ) draw_points(); return 0; }