[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [46237] trunk/blender/source/blender: Camera tracking: pre-calculate tracked segments for dopesheet channels
Sergey Sharybin
sergey.vfx at gmail.com
Thu May 3 19:52:34 CEST 2012
Revision: 46237
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=46237
Author: nazgul
Date: 2012-05-03 17:52:34 +0000 (Thu, 03 May 2012)
Log Message:
-----------
Camera tracking: pre-calculate tracked segments for dopesheet channels
Modified Paths:
--------------
trunk/blender/source/blender/blenkernel/intern/tracking.c
trunk/blender/source/blender/blenloader/intern/readfile.c
trunk/blender/source/blender/blenloader/intern/writefile.c
trunk/blender/source/blender/editors/space_clip/clip_dopesheet_draw.c
trunk/blender/source/blender/makesdna/DNA_tracking_types.h
Modified: trunk/blender/source/blender/blenkernel/intern/tracking.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/tracking.c 2012-05-03 17:02:33 UTC (rev 46236)
+++ trunk/blender/source/blender/blenkernel/intern/tracking.c 2012-05-03 17:52:34 UTC (rev 46237)
@@ -634,7 +634,20 @@
static void tracking_dopesheet_free(MovieTrackingDopesheet *dopesheet)
{
+ MovieTrackingDopesheetChannel *channel;
+
+ channel = dopesheet->channels.first;
+ while (channel) {
+ if (channel->segments) {
+ MEM_freeN(channel->segments);
+ }
+
+ channel = channel->next;
+ }
+
BLI_freelistN(&dopesheet->channels);
+
+ dopesheet->channels.first = dopesheet->channels.last = NULL;
dopesheet->tot_channel = 0;
}
@@ -3059,32 +3072,101 @@
return 0;
}
+static void channels_segments_calc(MovieTrackingDopesheetChannel *channel)
+{
+ MovieTrackingTrack *track = channel->track;
+ int i, segment;
+
+ channel->tot_segment = 0;
+ channel->max_segment = 0;
+ channel->total_frames = 0;
+
+ /* count */
+ i = 0;
+ while (i < track->markersnr) {
+ MovieTrackingMarker *marker = &track->markers[i];
+
+ if ((marker->flag & MARKER_DISABLED) == 0) {
+ int prev_fra = marker->framenr, len = 0;
+
+ i++;
+ while (i < track->markersnr) {
+ marker = &track->markers[i];
+
+ if (marker->framenr != prev_fra + 1)
+ break;
+ if (marker->flag & MARKER_DISABLED)
+ break;
+
+ prev_fra = marker->framenr;
+ len++;
+ i++;
+ }
+
+ channel->tot_segment++;
+ }
+
+ i++;
+ }
+
+ if (!channel->tot_segment)
+ return;
+
+ channel->segments = MEM_callocN(2 * sizeof(int) * channel->tot_segment, "tracking channel segments");
+
+ /* create segments */
+ i = 0;
+ segment = 0;
+ while (i < track->markersnr) {
+ MovieTrackingMarker *marker = &track->markers[i];
+
+ if ((marker->flag & MARKER_DISABLED) == 0) {
+ MovieTrackingMarker *start_marker = marker;
+ int prev_fra = marker->framenr, len = 0;
+
+ i++;
+ while (i < track->markersnr) {
+ marker = &track->markers[i];
+
+ if (marker->framenr != prev_fra + 1)
+ break;
+ if (marker->flag & MARKER_DISABLED)
+ break;
+
+ prev_fra = marker->framenr;
+ channel->total_frames++;
+ len++;
+ i++;
+ }
+
+ channel->segments[2 * segment] = start_marker->framenr;
+ channel->segments[2 * segment + 1] = start_marker->framenr + len;
+
+ channel->max_segment = MAX2(channel->max_segment, len);
+ segment++;
+ }
+
+ i++;
+ }
+}
+
void BKE_tracking_update_dopesheet(MovieTracking *tracking)
{
MovieTrackingObject *object = BKE_tracking_active_object(tracking);
MovieTrackingDopesheet *dopesheet = &tracking->dopesheet;
MovieTrackingTrack *track;
ListBase *tracksbase = BKE_tracking_object_tracks(tracking, object);
- ListBase old_channels;
- old_channels = dopesheet->channels;
- dopesheet->channels.first = dopesheet->channels.last = NULL;
- dopesheet->tot_channel = 0;
+ tracking_dopesheet_free(dopesheet);
for (track = tracksbase->first; track; track = track->next) {
if (TRACK_SELECTED(track) && (track->flag & TRACK_HIDDEN) == 0) {
- MovieTrackingDopesheetChannel *channel, *old_channel;
+ MovieTrackingDopesheetChannel *channel;
channel = MEM_callocN(sizeof(MovieTrackingDopesheetChannel), "tracking dopesheet channel");
channel->track = track;
- /* copy flags from current dopsheet information to new one */
- for (old_channel = old_channels.first; old_channel; old_channel = old_channel->next) {
- if (old_channel->track == track) {
- channel->flag = old_channel->flag;
- break;
- }
- }
+ channels_segments_calc(channel);
BLI_addtail(&dopesheet->channels, channel);
dopesheet->tot_channel++;
@@ -3092,6 +3174,4 @@
}
BLI_sortlist(&dopesheet->channels, channels_alpha_sort);
-
- BLI_freelistN(&old_channels);
}
Modified: trunk/blender/source/blender/blenloader/intern/readfile.c
===================================================================
--- trunk/blender/source/blender/blenloader/intern/readfile.c 2012-05-03 17:02:33 UTC (rev 46236)
+++ trunk/blender/source/blender/blenloader/intern/readfile.c 2012-05-03 17:52:34 UTC (rev 46237)
@@ -6179,6 +6179,7 @@
channel = dopesheet->channels.first;
while (channel) {
channel->track = newdataadr(fd, channel->track);
+ channel->segments = newdataadr(fd, channel->segments);
channel = channel->next;
}
Modified: trunk/blender/source/blender/blenloader/intern/writefile.c
===================================================================
--- trunk/blender/source/blender/blenloader/intern/writefile.c 2012-05-03 17:02:33 UTC (rev 46236)
+++ trunk/blender/source/blender/blenloader/intern/writefile.c 2012-05-03 17:52:34 UTC (rev 46237)
@@ -2686,6 +2686,7 @@
channel = dopesheet->channels.first;
while (channel) {
writestruct(wd, DATA, "MovieTrackingDopesheetChannel", 1, channel);
+ writedata(wd, DATA, 2 * channel->tot_segment, channel->segments);
channel = channel->next;
}
Modified: trunk/blender/source/blender/editors/space_clip/clip_dopesheet_draw.c
===================================================================
--- trunk/blender/source/blender/editors/space_clip/clip_dopesheet_draw.c 2012-05-03 17:02:33 UTC (rev 46236)
+++ trunk/blender/source/blender/editors/space_clip/clip_dopesheet_draw.c 2012-05-03 17:52:34 UTC (rev 46237)
@@ -87,7 +87,7 @@
{1.0f, 0.0f}, /* mid-right */
{0.0f, -1.0f}, /* bottom vert */
{-1.0f, 0.0f} /* mid-left */
- };
+ };
static GLuint displist1 = 0;
static GLuint displist2 = 0;
int hsize = STRIP_HEIGHT_HALF;
@@ -199,45 +199,19 @@
alpha = (track->flag & TRACK_LOCKED) ? 0.5f : 1.0f;
/* tracked segments */
- i = 0;
- while (i < track->markersnr) {
- MovieTrackingMarker *marker = &track->markers[i];
+ for (i = 0; i < channel->tot_segment; i++) {
+ int start_frame = channel->segments[2 * i];
+ int end_frame = channel->segments[2 * i + 1];
- if ((marker->flag & MARKER_DISABLED) == 0) {
- MovieTrackingMarker *start_marker = marker;
- int prev_fra = marker->framenr, len = 0;
-
- i++;
- while (i < track->markersnr) {
- marker = &track->markers[i];
-
- if (marker->framenr != prev_fra + 1)
- break;
- if (marker->flag & MARKER_DISABLED)
- break;
-
- prev_fra = marker->framenr;
- len++;
- i++;
- }
-
- if (sel)
- glColor4fv(selected_strip);
- else
- glColor4fv(strip);
-
- if (len) {
- glRectf(start_marker->framenr, (float) y - STRIP_HEIGHT_HALF,
- start_marker->framenr + len, (float) y + STRIP_HEIGHT_HALF);
- draw_keyframe_shape(start_marker->framenr, y, xscale, yscale, sel, alpha);
- draw_keyframe_shape(start_marker->framenr + len, y, xscale, yscale, sel, alpha);
- }
- else {
- draw_keyframe_shape(start_marker->framenr, y, xscale, yscale, sel, alpha);
- }
+ if (start_frame != end_frame) {
+ glRectf(start_frame, (float) y - STRIP_HEIGHT_HALF,
+ end_frame, (float) y + STRIP_HEIGHT_HALF);
+ draw_keyframe_shape(start_frame, y, xscale, yscale, sel, alpha);
+ draw_keyframe_shape(end_frame, y, xscale, yscale, sel, alpha);
}
-
- i++;
+ else {
+ draw_keyframe_shape(start_frame, y, xscale, yscale, sel, alpha);
+ }
}
/* keyframes */
@@ -286,8 +260,8 @@
height = (dopesheet->tot_channel * CHANNEL_STEP) + (CHANNEL_HEIGHT * 2);
if (height > (v2d->mask.ymax - v2d->mask.ymin)) {
- /* don't use totrect set, as the width stays the same
- * (NOTE: this is ok here, the configuration is pretty straightforward)
+ /* don't use totrect set, as the width stays the same
+ * (NOTE: this is ok here, the configuration is pretty straightforward)
*/
v2d->tot.ymin = (float)(-height);
}
Modified: trunk/blender/source/blender/makesdna/DNA_tracking_types.h
===================================================================
--- trunk/blender/source/blender/makesdna/DNA_tracking_types.h 2012-05-03 17:02:33 UTC (rev 46236)
+++ trunk/blender/source/blender/makesdna/DNA_tracking_types.h 2012-05-03 17:52:34 UTC (rev 46237)
@@ -195,8 +195,13 @@
typedef struct MovieTrackingDopesheetChannel {
struct MovieTrackingDopesheetChannel *next, *prev;
- MovieTrackingTrack *track;
- int flag, pad;
+
+ MovieTrackingTrack *track; /* motion track for which channel is created */
+ int pad;
+
+ int tot_segment; /* total number of segments */
+ int *segments; /* tracked segments */
+ int max_segment, total_frames; /* longest segment length and total number of tracked frames */
} MovieTrackingDopesheetChannel;
typedef struct MovieTrackingDopesheet {
More information about the Bf-blender-cvs
mailing list