Blender V5.0
tracking_ops_orient.cc
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2016 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
8
10#include "DNA_object_types.h" /* SELECT */
11#include "DNA_screen_types.h"
12#include "DNA_space_types.h"
13
14#include "BLI_listbase.h"
15#include "BLI_math_matrix.h"
16#include "BLI_math_vector.h"
17
18#include "BKE_constraint.h"
19#include "BKE_context.hh"
20#include "BKE_layer.hh"
21#include "BKE_object.hh"
22#include "BKE_report.hh"
23#include "BKE_tracking.h"
24
25#include "DEG_depsgraph.hh"
27
28#include "WM_api.hh"
29#include "WM_types.hh"
30
31#include "ED_clip.hh"
32
33#include "RNA_access.hh"
34#include "RNA_define.hh"
35
36#include "clip_intern.hh"
37
38/********************** set origin operator *********************/
39
40static Object *get_camera_with_movieclip(Scene *scene, const MovieClip *clip)
41{
42 Object *camera = scene->camera;
43
44 if (camera != nullptr && BKE_object_movieclip_get(scene, camera, false) == clip) {
45 return camera;
46 }
47
48 FOREACH_SCENE_OBJECT_BEGIN (scene, ob) {
49 if (ob->type == OB_CAMERA) {
50 if (BKE_object_movieclip_get(scene, ob, false) == clip) {
51 camera = ob;
52 break;
53 }
54 }
55 }
57
58 return camera;
59}
60
62{
63 Scene *scene = CTX_data_scene(C);
64 ViewLayer *view_layer = CTX_data_view_layer(C);
67 MovieTracking *tracking = &clip->tracking;
68 MovieTrackingObject *tracking_object = BKE_tracking_object_get_active(tracking);
69 Object *object = nullptr;
70
71 if (tracking_object->flag & TRACKING_OBJECT_CAMERA) {
72 object = get_camera_with_movieclip(scene, clip);
73 }
74 else {
75 BKE_view_layer_synced_ensure(scene, view_layer);
76 object = BKE_view_layer_active_object_get(view_layer);
77 }
78
79 if (object != nullptr && object->parent != nullptr) {
80 object = object->parent;
81 }
82
83 return object;
84}
85
87{
89 if (sc != nullptr) {
90 const Scene *scene = CTX_data_scene(C);
91 ViewLayer *view_layer = CTX_data_view_layer(C);
93 if (clip != nullptr) {
94 MovieTracking *tracking = &clip->tracking;
95 MovieTrackingObject *tracking_object = BKE_tracking_object_get_active(tracking);
96 if (tracking_object->flag & TRACKING_OBJECT_CAMERA) {
97 return true;
98 }
99 BKE_view_layer_synced_ensure(scene, view_layer);
100 return BKE_view_layer_active_object_get(view_layer) != nullptr;
101 }
102 }
103 return false;
104}
105
107{
110 const MovieTrackingObject *tracking_object = BKE_tracking_object_get_active(&clip->tracking);
111 int tot = 0;
112 LISTBASE_FOREACH (MovieTrackingTrack *, track, &tracking_object->tracks) {
113 if (TRACK_VIEW_SELECTED(sc, track) && (track->flag & TRACK_HAS_BUNDLE)) {
114 tot++;
115 }
116 }
117 return tot;
118}
119
120static void object_solver_inverted_matrix(Scene *scene, Object *ob, float invmat[4][4])
121{
122 bool found = false;
125 if (cti == nullptr) {
126 continue;
127 }
130 if (!found) {
131 Object *cam = data->camera ? data->camera : scene->camera;
133 }
134 mul_m4_m4m4(invmat, invmat, data->invmat);
135 found = true;
136 }
137 }
138 if (found) {
139 invert_m4(invmat);
140 }
141 else {
142 unit_m4(invmat);
143 }
144}
145
147{
150 if (cti == nullptr) {
151 continue;
152 }
155 return (data->camera != nullptr) ? data->camera : scene->camera;
156 }
157 }
158 return nullptr;
159}
160
162{
165 MovieTracking *tracking = &clip->tracking;
166 Scene *scene = CTX_data_scene(C);
167 Object *camera = get_camera_with_movieclip(scene, clip);
168 int selected_count = count_selected_bundles(C);
169
170 if (selected_count == 0) {
172 RPT_ERROR,
173 "At least one track with bundle should be selected to "
174 "define origin position");
175
176 return OPERATOR_CANCELLED;
177 }
178
180 if (object == nullptr) {
181 BKE_report(op->reports, RPT_ERROR, "No object to apply orientation on");
182 return OPERATOR_CANCELLED;
183 }
184
185 const MovieTrackingObject *tracking_object = BKE_tracking_object_get_active(tracking);
186
187 float median[3] = {0.0f, 0.0f, 0.0f};
188 zero_v3(median);
189 LISTBASE_FOREACH (const MovieTrackingTrack *, track, &tracking_object->tracks) {
190 if (TRACK_VIEW_SELECTED(sc, track) && (track->flag & TRACK_HAS_BUNDLE)) {
191 add_v3_v3(median, track->bundle_pos);
192 }
193 }
194 mul_v3_fl(median, 1.0f / selected_count);
195
196 float mat[4][4], vec[3];
198 mul_v3_m4v3(vec, mat, median);
199
200 if (tracking_object->flag & TRACKING_OBJECT_CAMERA) {
201 sub_v3_v3(object->loc, vec);
202 }
203 else {
204 object_solver_inverted_matrix(scene, object, mat);
205 mul_v3_m4v3(vec, mat, vec);
206 copy_v3_v3(object->loc, vec);
207 }
208
209 DEG_id_tag_update(&clip->id, 0);
211
214
215 return OPERATOR_FINISHED;
216}
217
219{
220 /* identifiers */
221 ot->name = "Set Origin";
222 ot->description =
223 "Set active marker as origin by moving camera (or its parent if present) in 3D space";
224 ot->idname = "CLIP_OT_set_origin";
225
226 /* API callbacks. */
227 ot->exec = set_origin_exec;
228 ot->poll = set_orientation_poll;
229
230 /* flags */
232
233 /* properties */
234 RNA_def_boolean(ot->srna,
235 "use_median",
236 false,
237 "Use Median",
238 "Set origin to median point of selected bundles");
239}
240
241/********************** set floor operator *********************/
242
243static void set_axis(Scene *scene,
244 Object *ob,
245 const MovieClip *clip,
246 const MovieTrackingObject *tracking_object,
247 const MovieTrackingTrack *track,
248 char axis)
249{
250 Object *camera = get_camera_with_movieclip(scene, clip);
251 const bool is_camera = (tracking_object->flag & TRACKING_OBJECT_CAMERA) != 0;
252 bool flip = false;
253 float mat[4][4], vec[3], obmat[4][4], dvec[3];
254
255 BKE_object_to_mat4(ob, obmat);
256
258 mul_v3_m4v3(vec, mat, track->bundle_pos);
259 copy_v3_v3(dvec, vec);
260
261 if (!is_camera) {
262 float imat[4][4];
263
264 object_solver_inverted_matrix(scene, ob, imat);
265 mul_v3_m4v3(vec, imat, vec);
266
267 invert_m4_m4(imat, obmat);
268 mul_v3_m4v3(dvec, imat, vec);
269
270 sub_v3_v3(vec, obmat[3]);
271 }
272
273 if (len_squared_v2(vec) < (1e-3f * 1e-3f)) {
274 return;
275 }
276
277 unit_m4(mat);
278
279 if (axis == 'X') {
280 if (fabsf(dvec[1]) < 1e-3f) {
281 flip = true;
282
283 mat[0][0] = -1.0f;
284 mat[0][1] = 0.0f;
285 mat[0][2] = 0.0f;
286 mat[1][0] = 0.0f;
287 mat[1][1] = -1.0f;
288 mat[1][2] = 0.0f;
289 mat[2][0] = 0.0f;
290 mat[2][1] = 0.0f;
291 mat[2][2] = 1.0f;
292 }
293 else {
294 copy_v3_v3(mat[0], vec);
295
296 if (is_camera || fabsf(vec[2]) < 1e-3f) {
297 mat[0][2] = 0.0f;
298 mat[2][0] = 0.0f;
299 mat[2][1] = 0.0f;
300 mat[2][2] = 1.0f;
301 cross_v3_v3v3(mat[1], mat[2], mat[0]);
302 }
303 else {
304 vec[2] = 0.0f;
305
306 cross_v3_v3v3(mat[1], mat[0], vec);
307 cross_v3_v3v3(mat[2], mat[0], mat[1]);
308 }
309 }
310 }
311 else {
312 if (fabsf(dvec[0]) < 1e-3f) {
313 flip = true;
314
315 mat[0][0] = -1.0f;
316 mat[0][1] = 0.0f;
317 mat[0][2] = 0.0f;
318 mat[1][0] = 0.0f;
319 mat[1][1] = -1.0f;
320 mat[1][2] = 0.0f;
321 mat[2][0] = 0.0f;
322 mat[2][1] = 0.0f;
323 mat[2][2] = 1.0f;
324 }
325 else {
326 copy_v3_v3(mat[1], vec);
327
328 if (is_camera || fabsf(vec[2]) < 1e-3f) {
329 mat[1][2] = 0.0f;
330 mat[2][0] = 0.0f;
331 mat[2][1] = 0.0f;
332 mat[2][2] = 1.0f;
333 cross_v3_v3v3(mat[0], mat[1], mat[2]);
334 }
335 else {
336 vec[2] = 0.0f;
337
338 cross_v3_v3v3(mat[0], vec, mat[1]);
339 cross_v3_v3v3(mat[2], mat[0], mat[1]);
340 }
341 }
342 }
343
344 normalize_v3(mat[0]);
345 normalize_v3(mat[1]);
346 normalize_v3(mat[2]);
347
348 if (is_camera) {
349 invert_m4(mat);
350
351 mul_m4_m4m4(mat, mat, obmat);
352 }
353 else {
354 if (!flip) {
355 float lmat[4][4], ilmat[4][4], rmat[3][3];
356
357 BKE_object_rot_to_mat3(ob, rmat, true);
358 invert_m3(rmat);
359 mul_m4_m4m3(mat, mat, rmat);
360
361 unit_m4(lmat);
362 copy_v3_v3(lmat[3], obmat[3]);
363 invert_m4_m4(ilmat, lmat);
364
365 mul_m4_series(mat, lmat, mat, ilmat, obmat);
366 }
367 else {
368 mul_m4_m4m4(mat, obmat, mat);
369 }
370 }
371
372 BKE_object_apply_mat4(ob, mat, false, false);
373}
374
376{
379 Scene *scene = CTX_data_scene(C);
380 MovieTracking *tracking = &clip->tracking;
381 const MovieTrackingTrack *axis_track = nullptr;
382 Object *camera = get_camera_with_movieclip(scene, clip);
383 int tot = 0;
384 float vec[3][3], mat[4][4], obmat[4][4], newmat[4][4], orig[3] = {0.0f, 0.0f, 0.0f};
385 int plane = RNA_enum_get(op->ptr, "plane");
386 float rot[4][4] = {
387 {0.0f, 0.0f, -1.0f, 0.0f},
388 {0.0f, 1.0f, 0.0f, 0.0f},
389 {1.0f, 0.0f, 0.0f, 0.0f},
390 {0.0f, 0.0f, 0.0f, 1.0f},
391 }; /* 90 degrees Y-axis rotation matrix */
392
393 if (count_selected_bundles(C) != 3) {
394 BKE_report(op->reports, RPT_ERROR, "Three tracks with bundles are needed to orient the floor");
395
396 return OPERATOR_CANCELLED;
397 }
398
399 const MovieTrackingObject *tracking_object = BKE_tracking_object_get_active(tracking);
400
402 if (object == nullptr) {
403 BKE_report(op->reports, RPT_ERROR, "No object to apply orientation on");
404 return OPERATOR_CANCELLED;
405 }
406
408
409 /* Get 3 bundles to use as reference. */
410 {
411 const MovieTrackingTrack *track = static_cast<const MovieTrackingTrack *>(
412 tracking_object->tracks.first);
413 while (track && tot < 3) {
414 if (track->flag & TRACK_HAS_BUNDLE && TRACK_VIEW_SELECTED(sc, track)) {
415 mul_v3_m4v3(vec[tot], mat, track->bundle_pos);
416 if (tot == 0 || track == tracking_object->active_track) {
417 copy_v3_v3(orig, vec[tot]);
418 }
419 else {
420 axis_track = track;
421 }
422 tot++;
423 }
424 track = track->next;
425 }
426 }
427
428 sub_v3_v3(vec[1], vec[0]);
429 sub_v3_v3(vec[2], vec[0]);
430
431 /* Construct ortho-normal basis. */
432 unit_m4(mat);
433 if (plane == 0) { /* floor */
434 cross_v3_v3v3(mat[0], vec[1], vec[2]);
435 copy_v3_v3(mat[1], vec[1]);
436 cross_v3_v3v3(mat[2], mat[0], mat[1]);
437 }
438 else if (plane == 1) { /* wall */
439 cross_v3_v3v3(mat[2], vec[1], vec[2]);
440 copy_v3_v3(mat[1], vec[1]);
441 cross_v3_v3v3(mat[0], mat[1], mat[2]);
442 }
443
444 normalize_v3(mat[0]);
445 normalize_v3(mat[1]);
446 normalize_v3(mat[2]);
447
448 /* Move to origin point. */
449 mat[3][0] = orig[0];
450 mat[3][1] = orig[1];
451 mat[3][2] = orig[2];
452
453 if (tracking_object->flag & TRACKING_OBJECT_CAMERA) {
454 invert_m4(mat);
455
456 BKE_object_to_mat4(object, obmat);
457 mul_m4_m4m4(mat, mat, obmat);
458 mul_m4_m4m4(newmat, rot, mat);
459 BKE_object_apply_mat4(object, newmat, false, false);
460
461 /* Make camera have positive z-coordinate. */
462 if (object->loc[2] < 0) {
463 invert_m4(rot);
464 mul_m4_m4m4(newmat, rot, mat);
465 BKE_object_apply_mat4(object, newmat, false, false);
466 }
467 }
468 else {
469 BKE_object_apply_mat4(object, mat, false, false);
470 }
471
474 Object *object_eval = DEG_get_evaluated(depsgraph, object);
475 BKE_object_transform_copy(object_eval, object);
476 BKE_object_where_is_calc(depsgraph, scene_eval, object_eval);
477 BKE_object_transform_copy(object, object_eval);
478
479 set_axis(scene, object, clip, tracking_object, axis_track, 'X');
480
481 DEG_id_tag_update(&clip->id, 0);
483
486
487 return OPERATOR_FINISHED;
488}
489
491{
492 static const EnumPropertyItem plane_items[] = {
493 {0, "FLOOR", 0, "Floor", "Set floor plane"},
494 {1, "WALL", 0, "Wall", "Set wall plane"},
495 {0, nullptr, 0, nullptr, nullptr},
496 };
497
498 /* identifiers */
499 ot->name = "Set Plane";
500 ot->description =
501 "Set plane based on 3 selected bundles by moving camera "
502 "(or its parent if present) in 3D space";
503 ot->idname = "CLIP_OT_set_plane";
504
505 /* API callbacks. */
506 ot->exec = set_plane_exec;
507 ot->poll = set_orientation_poll;
508
509 /* flags */
511
512 /* properties */
513 RNA_def_enum(ot->srna, "plane", plane_items, 0, "Plane", "Plane to be used for orientation");
514}
515
516/********************** set axis operator *********************/
517
519{
522 MovieTracking *tracking = &clip->tracking;
523 MovieTrackingObject *tracking_object = BKE_tracking_object_get_active(tracking);
524 Scene *scene = CTX_data_scene(C);
525 Object *object;
526 int axis = RNA_enum_get(op->ptr, "axis");
527
528 if (count_selected_bundles(C) != 1) {
530 op->reports, RPT_ERROR, "Single track with bundle should be selected to define axis");
531 return OPERATOR_CANCELLED;
532 }
533
534 object = get_orientation_object(C);
535 if (object == nullptr) {
536 BKE_report(op->reports, RPT_ERROR, "No object to apply orientation on");
537 return OPERATOR_CANCELLED;
538 }
539
540 const MovieTrackingTrack *track = static_cast<const MovieTrackingTrack *>(
541 tracking_object->tracks.first);
542 while (track) {
543 if (TRACK_VIEW_SELECTED(sc, track) && (track->flag & TRACK_HAS_BUNDLE)) {
544 break;
545 }
546 track = track->next;
547 }
548
549 set_axis(scene, object, clip, tracking_object, track, axis == 0 ? 'X' : 'Y');
550
551 DEG_id_tag_update(&clip->id, 0);
553
556
557 return OPERATOR_FINISHED;
558}
559
561{
562 static const EnumPropertyItem axis_actions[] = {
563 {0, "X", 0, "X", "Align bundle align X axis"},
564 {1, "Y", 0, "Y", "Align bundle align Y axis"},
565 {0, nullptr, 0, nullptr, nullptr},
566 };
567
568 /* identifiers */
569 ot->name = "Set Axis";
570 ot->description =
571 "Set the direction of a scene axis by rotating the camera "
572 "(or its parent if present). This assumes that the selected "
573 "track lies on a real axis connecting it to the origin";
574 ot->idname = "CLIP_OT_set_axis";
575
576 /* API callbacks. */
577 ot->exec = set_axis_exec;
578 ot->poll = set_orientation_poll;
579
580 /* flags */
582
583 /* properties */
584 RNA_def_enum(ot->srna, "axis", axis_actions, 0, "Axis", "Axis to use to align bundle along");
585}
586
587/********************** set scale operator *********************/
588
590 wmOperator *op,
591 bool scale_solution,
592 bool apply_scale)
593{
596 MovieTracking *tracking = &clip->tracking;
597 MovieTrackingObject *tracking_object = BKE_tracking_object_get_active(tracking);
598 Scene *scene = CTX_data_scene(C);
599 Object *object = nullptr;
600 Object *camera = get_camera_with_movieclip(scene, clip);
601 int tot = 0;
602 float vec[2][3], mat[4][4], scale;
603 float dist = RNA_float_get(op->ptr, "distance");
604
605 if (count_selected_bundles(C) != 2) {
606 BKE_report(op->reports, RPT_ERROR, "Two tracks with bundles should be selected to set scale");
607 return OPERATOR_CANCELLED;
608 }
609
610 if (!scale_solution && !apply_scale) {
611 object = get_orientation_object(C);
612 if (object == nullptr) {
613 BKE_report(op->reports, RPT_ERROR, "No object to apply orientation on");
614 return OPERATOR_CANCELLED;
615 }
616 }
617
619
620 LISTBASE_FOREACH (MovieTrackingTrack *, track, &tracking_object->tracks) {
621 if (TRACK_VIEW_SELECTED(sc, track)) {
622 mul_v3_m4v3(vec[tot], mat, track->bundle_pos);
623 tot++;
624 }
625 }
626
627 sub_v3_v3(vec[0], vec[1]);
628
629 if (len_v3(vec[0]) > 1e-5f) {
630 scale = dist / len_v3(vec[0]);
631 if (apply_scale) {
632 /* Apply scale on reconstructed scene itself. */
633 MovieTrackingReconstruction *reconstruction = &tracking_object->reconstruction;
634 MovieReconstructedCamera *reconstructed_cameras;
635 int i;
636
637 LISTBASE_FOREACH (MovieTrackingTrack *, track, &tracking_object->tracks) {
638 mul_v3_fl(track->bundle_pos, scale);
639 }
640
641 reconstructed_cameras = reconstruction->cameras;
642 for (i = 0; i < reconstruction->camnr; i++) {
643 mul_v3_fl(reconstructed_cameras[i].mat[3], scale);
644 }
645
647
650 }
651 else {
652 if (tracking_object->flag & TRACKING_OBJECT_CAMERA) {
653 mul_v3_fl(object->scale, scale);
654 mul_v3_fl(object->loc, scale);
655 }
656 else if (!scale_solution) {
657 Object *solver_camera = object_solver_camera(scene, object);
658
659 object->scale[0] = object->scale[1] = object->scale[2] = 1.0f / scale;
660
661 if (solver_camera) {
662 object->scale[0] /= solver_camera->scale[0];
663 object->scale[1] /= solver_camera->scale[1];
664 object->scale[2] /= solver_camera->scale[2];
665 }
666 }
667 else {
668 tracking_object->scale = scale;
669 }
670
671 DEG_id_tag_update(&clip->id, 0);
672
673 if (object) {
675 }
676
679 }
680 }
681
682 return OPERATOR_FINISHED;
683}
684
686{
687 return do_set_scale(C, op, false, false);
688}
689
691{
694
695 if (!RNA_struct_property_is_set(op->ptr, "distance")) {
696 RNA_float_set(op->ptr, "distance", clip->tracking.settings.dist);
697 }
698
699 return set_scale_exec(C, op);
700}
701
703{
704 /* identifiers */
705 ot->name = "Set Scale";
706 ot->description = "Set scale of scene by scaling camera (or its parent if present)";
707 ot->idname = "CLIP_OT_set_scale";
708
709 /* API callbacks. */
710 ot->exec = set_scale_exec;
711 ot->invoke = set_scale_invoke;
712 ot->poll = set_orientation_poll;
713
714 /* flags */
716
717 /* properties */
718 RNA_def_float(ot->srna,
719 "distance",
720 0.0f,
721 -FLT_MAX,
722 FLT_MAX,
723 "Distance",
724 "Distance between selected tracks",
725 -100.0f,
726 100.0f);
727}
728
729/********************** set solution scale operator *********************/
730
732{
734 if (sc != nullptr) {
736 if (clip != nullptr) {
737 MovieTracking *tracking = &clip->tracking;
738 MovieTrackingObject *tracking_object = BKE_tracking_object_get_active(tracking);
739 return (tracking_object->flag & TRACKING_OBJECT_CAMERA) == 0;
740 }
741 }
742 return false;
743}
744
746{
747 return do_set_scale(C, op, true, false);
748}
749
751 wmOperator *op,
752 const wmEvent * /*event*/)
753{
756
757 if (!RNA_struct_property_is_set(op->ptr, "distance")) {
758 RNA_float_set(op->ptr, "distance", clip->tracking.settings.object_distance);
759 }
760
761 return set_solution_scale_exec(C, op);
762}
763
765{
766 /* identifiers */
767 ot->name = "Set Solution Scale";
768 ot->description =
769 "Set object solution scale using distance between "
770 "two selected tracks";
771 ot->idname = "CLIP_OT_set_solution_scale";
772
773 /* API callbacks. */
777
778 /* flags */
780
781 /* properties */
782 RNA_def_float(ot->srna,
783 "distance",
784 0.0f,
785 -FLT_MAX,
786 FLT_MAX,
787 "Distance",
788 "Distance between selected tracks",
789 -100.0f,
790 100.0f);
791}
792
793/********************** apply solution scale operator *********************/
794
796{
798 if (sc != nullptr) {
800 if (clip != nullptr) {
801 MovieTracking *tracking = &clip->tracking;
802 MovieTrackingObject *tracking_object = BKE_tracking_object_get_active(tracking);
803 return (tracking_object->flag & TRACKING_OBJECT_CAMERA) != 0;
804 }
805 }
806 return false;
807}
808
810{
811 return do_set_scale(C, op, false, true);
812}
813
815 wmOperator *op,
816 const wmEvent * /*event*/)
817{
820 if (!RNA_struct_property_is_set(op->ptr, "distance")) {
821 RNA_float_set(op->ptr, "distance", clip->tracking.settings.dist);
822 }
823 return apply_solution_scale_exec(C, op);
824}
825
827{
828 /* identifiers */
829 ot->name = "Apply Solution Scale";
830 ot->description =
831 "Apply scale on solution itself to make distance between "
832 "selected tracks equals to desired";
833 ot->idname = "CLIP_OT_apply_solution_scale";
834
835 /* API callbacks. */
839
840 /* flags */
842
843 /* properties */
844 RNA_def_float(ot->srna,
845 "distance",
846 0.0f,
847 -FLT_MAX,
848 FLT_MAX,
849 "Distance",
850 "Distance between selected tracks",
851 -100.0f,
852 100.0f);
853}
#define FOREACH_SCENE_OBJECT_END
#define FOREACH_SCENE_OBJECT_BEGIN(scene, _instance)
const bConstraintTypeInfo * BKE_constraint_typeinfo_get(struct bConstraint *con)
Depsgraph * CTX_data_ensure_evaluated_depsgraph(const bContext *C)
Scene * CTX_data_scene(const bContext *C)
SpaceClip * CTX_wm_space_clip(const bContext *C)
ViewLayer * CTX_data_view_layer(const bContext *C)
void BKE_view_layer_synced_ensure(const Scene *scene, ViewLayer *view_layer)
Object * BKE_view_layer_active_object_get(const ViewLayer *view_layer)
General operations, lookup, etc. for blender objects.
void BKE_object_where_is_calc_mat4(const Object *ob, float r_obmat[4][4])
void BKE_object_rot_to_mat3(const Object *ob, float r_mat[3][3], bool use_drot)
MovieClip * BKE_object_movieclip_get(Scene *scene, const Object *ob, bool use_default)
void BKE_object_apply_mat4(Object *ob, const float mat[4][4], bool use_compat, bool use_parent)
void BKE_object_to_mat4(const Object *ob, float r_mat[4][4])
void BKE_object_where_is_calc(Depsgraph *depsgraph, Scene *scene, Object *ob)
void BKE_object_transform_copy(Object *ob_tar, const Object *ob_src)
@ RPT_ERROR
Definition BKE_report.hh:39
void BKE_report(ReportList *reports, eReportType type, const char *message)
Definition report.cc:153
void BKE_tracking_get_camera_object_matrix(const struct Object *camera_object, float mat[4][4])
struct MovieTrackingObject * BKE_tracking_object_get_active(const struct MovieTracking *tracking)
#define TRACK_VIEW_SELECTED(sc, track)
#define LISTBASE_FOREACH(type, var, list)
void mul_m4_m4m4(float R[4][4], const float A[4][4], const float B[4][4])
void mul_m4_m4m3(float R[4][4], const float A[4][4], const float B[3][3])
#define mul_m4_series(...)
void mul_v3_m4v3(float r[3], const float mat[4][4], const float vec[3])
bool invert_m4_m4(float inverse[4][4], const float mat[4][4])
bool invert_m4(float mat[4][4])
bool invert_m3(float mat[3][3])
void unit_m4(float m[4][4])
MINLINE float len_squared_v2(const float v[2]) ATTR_WARN_UNUSED_RESULT
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 normalize_v3(float n[3])
MINLINE float len_v3(const float a[3]) ATTR_WARN_UNUSED_RESULT
void DEG_id_tag_update(ID *id, unsigned int flags)
Scene * DEG_get_evaluated_scene(const Depsgraph *graph)
T * DEG_get_evaluated(const Depsgraph *depsgraph, T *id)
@ ID_RECALC_TRANSFORM
Definition DNA_ID.h:1054
@ ID_RECALC_SYNC_TO_EVAL
Definition DNA_ID.h:1118
@ CONSTRAINT_TYPE_OBJECTSOLVER
Object is a sort of wrapper for general info.
@ OB_CAMERA
@ TRACK_HAS_BUNDLE
@ TRACKING_OBJECT_CAMERA
@ OPERATOR_CANCELLED
@ OPERATOR_FINISHED
MovieClip * ED_space_clip_get_clip(const SpaceClip *sc)
#define C
Definition RandGen.cpp:29
#define NA_EVALUATED
Definition WM_types.hh:585
#define NC_MOVIECLIP
Definition WM_types.hh:397
@ OPTYPE_UNDO
Definition WM_types.hh:182
@ OPTYPE_REGISTER
Definition WM_types.hh:180
#define ND_TRANSFORM
Definition WM_types.hh:456
#define NC_OBJECT
Definition WM_types.hh:379
BMesh const char void * data
BPy_StructRNA * depsgraph
#define rot(x, k)
#define fabsf
float RNA_float_get(PointerRNA *ptr, const char *name)
void RNA_float_set(PointerRNA *ptr, const char *name, float value)
bool RNA_struct_property_is_set(PointerRNA *ptr, const char *identifier)
int RNA_enum_get(PointerRNA *ptr, const char *name)
PropertyRNA * RNA_def_float(StructOrFunctionRNA *cont_, const char *identifier, const float default_value, const float hardmin, const float hardmax, const char *ui_name, const char *ui_description, const float softmin, const float softmax)
PropertyRNA * RNA_def_enum(StructOrFunctionRNA *cont_, const char *identifier, const EnumPropertyItem *items, const int default_value, const char *ui_name, const char *ui_description)
PropertyRNA * RNA_def_boolean(StructOrFunctionRNA *cont_, const char *identifier, const bool default_value, const char *ui_name, const char *ui_description)
#define FLT_MAX
Definition stdcycles.h:14
void * first
struct MovieTracking tracking
MovieTrackingReconstruction reconstruction
MovieTrackingTrack * active_track
struct MovieReconstructedCamera * cameras
struct MovieTrackingTrack * next
MovieTrackingSettings settings
ListBase constraints
float loc[3]
float scale[3]
struct Object * parent
struct Object * camera
struct ReportList * reports
struct PointerRNA * ptr
i
Definition text_draw.cc:230
void CLIP_OT_set_origin(wmOperatorType *ot)
static wmOperatorStatus set_origin_exec(bContext *C, wmOperator *op)
static wmOperatorStatus set_solution_scale_exec(bContext *C, wmOperator *op)
static Object * object_solver_camera(Scene *scene, Object *ob)
void CLIP_OT_apply_solution_scale(wmOperatorType *ot)
static bool set_orientation_poll(bContext *C)
static wmOperatorStatus set_scale_invoke(bContext *C, wmOperator *op, const wmEvent *)
static bool set_solution_scale_poll(bContext *C)
void CLIP_OT_set_solution_scale(wmOperatorType *ot)
static wmOperatorStatus set_scale_exec(bContext *C, wmOperator *op)
static wmOperatorStatus apply_solution_scale_invoke(bContext *C, wmOperator *op, const wmEvent *)
void CLIP_OT_set_axis(wmOperatorType *ot)
static wmOperatorStatus apply_solution_scale_exec(bContext *C, wmOperator *op)
static wmOperatorStatus set_plane_exec(bContext *C, wmOperator *op)
static bool apply_solution_scale_poll(bContext *C)
static wmOperatorStatus set_axis_exec(bContext *C, wmOperator *op)
void CLIP_OT_set_scale(wmOperatorType *ot)
static Object * get_camera_with_movieclip(Scene *scene, const MovieClip *clip)
static void object_solver_inverted_matrix(Scene *scene, Object *ob, float invmat[4][4])
static int count_selected_bundles(bContext *C)
void CLIP_OT_set_plane(wmOperatorType *ot)
static Object * get_orientation_object(bContext *C)
static wmOperatorStatus set_solution_scale_invoke(bContext *C, wmOperator *op, const wmEvent *)
static void set_axis(Scene *scene, Object *ob, const MovieClip *clip, const MovieTrackingObject *tracking_object, const MovieTrackingTrack *track, char axis)
static wmOperatorStatus do_set_scale(bContext *C, wmOperator *op, bool scale_solution, bool apply_scale)
void WM_event_add_notifier(const bContext *C, uint type, void *reference)
wmOperatorType * ot
Definition wm_files.cc:4237