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:
authorSergey Sharybin <sergey.vfx@gmail.com>2012-05-04 03:15:01 +0400
committerSergey Sharybin <sergey.vfx@gmail.com>2012-05-04 03:15:01 +0400
commit48ead2736643cf0327b9472cfd05042a58f9d9b0 (patch)
treed966adce993fd14472a4ff2a79372da305273fc7 /source/blender/blenkernel
parent5da2135eef39ac042a8c4babcac7be375e6903d2 (diff)
Camera tracking: switch dopesheet information to lazy calculation
All operators which changes tracking data now just tags dopsheet as outdated, actual re-calculaiton of happens only when this information is actually needed (like on dopesheet draw). This makes things a bit faster when there's no dopesheet visible in current screen and also makes it much easier to update dopesheet using dependency graph. Also renamed dopesheet_sort_order to dopesheet_sort_method in rna and internal stuff which makes much more sense and also correlated with naming in file browser.
Diffstat (limited to 'source/blender/blenkernel')
-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
3 files changed, 58 insertions, 38 deletions
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;
}