Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--release/scripts/startup/bl_ui/space_clip.py2
-rw-r--r--source/blender/blenkernel/BKE_tracking.h4
-rw-r--r--source/blender/blenkernel/intern/depsgraph.c5
-rw-r--r--source/blender/blenkernel/intern/tracking.c87
-rw-r--r--source/blender/blenloader/intern/readfile.c20
-rw-r--r--source/blender/blenloader/intern/writefile.c15
-rw-r--r--source/blender/editors/include/ED_clip.h2
-rw-r--r--source/blender/editors/space_clip/clip_editor.c8
-rw-r--r--source/blender/editors/space_clip/clip_utils.c4
-rw-r--r--source/blender/editors/space_clip/space_clip.c4
-rw-r--r--source/blender/editors/space_clip/tracking_ops.c33
-rw-r--r--source/blender/makesdna/DNA_tracking_types.h4
-rw-r--r--source/blender/makesrna/intern/rna_space.c4
13 files changed, 88 insertions, 104 deletions
diff --git a/release/scripts/startup/bl_ui/space_clip.py b/release/scripts/startup/bl_ui/space_clip.py
index f7ad69a046c..bd3f087e38a 100644
--- a/release/scripts/startup/bl_ui/space_clip.py
+++ b/release/scripts/startup/bl_ui/space_clip.py
@@ -86,7 +86,7 @@ class CLIP_HT_header(Header):
if sc.view == 'DOPESHEET':
layout.label(text="Sort by:")
- layout.prop(sc, "dopesheet_sort_order", text="")
+ layout.prop(sc, "dopesheet_sort_method", text="")
layout.prop(sc, "invert_dopesheet_sort", text="Invert")
layout.template_running_jobs()
diff --git a/source/blender/blenkernel/BKE_tracking.h b/source/blender/blenkernel/BKE_tracking.h
index 1432dc151d0..0782396dbae 100644
--- a/source/blender/blenkernel/BKE_tracking.h
+++ b/source/blender/blenkernel/BKE_tracking.h
@@ -165,8 +165,8 @@ void BKE_tracking_select_track(struct ListBase *tracksbase, struct MovieTracking
void BKE_tracking_deselect_track(struct MovieTrackingTrack *track, int area);
/* Dopesheet */
-void BKE_tracking_update_dopesheet(struct MovieTracking *tracking);
-void BKE_tracking_dopesheet_sort(struct MovieTracking *tracking, int sort_order, int inverse);
+void BKE_tracking_dopesheet_tag_update(struct MovieTracking *tracking);
+void BKE_tracking_dopesheet_update(struct MovieTracking *tracking, int sort_method, int inverse);
#define TRACK_SELECTED(track) ((track)->flag&SELECT || (track)->pat_flag&SELECT || (track)->search_flag&SELECT)
diff --git a/source/blender/blenkernel/intern/depsgraph.c b/source/blender/blenkernel/intern/depsgraph.c
index d8cdd728c16..75e22195c6a 100644
--- a/source/blender/blenkernel/intern/depsgraph.c
+++ b/source/blender/blenkernel/intern/depsgraph.c
@@ -72,6 +72,7 @@
#include "BKE_pointcache.h"
#include "BKE_scene.h"
#include "BKE_screen.h"
+#include "BKE_tracking.h"
#include "BKE_utildefines.h"
#include "depsgraph_private.h"
@@ -2580,6 +2581,10 @@ static void dag_id_flush_update(Scene *sce, ID *id)
}
if (idtype == ID_MC) {
+ MovieClip *clip = (MovieClip *) id;
+
+ BKE_tracking_dopesheet_tag_update(&clip->tracking);
+
for (obt=bmain->object.first; obt; obt= obt->id.next) {
bConstraint *con;
for (con = obt->constraints.first; con; con=con->next) {
diff --git a/source/blender/blenkernel/intern/tracking.c b/source/blender/blenkernel/intern/tracking.c
index bb4a7783c82..be3bda4b625 100644
--- a/source/blender/blenkernel/intern/tracking.c
+++ b/source/blender/blenkernel/intern/tracking.c
@@ -1376,7 +1376,7 @@ void BKE_tracking_sync(MovieTrackingContext *context)
context->sync_frame = newframe;
- BKE_tracking_update_dopesheet(tracking);
+ tracking->dopesheet.ok = FALSE;
}
void BKE_tracking_sync_user(MovieClipUser *user, MovieTrackingContext *context)
@@ -3196,13 +3196,59 @@ static void channels_segments_calc(MovieTrackingDopesheetChannel *channel)
}
}
-void BKE_tracking_update_dopesheet(MovieTracking *tracking)
+static void tracking_dopesheet_sort(MovieTracking *tracking, int sort_method, int inverse)
+{
+ MovieTrackingDopesheet *dopesheet = &tracking->dopesheet;
+
+ if (dopesheet->sort_method == sort_method && dopesheet->sort_inverse == inverse)
+ return;
+
+ if (inverse) {
+ if (sort_method == TRACK_SORT_NAME) {
+ BLI_sortlist(&dopesheet->channels, channels_alpha_inverse_sort);
+ }
+ else if (sort_method == TRACK_SORT_LONGEST) {
+ BLI_sortlist(&dopesheet->channels, channels_longest_segment_inverse_sort);
+ }
+ else if (sort_method == TRACK_SORT_TOTAL) {
+ BLI_sortlist(&dopesheet->channels, channels_total_track_inverse_sort);
+ }
+ }
+ else {
+ if (sort_method == TRACK_SORT_NAME) {
+ BLI_sortlist(&dopesheet->channels, channels_alpha_sort);
+ }
+ else if (sort_method == TRACK_SORT_LONGEST) {
+ BLI_sortlist(&dopesheet->channels, channels_longest_segment_sort);
+ }
+ else if (sort_method == TRACK_SORT_TOTAL) {
+ BLI_sortlist(&dopesheet->channels, channels_total_track_sort);
+ }
+ }
+
+ dopesheet->sort_method = sort_method;
+ dopesheet->sort_inverse = inverse;
+}
+
+void BKE_tracking_dopesheet_tag_update(MovieTracking *tracking)
+{
+ MovieTrackingDopesheet *dopesheet = &tracking->dopesheet;
+
+ dopesheet->ok = FALSE;
+}
+
+void BKE_tracking_dopesheet_update(MovieTracking *tracking, int sort_method, int inverse)
{
MovieTrackingObject *object = BKE_tracking_active_object(tracking);
MovieTrackingDopesheet *dopesheet = &tracking->dopesheet;
MovieTrackingTrack *track;
ListBase *tracksbase = BKE_tracking_object_tracks(tracking, object);
+ if (dopesheet->ok) {
+ tracking_dopesheet_sort(tracking, sort_method, inverse);
+ return;
+ }
+
tracking_dopesheet_free(dopesheet);
for (track = tracksbase->first; track; track = track->next) {
@@ -3219,40 +3265,9 @@ void BKE_tracking_update_dopesheet(MovieTracking *tracking)
}
}
- dopesheet->sort_order = TRACK_SORT_NONE;
- dopesheet->sort_inverse = -1;
-}
-
-void BKE_tracking_dopesheet_sort(MovieTracking *tracking, int sort_order, int inverse)
-{
- MovieTrackingDopesheet *dopesheet = &tracking->dopesheet;
-
- if (dopesheet->sort_order == sort_order && dopesheet->sort_inverse == inverse)
- return;
+ dopesheet->sort_method = TRACK_SORT_NONE;
- if (inverse) {
- if (sort_order == TRACK_SORT_NAME) {
- BLI_sortlist(&dopesheet->channels, channels_alpha_inverse_sort);
- }
- else if (sort_order == TRACK_SORT_LONGEST) {
- BLI_sortlist(&dopesheet->channels, channels_longest_segment_inverse_sort);
- }
- else if (sort_order == TRACK_SORT_TOTAL) {
- BLI_sortlist(&dopesheet->channels, channels_total_track_inverse_sort);
- }
- }
- else {
- if (sort_order == TRACK_SORT_NAME) {
- BLI_sortlist(&dopesheet->channels, channels_alpha_sort);
- }
- else if (sort_order == TRACK_SORT_LONGEST) {
- BLI_sortlist(&dopesheet->channels, channels_longest_segment_sort);
- }
- else if (sort_order == TRACK_SORT_TOTAL) {
- BLI_sortlist(&dopesheet->channels, channels_total_track_sort);
- }
- }
+ tracking_dopesheet_sort(tracking, sort_method, inverse);
- dopesheet->sort_order = sort_order;
- dopesheet->sort_inverse = inverse;
+ dopesheet->ok = TRUE;
}
diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c
index afc4989f620..df71a9f6494 100644
--- a/source/blender/blenloader/intern/readfile.c
+++ b/source/blender/blenloader/intern/readfile.c
@@ -6170,21 +6170,6 @@ static void direct_link_movieTracks(FileData *fd, ListBase *tracksbase)
}
}
-static void direct_link_movieDopesheet(FileData *fd, MovieTrackingDopesheet *dopesheet)
-{
- MovieTrackingDopesheetChannel *channel;
-
- link_list(fd, &dopesheet->channels);
-
- channel = dopesheet->channels.first;
- while (channel) {
- channel->track = newdataadr(fd, channel->track);
- channel->segments = newdataadr(fd, channel->segments);
-
- channel = channel->next;
- }
-}
-
static void direct_link_movieclip(FileData *fd, MovieClip *clip)
{
MovieTracking *tracking= &clip->tracking;
@@ -6211,6 +6196,9 @@ static void direct_link_movieclip(FileData *fd, MovieClip *clip)
clip->tracking.stabilization.scaleibuf= NULL;
clip->tracking.stabilization.rot_track= newdataadr(fd, clip->tracking.stabilization.rot_track);
+ clip->tracking.dopesheet.ok = 0;
+ clip->tracking.dopesheet.channels.first = clip->tracking.dopesheet.channels.last = NULL;
+
link_list(fd, &tracking->objects);
object= tracking->objects.first;
@@ -6220,8 +6208,6 @@ static void direct_link_movieclip(FileData *fd, MovieClip *clip)
object= object->next;
}
-
- direct_link_movieDopesheet(fd, &clip->tracking.dopesheet);
}
static void lib_link_movieclip(FileData *fd, Main *main)
diff --git a/source/blender/blenloader/intern/writefile.c b/source/blender/blenloader/intern/writefile.c
index 2199259a322..14c8d42654c 100644
--- a/source/blender/blenloader/intern/writefile.c
+++ b/source/blender/blenloader/intern/writefile.c
@@ -2679,19 +2679,6 @@ static void write_movieTracks(WriteData *wd, ListBase *tracks)
}
}
-static void write_movieDopesheet(WriteData *wd, MovieTrackingDopesheet *dopesheet)
-{
- MovieTrackingDopesheetChannel *channel;
-
- channel = dopesheet->channels.first;
- while (channel) {
- writestruct(wd, DATA, "MovieTrackingDopesheetChannel", 1, channel);
- writedata(wd, DATA, 2 * channel->tot_segment * sizeof(int), channel->segments);
-
- channel = channel->next;
- }
-}
-
static void write_movieReconstruction(WriteData *wd, MovieTrackingReconstruction *reconstruction)
{
if (reconstruction->camnr)
@@ -2724,8 +2711,6 @@ static void write_movieclips(WriteData *wd, ListBase *idbase)
object= object->next;
}
-
- write_movieDopesheet(wd, &tracking->dopesheet);
}
clip= clip->id.next;
diff --git a/source/blender/editors/include/ED_clip.h b/source/blender/editors/include/ED_clip.h
index 03e7bd62a2c..302c2940fef 100644
--- a/source/blender/editors/include/ED_clip.h
+++ b/source/blender/editors/include/ED_clip.h
@@ -72,8 +72,6 @@ void ED_space_clip_free_texture_buffer(struct SpaceClip *sc);
int ED_space_clip_show_trackedit(struct SpaceClip *sc);
-void ED_space_clip_update_dopesheet(struct SpaceClip *sc);
-
/* clip_ops.c */
void ED_operatormacros_clip(void);
diff --git a/source/blender/editors/space_clip/clip_editor.c b/source/blender/editors/space_clip/clip_editor.c
index c5c5628abb9..a5575cd125e 100644
--- a/source/blender/editors/space_clip/clip_editor.c
+++ b/source/blender/editors/space_clip/clip_editor.c
@@ -552,11 +552,3 @@ int ED_space_clip_show_trackedit(SpaceClip *sc)
return FALSE;
}
-
-void ED_space_clip_update_dopesheet(SpaceClip *sc)
-{
- MovieClip *clip = sc->clip;
- MovieTracking *tracking = &clip->tracking;
-
- BKE_tracking_update_dopesheet(tracking);
-}
diff --git a/source/blender/editors/space_clip/clip_utils.c b/source/blender/editors/space_clip/clip_utils.c
index c8ba8be7eae..d45fe834fac 100644
--- a/source/blender/editors/space_clip/clip_utils.c
+++ b/source/blender/editors/space_clip/clip_utils.c
@@ -194,11 +194,11 @@ void clip_delete_track(bContext *C, MovieClip *clip, ListBase *tracksbase, Movie
if (update_stab) {
tracking->stabilization.ok = FALSE;
-
- DAG_id_tag_update(&clip->id, 0);
WM_event_add_notifier(C, NC_MOVIECLIP|ND_DISPLAY, clip);
}
+ DAG_id_tag_update(&clip->id, 0);
+
if (has_bundle)
WM_event_add_notifier(C, NC_SPACE|ND_SPACE_VIEW3D, NULL);
}
diff --git a/source/blender/editors/space_clip/space_clip.c b/source/blender/editors/space_clip/space_clip.c
index 82f76efacaa..b92b45752ef 100644
--- a/source/blender/editors/space_clip/space_clip.c
+++ b/source/blender/editors/space_clip/space_clip.c
@@ -1135,7 +1135,7 @@ static void dopesheet_area_draw(const bContext *C, ARegion *ar)
View2DScrollers *scrollers;
short unit = 0;
- BKE_tracking_dopesheet_sort(&clip->tracking, sc->dope_sort, sc->dope_flag & SC_DOPE_SORT_INVERSE);
+ BKE_tracking_dopesheet_update(&clip->tracking, sc->dope_sort, sc->dope_flag & SC_DOPE_SORT_INVERSE);
/* clear and setup matrix */
UI_ThemeClearColor(TH_BACK);
@@ -1194,7 +1194,7 @@ static void clip_channels_area_draw(const bContext *C, ARegion *ar)
View2D *v2d = &ar->v2d;
View2DScrollers *scrollers;
- BKE_tracking_dopesheet_sort(&clip->tracking, sc->dope_sort, sc->dope_flag & SC_DOPE_SORT_INVERSE);
+ BKE_tracking_dopesheet_update(&clip->tracking, sc->dope_sort, sc->dope_flag & SC_DOPE_SORT_INVERSE);
/* clear and setup matrix */
UI_ThemeClearColor(TH_BACK);
diff --git a/source/blender/editors/space_clip/tracking_ops.c b/source/blender/editors/space_clip/tracking_ops.c
index 2c9b61ed1ef..2c1a6ade70a 100644
--- a/source/blender/editors/space_clip/tracking_ops.c
+++ b/source/blender/editors/space_clip/tracking_ops.c
@@ -95,8 +95,6 @@ static void add_marker(SpaceClip *sc, float x, float y)
BKE_tracking_select_track(tracksbase, track, TRACK_AREA_ALL, 0);
clip->tracking.act_track = track;
-
- ED_space_clip_update_dopesheet(sc);
}
static int add_marker_exec(bContext *C, wmOperator *op)
@@ -176,8 +174,6 @@ static int delete_track_exec(bContext *C, wmOperator *UNUSED(op))
/* nothing selected now, unlock view so it can be scrolled nice again */
sc->flag &= ~SC_LOCK_SELECTION;
- ED_space_clip_update_dopesheet(sc);
-
return OPERATOR_FINISHED;
}
@@ -229,8 +225,6 @@ static int delete_marker_exec(bContext *C, wmOperator *UNUSED(op))
sc->flag &= ~SC_LOCK_SELECTION;
}
- ED_space_clip_update_dopesheet(sc);
-
return OPERATOR_FINISHED;
}
@@ -795,8 +789,9 @@ static int mouse_select(bContext *C, float co[2], int extend)
sc->ylockof = 0.0f;
}
+ BKE_tracking_dopesheet_tag_update(tracking);
+
WM_event_add_notifier(C, NC_GEOM|ND_SELECT, NULL);
- ED_space_clip_update_dopesheet(sc);
return OPERATOR_FINISHED;
}
@@ -868,8 +863,9 @@ static int border_select_exec(bContext *C, wmOperator *op)
{
SpaceClip *sc = CTX_wm_space_clip(C);
MovieClip *clip = ED_space_clip(sc);
+ MovieTracking *tracking = &clip->tracking;
MovieTrackingTrack *track;
- ListBase *tracksbase = BKE_tracking_get_tracks(&clip->tracking);
+ ListBase *tracksbase = BKE_tracking_get_tracks(tracking);
rcti rect;
rctf rectf;
int change = FALSE, mode, extend;
@@ -908,7 +904,7 @@ static int border_select_exec(bContext *C, wmOperator *op)
}
if (change) {
- ED_space_clip_update_dopesheet(sc);
+ BKE_tracking_dopesheet_tag_update(tracking);
WM_event_add_notifier(C, NC_GEOM|ND_SELECT, NULL);
@@ -956,8 +952,9 @@ static int circle_select_exec(bContext *C, wmOperator *op)
SpaceClip *sc = CTX_wm_space_clip(C);
MovieClip *clip = ED_space_clip(sc);
ARegion *ar = CTX_wm_region(C);
+ MovieTracking *tracking = &clip->tracking;
MovieTrackingTrack *track;
- ListBase *tracksbase = BKE_tracking_get_tracks(&clip->tracking);
+ ListBase *tracksbase = BKE_tracking_get_tracks(tracking);
int x, y, radius, width, height, mode, change = FALSE;
float zoomx, zoomy, offset[2], ellipse[2];
@@ -994,7 +991,7 @@ static int circle_select_exec(bContext *C, wmOperator *op)
}
if (change) {
- ED_space_clip_update_dopesheet(sc);
+ BKE_tracking_dopesheet_tag_update(tracking);
WM_event_add_notifier(C, NC_GEOM|ND_SELECT, NULL);
@@ -1033,9 +1030,10 @@ static int select_all_exec(bContext *C, wmOperator *op)
{
SpaceClip *sc = CTX_wm_space_clip(C);
MovieClip *clip = ED_space_clip(sc);
+ MovieTracking *tracking = &clip->tracking;
MovieTrackingTrack *track = NULL; /* selected track */
MovieTrackingMarker *marker;
- ListBase *tracksbase = BKE_tracking_get_tracks(&clip->tracking);
+ ListBase *tracksbase = BKE_tracking_get_tracks(tracking);
int action = RNA_enum_get(op->ptr, "action");
int framenr = sc->user.framenr;
int has_selection = FALSE;
@@ -1092,7 +1090,7 @@ static int select_all_exec(bContext *C, wmOperator *op)
if (!has_selection)
sc->flag &= ~SC_LOCK_SELECTION;
- ED_space_clip_update_dopesheet(sc);
+ BKE_tracking_dopesheet_tag_update(tracking);
WM_event_add_notifier(C, NC_GEOM|ND_SELECT, NULL);
@@ -1174,7 +1172,7 @@ static int select_groped_exec(bContext *C, wmOperator *op)
track = track->next;
}
- ED_space_clip_update_dopesheet(sc);
+ BKE_tracking_dopesheet_tag_update(tracking);
WM_event_add_notifier(C, NC_MOVIECLIP|ND_DISPLAY, clip);
@@ -2745,7 +2743,7 @@ static int hide_tracks_exec(bContext *C, wmOperator *op)
sc->flag &= ~SC_LOCK_SELECTION;
}
- BKE_tracking_update_dopesheet(tracking);
+ BKE_tracking_dopesheet_tag_update(tracking);
WM_event_add_notifier(C, NC_MOVIECLIP|ND_DISPLAY, NULL);
@@ -2776,7 +2774,8 @@ static int hide_tracks_clear_exec(bContext *C, wmOperator *UNUSED(op))
{
SpaceClip *sc = CTX_wm_space_clip(C);
MovieClip *clip = ED_space_clip(sc);
- ListBase *tracksbase = BKE_tracking_get_tracks(&clip->tracking);
+ MovieTracking *tracking = &clip->tracking;
+ ListBase *tracksbase = BKE_tracking_get_tracks(tracking);
MovieTrackingTrack *track;
track = tracksbase->first;
@@ -2786,6 +2785,8 @@ static int hide_tracks_clear_exec(bContext *C, wmOperator *UNUSED(op))
track = track->next;
}
+ BKE_tracking_dopesheet_tag_update(tracking);
+
WM_event_add_notifier(C, NC_MOVIECLIP|ND_DISPLAY, NULL);
return OPERATOR_FINISHED;
diff --git a/source/blender/makesdna/DNA_tracking_types.h b/source/blender/makesdna/DNA_tracking_types.h
index 4e2b3c46aa4..6bf059c7ecb 100644
--- a/source/blender/makesdna/DNA_tracking_types.h
+++ b/source/blender/makesdna/DNA_tracking_types.h
@@ -205,10 +205,12 @@ typedef struct MovieTrackingDopesheetChannel {
} MovieTrackingDopesheetChannel;
typedef struct MovieTrackingDopesheet {
+ int ok, pad; /* flag if dopesheet information is still relevant */
+
ListBase channels;
int tot_channel;
- short sort_order; /* order in which tracks are stored */
+ short sort_method; /* method to be used to sort tracks */
short sort_inverse; /* order of tracks is inverted */
} MovieTrackingDopesheet;
diff --git a/source/blender/makesrna/intern/rna_space.c b/source/blender/makesrna/intern/rna_space.c
index bc2e1b7e1f3..51f5cdcda85 100644
--- a/source/blender/makesrna/intern/rna_space.c
+++ b/source/blender/makesrna/intern/rna_space.c
@@ -3122,10 +3122,10 @@ static void rna_def_space_clip(BlenderRNA *brna)
/* ** dopesheet ** */
/* dopesheet sort */
- prop = RNA_def_property(srna, "dopesheet_sort_order", PROP_ENUM, PROP_NONE);
+ prop = RNA_def_property(srna, "dopesheet_sort_method", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "dope_sort");
RNA_def_property_enum_items(prop, dope_sort_items);
- RNA_def_property_ui_text(prop, "Dopesheet Sort Field", "Field used to sort channels in dopesheet view");
+ RNA_def_property_ui_text(prop, "Dopesheet Sort Field", "Method to be used to sort channels in dopesheet view");
RNA_def_property_update(prop, NC_SPACE|ND_SPACE_CLIP, NULL);
/* invert_dopesheet_sort */