X-Git-Url: https://git.cinelerra-gg.org/git/?p=goodguy%2Fcinelerra.git;a=blobdiff_plain;f=cinelerra-5.1%2Fcinelerra%2Fmaskautos.C;h=bac0d851d965301f13508d3454e565a952d54f27;hp=62b6ad74ea9d8d7d8253502abbcf89969104b3f3;hb=076da20a596fe698e1152ce2f3f2d75d2daddec8;hpb=c857b2fb7965d27d86d5785fb9f1b8957a871a1a diff --git a/cinelerra-5.1/cinelerra/maskautos.C b/cinelerra-5.1/cinelerra/maskautos.C index 62b6ad74..bac0d851 100644 --- a/cinelerra-5.1/cinelerra/maskautos.C +++ b/cinelerra-5.1/cinelerra/maskautos.C @@ -22,6 +22,7 @@ #include "automation.inc" #include "clip.h" #include "edl.h" +#include "edlsession.h" #include "localsession.h" #include "maskauto.h" #include "maskautos.h" @@ -50,7 +51,8 @@ void MaskAutos::update_parameter(MaskAuto *src) // Selection is always aligned to frame for masks // Create new keyframe if auto keyframes or replace entire keyframe. - if(selection_start == selection_end) + if( !edl->session->span_keyframes || + EQUIV(selection_start, selection_end) ) { // Search for keyframe to write to MaskAuto *dst = (MaskAuto*)get_auto_for_editing(); @@ -88,7 +90,7 @@ void MaskAutos::update_parameter(MaskAuto *src) -void MaskAutos::get_points(ArrayList *points, +void MaskAutos::get_points(MaskPoints *points, int submask, int64_t position, int direction) @@ -161,37 +163,35 @@ void MaskAutos::get_points(ArrayList *points, } -float MaskAutos::get_feather(int64_t position, int direction) +double MaskAutos::get_feather(int64_t position, int i, int direction) { Auto *begin = 0, *end = 0; position = (direction == PLAY_FORWARD) ? position : (position - 1); + MaskAuto*prev = (MaskAuto*)get_prev_auto(position, PLAY_FORWARD, begin, 1); + MaskAuto*next = (MaskAuto*)get_next_auto(position, PLAY_FORWARD, end, 1); + SubMask *prev_mask = prev->get_submask(i), *next_mask = next->get_submask(i); - get_prev_auto(position, PLAY_FORWARD, begin, 1); - get_next_auto(position, PLAY_FORWARD, end, 1); + double weight = end->position == begin->position ? 0.0 : + (double)(position - begin->position) / (end->position - begin->position); - double weight = 0.0; - if(end->position != begin->position) - weight = (double)(position - begin->position) / (end->position - begin->position); - - return ((MaskAuto*)begin)->feather * (1.0 - weight) + ((MaskAuto*)end)->feather * weight; + double result = prev_mask->feather * (1-weight) + next_mask->feather*weight; + return result; } -int MaskAutos::get_value(int64_t position, int direction) +double MaskAutos::get_fader(int64_t position, int i, int direction) { Auto *begin = 0, *end = 0; position = (direction == PLAY_FORWARD) ? position : (position - 1); + MaskAuto*prev = (MaskAuto*)get_prev_auto(position, PLAY_FORWARD, begin, 1); + MaskAuto*next = (MaskAuto*)get_next_auto(position, PLAY_FORWARD, end, 1); + SubMask *prev_mask = prev->get_submask(i), *next_mask = next->get_submask(i); - get_prev_auto(position, PLAY_FORWARD, begin, 1); - get_next_auto(position, PLAY_FORWARD, end, 1); + double weight = end->position == begin->position ? 0.0 : + (double)(position - begin->position) / (end->position - begin->position); - double weight = 0.0; - if(end->position != begin->position) - weight = (double)(position - begin->position) / (end->position - begin->position); - - int result = (int)((double)((MaskAuto*)begin)->value * (1.0 - weight) + - (double)((MaskAuto*)end)->value * weight + 0.5); -// printf("MaskAutos::get_value %d %d %f %d %f %d\n", __LINE__, -// ((MaskAuto*)begin)->value, 1.0 - weight, ((MaskAuto*)end)->value, weight, result); + double result = prev_mask->fader * (1-weight) + next_mask->fader*weight; +// printf("MaskAutos::get_fader %d %d %d %f %d %f %d\n", __LINE__, i, +// ((MaskAuto*)begin)->fader, 1.0 - weight, ((MaskAuto*)end)->fader, weight, result); return result; } @@ -221,19 +221,18 @@ Auto* MaskAutos::new_auto() return new MaskAuto(edl, this); } -void MaskAutos::dump() +void MaskAutos::dump(FILE *fp) { - printf(" MaskAutos::dump %p\n", this); - printf(" Default: position %jd submasks %d\n", + fprintf(fp, " MaskAutos::dump %p\n", this); + fprintf(fp, " Default: position %jd submasks %d\n", default_auto->position, ((MaskAuto*)default_auto)->masks.total); - ((MaskAuto*)default_auto)->dump(); - for(Auto* current = first; current; current = NEXT) - { - printf(" position %jd masks %d\n", + ((MaskAuto*)default_auto)->dump(fp); + for( Auto* current = first; current; current=NEXT ) { + fprintf(fp, " position %jd masks %d\n", current->position, ((MaskAuto*)current)->masks.total); - ((MaskAuto*)current)->dump(); + ((MaskAuto*)current)->dump(fp); } } @@ -244,10 +243,7 @@ int MaskAutos::mask_exists(int64_t position, int direction) MaskAuto* keyframe = (MaskAuto*)get_prev_auto(position, direction, current); - - - for(int i = 0; i < keyframe->masks.total; i++) - { + for( int i = 0; i < keyframe->masks.total; i++ ) { SubMask *mask = keyframe->get_submask(i); if(mask->points.total > 1) return 1; @@ -258,12 +254,8 @@ int MaskAutos::mask_exists(int64_t position, int direction) int MaskAutos::total_submasks(int64_t position, int direction) { position = (direction == PLAY_FORWARD) ? position : (position - 1); - for(MaskAuto* current = (MaskAuto*)last; - current; - current = (MaskAuto*)PREVIOUS) - { - if(current->position <= position) - { + for( MaskAuto* current=(MaskAuto*)last; current; current=(MaskAuto*)PREVIOUS ) { + if( current->position <= position ) { return current->masks.total; } } @@ -275,10 +267,7 @@ int MaskAutos::total_submasks(int64_t position, int direction) void MaskAutos::translate_masks(float translate_x, float translate_y) { ((MaskAuto *)default_auto)->translate_submasks(translate_x, translate_y); - for(MaskAuto* current = (MaskAuto*)first; - current; - current = (MaskAuto*)NEXT) - { + for( MaskAuto* current=(MaskAuto*)first; current; current=(MaskAuto*)NEXT ) { current->translate_submasks(translate_x, translate_y); } }