diff options
Diffstat (limited to 'source/blender/makesrna/intern/rna_tracking.c')
-rw-r--r-- | source/blender/makesrna/intern/rna_tracking.c | 297 |
1 files changed, 297 insertions, 0 deletions
diff --git a/source/blender/makesrna/intern/rna_tracking.c b/source/blender/makesrna/intern/rna_tracking.c index 4c47bbf93a6..c92af884b1b 100644 --- a/source/blender/makesrna/intern/rna_tracking.c +++ b/source/blender/makesrna/intern/rna_tracking.c @@ -95,6 +95,13 @@ static void rna_trackingTracks_begin(CollectionPropertyIterator *iter, PointerRN rna_iterator_listbase_begin(iter, &clip->tracking.tracks, NULL); } +static void rna_trackingPlaneTracks_begin(CollectionPropertyIterator *iter, PointerRNA *ptr) +{ + MovieClip *clip = (MovieClip *)ptr->id.data; + + rna_iterator_listbase_begin(iter, &clip->tracking.plane_tracks, NULL); +} + static void rna_trackingObjects_begin(CollectionPropertyIterator *iter, PointerRNA *ptr) { MovieClip *clip = (MovieClip *)ptr->id.data; @@ -146,6 +153,27 @@ static void rna_tracking_active_track_set(PointerRNA *ptr, PointerRNA value) clip->tracking.act_track = NULL; } +static PointerRNA rna_tracking_active_plane_track_get(PointerRNA *ptr) +{ + MovieClip *clip = (MovieClip *)ptr->id.data; + MovieTrackingPlaneTrack *act_plane_track = BKE_tracking_plane_track_get_active(&clip->tracking); + + return rna_pointer_inherit_refine(ptr, &RNA_MovieTrackingPlaneTrack, act_plane_track); +} + +static void rna_tracking_active_plane_track_set(PointerRNA *ptr, PointerRNA value) +{ + MovieClip *clip = (MovieClip *)ptr->id.data; + MovieTrackingPlaneTrack *plane_track = (MovieTrackingPlaneTrack *) value.data; + ListBase *plane_tracks_base = BKE_tracking_get_active_plane_tracks(&clip->tracking); + int index = BLI_findindex(plane_tracks_base, plane_track); + + if (index >= 0) + clip->tracking.act_plane_track = plane_track; + else + clip->tracking.act_plane_track = NULL; +} + static void rna_trackingTrack_name_set(PointerRNA *ptr, const char *value) { MovieClip *clip = (MovieClip *)ptr->id.data; @@ -197,6 +225,71 @@ static void rna_trackingTrack_select_set(PointerRNA *ptr, int value) } } +static void rna_trackingPlaneMarker_frame_set(PointerRNA *ptr, int value) +{ + MovieClip *clip = (MovieClip *) ptr->id.data; + MovieTracking *tracking = &clip->tracking; + MovieTrackingPlaneTrack *plane_track; + MovieTrackingPlaneMarker *plane_marker = (MovieTrackingPlaneMarker *) ptr->data; + + /* TODO(sergey): Need to support editing markers from object's tracks */ + + plane_track = tracking->plane_tracks.first; + while (plane_track) { + if (plane_marker >= plane_track->markers && + plane_marker < plane_track->markers + plane_track->markersnr) + { + break; + } + + plane_track = plane_track->next; + } + + if (plane_track) { + MovieTrackingPlaneMarker new_plane_marker = *plane_marker; + new_plane_marker.framenr = value; + + BKE_tracking_plane_marker_delete(plane_track, plane_marker->framenr); + BKE_tracking_plane_marker_insert(plane_track, &new_plane_marker); + } +} + +static char *rna_trackingPlaneTrack_path(PointerRNA *ptr) +{ + MovieTrackingPlaneTrack *plane_track = (MovieTrackingPlaneTrack *)ptr->data; + char name_esc[sizeof(plane_track->name) * 2]; + BLI_strescape(name_esc, plane_track->name, sizeof(name_esc)); + return BLI_sprintfN("tracking.plane_tracks[\"%s\"]", name_esc); +} + +static void rna_trackingPlaneTrack_name_set(PointerRNA *ptr, const char *value) +{ + MovieClip *clip = (MovieClip *)ptr->id.data; + MovieTracking *tracking = &clip->tracking; + MovieTrackingPlaneTrack *plane_track = (MovieTrackingPlaneTrack *)ptr->data; + ListBase *plane_tracks_base = &tracking->plane_tracks; + + BLI_strncpy(plane_track->name, value, sizeof(plane_track->name)); + + /* TODO: it's a bit difficult to find list track came from knowing just + * movie clip ID and MovieTracking structure, so keep this naive + * search for a while */ + if (BLI_findindex(plane_tracks_base, plane_track) < 0) { + MovieTrackingObject *object = tracking->objects.first; + + while (object) { + if (BLI_findindex(&object->plane_tracks, plane_track)) { + plane_tracks_base = &object->plane_tracks; + break; + } + + object = object->next; + } + } + + BKE_tracking_plane_track_unique_name(plane_tracks_base, plane_track); +} + static char *rna_trackingCamera_path(PointerRNA *UNUSED(ptr)) { return BLI_sprintfN("tracking.camera"); @@ -294,6 +387,20 @@ static void rna_trackingObject_tracks_begin(CollectionPropertyIterator *iter, Po } } +static void rna_trackingObject_plane_tracks_begin(CollectionPropertyIterator *iter, PointerRNA *ptr) +{ + MovieTrackingObject *object = (MovieTrackingObject *)ptr->data; + + if (object->flag & TRACKING_OBJECT_CAMERA) { + MovieClip *clip = (MovieClip *)ptr->id.data; + + rna_iterator_listbase_begin(iter, &clip->tracking.plane_tracks, NULL); + } + else { + rna_iterator_listbase_begin(iter, &object->plane_tracks, NULL); + } +} + static PointerRNA rna_trackingObject_reconstruction_get(PointerRNA *ptr) { MovieTrackingObject *object = (MovieTrackingObject *)ptr->data; @@ -1188,6 +1295,115 @@ static void rna_def_trackingTrack(BlenderRNA *brna) RNA_def_property_update(prop, NC_MOVIECLIP | ND_DISPLAY, NULL); } +static void rna_def_trackingPlaneMarker(BlenderRNA *brna) +{ + StructRNA *srna; + PropertyRNA *prop; + + srna = RNA_def_struct(brna, "MovieTrackingPlaneMarker", NULL); + RNA_def_struct_ui_text(srna, "Movie Tracking Plane Marker Data", "Match-moving plane marker data for tracking"); + + /* frame */ + prop = RNA_def_property(srna, "frame", PROP_INT, PROP_NONE); + RNA_def_property_int_sdna(prop, NULL, "framenr"); + RNA_def_property_ui_text(prop, "Frame", "Frame number marker is keyframed on"); + RNA_def_property_int_funcs(prop, NULL, "rna_trackingPlaneMarker_frame_set", NULL); + RNA_def_property_update(prop, NC_MOVIECLIP | NA_EDITED, 0); + + /* Corners */ + prop = RNA_def_property(srna, "corners", PROP_FLOAT, PROP_MATRIX); + RNA_def_property_float_sdna(prop, NULL, "corners"); + RNA_def_property_clear_flag(prop, PROP_ANIMATABLE); + RNA_def_property_multi_array(prop, 2, rna_matrix_dimsize_4x2); + RNA_def_property_ui_range(prop, -FLT_MAX, FLT_MAX, 1, RNA_TRANSLATION_PREC_DEFAULT); + RNA_def_property_ui_text(prop, "Corners", + "Array of coordinates which represents UI rectange corners in " + "frame normalized coordinates"); + RNA_def_property_update(prop, NC_MOVIECLIP | NA_EDITED, NULL); + + /* enable */ + prop = RNA_def_property(srna, "mute", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "flag", PLANE_MARKER_DISABLED); + RNA_def_property_ui_text(prop, "Mode", "Is marker muted for current frame"); + RNA_def_property_update(prop, NC_MOVIECLIP | NA_EDITED, NULL); +} + +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_trackingMarkers_find_frame"); + RNA_def_function_ui_description(func, "Get 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 marker at exact frame number rather than get estimated marker"); + parm = RNA_def_pointer(func, "marker", "MovieTrackingMarker", "", "Marker for specified frame"); + 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"); + 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); + RNA_def_float_vector(func, "co", 2, 0, -1.0, 1.0, "Coordinate", + "Place new marker at the given frame using specified in normalized space coordinates", + -1.0, 1.0); + RNA_def_property_flag(parm, PROP_REQUIRED); + parm = RNA_def_pointer(func, "marker", "MovieTrackingMarker", "", "Newly created marker"); + RNA_def_function_return(func, parm); + + func = RNA_def_function(srna, "delete_frame", "rna_trackingMarkers_delete_frame"); + RNA_def_function_ui_description(func, "Delete marker at specified frame"); + parm = RNA_def_int(func, "frame", 1, MINFRAME, MAXFRAME, "Frame", + "Frame number to delete marker from", MINFRAME, MAXFRAME); + RNA_def_property_flag(parm, PROP_REQUIRED); + */ +} + +static void rna_def_trackingPlaneTrack(BlenderRNA *brna) +{ + StructRNA *srna; + PropertyRNA *prop; + + rna_def_trackingPlaneMarker(brna); + + srna = RNA_def_struct(brna, "MovieTrackingPlaneTrack", NULL); + RNA_def_struct_path_func(srna, "rna_trackingPlaneTrack_path"); + RNA_def_struct_ui_text(srna, "Movie tracking plane track data", "Match-moving plane track data for tracking"); + RNA_def_struct_ui_icon(srna, ICON_ANIM_DATA); + + /* name */ + prop = RNA_def_property(srna, "name", PROP_STRING, PROP_NONE); + RNA_def_property_ui_text(prop, "Name", "Unique name of track"); + RNA_def_property_string_funcs(prop, NULL, NULL, "rna_trackingPlaneTrack_name_set"); + RNA_def_property_string_maxlength(prop, MAX_ID_NAME - 2); + RNA_def_property_update(prop, NC_MOVIECLIP | NA_EDITED, NULL); + RNA_def_struct_name_property(srna, prop); + + /* markers */ + prop = RNA_def_property(srna, "markers", PROP_COLLECTION, PROP_NONE); + RNA_def_property_struct_type(prop, "MovieTrackingPlaneMarker"); + RNA_def_property_collection_sdna(prop, NULL, "markers", "markersnr"); + RNA_def_property_ui_text(prop, "Markers", "Collection of markers in track"); + rna_def_trackingPlaneMarkers(brna, prop); + + /* select */ + prop = RNA_def_property(srna, "select", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "flag", SELECT); + RNA_def_property_ui_text(prop, "Select", "Plane track is selected"); + RNA_def_property_update(prop, NC_MOVIECLIP | ND_DISPLAY, NULL); +} + static void rna_def_trackingStabilization(BlenderRNA *brna) { StructRNA *srna; @@ -1373,6 +1589,37 @@ static void rna_def_trackingTracks(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Active Track", "Active track in this tracking data object"); } +static void rna_def_trackingPlaneTracks(BlenderRNA *brna) +{ + StructRNA *srna; + //FunctionRNA *func; + PropertyRNA *prop; + //PropertyRNA *parm; + + srna = RNA_def_struct(brna, "MovieTrackingPlaneTracks", NULL); + RNA_def_struct_sdna(srna, "MovieTracking"); + RNA_def_struct_ui_text(srna, "Movie Plane Tracks", "Collection of movie tracking plane tracks"); + + /* TODO(sergey): Need to support tracks API. */ + +#if 0 + func = RNA_def_function(srna, "new", "rna_trackingTracks_new"); + RNA_def_function_flag(func, FUNC_USE_SELF_ID); + RNA_def_function_ui_description(func, "Create new motion track in this movie clip"); + RNA_def_string(func, "name", "", 0, "", "Name of new track"); + RNA_def_int(func, "frame", 1, MINFRAME, MAXFRAME, "Frame", "Frame number to add track on", MINFRAME, MAXFRAME); + parm = RNA_def_pointer(func, "track", "MovieTrackingTrack", "", "Newly created track"); + RNA_def_function_return(func, parm); +#endif + + /* active plane track */ + prop = RNA_def_property(srna, "active", PROP_POINTER, PROP_NONE); + RNA_def_property_struct_type(prop, "MovieTrackingPlaneTrack"); + RNA_def_property_pointer_funcs(prop, "rna_tracking_active_plane_track_get", "rna_tracking_active_plane_track_set", NULL, NULL); + RNA_def_property_flag(prop, PROP_EDITABLE | PROP_NEVER_UNLINK); + RNA_def_property_ui_text(prop, "Active Plane Track", "Active plane track in this tracking data object"); +} + static void rna_def_trackingObjectTracks(BlenderRNA *brna) { StructRNA *srna; @@ -1400,6 +1647,35 @@ static void rna_def_trackingObjectTracks(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Active Track", "Active track in this tracking data object"); } +static void rna_def_trackingObjectPlaneTracks(BlenderRNA *brna) +{ + StructRNA *srna; + //FunctionRNA *func; + PropertyRNA *prop; + //PropertyRNA *parm; + + srna = RNA_def_struct(brna, "MovieTrackingObjectPlaneTracks", NULL); + RNA_def_struct_sdna(srna, "MovieTrackingObject"); + RNA_def_struct_ui_text(srna, "Plane Tracks", "Collection of tracking plane tracks"); + +#if 0 + func = RNA_def_function(srna, "new", "rna_trackingObject_tracks_new"); + RNA_def_function_flag(func, FUNC_USE_SELF_ID); + RNA_def_function_ui_description(func, "create new motion track in this movie clip"); + RNA_def_string(func, "name", "", 0, "", "Name of new track"); + RNA_def_int(func, "frame", 1, MINFRAME, MAXFRAME, "Frame", "Frame number to add tracks on", MINFRAME, MAXFRAME); + parm = RNA_def_pointer(func, "track", "MovieTrackingTrack", "", "Newly created track"); + RNA_def_function_return(func, parm); +#endif + + /* active track */ + prop = RNA_def_property(srna, "active", PROP_POINTER, PROP_NONE); + RNA_def_property_struct_type(prop, "MovieTrackingTrack"); + RNA_def_property_pointer_funcs(prop, "rna_tracking_active_plane_track_get", "rna_tracking_active_plane_track_set", NULL, NULL); + RNA_def_property_flag(prop, PROP_EDITABLE | PROP_NEVER_UNLINK); + RNA_def_property_ui_text(prop, "Active Track", "Active track in this tracking data object"); +} + static void rna_def_trackingObject(BlenderRNA *brna) { StructRNA *srna; @@ -1432,6 +1708,15 @@ static void rna_def_trackingObject(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Tracks", "Collection of tracks in this tracking data object"); RNA_def_property_srna(prop, "MovieTrackingObjectTracks"); + /* plane tracks */ + prop = RNA_def_property(srna, "plane_tracks", PROP_COLLECTION, PROP_NONE); + RNA_def_property_collection_funcs(prop, "rna_trackingObject_plane_tracks_begin", "rna_iterator_listbase_next", + "rna_iterator_listbase_end", "rna_iterator_listbase_get", + NULL, NULL, NULL, NULL); + RNA_def_property_struct_type(prop, "MovieTrackingPlaneTrack"); + RNA_def_property_ui_text(prop, "Plane Tracks", "Collection of plane tracks in this tracking data object"); + RNA_def_property_srna(prop, "MovieTrackingObjectPlaneTracks"); + /* reconstruction */ prop = RNA_def_property(srna, "reconstruction", PROP_POINTER, PROP_NONE); RNA_def_property_struct_type(prop, "MovieTrackingReconstruction"); @@ -1549,8 +1834,11 @@ static void rna_def_tracking(BlenderRNA *brna) rna_def_trackingSettings(brna); rna_def_trackingCamera(brna); rna_def_trackingTrack(brna); + rna_def_trackingPlaneTrack(brna); rna_def_trackingTracks(brna); + rna_def_trackingPlaneTracks(brna); rna_def_trackingObjectTracks(brna); + rna_def_trackingObjectPlaneTracks(brna); rna_def_trackingStabilization(brna); rna_def_trackingReconstruction(brna); rna_def_trackingObject(brna); @@ -1577,6 +1865,15 @@ static void rna_def_tracking(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Tracks", "Collection of tracks in this tracking data object"); RNA_def_property_srna(prop, "MovieTrackingTracks"); + /* tracks */ + prop = RNA_def_property(srna, "plane_tracks", PROP_COLLECTION, PROP_NONE); + RNA_def_property_collection_funcs(prop, "rna_trackingPlaneTracks_begin", "rna_iterator_listbase_next", + "rna_iterator_listbase_end", "rna_iterator_listbase_get", + NULL, NULL, NULL, NULL); + RNA_def_property_struct_type(prop, "MovieTrackingPlaneTrack"); + RNA_def_property_ui_text(prop, "Plane Tracks", "Collection of plane tracks in this tracking data object"); + RNA_def_property_srna(prop, "MovieTrackingPlaneTracks"); + /* stabilization */ prop = RNA_def_property(srna, "stabilization", PROP_POINTER, PROP_NONE); RNA_def_property_struct_type(prop, "MovieTrackingStabilization"); |