X-Git-Url: https://git.cinelerra-gg.org/git/?p=goodguy%2Fcinelerra.git;a=blobdiff_plain;f=cinelerra-5.1%2Fcinelerra%2Ftracks.C;h=bb31f6dbecd2fa59c492101819bf5aae192244cb;hp=08952e429d3fbd06e50bfe9859b335a15e623ceb;hb=b78b166faf60a1c7357f990b1e2fb0e70be29fee;hpb=7fd85fb66168f6b518c5f2d73e04036e87faa0e1 diff --git a/cinelerra-5.1/cinelerra/tracks.C b/cinelerra-5.1/cinelerra/tracks.C index 08952e42..bb31f6db 100644 --- a/cinelerra-5.1/cinelerra/tracks.C +++ b/cinelerra-5.1/cinelerra/tracks.C @@ -105,32 +105,40 @@ void Tracks::equivalent_output(Tracks *tracks, double *result) } - - -void Tracks::get_affected_edits(ArrayList *drag_edits, double position, Track *start_track) +void Tracks::clear_selected_edits() { - drag_edits->remove_all(); + for( Track *track=first; track; track=track->next ) { + for( Edit *edit=track->edits->first; edit; edit=edit->next ) + edit->is_selected = 0; + } +} - for(Track *track = start_track; - track; - track = track->next) - { -//printf("Tracks::get_affected_edits 1 %p %d %d\n", track, track->data_type, track->record); - if(track->record) - { - for(Edit *edit = track->edits->first; edit; edit = edit->next) - { - double startproject = track->from_units(edit->startproject); -//printf("Tracks::get_affected_edits 1 %d\n", edl->equivalent(startproject, position)); - if(edl->equivalent(startproject, position)) - { - drag_edits->append(edit); - break; - } +void Tracks::select_affected_edits(double position, Track *start_track, int sense) +{ + for( Track *track=start_track; track; track=track->next ) { + if( !track->record ) continue; + for( Edit *edit=track->edits->first; edit; edit=edit->next ) { + if( edit->silence() ) continue; + double startproject = track->from_units(edit->startproject); + if( edl->equivalent(startproject, position) ) { + edit->is_selected = sense >= 0 ? sense : + edit->is_selected ? 0 : 1; + break; } } } +} +void Tracks::get_selected_edits(ArrayList *drag_edits) +{ + drag_edits->remove_all(); + for( Track *track=first; track; track=track->next ) { + if( !track->record ) continue; + for( Edit *edit=track->edits->first; edit; edit=edit->next ) { + if( !edit->is_selected ) continue; + drag_edits->append(edit); + } + } } void Tracks::get_automation_extents(float *min, @@ -162,6 +170,8 @@ void Tracks::copy_from(Tracks *tracks) Track *new_track = 0; delete_all_tracks(); + int solo_track_id = tracks->edl->local_session->solo_track_id; + for(Track *current = tracks->first; current; current = NEXT) { switch(current->data_type) @@ -179,6 +189,9 @@ void Tracks::copy_from(Tracks *tracks) continue; } new_track->copy_from(current); + + if( current->get_id() == solo_track_id ) + edl->local_session->solo_track_id = new_track->get_id(); } } @@ -509,14 +522,62 @@ double Tracks::total_length_framealigned(double fps) return 0; } -void Tracks::translate_projector(float offset_x, float offset_y) +void Tracks::translate_fauto_xy(int fauto, float dx, float dy, int all) { - for(Track *current = first; current; current = NEXT) - { - if(current->data_type == TRACK_VIDEO) - { - ((VTrack*)current)->translate(offset_x, offset_y, 0); - } + Track *track = first; + for( ; track; track=track->next ) { + if( !all && !track->record ) continue; + if( track->data_type != TRACK_VIDEO ) continue; + ((VTrack*)track)->translate(fauto, dx, dy, all); + } +} + +void Tracks::translate_projector(float dx, float dy, int all) +{ + translate_fauto_xy(AUTOMATION_PROJECTOR_X, dx, dy, all); +} + +void Tracks::translate_camera(float dx, float dy, int all) +{ + translate_fauto_xy(AUTOMATION_CAMERA_X, dx, dy, all); +} + +void Tracks::crop_resize(float x, float y, float z) +{ + float ctr_x = edl->session->output_w / 2.; + float ctr_y = edl->session->output_h / 2.; + Track *track = first; + for( ; track; track=track->next ) { + if( !track->record ) continue; + if( track->data_type != TRACK_VIDEO ) continue; + float px, py, pz; + track->get_projector(px, py, pz); + float old_x = px + ctr_x; + float old_y = py + ctr_y; + float nx = (old_x - x) * z; + float ny = (old_y - y) * z; + track->set_projector(nx, ny, pz * z); + } +} + +void Tracks::crop_shrink(float x, float y, float z) +{ + float ctr_x = edl->session->output_w / 2.; + float ctr_y = edl->session->output_h / 2.; + Track *track = first; + for( ; track; track=track->next ) { + if( !track->record ) continue; + if( track->data_type != TRACK_VIDEO ) continue; + float cx, cy, cz, px, py, pz; + track->get_camera(cx, cy, cz); + track->get_projector(px, py, pz); + float dx = x - (px + ctr_x); + float dy = y - (py + ctr_y); + cz *= pz; + cx += dx / cz; cy += dy / cz; + track->set_camera(cx, cy, cz * z); + px += dx; py += dy; + track->set_projector(px, py, 1 / z); } } @@ -617,6 +678,12 @@ Track* Tracks::number(int number) return current; } +Track* Tracks::get_track_by_id(int id) +{ + Track *track = edl->tracks->first; + while( track && track->get_id() != id ) track = track->next; + return track; +} int Tracks::total_playable_vtracks() { @@ -646,6 +713,47 @@ int Tracks::track_exists(Track *track) return 0; } +int Tracks::new_group(int id) +{ + int count = 0; + for( Track *track=first; track; track=track->next ) { + if( !track->record ) continue; + for( Edit *edit=track->edits->first; edit; edit=edit->next ) { + if( edit->group_id > 0 ) continue; + if( !edit->is_selected ) continue; + edit->group_id = id; + ++count; + } + } + return count; +} + +int Tracks::set_group_selected(int id, int v) +{ + int count = 0; + for( Track *track=first; track; track=track->next ) { + for( Edit *edit=track->edits->first; edit; edit=edit->next ) { + if( edit->group_id != id ) continue; + edit->is_selected = v >= 0 ? v : !edit->is_selected ? 1 : 0; + ++count; + } + } + return count; +} + +int Tracks::del_group(int id) +{ + int count = 0; + for( Track *track=first; track; track=track->next ) { + for( Edit *edit=track->edits->first; edit; edit=edit->next ) { + if( edit->group_id != id ) continue; + edit->is_selected = 1; + edit->group_id = 0; + ++count; + } + } + return count; +} Track *Tracks::get(int idx, int data_type) { @@ -657,4 +765,3 @@ Track *Tracks::get(int idx, int data_type) return 0; } -