diff options
Diffstat (limited to 'source/blender')
-rw-r--r-- | source/blender/blenkernel/BKE_tracking.h | 40 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/tracking.c | 152 | ||||
-rw-r--r-- | source/blender/editors/space_clip/clip_intern.h | 2 | ||||
-rw-r--r-- | source/blender/editors/space_clip/clip_utils.c | 58 | ||||
-rw-r--r-- | source/blender/editors/space_clip/tracking_ops.c | 9 | ||||
-rw-r--r-- | source/blender/editors/space_sequencer/sequencer_edit.c | 9 | ||||
-rw-r--r-- | source/blender/makesrna/intern/rna_tracking.c | 147 |
7 files changed, 294 insertions, 123 deletions
diff --git a/source/blender/blenkernel/BKE_tracking.h b/source/blender/blenkernel/BKE_tracking.h index b4ca1b79238..5da87de1cc9 100644 --- a/source/blender/blenkernel/BKE_tracking.h +++ b/source/blender/blenkernel/BKE_tracking.h @@ -289,6 +289,46 @@ void BKE_tracking_stabilization_data_to_mat4(int width, int height, float aspect void BKE_tracking_dopesheet_tag_update(struct MovieTracking *tracking); void BKE_tracking_dopesheet_update(struct MovieTracking *tracking); +/* **** Query/search **** */ + +struct MovieTrackingObject *BKE_tracking_find_object_for_track( + const struct MovieTracking *tracking, + const struct MovieTrackingTrack *track); +struct ListBase *BKE_tracking_find_tracks_list_for_track( + struct MovieTracking *tracking, + const struct MovieTrackingTrack *track); + +struct MovieTrackingObject *BKE_tracking_find_object_for_plane_track( + const struct MovieTracking *tracking, + const struct MovieTrackingPlaneTrack *plane_track); +struct ListBase *BKE_tracking_find_tracks_list_for_plane_track( + struct MovieTracking *tracking, + const struct MovieTrackingPlaneTrack *plane_track); + + +void BKE_tracking_get_rna_path_for_track( + const struct MovieTracking *tracking, + const struct MovieTrackingTrack *track, + char *rna_path, + size_t rna_path_len); +void BKE_tracking_get_rna_path_prefix_for_track( + const struct MovieTracking *tracking, + const struct MovieTrackingTrack *track, + char *rna_path, + size_t rna_path_len); +void BKE_tracking_get_rna_path_for_plane_track( + const struct MovieTracking *tracking, + const struct MovieTrackingPlaneTrack *plane_track, + char *rna_path, + size_t rna_path_len); +void BKE_tracking_get_rna_path_prefix_for_plane_track( + const struct MovieTracking *tracking, + const struct MovieTrackingPlaneTrack *plane_track, + char *rna_path, + size_t rna_path_len); + +/* **** Utility macros **** */ + #define TRACK_SELECTED(track) ((track)->flag & SELECT || (track)->pat_flag & SELECT || (track)->search_flag & SELECT) #define TRACK_AREA_SELECTED(track, area) ((area) == TRACK_AREA_POINT ? (track)->flag & SELECT : \ diff --git a/source/blender/blenkernel/intern/tracking.c b/source/blender/blenkernel/intern/tracking.c index 07e071df04a..ebd4c04e8ce 100644 --- a/source/blender/blenkernel/intern/tracking.c +++ b/source/blender/blenkernel/intern/tracking.c @@ -2905,3 +2905,155 @@ void BKE_tracking_dopesheet_update(MovieTracking *tracking) dopesheet->ok = true; } + +/* NOTE: Returns NULL if the track comes from camera object, */ +MovieTrackingObject *BKE_tracking_find_object_for_track( + const MovieTracking *tracking, + const MovieTrackingTrack *track) +{ + const ListBase *tracksbase = &tracking->tracks; + if (BLI_findindex(tracksbase, track) != -1) { + return NULL; + } + MovieTrackingObject *object = tracking->objects.first; + while (object != NULL) { + if (BLI_findindex(&object->tracks, track) != -1) { + return object; + } + object = object->next; + } + return NULL; +} + +ListBase *BKE_tracking_find_tracks_list_for_track( + MovieTracking *tracking, + const MovieTrackingTrack *track) +{ + MovieTrackingObject *object = BKE_tracking_find_object_for_track(tracking, + track); + if (object != NULL) { + return &object->tracks; + } + return &tracking->tracks; +} + +/* NOTE: Returns NULL if the track comes from camera object, */ +MovieTrackingObject *BKE_tracking_find_object_for_plane_track( + const MovieTracking *tracking, + const MovieTrackingPlaneTrack *plane_track) +{ + const ListBase *plane_tracks_base = &tracking->plane_tracks; + if (BLI_findindex(plane_tracks_base, plane_track) != -1) { + return NULL; + } + MovieTrackingObject *object = tracking->objects.first; + while (object != NULL) { + if (BLI_findindex(&object->plane_tracks, plane_track) != -1) { + return object; + } + object = object->next; + } + return NULL; +} + +ListBase *BKE_tracking_find_tracks_list_for_plane_track( + MovieTracking *tracking, + const MovieTrackingPlaneTrack *plane_track) +{ + MovieTrackingObject *object = + BKE_tracking_find_object_for_plane_track(tracking, plane_track); + if (object != NULL) { + return &object->plane_tracks; + } + return &tracking->plane_tracks; +} + +void BKE_tracking_get_rna_path_for_track( + const struct MovieTracking *tracking, + const struct MovieTrackingTrack *track, + char *rna_path, + size_t rna_path_len) +{ + MovieTrackingObject *object = + BKE_tracking_find_object_for_track(tracking, track); + char track_name_esc[MAX_NAME * 2]; + BLI_strescape(track_name_esc, track->name, sizeof(track_name_esc)); + if (object == NULL) { + BLI_snprintf(rna_path, rna_path_len, + "tracking.tracks[\"%s\"]", + track_name_esc); + } + else { + char object_name_esc[MAX_NAME * 2]; + BLI_strescape(object_name_esc, object->name, sizeof(object_name_esc)); + BLI_snprintf(rna_path, rna_path_len, + "tracking.objects[\"%s\"].tracks[\"%s\"]", + object_name_esc, + track_name_esc); + } +} + +void BKE_tracking_get_rna_path_prefix_for_track( + const struct MovieTracking *tracking, + const struct MovieTrackingTrack *track, + char *rna_path, + size_t rna_path_len) +{ + MovieTrackingObject *object = + BKE_tracking_find_object_for_track(tracking, track); + if (object == NULL) { + BLI_snprintf(rna_path, rna_path_len, "tracking.tracks"); + } + else { + char object_name_esc[MAX_NAME * 2]; + BLI_strescape(object_name_esc, object->name, sizeof(object_name_esc)); + BLI_snprintf(rna_path, rna_path_len, + "tracking.objects[\"%s\"]", + object_name_esc); + } +} + +void BKE_tracking_get_rna_path_for_plane_track( + const struct MovieTracking *tracking, + const struct MovieTrackingPlaneTrack *plane_track, + char *rna_path, + size_t rna_path_len) +{ + MovieTrackingObject *object = + BKE_tracking_find_object_for_plane_track(tracking, plane_track); + char track_name_esc[MAX_NAME * 2]; + BLI_strescape(track_name_esc, plane_track->name, sizeof(track_name_esc)); + if (object == NULL) { + BLI_snprintf(rna_path, rna_path_len, + "tracking.plane_tracks[\"%s\"]", + track_name_esc); + } + else { + char object_name_esc[MAX_NAME * 2]; + BLI_strescape(object_name_esc, object->name, sizeof(object_name_esc)); + BLI_snprintf(rna_path, rna_path_len, + "tracking.objects[\"%s\"].plane_tracks[\"%s\"]", + object_name_esc, + track_name_esc); + } +} + +void BKE_tracking_get_rna_path_prefix_for_plane_track( + const struct MovieTracking *tracking, + const struct MovieTrackingPlaneTrack *plane_track, + char *rna_path, + size_t rna_path_len) +{ + MovieTrackingObject *object = + BKE_tracking_find_object_for_plane_track(tracking, plane_track); + if (object == NULL) { + BLI_snprintf(rna_path, rna_path_len, "tracking.plane_tracks"); + } + else { + char object_name_esc[MAX_NAME * 2]; + BLI_strescape(object_name_esc, object->name, sizeof(object_name_esc)); + BLI_snprintf(rna_path, rna_path_len, + "tracking.objects[\"%s\"].plane_tracks", + object_name_esc); + } +} diff --git a/source/blender/editors/space_clip/clip_intern.h b/source/blender/editors/space_clip/clip_intern.h index ffc7a41f0aa..b0d00744558 100644 --- a/source/blender/editors/space_clip/clip_intern.h +++ b/source/blender/editors/space_clip/clip_intern.h @@ -139,6 +139,8 @@ void clip_graph_tracking_iterate(struct SpaceClip *sc, bool selected_only, bool void clip_delete_track(struct bContext *C, struct MovieClip *clip, struct MovieTrackingTrack *track); void clip_delete_marker(struct bContext *C, struct MovieClip *clip, struct MovieTrackingTrack *track, struct MovieTrackingMarker *marker); +void clip_delete_plane_track(struct bContext *C, struct MovieClip *clip, struct MovieTrackingPlaneTrack *plane_track); + void clip_view_center_to_point(SpaceClip *sc, float x, float y); void clip_draw_cfra(struct SpaceClip *sc, struct ARegion *ar, struct Scene *scene); diff --git a/source/blender/editors/space_clip/clip_utils.c b/source/blender/editors/space_clip/clip_utils.c index 40661937bae..7f9d9bf577c 100644 --- a/source/blender/editors/space_clip/clip_utils.c +++ b/source/blender/editors/space_clip/clip_utils.c @@ -184,37 +184,37 @@ void clip_delete_track(bContext *C, MovieClip *clip, MovieTrackingTrack *track) MovieTrackingTrack *act_track = BKE_tracking_track_get_active(tracking); ListBase *tracksbase = BKE_tracking_get_active_tracks(tracking); bool has_bundle = false; - char track_name_escaped[MAX_NAME], prefix[MAX_NAME * 2]; - const bool used_for_stabilization = (track->flag & (TRACK_USE_2D_STAB | TRACK_USE_2D_STAB_ROT)); - - if (track == act_track) + const bool used_for_stabilization = + (track->flag & (TRACK_USE_2D_STAB | TRACK_USE_2D_STAB_ROT)) != 0; + if (track == act_track) { tracking->act_track = NULL; - - /* handle reconstruction display in 3d viewport */ - if (track->flag & TRACK_HAS_BUNDLE) + } + /* Handle reconstruction display in 3d viewport. */ + if (track->flag & TRACK_HAS_BUNDLE) { has_bundle = true; - + } /* Make sure no plane will use freed track */ BKE_tracking_plane_tracks_remove_point_track(tracking, track); - /* Delete f-curves associated with the track (such as weight, i.e.) */ - BLI_strescape(track_name_escaped, track->name, sizeof(track_name_escaped)); - BLI_snprintf(prefix, sizeof(prefix), "tracks[\"%s\"]", track_name_escaped); - BKE_animdata_fix_paths_remove(&clip->id, prefix); - + /* Escaped object name, escaped track name, rest of the path. */ + char rna_path[MAX_NAME * 4 + 64]; + BKE_tracking_get_rna_path_for_track(tracking, + track, + rna_path, sizeof(rna_path)); + BKE_animdata_fix_paths_remove(&clip->id, rna_path); + /* Delete track itself. */ BKE_tracking_track_free(track); BLI_freelinkN(tracksbase, track); - + /* Send notifiers. */ WM_event_add_notifier(C, NC_MOVIECLIP | NA_EDITED, clip); - if (used_for_stabilization) { WM_event_add_notifier(C, NC_MOVIECLIP | ND_DISPLAY, clip); } - + /* Inform dependency graph. */ DEG_id_tag_update(&clip->id, 0); - - if (has_bundle) + if (has_bundle) { WM_event_add_notifier(C, NC_SPACE | ND_SPACE_VIEW3D, NULL); + } } void clip_delete_marker(bContext *C, MovieClip *clip, MovieTrackingTrack *track, @@ -230,6 +230,28 @@ void clip_delete_marker(bContext *C, MovieClip *clip, MovieTrackingTrack *track, } } +void clip_delete_plane_track(bContext *C, + MovieClip *clip, + MovieTrackingPlaneTrack *plane_track) +{ + MovieTracking *tracking = &clip->tracking; + ListBase *plane_tracks_base = BKE_tracking_get_active_plane_tracks(tracking); + /* Delete f-curves associated with the track (such as weight, i.e.) */ + /* Escaped object name, escaped track name, rest of the path. */ + char rna_path[MAX_NAME * 4 + 64]; + BKE_tracking_get_rna_path_for_plane_track(tracking, + plane_track, + rna_path, sizeof(rna_path)); + BKE_animdata_fix_paths_remove(&clip->id, rna_path); + /* Delete the plane track itself. */ + BKE_tracking_plane_track_free(plane_track); + BLI_freelinkN(plane_tracks_base, plane_track); + /* TODO(sergey): Any notifiers to be sent here? */ + (void) C; + /* Inform dependency graph. */ + DEG_id_tag_update(&clip->id, 0); +} + void clip_view_center_to_point(SpaceClip *sc, float x, float y) { int width, height; diff --git a/source/blender/editors/space_clip/tracking_ops.c b/source/blender/editors/space_clip/tracking_ops.c index 2439ac06d9c..4dd96a838e0 100644 --- a/source/blender/editors/space_clip/tracking_ops.c +++ b/source/blender/editors/space_clip/tracking_ops.c @@ -227,7 +227,6 @@ static int delete_track_exec(bContext *C, wmOperator *UNUSED(op)) MovieClip *clip = ED_space_clip_get_clip(sc); MovieTracking *tracking = &clip->tracking; bool changed = false; - /* Delete selected plane tracks. */ ListBase *plane_tracks_base = BKE_tracking_get_active_plane_tracks(tracking); for (MovieTrackingPlaneTrack *plane_track = plane_tracks_base->first, @@ -236,14 +235,11 @@ static int delete_track_exec(bContext *C, wmOperator *UNUSED(op)) plane_track = next_plane_track) { next_plane_track = plane_track->next; - if (PLANE_TRACK_VIEW_SELECTED(plane_track)) { - BKE_tracking_plane_track_free(plane_track); - BLI_freelinkN(plane_tracks_base, plane_track); + clip_delete_plane_track(C, clip, plane_track); changed = true; } } - /* Remove selected point tracks (they'll also be removed from planes which * uses them). */ @@ -258,14 +254,11 @@ static int delete_track_exec(bContext *C, wmOperator *UNUSED(op)) changed = true; } } - /* Nothing selected now, unlock view so it can be scrolled nice again. */ sc->flag &= ~SC_LOCK_SELECTION; - if (changed) { WM_event_add_notifier(C, NC_MOVIECLIP | NA_EDITED, clip); } - return OPERATOR_FINISHED; } diff --git a/source/blender/editors/space_sequencer/sequencer_edit.c b/source/blender/editors/space_sequencer/sequencer_edit.c index 8f6eb064b0d..cb0c5bd3717 100644 --- a/source/blender/editors/space_sequencer/sequencer_edit.c +++ b/source/blender/editors/space_sequencer/sequencer_edit.c @@ -2190,23 +2190,24 @@ static int sequencer_delete_exec(bContext *C, wmOperator *UNUSED(op)) Editing *ed = BKE_sequencer_editing_get(scene, false); Sequence *seq; MetaStack *ms; - bool nothingSelected = true; + bool nothing_selected = true; seq = BKE_sequencer_active_get(scene); if (seq && seq->flag & SELECT) { /* avoid a loop since this is likely to be selected */ - nothingSelected = false; + nothing_selected = false; } else { for (seq = ed->seqbasep->first; seq; seq = seq->next) { if (seq->flag & SELECT) { - nothingSelected = false; + nothing_selected = false; break; } } } - if (nothingSelected) + if (nothing_selected) { return OPERATOR_FINISHED; + } /* for effects and modifiers, try to find a replacement input */ for (seq = ed->seqbasep->first; seq; seq = seq->next) { diff --git a/source/blender/makesrna/intern/rna_tracking.c b/source/blender/makesrna/intern/rna_tracking.c index d23017429c1..ccc118edfb6 100644 --- a/source/blender/makesrna/intern/rna_tracking.c +++ b/source/blender/makesrna/intern/rna_tracking.c @@ -48,6 +48,9 @@ #ifdef RNA_RUNTIME +#include "DNA_anim_types.h" + +#include "BKE_animsys.h" #include "BKE_node.h" #include "DEG_depsgraph.h" @@ -56,71 +59,6 @@ #include "WM_api.h" -static MovieTrackingObject *tracking_object_from_track(MovieClip *clip, - MovieTrackingTrack *track) -{ - MovieTracking *tracking = &clip->tracking; - ListBase *tracksbase = &tracking->tracks; - /* TODO: it's a bit difficult to find list track came from knowing just - * movie clip ID and MovieTracking structure, so keep this naive - * search for a while */ - if (BLI_findindex(tracksbase, track) == -1) { - MovieTrackingObject *object = tracking->objects.first; - while (object) { - if (BLI_findindex(&object->tracks, track) != -1) { - return object; - } - object = object->next; - } - } - return NULL; -} - -static ListBase *tracking_tracksbase_from_track(MovieClip *clip, - MovieTrackingTrack *track) -{ - MovieTracking *tracking = &clip->tracking; - MovieTrackingObject *object = tracking_object_from_track(clip, track); - if (object != NULL) { - return &object->tracks; - } - return &tracking->tracks; -} - -static MovieTrackingObject *tracking_object_from_plane_track( - MovieClip *clip, - MovieTrackingPlaneTrack *plane_track) -{ - MovieTracking *tracking = &clip->tracking; - ListBase *plane_tracks_base = &tracking->plane_tracks; - /* TODO: it's a bit difficult to find list track came from knowing just - * movie clip ID and MovieTracking structure, so keep this naive - * search for a while */ - if (BLI_findindex(plane_tracks_base, plane_track) == -1) { - MovieTrackingObject *object = tracking->objects.first; - while (object) { - if (BLI_findindex(&object->plane_tracks, plane_track) != -1) { - return object; - } - object = object->next; - } - } - return NULL; -} - -static ListBase *tracking_tracksbase_from_plane_track( - MovieClip *clip, - MovieTrackingPlaneTrack *plane_track) -{ - MovieTracking *tracking = &clip->tracking; - MovieTrackingObject *object = tracking_object_from_plane_track(clip, - plane_track); - if (object != NULL) { - return &object->plane_tracks; - } - return &tracking->plane_tracks; -} - static char *rna_tracking_path(PointerRNA *UNUSED(ptr)) { return BLI_sprintfN("tracking"); @@ -150,19 +88,12 @@ static char *rna_trackingTrack_path(PointerRNA *ptr) { MovieClip *clip = (MovieClip *)ptr->id.data; MovieTrackingTrack *track = (MovieTrackingTrack *)ptr->data; - MovieTrackingObject *object = tracking_object_from_track(clip, track); - char track_name_esc[sizeof(track->name) * 2]; - BLI_strescape(track_name_esc, track->name, sizeof(track_name_esc)); - if (object == NULL) { - return BLI_sprintfN("tracking.tracks[\"%s\"]", track_name_esc); - } - else { - char object_name_esc[sizeof(object->name) * 2]; - BLI_strescape(object_name_esc, object->name, sizeof(object_name_esc)); - return BLI_sprintfN("tracking.objects[\"%s\"].tracks[\"%s\"]", - object_name_esc, - track_name_esc); - } + /* Escaped object name, escaped track name, rest of the path. */ + char rna_path[MAX_NAME * 4 + 64]; + BKE_tracking_get_rna_path_for_track(&clip->tracking, + track, + rna_path, sizeof(rna_path)); + return BLI_strdup(rna_path); } static void rna_trackingTracks_begin(CollectionPropertyIterator *iter, PointerRNA *ptr) @@ -256,9 +187,26 @@ static void rna_trackingTrack_name_set(PointerRNA *ptr, const char *value) { MovieClip *clip = (MovieClip *)ptr->id.data; MovieTrackingTrack *track = (MovieTrackingTrack *)ptr->data; - ListBase *tracksbase = tracking_tracksbase_from_track(clip, track); + ListBase *tracksbase = + BKE_tracking_find_tracks_list_for_track(&clip->tracking, track); + /* Store old name, for the animation fix later. */ + char old_name[sizeof(track->name)]; + BLI_strncpy(old_name, track->name, sizeof(track->name)); + /* Update the name, */ BLI_strncpy(track->name, value, sizeof(track->name)); BKE_tracking_track_unique_name(tracksbase, track); + /* Fix animation paths. */ + AnimData *adt = BKE_animdata_from_id(&clip->id); + if (adt != NULL) { + char rna_path[MAX_NAME * 2 + 64]; + BKE_tracking_get_rna_path_prefix_for_track(&clip->tracking, + track, + rna_path, sizeof(rna_path)); + BKE_animdata_fix_paths_rename(&clip->id, adt, NULL, + rna_path, + old_name, track->name, + 0, 0, 1); + } } static int rna_trackingTrack_select_get(PointerRNA *ptr) @@ -327,28 +275,40 @@ static char *rna_trackingPlaneTrack_path(PointerRNA *ptr) { MovieClip *clip = (MovieClip *)ptr->id.data; MovieTrackingPlaneTrack *plane_track = (MovieTrackingPlaneTrack *)ptr->data; - char track_name_esc[sizeof(plane_track->name) * 2]; - MovieTrackingObject *object = tracking_object_from_plane_track(clip, plane_track); - BLI_strescape(track_name_esc, plane_track->name, sizeof(track_name_esc)); - if (object == NULL) { - return BLI_sprintfN("tracking.plane_tracks[\"%s\"]", track_name_esc); - } - else { - char object_name_esc[sizeof(object->name) * 2]; - BLI_strescape(object_name_esc, object->name, sizeof(object_name_esc)); - return BLI_sprintfN("tracking.objects[\"%s\"].plane_tracks[\"%s\"]", - object_name_esc, - track_name_esc); - } + /* Escaped object name, escaped track name, rest of the path. */ + char rna_path[MAX_NAME * 4 + 64]; + BKE_tracking_get_rna_path_for_plane_track(&clip->tracking, + plane_track, + rna_path, sizeof(rna_path)); + return BLI_strdup(rna_path); } static void rna_trackingPlaneTrack_name_set(PointerRNA *ptr, const char *value) { MovieClip *clip = (MovieClip *)ptr->id.data; MovieTrackingPlaneTrack *plane_track = (MovieTrackingPlaneTrack *)ptr->data; - ListBase *plane_tracks_base = tracking_tracksbase_from_plane_track(clip, plane_track); + ListBase *plane_tracks_base = + BKE_tracking_find_tracks_list_for_plane_track(&clip->tracking, + plane_track); + /* Store old name, for the animation fix later. */ + char old_name[sizeof(plane_track->name)]; + BLI_strncpy(old_name, plane_track->name, sizeof(plane_track->name)); + /* Update the name, */ BLI_strncpy(plane_track->name, value, sizeof(plane_track->name)); BKE_tracking_plane_track_unique_name(plane_tracks_base, plane_track); + /* Fix animation paths. */ + AnimData *adt = BKE_animdata_from_id(&clip->id); + if (adt != NULL) { + char rna_path[MAX_NAME * 2 + 64]; + BKE_tracking_get_rna_path_prefix_for_plane_track(&clip->tracking, + plane_track, + rna_path, + sizeof(rna_path)); + BKE_animdata_fix_paths_rename(&clip->id, adt, NULL, + rna_path, + old_name, plane_track->name, + 0, 0, 1); + } } static char *rna_trackingCamera_path(PointerRNA *UNUSED(ptr)) @@ -1651,6 +1611,7 @@ static void rna_def_trackingPlaneTrack(BlenderRNA *brna) /* auto keyframing */ prop = RNA_def_property(srna, "use_auto_keying", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "flag", PLANE_TRACK_AUTOKEY); + RNA_def_property_clear_flag(prop, PROP_ANIMATABLE); RNA_def_property_ui_text(prop, "Auto Keyframe", "Automatic keyframe insertion when moving plane corners"); RNA_def_property_ui_icon(prop, ICON_REC, 0); |