[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