Blender  V2.93
tracking_ops_orient.c
Go to the documentation of this file.
1 /*
2  * This program is free software; you can redistribute it and/or
3  * modify it under the terms of the GNU General Public License
4  * as published by the Free Software Foundation; either version 2
5  * of the License, or (at your option) any later version.
6  *
7  * This program is distributed in the hope that it will be useful,
8  * but WITHOUT ANY WARRANTY; without even the implied warranty of
9  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10  * GNU General Public License for more details.
11  *
12  * You should have received a copy of the GNU General Public License
13  * along with this program; if not, write to the Free Software Foundation,
14  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
15  *
16  * The Original Code is Copyright (C) 2016 Blender Foundation.
17  * All rights reserved.
18  */
19 
24 #include "MEM_guardedalloc.h"
25 
26 #include "DNA_constraint_types.h"
27 #include "DNA_object_types.h" /* SELECT */
28 #include "DNA_screen_types.h"
29 #include "DNA_space_types.h"
30 
31 #include "BLI_math.h"
32 #include "BLI_utildefines.h"
33 
34 #include "BKE_constraint.h"
35 #include "BKE_context.h"
36 #include "BKE_layer.h"
37 #include "BKE_object.h"
38 #include "BKE_report.h"
39 #include "BKE_tracking.h"
40 
41 #include "DEG_depsgraph.h"
42 #include "DEG_depsgraph_query.h"
43 
44 #include "WM_api.h"
45 #include "WM_types.h"
46 
47 #include "ED_clip.h"
48 
49 #include "RNA_access.h"
50 #include "RNA_define.h"
51 
52 #include "clip_intern.h"
53 
54 /********************** set origin operator *********************/
55 
57 {
58  Object *camera = scene->camera;
59 
60  if (camera != NULL && BKE_object_movieclip_get(scene, camera, false) == clip) {
61  return camera;
62  }
63 
65  if (ob->type == OB_CAMERA) {
66  if (BKE_object_movieclip_get(scene, ob, false) == clip) {
67  camera = ob;
68  break;
69  }
70  }
71  }
73 
74  return camera;
75 }
76 
78 {
80  ViewLayer *view_layer = CTX_data_view_layer(C);
83  MovieTracking *tracking = &clip->tracking;
84  MovieTrackingObject *tracking_object = BKE_tracking_object_get_active(tracking);
85  Object *object = NULL;
86 
87  if (tracking_object->flag & TRACKING_OBJECT_CAMERA) {
88  object = get_camera_with_movieclip(scene, clip);
89  }
90  else {
91  object = OBACT(view_layer);
92  }
93 
94  if (object != NULL && object->parent != NULL) {
95  object = object->parent;
96  }
97 
98  return object;
99 }
100 
102 {
104  if (sc != NULL) {
105  ViewLayer *view_layer = CTX_data_view_layer(C);
106  MovieClip *clip = ED_space_clip_get_clip(sc);
107  if (clip != NULL) {
108  MovieTracking *tracking = &clip->tracking;
109  MovieTrackingObject *tracking_object = BKE_tracking_object_get_active(tracking);
110  if (tracking_object->flag & TRACKING_OBJECT_CAMERA) {
111  return true;
112  }
113  return OBACT(view_layer) != NULL;
114  }
115  }
116  return false;
117 }
118 
120 {
122  MovieClip *clip = ED_space_clip_get_clip(sc);
123  ListBase *tracksbase = BKE_tracking_get_active_tracks(&clip->tracking);
124  int tot = 0;
125  for (MovieTrackingTrack *track = tracksbase->first; track != NULL; track = track->next) {
126  if (TRACK_VIEW_SELECTED(sc, track) && (track->flag & TRACK_HAS_BUNDLE)) {
127  tot++;
128  }
129  }
130  return tot;
131 }
132 
133 static void object_solver_inverted_matrix(Scene *scene, Object *ob, float invmat[4][4])
134 {
135  bool found = false;
136  for (bConstraint *con = ob->constraints.first; con != NULL; con = con->next) {
138  if (cti == NULL) {
139  continue;
140  }
141  if (cti->type == CONSTRAINT_TYPE_OBJECTSOLVER) {
143  if (!found) {
144  Object *cam = data->camera ? data->camera : scene->camera;
145  BKE_object_where_is_calc_mat4(cam, invmat);
146  }
147  mul_m4_m4m4(invmat, invmat, data->invmat);
148  found = true;
149  }
150  }
151  if (found) {
152  invert_m4(invmat);
153  }
154  else {
155  unit_m4(invmat);
156  }
157 }
158 
160 {
161  for (bConstraint *con = ob->constraints.first; con != NULL; con = con->next) {
163  if (cti == NULL) {
164  continue;
165  }
166  if (cti->type == CONSTRAINT_TYPE_OBJECTSOLVER) {
168  return (data->camera != NULL) ? data->camera : scene->camera;
169  }
170  }
171  return NULL;
172 }
173 
175 {
177  MovieClip *clip = ED_space_clip_get_clip(sc);
178  MovieTracking *tracking = &clip->tracking;
180  Object *camera = get_camera_with_movieclip(scene, clip);
181  int selected_count = count_selected_bundles(C);
182 
183  if (selected_count == 0) {
184  BKE_report(op->reports,
185  RPT_ERROR,
186  "At least one track with bundle should be selected to "
187  "define origin position");
188 
189  return OPERATOR_CANCELLED;
190  }
191 
192  Object *object = get_orientation_object(C);
193  if (object == NULL) {
194  BKE_report(op->reports, RPT_ERROR, "No object to apply orientation on");
195  return OPERATOR_CANCELLED;
196  }
197 
198  MovieTrackingObject *tracking_object = BKE_tracking_object_get_active(tracking);
199  ListBase *tracksbase = BKE_tracking_object_get_tracks(tracking, tracking_object);
200 
201  float median[3] = {0.0f, 0.0f, 0.0f};
202  zero_v3(median);
203  for (MovieTrackingTrack *track = tracksbase->first; track != NULL; track = track->next) {
204  if (TRACK_VIEW_SELECTED(sc, track) && (track->flag & TRACK_HAS_BUNDLE)) {
205  add_v3_v3(median, track->bundle_pos);
206  }
207  }
208  mul_v3_fl(median, 1.0f / selected_count);
209 
210  float mat[4][4], vec[3];
212  mul_v3_m4v3(vec, mat, median);
213 
214  if (tracking_object->flag & TRACKING_OBJECT_CAMERA) {
215  sub_v3_v3(object->loc, vec);
216  }
217  else {
218  object_solver_inverted_matrix(scene, object, mat);
219  mul_v3_m4v3(vec, mat, vec);
220  copy_v3_v3(object->loc, vec);
221  }
222 
223  DEG_id_tag_update(&clip->id, 0);
225 
228 
229  return OPERATOR_FINISHED;
230 }
231 
233 {
234  /* identifiers */
235  ot->name = "Set Origin";
236  ot->description =
237  "Set active marker as origin by moving camera (or its parent if present) in 3D space";
238  ot->idname = "CLIP_OT_set_origin";
239 
240  /* api callbacks */
243 
244  /* flags */
246 
247  /* properties */
249  ot->srna, "use_median", 0, "Use Median", "Set origin to median point of selected bundles");
250 }
251 
252 /********************** set floor operator *********************/
253 
254 static void set_axis(Scene *scene,
255  Object *ob,
256  MovieClip *clip,
257  MovieTrackingObject *tracking_object,
258  MovieTrackingTrack *track,
259  char axis)
260 {
261  Object *camera = get_camera_with_movieclip(scene, clip);
262  const bool is_camera = (tracking_object->flag & TRACKING_OBJECT_CAMERA) != 0;
263  bool flip = false;
264  float mat[4][4], vec[3], obmat[4][4], dvec[3];
265 
266  BKE_object_to_mat4(ob, obmat);
267 
269  mul_v3_m4v3(vec, mat, track->bundle_pos);
270  copy_v3_v3(dvec, vec);
271 
272  if (!is_camera) {
273  float imat[4][4];
274 
276  mul_v3_m4v3(vec, imat, vec);
277 
278  invert_m4_m4(imat, obmat);
279  mul_v3_m4v3(dvec, imat, vec);
280 
281  sub_v3_v3(vec, obmat[3]);
282  }
283 
284  if (len_squared_v2(vec) < (1e-3f * 1e-3f)) {
285  return;
286  }
287 
288  unit_m4(mat);
289 
290  if (axis == 'X') {
291  if (fabsf(dvec[1]) < 1e-3f) {
292  flip = true;
293 
294  mat[0][0] = -1.0f;
295  mat[0][1] = 0.0f;
296  mat[0][2] = 0.0f;
297  mat[1][0] = 0.0f;
298  mat[1][1] = -1.0f;
299  mat[1][2] = 0.0f;
300  mat[2][0] = 0.0f;
301  mat[2][1] = 0.0f;
302  mat[2][2] = 1.0f;
303  }
304  else {
305  copy_v3_v3(mat[0], vec);
306 
307  if (is_camera || fabsf(vec[2]) < 1e-3f) {
308  mat[0][2] = 0.0f;
309  mat[2][0] = 0.0f;
310  mat[2][1] = 0.0f;
311  mat[2][2] = 1.0f;
312  cross_v3_v3v3(mat[1], mat[2], mat[0]);
313  }
314  else {
315  vec[2] = 0.0f;
316 
317  cross_v3_v3v3(mat[1], mat[0], vec);
318  cross_v3_v3v3(mat[2], mat[0], mat[1]);
319  }
320  }
321  }
322  else {
323  if (fabsf(dvec[0]) < 1e-3f) {
324  flip = true;
325 
326  mat[0][0] = -1.0f;
327  mat[0][1] = 0.0f;
328  mat[0][2] = 0.0f;
329  mat[1][0] = 0.0f;
330  mat[1][1] = -1.0f;
331  mat[1][2] = 0.0f;
332  mat[2][0] = 0.0f;
333  mat[2][1] = 0.0f;
334  mat[2][2] = 1.0f;
335  }
336  else {
337  copy_v3_v3(mat[1], vec);
338 
339  if (is_camera || fabsf(vec[2]) < 1e-3f) {
340  mat[1][2] = 0.0f;
341  mat[2][0] = 0.0f;
342  mat[2][1] = 0.0f;
343  mat[2][2] = 1.0f;
344  cross_v3_v3v3(mat[0], mat[1], mat[2]);
345  }
346  else {
347  vec[2] = 0.0f;
348 
349  cross_v3_v3v3(mat[0], vec, mat[1]);
350  cross_v3_v3v3(mat[2], mat[0], mat[1]);
351  }
352  }
353  }
354 
355  normalize_v3(mat[0]);
356  normalize_v3(mat[1]);
357  normalize_v3(mat[2]);
358 
359  if (is_camera) {
360  invert_m4(mat);
361 
362  mul_m4_m4m4(mat, mat, obmat);
363  }
364  else {
365  if (!flip) {
366  float lmat[4][4], ilmat[4][4], rmat[3][3];
367 
368  BKE_object_rot_to_mat3(ob, rmat, true);
369  invert_m3(rmat);
370  mul_m4_m4m3(mat, mat, rmat);
371 
372  unit_m4(lmat);
373  copy_v3_v3(lmat[3], obmat[3]);
374  invert_m4_m4(ilmat, lmat);
375 
376  mul_m4_series(mat, lmat, mat, ilmat, obmat);
377  }
378  else {
379  mul_m4_m4m4(mat, obmat, mat);
380  }
381  }
382 
383  BKE_object_apply_mat4(ob, mat, 0, 0);
384 }
385 
387 {
389  MovieClip *clip = ED_space_clip_get_clip(sc);
391  MovieTracking *tracking = &clip->tracking;
392  MovieTrackingObject *tracking_object;
393  MovieTrackingTrack *track, *axis_track = NULL, *act_track;
394  ListBase *tracksbase;
395  Object *object;
396  Object *camera = get_camera_with_movieclip(scene, clip);
397  int tot = 0;
398  float vec[3][3], mat[4][4], obmat[4][4], newmat[4][4], orig[3] = {0.0f, 0.0f, 0.0f};
399  int plane = RNA_enum_get(op->ptr, "plane");
400  float rot[4][4] = {
401  {0.0f, 0.0f, -1.0f, 0.0f},
402  {0.0f, 1.0f, 0.0f, 0.0f},
403  {1.0f, 0.0f, 0.0f, 0.0f},
404  {0.0f, 0.0f, 0.0f, 1.0f},
405  }; /* 90 degrees Y-axis rotation matrix */
406 
407  if (count_selected_bundles(C) != 3) {
408  BKE_report(op->reports, RPT_ERROR, "Three tracks with bundles are needed to orient the floor");
409 
410  return OPERATOR_CANCELLED;
411  }
412 
413  tracking_object = BKE_tracking_object_get_active(tracking);
414  tracksbase = BKE_tracking_object_get_tracks(tracking, tracking_object);
415  act_track = BKE_tracking_track_get_active(tracking);
416 
417  object = get_orientation_object(C);
418  if (object == NULL) {
419  BKE_report(op->reports, RPT_ERROR, "No object to apply orientation on");
420  return OPERATOR_CANCELLED;
421  }
422 
424 
425  /* Get 3 bundles to use as reference. */
426  track = tracksbase->first;
427  while (track && tot < 3) {
428  if (track->flag & TRACK_HAS_BUNDLE && TRACK_VIEW_SELECTED(sc, track)) {
429  mul_v3_m4v3(vec[tot], mat, track->bundle_pos);
430  if (tot == 0 || track == act_track) {
431  copy_v3_v3(orig, vec[tot]);
432  }
433  else {
434  axis_track = track;
435  }
436  tot++;
437  }
438  track = track->next;
439  }
440 
441  sub_v3_v3(vec[1], vec[0]);
442  sub_v3_v3(vec[2], vec[0]);
443 
444  /* Construct ortho-normal basis. */
445  unit_m4(mat);
446  if (plane == 0) { /* floor */
447  cross_v3_v3v3(mat[0], vec[1], vec[2]);
448  copy_v3_v3(mat[1], vec[1]);
449  cross_v3_v3v3(mat[2], mat[0], mat[1]);
450  }
451  else if (plane == 1) { /* wall */
452  cross_v3_v3v3(mat[2], vec[1], vec[2]);
453  copy_v3_v3(mat[1], vec[1]);
454  cross_v3_v3v3(mat[0], mat[1], mat[2]);
455  }
456 
457  normalize_v3(mat[0]);
458  normalize_v3(mat[1]);
459  normalize_v3(mat[2]);
460 
461  /* Move to origin point. */
462  mat[3][0] = orig[0];
463  mat[3][1] = orig[1];
464  mat[3][2] = orig[2];
465 
466  if (tracking_object->flag & TRACKING_OBJECT_CAMERA) {
467  invert_m4(mat);
468 
469  BKE_object_to_mat4(object, obmat);
470  mul_m4_m4m4(mat, mat, obmat);
471  mul_m4_m4m4(newmat, rot, mat);
472  BKE_object_apply_mat4(object, newmat, 0, 0);
473 
474  /* Make camera have positive z-coordinate. */
475  if (object->loc[2] < 0) {
476  invert_m4(rot);
477  mul_m4_m4m4(newmat, rot, mat);
478  BKE_object_apply_mat4(object, newmat, 0, 0);
479  }
480  }
481  else {
482  BKE_object_apply_mat4(object, mat, 0, 0);
483  }
484 
486  Scene *scene_eval = DEG_get_evaluated_scene(depsgraph);
487  Object *object_eval = DEG_get_evaluated_object(depsgraph, object);
488  BKE_object_transform_copy(object_eval, object);
489  BKE_object_where_is_calc(depsgraph, scene_eval, object_eval);
490  BKE_object_transform_copy(object, object_eval);
491 
492  set_axis(scene, object, clip, tracking_object, axis_track, 'X');
493 
494  DEG_id_tag_update(&clip->id, 0);
496 
499 
500  return OPERATOR_FINISHED;
501 }
502 
504 {
505  static const EnumPropertyItem plane_items[] = {
506  {0, "FLOOR", 0, "Floor", "Set floor plane"},
507  {1, "WALL", 0, "Wall", "Set wall plane"},
508  {0, NULL, 0, NULL, NULL},
509  };
510 
511  /* identifiers */
512  ot->name = "Set Plane";
513  ot->description =
514  "Set plane based on 3 selected bundles by moving camera "
515  "(or its parent if present) in 3D space";
516  ot->idname = "CLIP_OT_set_plane";
517 
518  /* api callbacks */
521 
522  /* flags */
524 
525  /* properties */
526  RNA_def_enum(ot->srna, "plane", plane_items, 0, "Plane", "Plane to be used for orientation");
527 }
528 
529 /********************** set axis operator *********************/
530 
532 {
534  MovieClip *clip = ED_space_clip_get_clip(sc);
535  MovieTracking *tracking = &clip->tracking;
536  MovieTrackingObject *tracking_object = BKE_tracking_object_get_active(tracking);
538  Object *object;
539  int axis = RNA_enum_get(op->ptr, "axis");
540 
541  if (count_selected_bundles(C) != 1) {
542  BKE_report(
543  op->reports, RPT_ERROR, "Single track with bundle should be selected to define axis");
544  return OPERATOR_CANCELLED;
545  }
546 
547  object = get_orientation_object(C);
548  if (object == NULL) {
549  BKE_report(op->reports, RPT_ERROR, "No object to apply orientation on");
550  return OPERATOR_CANCELLED;
551  }
552 
553  ListBase *tracksbase = BKE_tracking_object_get_tracks(tracking, tracking_object);
554  MovieTrackingTrack *track = tracksbase->first;
555  while (track) {
556  if (TRACK_VIEW_SELECTED(sc, track) && (track->flag & TRACK_HAS_BUNDLE)) {
557  break;
558  }
559  track = track->next;
560  }
561 
562  set_axis(scene, object, clip, tracking_object, track, axis == 0 ? 'X' : 'Y');
563 
564  DEG_id_tag_update(&clip->id, 0);
566 
569 
570  return OPERATOR_FINISHED;
571 }
572 
574 {
575  static const EnumPropertyItem axis_actions[] = {
576  {0, "X", 0, "X", "Align bundle align X axis"},
577  {1, "Y", 0, "Y", "Align bundle align Y axis"},
578  {0, NULL, 0, NULL, NULL},
579  };
580 
581  /* identifiers */
582  ot->name = "Set Axis";
583  ot->description =
584  "Set direction of scene axis rotating camera "
585  "(or its parent if present) and assume selected track "
586  "lies on real axis, joining it with the origin";
587  ot->idname = "CLIP_OT_set_axis";
588 
589  /* api callbacks */
590  ot->exec = set_axis_exec;
592 
593  /* flags */
595 
596  /* properties */
597  RNA_def_enum(ot->srna, "axis", axis_actions, 0, "Axis", "Axis to use to align bundle along");
598 }
599 
600 /********************** set scale operator *********************/
601 
602 static int do_set_scale(bContext *C, wmOperator *op, bool scale_solution, bool apply_scale)
603 {
605  MovieClip *clip = ED_space_clip_get_clip(sc);
606  MovieTracking *tracking = &clip->tracking;
607  MovieTrackingObject *tracking_object = BKE_tracking_object_get_active(tracking);
608  MovieTrackingTrack *track;
610  Object *object = NULL;
611  Object *camera = get_camera_with_movieclip(scene, clip);
612  ListBase *tracksbase = BKE_tracking_get_active_tracks(tracking);
613  int tot = 0;
614  float vec[2][3], mat[4][4], scale;
615  float dist = RNA_float_get(op->ptr, "distance");
616 
617  if (count_selected_bundles(C) != 2) {
618  BKE_report(op->reports, RPT_ERROR, "Two tracks with bundles should be selected to set scale");
619  return OPERATOR_CANCELLED;
620  }
621 
622  if (!scale_solution && !apply_scale) {
623  object = get_orientation_object(C);
624  if (object == NULL) {
625  BKE_report(op->reports, RPT_ERROR, "No object to apply orientation on");
626  return OPERATOR_CANCELLED;
627  }
628  }
629 
631 
632  track = tracksbase->first;
633  while (track) {
634  if (TRACK_VIEW_SELECTED(sc, track)) {
635  mul_v3_m4v3(vec[tot], mat, track->bundle_pos);
636  tot++;
637  }
638  track = track->next;
639  }
640 
641  sub_v3_v3(vec[0], vec[1]);
642 
643  if (len_v3(vec[0]) > 1e-5f) {
644  scale = dist / len_v3(vec[0]);
645  if (apply_scale) {
646  /* Apply scale on reconstructed scene itself. */
648  tracking);
649  MovieReconstructedCamera *reconstructed_cameras;
650  int i;
651 
652  for (track = tracksbase->first; track; track = track->next) {
653  mul_v3_fl(track->bundle_pos, scale);
654  }
655 
656  reconstructed_cameras = reconstruction->cameras;
657  for (i = 0; i < reconstruction->camnr; i++) {
658  mul_v3_fl(reconstructed_cameras[i].mat[3], scale);
659  }
660 
663  }
664  else {
665  if (tracking_object->flag & TRACKING_OBJECT_CAMERA) {
666  mul_v3_fl(object->scale, scale);
667  mul_v3_fl(object->loc, scale);
668  }
669  else if (!scale_solution) {
670  Object *solver_camera = object_solver_camera(scene, object);
671 
672  object->scale[0] = object->scale[1] = object->scale[2] = 1.0f / scale;
673 
674  if (solver_camera) {
675  object->scale[0] /= solver_camera->scale[0];
676  object->scale[1] /= solver_camera->scale[1];
677  object->scale[2] /= solver_camera->scale[2];
678  }
679  }
680  else {
681  tracking_object->scale = scale;
682  }
683 
684  DEG_id_tag_update(&clip->id, 0);
685 
686  if (object) {
688  }
689 
692  }
693  }
694 
695  return OPERATOR_FINISHED;
696 }
697 
699 {
700  return do_set_scale(C, op, false, false);
701 }
702 
703 static int set_scale_invoke(bContext *C, wmOperator *op, const wmEvent *UNUSED(event))
704 {
706  MovieClip *clip = ED_space_clip_get_clip(sc);
707 
708  if (!RNA_struct_property_is_set(op->ptr, "distance")) {
709  RNA_float_set(op->ptr, "distance", clip->tracking.settings.dist);
710  }
711 
712  return set_scale_exec(C, op);
713 }
714 
716 {
717  /* identifiers */
718  ot->name = "Set Scale";
719  ot->description = "Set scale of scene by scaling camera (or its parent if present)";
720  ot->idname = "CLIP_OT_set_scale";
721 
722  /* api callbacks */
726 
727  /* flags */
729 
730  /* properties */
732  "distance",
733  0.0f,
734  -FLT_MAX,
735  FLT_MAX,
736  "Distance",
737  "Distance between selected tracks",
738  -100.0f,
739  100.0f);
740 }
741 
742 /********************** set solution scale operator *********************/
743 
745 {
747  if (sc != NULL) {
748  MovieClip *clip = ED_space_clip_get_clip(sc);
749  if (clip != NULL) {
750  MovieTracking *tracking = &clip->tracking;
751  MovieTrackingObject *tracking_object = BKE_tracking_object_get_active(tracking);
752  return (tracking_object->flag & TRACKING_OBJECT_CAMERA) == 0;
753  }
754  }
755  return false;
756 }
757 
759 {
760  return do_set_scale(C, op, true, false);
761 }
762 
764 {
766  MovieClip *clip = ED_space_clip_get_clip(sc);
767 
768  if (!RNA_struct_property_is_set(op->ptr, "distance")) {
769  RNA_float_set(op->ptr, "distance", clip->tracking.settings.object_distance);
770  }
771 
772  return set_solution_scale_exec(C, op);
773 }
774 
776 {
777  /* identifiers */
778  ot->name = "Set Solution Scale";
779  ot->description =
780  "Set object solution scale using distance between "
781  "two selected tracks";
782  ot->idname = "CLIP_OT_set_solution_scale";
783 
784  /* api callbacks */
788 
789  /* flags */
791 
792  /* properties */
794  "distance",
795  0.0f,
796  -FLT_MAX,
797  FLT_MAX,
798  "Distance",
799  "Distance between selected tracks",
800  -100.0f,
801  100.0f);
802 }
803 
804 /********************** apply solution scale operator *********************/
805 
807 {
809  if (sc != NULL) {
810  MovieClip *clip = ED_space_clip_get_clip(sc);
811  if (clip != NULL) {
812  MovieTracking *tracking = &clip->tracking;
813  MovieTrackingObject *tracking_object = BKE_tracking_object_get_active(tracking);
814  return (tracking_object->flag & TRACKING_OBJECT_CAMERA) != 0;
815  }
816  }
817  return 0;
818 }
819 
821 {
822  return do_set_scale(C, op, false, true);
823 }
824 
826 {
828  MovieClip *clip = ED_space_clip_get_clip(sc);
829  if (!RNA_struct_property_is_set(op->ptr, "distance")) {
830  RNA_float_set(op->ptr, "distance", clip->tracking.settings.dist);
831  }
832  return apply_solution_scale_exec(C, op);
833 }
834 
836 {
837  /* identifiers */
838  ot->name = "Apply Solution Scale";
839  ot->description =
840  "Apply scale on solution itself to make distance between "
841  "selected tracks equals to desired";
842  ot->idname = "CLIP_OT_apply_solution_scale";
843 
844  /* api callbacks */
848 
849  /* flags */
851 
852  /* properties */
854  "distance",
855  0.0f,
856  -FLT_MAX,
857  FLT_MAX,
858  "Distance",
859  "Distance between selected tracks",
860  -100.0f,
861  100.0f);
862 }
#define FOREACH_SCENE_OBJECT_END
#define FOREACH_SCENE_OBJECT_BEGIN(scene, _instance)
const bConstraintTypeInfo * BKE_constraint_typeinfo_get(struct bConstraint *con)
Definition: constraint.c:5435
struct Scene * CTX_data_scene(const bContext *C)
Definition: context.c:1034
struct SpaceClip * CTX_wm_space_clip(const bContext *C)
Definition: context.c:899
struct ViewLayer * CTX_data_view_layer(const bContext *C)
Definition: context.c:1044
struct Depsgraph * CTX_data_ensure_evaluated_depsgraph(const bContext *C)
Definition: context.c:1424
General operations, lookup, etc. for blender objects.
struct MovieClip * BKE_object_movieclip_get(struct Scene *scene, struct Object *ob, bool use_default)
Definition: object.c:5079
void BKE_object_where_is_calc(struct Depsgraph *depsgraph, struct Scene *scene, struct Object *ob)
Definition: object.c:3653
void BKE_object_transform_copy(struct Object *ob_tar, const struct Object *ob_src)
void BKE_object_where_is_calc_mat4(struct Object *ob, float r_obmat[4][4])
Definition: object.c:3636
void BKE_object_rot_to_mat3(const struct Object *ob, float r_mat[3][3], bool use_drot)
void BKE_object_to_mat4(struct Object *ob, float r_mat[4][4])
Definition: object.c:3234
void BKE_object_apply_mat4(struct Object *ob, const float mat[4][4], const bool use_compat, const bool use_parent)
Definition: object.c:3754
void BKE_report(ReportList *reports, ReportType type, const char *message)
Definition: report.c:104
void BKE_tracking_get_camera_object_matrix(struct Object *camera_object, float mat[4][4])
Definition: tracking.c:399
struct ListBase * BKE_tracking_get_active_tracks(struct MovieTracking *tracking)
Definition: tracking.c:365
struct MovieTrackingTrack * BKE_tracking_track_get_active(struct MovieTracking *tracking)
Definition: tracking.c:1170
struct MovieTrackingReconstruction * BKE_tracking_get_active_reconstruction(struct MovieTracking *tracking)
Definition: tracking.c:389
#define TRACK_VIEW_SELECTED(sc, track)
Definition: BKE_tracking.h:497
struct ListBase * BKE_tracking_object_get_tracks(struct MovieTracking *tracking, struct MovieTrackingObject *object)
Definition: tracking.c:2218
struct MovieTrackingObject * BKE_tracking_object_get_active(struct MovieTracking *tracking)
Definition: tracking.c:2198
void mul_m4_m4m4(float R[4][4], const float A[4][4], const float B[4][4])
Definition: math_matrix.c:262
bool invert_m4(float R[4][4])
Definition: math_matrix.c:1187
void mul_m4_m4m3(float R[4][4], const float A[4][4], const float B[3][3])
Definition: math_matrix.c:437
void unit_m4(float m[4][4])
Definition: rct.c:1140
bool invert_m4_m4(float R[4][4], const float A[4][4])
Definition: math_matrix.c:1278
#define mul_m4_series(...)
void mul_v3_m4v3(float r[3], const float M[4][4], const float v[3])
Definition: math_matrix.c:742
bool invert_m3(float R[3][3])
Definition: math_matrix.c:1152
MINLINE float len_squared_v2(const float v[2]) ATTR_WARN_UNUSED_RESULT
MINLINE float normalize_v3(float r[3])
MINLINE void sub_v3_v3(float r[3], const float a[3])
MINLINE void mul_v3_fl(float r[3], float f)
MINLINE void copy_v3_v3(float r[3], const float a[3])
MINLINE void cross_v3_v3v3(float r[3], const float a[3], const float b[3])
MINLINE void zero_v3(float r[3])
MINLINE void add_v3_v3(float r[3], const float a[3])
MINLINE float len_v3(const float a[3]) ATTR_WARN_UNUSED_RESULT
#define UNUSED(x)
struct Depsgraph Depsgraph
Definition: DEG_depsgraph.h:51
void DEG_id_tag_update(struct ID *id, int flag)
struct Object * DEG_get_evaluated_object(const struct Depsgraph *depsgraph, struct Object *object)
struct Scene * DEG_get_evaluated_scene(const struct Depsgraph *graph)
@ ID_RECALC_TRANSFORM
Definition: DNA_ID.h:599
@ CONSTRAINT_TYPE_OBJECTSOLVER
Object is a sort of wrapper for general info.
@ OB_CAMERA
#define OBACT(_view_layer)
@ TRACK_HAS_BUNDLE
@ TRACKING_OBJECT_CAMERA
@ OPERATOR_CANCELLED
@ OPERATOR_FINISHED
struct MovieClip * ED_space_clip_get_clip(struct SpaceClip *sc)
Definition: clip_editor.c:572
Read Guarded memory(de)allocation.
#define C
Definition: RandGen.cpp:39
@ OPTYPE_UNDO
Definition: WM_types.h:155
@ OPTYPE_REGISTER
Definition: WM_types.h:153
#define NA_EVALUATED
Definition: WM_types.h:463
#define NC_MOVIECLIP
Definition: WM_types.h:298
#define ND_TRANSFORM
Definition: WM_types.h:357
#define NC_OBJECT
Definition: WM_types.h:280
return(oflags[bm->toolflag_index].f &oflag) !=0
Scene scene
const Depsgraph * depsgraph
#define rot(x, k)
const ProjectiveReconstruction & reconstruction
Definition: intersect.cc:198
#define fabsf(x)
float RNA_float_get(PointerRNA *ptr, const char *name)
Definition: rna_access.c:6355
void RNA_float_set(PointerRNA *ptr, const char *name, float value)
Definition: rna_access.c:6366
bool RNA_struct_property_is_set(PointerRNA *ptr, const char *identifier)
Definition: rna_access.c:6685
int RNA_enum_get(PointerRNA *ptr, const char *name)
Definition: rna_access.c:6402
PropertyRNA * RNA_def_float(StructOrFunctionRNA *cont_, const char *identifier, float default_value, float hardmin, float hardmax, const char *ui_name, const char *ui_description, float softmin, float softmax)
Definition: rna_define.c:3825
PropertyRNA * RNA_def_boolean(StructOrFunctionRNA *cont_, const char *identifier, bool default_value, const char *ui_name, const char *ui_description)
Definition: rna_define.c:3481
PropertyRNA * RNA_def_enum(StructOrFunctionRNA *cont_, const char *identifier, const EnumPropertyItem *items, int default_value, const char *ui_name, const char *ui_description)
Definition: rna_define.c:3771
void * first
Definition: DNA_listBase.h:47
struct MovieTracking tracking
struct MovieTrackingTrack * next
MovieTrackingSettings settings
ListBase constraints
float loc[3]
float scale[3]
struct Object * parent
struct Object * camera
int(* invoke)(struct bContext *, struct wmOperator *, const struct wmEvent *) ATTR_WARN_UNUSED_RESULT
Definition: WM_types.h:752
const char * name
Definition: WM_types.h:721
const char * idname
Definition: WM_types.h:723
bool(* poll)(struct bContext *) ATTR_WARN_UNUSED_RESULT
Definition: WM_types.h:776
struct StructRNA * srna
Definition: WM_types.h:802
const char * description
Definition: WM_types.h:726
int(* exec)(struct bContext *, struct wmOperator *) ATTR_WARN_UNUSED_RESULT
Definition: WM_types.h:736
struct ReportList * reports
struct PointerRNA * ptr
void CLIP_OT_set_origin(wmOperatorType *ot)
static void set_axis(Scene *scene, Object *ob, MovieClip *clip, MovieTrackingObject *tracking_object, MovieTrackingTrack *track, char axis)
void CLIP_OT_apply_solution_scale(wmOperatorType *ot)
static bool set_orientation_poll(bContext *C)
static int apply_solution_scale_exec(bContext *C, wmOperator *op)
static bool set_solution_scale_poll(bContext *C)
static int apply_solution_scale_invoke(bContext *C, wmOperator *op, const wmEvent *UNUSED(event))
void CLIP_OT_set_solution_scale(wmOperatorType *ot)
void CLIP_OT_set_axis(wmOperatorType *ot)
static int set_origin_exec(bContext *C, wmOperator *op)
static Object * get_orientation_object(bContext *C)
static int set_scale_exec(bContext *C, wmOperator *op)
static int do_set_scale(bContext *C, wmOperator *op, bool scale_solution, bool apply_scale)
static bool apply_solution_scale_poll(bContext *C)
static int set_solution_scale_exec(bContext *C, wmOperator *op)
void CLIP_OT_set_scale(wmOperatorType *ot)
static Object * object_solver_camera(Scene *scene, Object *ob)
static int set_axis_exec(bContext *C, wmOperator *op)
static int set_plane_exec(bContext *C, wmOperator *op)
static int set_solution_scale_invoke(bContext *C, wmOperator *op, const wmEvent *UNUSED(event))
static int set_scale_invoke(bContext *C, wmOperator *op, const wmEvent *UNUSED(event))
static void object_solver_inverted_matrix(Scene *scene, Object *ob, float invmat[4][4])
static Object * get_camera_with_movieclip(Scene *scene, MovieClip *clip)
static int count_selected_bundles(bContext *C)
void CLIP_OT_set_plane(wmOperatorType *ot)
void WM_event_add_notifier(const bContext *C, uint type, void *reference)
wmOperatorType * ot
Definition: wm_files.c:3156