diff options
author | Dalai Felinto <dfelinto@gmail.com> | 2018-08-13 22:59:42 +0300 |
---|---|---|
committer | Dalai Felinto <dfelinto@gmail.com> | 2018-08-15 15:46:33 +0300 |
commit | 5d15e68743fc92b41a85ef4180628427ab3b86da (patch) | |
tree | 54e363980253f46ee300f23f6bd585c9d4b840fc /source/blender/blenkernel | |
parent | 7907dfc400182b408e558d9fef1240d9929f8661 (diff) |
Fix viewport selection of markers not updating in all editors
This includes selections both in the clip editor as the viewport.
The selection is implemented as a synchronization function called from the eval
selection update node in depsgraph.
Diffstat (limited to 'source/blender/blenkernel')
-rw-r--r-- | source/blender/blenkernel/BKE_movieclip.h | 3 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/movieclip.c | 43 |
2 files changed, 45 insertions, 1 deletions
diff --git a/source/blender/blenkernel/BKE_movieclip.h b/source/blender/blenkernel/BKE_movieclip.h index 014ea2b9159..ee8e22048a1 100644 --- a/source/blender/blenkernel/BKE_movieclip.h +++ b/source/blender/blenkernel/BKE_movieclip.h @@ -84,8 +84,9 @@ struct ImBuf *BKE_movieclip_anim_ibuf_for_frame(struct MovieClip *clip, struct M bool BKE_movieclip_has_cached_frame(struct MovieClip *clip, struct MovieClipUser *user); bool BKE_movieclip_put_frame_if_possible(struct MovieClip *clip, struct MovieClipUser *user, struct ImBuf *ibuf); -/* Evaluaiton. */ +/* Evaluation. */ void BKE_movieclip_eval_update(struct Depsgraph *depsgraph, struct MovieClip *clip); +void BKE_movieclip_eval_selection_update(struct Depsgraph *depsgraph, struct MovieClip *clip); /* cacheing flags */ #define MOVIECLIP_CACHE_SKIP (1 << 0) diff --git a/source/blender/blenkernel/intern/movieclip.c b/source/blender/blenkernel/intern/movieclip.c index 98586a5c2f5..69d237e1296 100644 --- a/source/blender/blenkernel/intern/movieclip.c +++ b/source/blender/blenkernel/intern/movieclip.c @@ -1609,8 +1609,51 @@ bool BKE_movieclip_put_frame_if_possible(MovieClip *clip, return result; } +static void movieclip_selection_synchronize(MovieClip *clip_dst, MovieClip *clip_src) +{ + BLI_assert(clip_dst != clip_src); + MovieTracking *tracking_dst = &clip_dst->tracking, *tracking_src = &clip_src->tracking; + /* Syncs the active object, track and plane track. */ + tracking_dst->objectnr = tracking_src->objectnr; + const int active_track_index = BLI_findindex(&tracking_src->tracks, tracking_src->act_track); + const int active_plane_track_index = BLI_findindex(&tracking_src->plane_tracks, tracking_src->act_plane_track); + tracking_dst->act_track = BLI_findlink(&tracking_dst->tracks, active_track_index); + tracking_dst->act_plane_track = BLI_findlink(&tracking_dst->plane_tracks, active_plane_track_index); + + /* Syncs the tracking selection flag. */ + MovieTrackingObject *tracking_object_dst, *tracking_object_src; + tracking_object_src = tracking_src->objects.first; + + for (tracking_object_dst = tracking_dst->objects.first; + tracking_object_dst != NULL; + tracking_object_dst = tracking_object_dst->next, + tracking_object_src = tracking_object_src->next) + { + ListBase *tracksbase_dst, *tracksbase_src; + tracksbase_dst = BKE_tracking_object_get_tracks(tracking_dst, tracking_object_dst); + tracksbase_src = BKE_tracking_object_get_tracks(tracking_src, tracking_object_src); + + MovieTrackingTrack *track_dst, *track_src; + track_src = tracksbase_src->first; + for (track_dst = tracksbase_dst->first; + track_dst != NULL; + track_dst = track_dst->next, track_src = track_src->next) + { + track_dst->flag = track_src->flag; + track_dst->pat_flag = track_src->pat_flag; + track_dst->search_flag = track_src->search_flag; + } + } +} + void BKE_movieclip_eval_update(struct Depsgraph *depsgraph, MovieClip *clip) { DEG_debug_print_eval(depsgraph, __func__, clip->id.name, clip); BKE_tracking_dopesheet_tag_update(&clip->tracking); } + +void BKE_movieclip_eval_selection_update(struct Depsgraph *depsgraph, MovieClip *clip) +{ + DEG_debug_print_eval(depsgraph, __func__, clip->id.name, clip); + movieclip_selection_synchronize(clip, (MovieClip *)clip->id.orig_id); +} |