[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [59405] trunk/blender/source/blender/ makesrna/intern/rna_tracking.c: Tracking Python API improvements

Sergey Sharybin sergey.vfx at gmail.com
Fri Aug 23 11:10:23 CEST 2013


Revision: 59405
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=59405
Author:   nazgul
Date:     2013-08-23 09:10:23 +0000 (Fri, 23 Aug 2013)
Log Message:
-----------
Tracking Python API improvements

- Solved issue with changing marker's frame number
  for tracks which doesn't belong to camera object.

- Support find_frame, insert_frame and delete_frame
  functions for plane markers.

Modified Paths:
--------------
    trunk/blender/source/blender/makesrna/intern/rna_tracking.c

Modified: trunk/blender/source/blender/makesrna/intern/rna_tracking.c
===================================================================
--- trunk/blender/source/blender/makesrna/intern/rna_tracking.c	2013-08-23 08:39:25 UTC (rev 59404)
+++ trunk/blender/source/blender/makesrna/intern/rna_tracking.c	2013-08-23 09:10:23 UTC (rev 59405)
@@ -229,23 +229,33 @@
 {
 	MovieClip *clip = (MovieClip *) ptr->id.data;
 	MovieTracking *tracking = &clip->tracking;
-	MovieTrackingPlaneTrack *plane_track;
 	MovieTrackingPlaneMarker *plane_marker = (MovieTrackingPlaneMarker *) ptr->data;
+	MovieTrackingObject *tracking_object;
+	bool found = false;
+	MovieTrackingPlaneTrack *plane_track = NULL;
 
-	/* TODO(sergey): Need to support editing markers from object's tracks */
+	for (tracking_object = tracking->objects.first;
+	     tracking_object;
+	     tracking_object = tracking_object->next)
+	{
+		ListBase *tracksbase = BKE_tracking_object_get_plane_tracks(tracking, tracking_object);
 
-	plane_track = tracking->plane_tracks.first;
-	while (plane_track) {
-		if (plane_marker >= plane_track->markers &&
-		    plane_marker < plane_track->markers + plane_track->markersnr)
+		for (plane_track = tracksbase->first;
+			 plane_track;
+			 plane_track = plane_track->next)
 		{
+			if (plane_marker >= plane_track->markers && plane_marker < plane_track->markers + plane_track->markersnr) {
+				found = true;
+				break;
+			}
+		}
+
+		if (found) {
 			break;
 		}
-
-		plane_track = plane_track->next;
 	}
 
-	if (plane_track) {
+	if (found) {
 		MovieTrackingPlaneMarker new_plane_marker = *plane_marker;
 		new_plane_marker.framenr = value;
 
@@ -455,19 +465,33 @@
 {
 	MovieClip *clip = (MovieClip *) ptr->id.data;
 	MovieTracking *tracking = &clip->tracking;
-	MovieTrackingTrack *track;
 	MovieTrackingMarker *marker = (MovieTrackingMarker *) ptr->data;
+	MovieTrackingObject *tracking_object;
+	bool found = false;
+	MovieTrackingTrack *track = NULL;
 
-	track = tracking->tracks.first;
-	while (track) {
-		if (marker >= track->markers && marker < track->markers + track->markersnr) {
+	for (tracking_object = tracking->objects.first;
+	     tracking_object;
+	     tracking_object = tracking_object->next)
+	{
+		ListBase *tracksbase = BKE_tracking_object_get_tracks(tracking, tracking_object);
+
+		for (track = tracksbase->first;
+			 track;
+			 track = track->next)
+		{
+			if (marker >= track->markers && marker < track->markers + track->markersnr) {
+				found = true;
+				break;
+			}
+		}
+
+		if (found) {
 			break;
 		}
-
-		track = track->next;
 	}
 
-	if (track) {
+	if (found) {
 		MovieTrackingMarker new_marker = *marker;
 		new_marker.framenr = value;
 
@@ -623,6 +647,44 @@
 	WM_main_add_notifier(NC_MOVIECLIP | NA_EDITED, NULL);
 }
 
+static MovieTrackingPlaneMarker *rna_trackingPlaneMarkers_find_frame(MovieTrackingPlaneTrack *plane_track, int framenr, int exact)
+{
+	if (exact)
+		return BKE_tracking_plane_marker_get_exact(plane_track, framenr);
+	else
+		return BKE_tracking_plane_marker_get(plane_track, framenr);
+}
+
+static MovieTrackingPlaneMarker *rna_trackingPlaneMarkers_insert_frame(MovieTrackingPlaneTrack *plane_track, int framenr)
+{
+	MovieTrackingPlaneMarker plane_marker, *new_plane_marker;
+
+	memset(&plane_marker, 0, sizeof(plane_marker));
+	plane_marker.framenr = framenr;
+
+	/* a bit arbitrary, but better than creating zero markers */
+	copy_v2_v2(plane_marker.corners[0], plane_track->markers[0].corners[0]);
+	copy_v2_v2(plane_marker.corners[1], plane_track->markers[0].corners[1]);
+	copy_v2_v2(plane_marker.corners[2], plane_track->markers[0].corners[2]);
+	copy_v2_v2(plane_marker.corners[3], plane_track->markers[0].corners[3]);
+
+	new_plane_marker = BKE_tracking_plane_marker_insert(plane_track, &plane_marker);
+
+	WM_main_add_notifier(NC_MOVIECLIP | NA_EDITED, NULL);
+
+	return new_plane_marker;
+}
+
+static void rna_trackingPlaneMarkers_delete_frame(MovieTrackingPlaneTrack *plane_track, int framenr)
+{
+	if (plane_track->markersnr == 1)
+		return;
+
+	BKE_tracking_plane_marker_delete(plane_track, framenr);
+
+	WM_main_add_notifier(NC_MOVIECLIP | NA_EDITED, NULL);
+}
+
 #else
 
 static EnumPropertyItem tracker_motion_model[] = {
@@ -1068,7 +1130,7 @@
 	RNA_def_function_return(func, parm);
 
 	func = RNA_def_function(srna, "insert_frame", "rna_trackingMarkers_insert_frame");
-	RNA_def_function_ui_description(func, "Add a number of tracks to this movie clip");
+	RNA_def_function_ui_description(func, "Insert a new marker at the specified frame");
 	parm = RNA_def_int(func, "frame", 1, MINFRAME, MAXFRAME, "Frame",
 	                   "Frame number to insert marker to", MINFRAME, MAXFRAME);
 	RNA_def_property_flag(parm, PROP_REQUIRED);
@@ -1332,12 +1394,38 @@
 static void rna_def_trackingPlaneMarkers(BlenderRNA *brna, PropertyRNA *cprop)
 {
 	StructRNA *srna;
+	FunctionRNA *func;
+	PropertyRNA *parm;
 
 	RNA_def_property_srna(cprop, "MovieTrackingPlaneMarkers");
 	srna = RNA_def_struct(brna, "MovieTrackingPlaneMarkers", NULL);
 	RNA_def_struct_sdna(srna, "MovieTrackingPlaneTrack");
 	RNA_def_struct_ui_text(srna, "Movie Tracking Plane Markers",
 	                       "Collection of markers for movie tracking plane track");
+
+	func = RNA_def_function(srna, "find_frame", "rna_trackingPlaneMarkers_find_frame");
+	RNA_def_function_ui_description(func, "Get plane marker for specified frame");
+	parm = RNA_def_int(func, "frame", 1, MINFRAME, MAXFRAME, "Frame",
+	                   "Frame number to find marker for", MINFRAME, MAXFRAME);
+	RNA_def_property_flag(parm, PROP_REQUIRED);
+	RNA_def_boolean(func, "exact", TRUE, "Exact",
+	                "Get plane marker at exact frame number rather than get estimated marker");
+	parm = RNA_def_pointer(func, "plane_marker", "MovieTrackingPlaneMarker", "", "Plane marker for specified frame");
+	RNA_def_function_return(func, parm);
+
+	func = RNA_def_function(srna, "insert_frame", "rna_trackingPlaneMarkers_insert_frame");
+	RNA_def_function_ui_description(func, "Insert a new plane marker at the specified frame");
+	parm = RNA_def_int(func, "frame", 1, MINFRAME, MAXFRAME, "Frame",
+	                   "Frame number to insert marker to", MINFRAME, MAXFRAME);
+	RNA_def_property_flag(parm, PROP_REQUIRED);
+	parm = RNA_def_pointer(func, "plane_marker", "MovieTrackingPlaneMarker", "", "Newly created plane marker");
+	RNA_def_function_return(func, parm);
+
+	func = RNA_def_function(srna, "delete_frame", "rna_trackingPlaneMarkers_delete_frame");
+	RNA_def_function_ui_description(func, "Delete plane marker at specified frame");
+	parm = RNA_def_int(func, "frame", 1, MINFRAME, MAXFRAME, "Frame",
+	                   "Frame number to delete plane marker from", MINFRAME, MAXFRAME);
+	RNA_def_property_flag(parm, PROP_REQUIRED);
 }
 
 static void rna_def_trackingPlaneTrack(BlenderRNA *brna)
@@ -1568,6 +1656,8 @@
 	RNA_def_struct_sdna(srna, "MovieTracking");
 	RNA_def_struct_ui_text(srna, "Movie Plane Tracks", "Collection of movie tracking plane tracks");
 
+	/* TODO(sergey): Add API to create new plane tracks */
+
 	/* active plane track */
 	prop = RNA_def_property(srna, "active", PROP_POINTER, PROP_NONE);
 	RNA_def_property_struct_type(prop, "MovieTrackingPlaneTrack");




More information about the Bf-blender-cvs mailing list