Merge branch 'master' into blender2.8

This commit is contained in:
2017-12-19 13:42:01 +01:00
7 changed files with 294 additions and 123 deletions

View File

@@ -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 : \

View File

@@ -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);
}
}

View File

@@ -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);

View File

@@ -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;

View File

@@ -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;
}

View File

@@ -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) {

View File

@@ -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);