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.
This commit is contained in:
parent
7907dfc400
commit
5d15e68743
|
@ -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)
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -1502,7 +1502,7 @@ void DepsgraphNodeBuilder::build_movieclip(MovieClip *clip)
|
|||
return;
|
||||
}
|
||||
ID *clip_id = &clip->id;
|
||||
MovieClip *clip_cow = get_cow_datablock(clip);
|
||||
MovieClip *clip_cow = (MovieClip *)ensure_cow_id(clip_id);
|
||||
/* Animation. */
|
||||
build_animdata(clip_id);
|
||||
/* Movie clip evaluation. */
|
||||
|
@ -1510,6 +1510,11 @@ void DepsgraphNodeBuilder::build_movieclip(MovieClip *clip)
|
|||
DEG_NODE_TYPE_PARAMETERS,
|
||||
function_bind(BKE_movieclip_eval_update, _1, clip_cow),
|
||||
DEG_OPCODE_MOVIECLIP_EVAL);
|
||||
|
||||
add_operation_node(clip_id,
|
||||
DEG_NODE_TYPE_BATCH_CACHE,
|
||||
function_bind(BKE_movieclip_eval_selection_update, _1, clip_cow),
|
||||
DEG_OPCODE_MOVIECLIP_SELECT_UPDATE);
|
||||
}
|
||||
|
||||
void DepsgraphNodeBuilder::build_lightprobe(LightProbe *probe)
|
||||
|
|
|
@ -152,6 +152,10 @@ void depsgraph_select_tag_to_component_opcode(
|
|||
*component_type = DEG_NODE_TYPE_OBJECT_FROM_LAYER;
|
||||
*operation_code = DEG_OPCODE_OBJECT_BASE_FLAGS;
|
||||
}
|
||||
else if (id_type == ID_MC) {
|
||||
*component_type = DEG_NODE_TYPE_BATCH_CACHE;
|
||||
*operation_code = DEG_OPCODE_MOVIECLIP_SELECT_UPDATE;
|
||||
}
|
||||
else {
|
||||
*component_type = DEG_NODE_TYPE_BATCH_CACHE;
|
||||
*operation_code = DEG_OPCODE_GEOMETRY_SELECT_UPDATE;
|
||||
|
|
|
@ -175,6 +175,7 @@ const char *operationCodeAsString(eDepsOperation_Code opcode)
|
|||
STRINGIFY_OPCODE(WORLD_UPDATE);
|
||||
/* Movie clip. */
|
||||
STRINGIFY_OPCODE(MOVIECLIP_EVAL);
|
||||
STRINGIFY_OPCODE(MOVIECLIP_SELECT_UPDATE);
|
||||
|
||||
case DEG_NUM_OPCODES: return "SpecialCase";
|
||||
#undef STRINGIFY_OPCODE
|
||||
|
|
|
@ -152,7 +152,7 @@ typedef enum eDepsNode_Type {
|
|||
DEG_NODE_TYPE_SHADING_PARAMETERS,
|
||||
/* Cache Component */
|
||||
DEG_NODE_TYPE_CACHE,
|
||||
/* Batch Cache Component */
|
||||
/* Batch Cache Component - TODO (dfelinto/sergey) rename to make it more generic. */
|
||||
DEG_NODE_TYPE_BATCH_CACHE,
|
||||
|
||||
/* Total number of meaningful node types. */
|
||||
|
@ -274,6 +274,7 @@ typedef enum eDepsOperation_Code {
|
|||
|
||||
/* Movie clips. ------------------------------------ */
|
||||
DEG_OPCODE_MOVIECLIP_EVAL,
|
||||
DEG_OPCODE_MOVIECLIP_SELECT_UPDATE,
|
||||
|
||||
DEG_NUM_OPCODES,
|
||||
} eDepsOperation_Code;
|
||||
|
|
|
@ -54,6 +54,8 @@
|
|||
|
||||
#include "UI_view2d.h"
|
||||
|
||||
#include "DEG_depsgraph.h"
|
||||
|
||||
#include "tracking_ops_intern.h" /* own include */
|
||||
#include "clip_intern.h" /* own include */
|
||||
|
||||
|
@ -347,6 +349,7 @@ static int mouse_select(bContext *C, float co[2], int extend)
|
|||
BKE_tracking_dopesheet_tag_update(tracking);
|
||||
|
||||
WM_event_add_notifier(C, NC_GEOM | ND_SELECT, NULL);
|
||||
DEG_id_tag_update(&clip->id, DEG_TAG_SELECT_UPDATE);
|
||||
|
||||
return OPERATOR_FINISHED;
|
||||
}
|
||||
|
@ -390,6 +393,7 @@ static int select_invoke(bContext *C, wmOperator *op, const wmEvent *event)
|
|||
clip->tracking.act_track = track;
|
||||
|
||||
WM_event_add_notifier(C, NC_GEOM | ND_SELECT, NULL);
|
||||
DEG_id_tag_update(&clip->id, DEG_TAG_SELECT_UPDATE);
|
||||
|
||||
return OPERATOR_PASS_THROUGH;
|
||||
}
|
||||
|
@ -507,6 +511,7 @@ static int border_select_exec(bContext *C, wmOperator *op)
|
|||
BKE_tracking_dopesheet_tag_update(tracking);
|
||||
|
||||
WM_event_add_notifier(C, NC_GEOM | ND_SELECT, NULL);
|
||||
DEG_id_tag_update(&clip->id, DEG_TAG_SELECT_UPDATE);
|
||||
|
||||
return OPERATOR_FINISHED;
|
||||
}
|
||||
|
@ -617,6 +622,7 @@ static int do_lasso_select_marker(bContext *C, const int mcords[][2], const shor
|
|||
BKE_tracking_dopesheet_tag_update(tracking);
|
||||
|
||||
WM_event_add_notifier(C, NC_GEOM | ND_SELECT, NULL);
|
||||
DEG_id_tag_update(&clip->id, DEG_TAG_SELECT_UPDATE);
|
||||
}
|
||||
|
||||
return changed;
|
||||
|
@ -759,6 +765,7 @@ static int circle_select_exec(bContext *C, wmOperator *op)
|
|||
BKE_tracking_dopesheet_tag_update(tracking);
|
||||
|
||||
WM_event_add_notifier(C, NC_GEOM | ND_SELECT, NULL);
|
||||
DEG_id_tag_update(&clip->id, DEG_TAG_SELECT_UPDATE);
|
||||
|
||||
return OPERATOR_FINISHED;
|
||||
}
|
||||
|
@ -884,6 +891,7 @@ static int select_all_exec(bContext *C, wmOperator *op)
|
|||
BKE_tracking_dopesheet_tag_update(tracking);
|
||||
|
||||
WM_event_add_notifier(C, NC_GEOM | ND_SELECT, NULL);
|
||||
DEG_id_tag_update(&clip->id, DEG_TAG_SELECT_UPDATE);
|
||||
|
||||
return OPERATOR_FINISHED;
|
||||
}
|
||||
|
@ -967,6 +975,7 @@ static int select_grouped_exec(bContext *C, wmOperator *op)
|
|||
BKE_tracking_dopesheet_tag_update(tracking);
|
||||
|
||||
WM_event_add_notifier(C, NC_MOVIECLIP | ND_DISPLAY, clip);
|
||||
DEG_id_tag_update(&clip->id, DEG_TAG_SELECT_UPDATE);
|
||||
|
||||
return OPERATOR_FINISHED;
|
||||
}
|
||||
|
|
|
@ -1639,6 +1639,7 @@ static bool ed_object_select_pick(
|
|||
retval = true;
|
||||
|
||||
DEG_id_tag_update(&scene->id, DEG_TAG_SELECT_UPDATE);
|
||||
DEG_id_tag_update(&clip->id, DEG_TAG_SELECT_UPDATE);
|
||||
WM_event_add_notifier(C, NC_MOVIECLIP | ND_SELECT, track);
|
||||
WM_event_add_notifier(C, NC_SCENE | ND_OB_SELECT, scene);
|
||||
|
||||
|
|
Loading…
Reference in New Issue