diff options
-rw-r--r-- | source/blender/blenkernel/BKE_tracking.h | 2 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/tracking.c | 43 | ||||
-rw-r--r-- | source/blender/editors/object/object_transform.c | 16 |
3 files changed, 60 insertions, 1 deletions
diff --git a/source/blender/blenkernel/BKE_tracking.h b/source/blender/blenkernel/BKE_tracking.h index 56b5240883c..d8c761cd1b4 100644 --- a/source/blender/blenkernel/BKE_tracking.h +++ b/source/blender/blenkernel/BKE_tracking.h @@ -195,6 +195,8 @@ void BKE_tracking_reconstruction_solve(struct MovieReconstructContext *context, float *progress, char *stats_message, int message_size); int BKE_tracking_reconstruction_finish(struct MovieReconstructContext *context, struct MovieTracking *tracking); +void BKE_tracking_reconstruction_scale(struct MovieTracking *tracking, float scale[3]); + /* **** Feature detection **** */ void BKE_tracking_detect_fast(struct MovieTracking *tracking, struct ListBase *tracksbase, struct ImBuf *imbuf, int framenr, int margin, int min_trackness, int min_distance, struct bGPDlayer *layer, diff --git a/source/blender/blenkernel/intern/tracking.c b/source/blender/blenkernel/intern/tracking.c index 7ad74085f85..74507b6d543 100644 --- a/source/blender/blenkernel/intern/tracking.c +++ b/source/blender/blenkernel/intern/tracking.c @@ -3353,6 +3353,49 @@ int BKE_tracking_reconstruction_finish(MovieReconstructContext *context, MovieTr return TRUE; } +static void tracking_scale_reconstruction(ListBase *tracksbase, MovieTrackingReconstruction *reconstruction, + float scale[3]) +{ + MovieTrackingTrack *track; + int i; + float first_camera_delta[3] = {0.0f, 0.0f, 0.0f}; + + if (reconstruction->camnr > 0) { + mul_v3_v3v3(first_camera_delta, reconstruction->cameras[0].mat[3], scale); + } + + for (i = 0; i < reconstruction->camnr; i++) { + MovieReconstructedCamera *camera = &reconstruction->cameras[i]; + mul_v3_v3(camera->mat[3], scale); + sub_v3_v3(camera->mat[3], first_camera_delta); + } + + for (track = tracksbase->first; track; track = track->next) { + if (track->flag & TRACK_HAS_BUNDLE) { + mul_v3_v3(track->bundle_pos, scale); + sub_v3_v3(track->bundle_pos, first_camera_delta); + } + } +} + +/* Apply scale on all reconstructed cameras and bundles, + * used by camera scale apply operator. + */ +void BKE_tracking_reconstruction_scale(MovieTracking *tracking, float scale[3]) +{ + MovieTrackingObject *object; + + for (object = tracking->objects.first; object; object = object->next) { + ListBase *tracksbase; + MovieTrackingReconstruction *reconstruction; + + tracksbase = BKE_tracking_object_get_tracks(tracking, object); + reconstruction = BKE_tracking_object_get_reconstruction(tracking, object); + + tracking_scale_reconstruction(tracksbase, reconstruction, scale); + } +} + /*********************** Feature detection *************************/ /* Check whether point is inside grease pencil stroke. */ diff --git a/source/blender/editors/object/object_transform.c b/source/blender/editors/object/object_transform.c index f6256174391..7eb5c36a3fc 100644 --- a/source/blender/editors/object/object_transform.c +++ b/source/blender/editors/object/object_transform.c @@ -58,6 +58,7 @@ #include "BKE_multires.h" #include "BKE_armature.h" #include "BKE_lattice.h" +#include "BKE_tracking.h" #include "RNA_define.h" #include "RNA_access.h" @@ -549,8 +550,21 @@ static int apply_objects_internal(bContext *C, ReportList *reports, int apply_lo } } } - else + else if (ob->type == OB_CAMERA) { + MovieClip *clip = BKE_object_movieclip_get(scene, ob, FALSE); + + /* applying scale on camera actually scales clip's reconstruction. + * of there's clip assigned to camera nothing to do actually. + */ + if (!clip) + continue; + + if (apply_scale) + BKE_tracking_reconstruction_scale(&clip->tracking, ob->size); + } + else { continue; + } if (apply_loc) zero_v3(ob->loc); |