Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source/blender/blenkernel/BKE_tracking.h2
-rw-r--r--source/blender/blenkernel/intern/tracking.c43
-rw-r--r--source/blender/editors/object/object_transform.c16
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);