diff --git a/release/scripts/startup/bl_operators/clip.py b/release/scripts/startup/bl_operators/clip.py index cb21f17cff5..8ce8665200e 100644 --- a/release/scripts/startup/bl_operators/clip.py +++ b/release/scripts/startup/bl_operators/clip.py @@ -60,6 +60,22 @@ def CLIP_set_viewport_background(context, all_screens, clip, clip_user): set_background, clip, clip_user) +def CLIP_camera_for_clip(context, clip): + scene = context.scene + + camera = scene.camera + + for ob in scene.objects: + if ob.type == 'CAMERA': + for con in ob.constraints: + if con.type == 'CAMERA_SOLVER': + cur_clip = scene.clip if con.use_active_clip else con.clip + + if cur_clip == clip: + return ob + + return camera + def CLIP_track_view_selected(sc, track): if track.select_anchor: return True @@ -80,7 +96,7 @@ class CLIP_OT_track_to_empty(Operator): bl_label = "Link Empty to Track" bl_options = {'UNDO', 'REGISTER'} - def _link_track(self, context, track): + def _link_track(self, context, clip, tracking_object, track): sc = context.space_data constraint = None ob = None @@ -101,14 +117,17 @@ class CLIP_OT_track_to_empty(Operator): constraint.clip = sc.clip constraint.track = track.name constraint.use_3d_position = False + constraint.object = tracking_object.name + constraint.camera = CLIP_camera_for_clip(context, clip); def execute(self, context): sc = context.space_data clip = sc.clip + tracking_object = clip.tracking.objects.active - for track in clip.tracking.tracks: + for track in tracking_object.tracks: if CLIP_track_view_selected(sc, track): - self._link_track(context, track) + self._link_track(context, clip, tracking_object ,track) return {'FINISHED'} @@ -130,11 +149,12 @@ class CLIP_OT_bundles_to_mesh(Operator): sc = context.space_data clip = sc.clip + tracking_object = clip.tracking.objects.active new_verts = [] mesh = bpy.data.meshes.new(name="Tracks") - for track in clip.tracking.tracks: + for track in tracking_object.tracks: if track.has_bundle: new_verts.append(track.bundle) @@ -269,7 +289,7 @@ object's movement caused by this constraint""" # TODO: several camera solvers and track followers would fail, # but can't think about eal workflow where it'll be useful for x in ob.constraints: - if x.type in {'CAMERA_SOLVER', 'FOLLOW_TRACK'}: + if x.type in {'CAMERA_SOLVER', 'FOLLOW_TRACK', 'OBJECT_SOLVER'}: con = x if not con: diff --git a/source/blender/editors/space_view3d/view3d_snap.c b/source/blender/editors/space_view3d/view3d_snap.c index 85ddc41039c..1ee0c03d5e5 100644 --- a/source/blender/editors/space_view3d/view3d_snap.c +++ b/source/blender/editors/space_view3d/view3d_snap.c @@ -827,8 +827,7 @@ static void bundle_midpoint(Scene *scene, Object *ob, float vec[3]) tracking= &clip->tracking; - if(scene->camera) - copy_m4_m4(cammat, scene->camera->obmat); + copy_m4_m4(cammat, ob->obmat); BKE_get_tracking_mat(scene, ob, mat); diff --git a/source/blender/imbuf/intern/anim_movie.c b/source/blender/imbuf/intern/anim_movie.c index 45264fa862b..e6d09285685 100644 --- a/source/blender/imbuf/intern/anim_movie.c +++ b/source/blender/imbuf/intern/anim_movie.c @@ -768,8 +768,8 @@ static int ffmpeg_decode_video_frame(struct anim * anim) == AV_NOPTS_VALUE) ? -1 : (long long int)anim->pFrame->pkt_pts, (long long int)anim->next_pts); + break; } - break; } av_free_packet(&anim->next_packet); anim->next_packet.stream_index = -1; diff --git a/source/blender/makesrna/intern/rna_tracking.c b/source/blender/makesrna/intern/rna_tracking.c index bbec6484c5f..c29d655feb2 100644 --- a/source/blender/makesrna/intern/rna_tracking.c +++ b/source/blender/makesrna/intern/rna_tracking.c @@ -305,7 +305,14 @@ static void rna_trackingObject_tracks_begin(CollectionPropertyIterator *iter, Po { MovieTrackingObject *object= (MovieTrackingObject* )ptr->data; - rna_iterator_listbase_begin(iter, &object->tracks, NULL); + if(object->flag&TRACKING_OBJECT_CAMERA) { + MovieClip *clip= (MovieClip*)ptr->id.data; + + rna_iterator_listbase_begin(iter, &clip->tracking.tracks, NULL); + } + else { + rna_iterator_listbase_begin(iter, &object->tracks, NULL); + } } static PointerRNA rna_tracking_active_object_get(PointerRNA *ptr)