Blender V4.3
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
9#include "MEM_guardedalloc.h"
10
12#include "DNA_object_types.h" /* SELECT */
13#include "DNA_screen_types.h"
14#include "DNA_space_types.h"
15
16#include "BLI_math_matrix.h"
17#include "BLI_math_vector.h"
18#include "BLI_utildefines.h"
19
20#include "BKE_constraint.h"
21#include "BKE_context.hh"
22#include "BKE_layer.hh"
23#include "BKE_object.hh"
24#include "BKE_report.hh"
25#include "BKE_tracking.h"
26
27#include "DEG_depsgraph.hh"
29
30#include "WM_api.hh"
31#include "WM_types.hh"
32
33#include "ED_clip.hh"
34
35#include "RNA_access.hh"
36#include "RNA_define.hh"
37
38#include "clip_intern.hh"
39
40/********************** set origin operator *********************/
41
42static Object *get_camera_with_movieclip(Scene *scene, const MovieClip *clip)
43{
44 Object *camera = scene->camera;
45
46 if (camera != nullptr && BKE_object_movieclip_get(scene, camera, false) == clip) {
47 return camera;
48 }
49
50 FOREACH_SCENE_OBJECT_BEGIN (scene, ob) {
51 if (ob->type == OB_CAMERA) {
52 if (BKE_object_movieclip_get(scene, ob, false) == clip) {
53 camera = ob;
54 break;
55 }
56 }
57 }
59
60 return camera;
61}
62
64{
65 Scene *scene = CTX_data_scene(C);
66 ViewLayer *view_layer = CTX_data_view_layer(C);
69 MovieTracking *tracking = &clip->tracking;
70 MovieTrackingObject *tracking_object = BKE_tracking_object_get_active(tracking);
71 Object *object = nullptr;
72
73 if (tracking_object->flag & TRACKING_OBJECT_CAMERA) {
74 object = get_camera_with_movieclip(scene, clip);
75 }
76 else {
77 BKE_view_layer_synced_ensure(scene, view_layer);
78 object = BKE_view_layer_active_object_get(view_layer);
79 }
80
81 if (object != nullptr && object->parent != nullptr) {
82 object = object->parent;
83 }
84
85 return object;
86}
87
89{
91 if (sc != nullptr) {
92 const Scene *scene = CTX_data_scene(C);
93 ViewLayer *view_layer = CTX_data_view_layer(C);
95 if (clip != nullptr) {
96 MovieTracking *tracking = &clip->tracking;
97 MovieTrackingObject *tracking_object = BKE_tracking_object_get_active(tracking);
98 if (tracking_object->flag & TRACKING_OBJECT_CAMERA) {
99 return true;
100 }
101 BKE_view_layer_synced_ensure(scene, view_layer);
102 return BKE_view_layer_active_object_get(view_layer) != nullptr;
103 }
104 }
105 return false;
106}
107
109{
112 const MovieTrackingObject *tracking_object = BKE_tracking_object_get_active(&clip->tracking);
113 int tot = 0;
114 LISTBASE_FOREACH (MovieTrackingTrack *, track, &tracking_object->tracks) {
115 if (TRACK_VIEW_SELECTED(sc, track) && (track->flag & TRACK_HAS_BUNDLE)) {
116 tot++;
117 }
118 }
119 return tot;
120}
121
122static void object_solver_inverted_matrix(Scene *scene, Object *ob, float invmat[4][4])
123{
124 bool found = false;
127 if (cti == nullptr) {
128 continue;
129 }
132 if (!found) {
133 Object *cam = data->camera ? data->camera : scene->camera;
135 }
136 mul_m4_m4m4(invmat, invmat, data->invmat);
137 found = true;
138 }
139 }
140 if (found) {
141 invert_m4(invmat);
142 }
143 else {
144 unit_m4(invmat);
145 }
146}
147
149{
152 if (cti == nullptr) {
153 continue;
154 }
157 return (data->camera != nullptr) ? data->camera : scene->camera;
158 }
159 }
160 return nullptr;
161}
162
164{
167 MovieTracking *tracking = &clip->tracking;
168 Scene *scene = CTX_data_scene(C);
169 Object *camera = get_camera_with_movieclip(scene, clip);
170 int selected_count = count_selected_bundles(C);
171
172 if (selected_count == 0) {
174 RPT_ERROR,
175 "At least one track with bundle should be selected to "
176 "define origin position");
177
178 return OPERATOR_CANCELLED;
179 }
180
181 Object *object = get_orientation_object(C);
182 if (object == nullptr) {
183 BKE_report(op->reports, RPT_ERROR, "No object to apply orientation on");
184 return OPERATOR_CANCELLED;
185 }
186
187 const MovieTrackingObject *tracking_object = BKE_tracking_object_get_active(tracking);
188
189 float median[3] = {0.0f, 0.0f, 0.0f};
190 zero_v3(median);
191 LISTBASE_FOREACH (const MovieTrackingTrack *, track, &tracking_object->tracks) {
192 if (TRACK_VIEW_SELECTED(sc, track) && (track->flag & TRACK_HAS_BUNDLE)) {
193 add_v3_v3(median, track->bundle_pos);
194 }
195 }
196 mul_v3_fl(median, 1.0f / selected_count);
197
198 float mat[4][4], vec[3];
200 mul_v3_m4v3(vec, mat, median);
201
202 if (tracking_object->flag & TRACKING_OBJECT_CAMERA) {
203 sub_v3_v3(object->loc, vec);
204 }
205 else {
206 object_solver_inverted_matrix(scene, object, mat);
207 mul_v3_m4v3(vec, mat, vec);
208 copy_v3_v3(object->loc, vec);
209 }
210
211 DEG_id_tag_update(&clip->id, 0);
213
216
217 return OPERATOR_FINISHED;
218}
219
221{
222 /* identifiers */
223 ot->name = "Set Origin";
224 ot->description =
225 "Set active marker as origin by moving camera (or its parent if present) in 3D space";
226 ot->idname = "CLIP_OT_set_origin";
227
228 /* api callbacks */
231
232 /* flags */
234
235 /* properties */
237 "use_median",
238 false,
239 "Use Median",
240 "Set origin to median point of selected bundles");
241}
242
243/********************** set floor operator *********************/
244
245static void set_axis(Scene *scene,
246 Object *ob,
247 const MovieClip *clip,
248 const MovieTrackingObject *tracking_object,
249 const MovieTrackingTrack *track,
250 char axis)
251{
252 Object *camera = get_camera_with_movieclip(scene, clip);
253 const bool is_camera = (tracking_object->flag & TRACKING_OBJECT_CAMERA) != 0;
254 bool flip = false;
255 float mat[4][4], vec[3], obmat[4][4], dvec[3];
256
257 BKE_object_to_mat4(ob, obmat);
258
260 mul_v3_m4v3(vec, mat, track->bundle_pos);
261 copy_v3_v3(dvec, vec);
262
263 if (!is_camera) {
264 float imat[4][4];
265
266 object_solver_inverted_matrix(scene, ob, imat);
267 mul_v3_m4v3(vec, imat, vec);
268
269 invert_m4_m4(imat, obmat);
270 mul_v3_m4v3(dvec, imat, vec);
271
272 sub_v3_v3(vec, obmat[3]);
273 }
274
275 if (len_squared_v2(vec) < (1e-3f * 1e-3f)) {
276 return;
277 }
278
279 unit_m4(mat);
280
281 if (axis == 'X') {
282 if (fabsf(dvec[1]) < 1e-3f) {
283 flip = true;
284
285 mat[0][0] = -1.0f;
286 mat[0][1] = 0.0f;
287 mat[0][2] = 0.0f;
288 mat[1][0] = 0.0f;
289 mat[1][1] = -1.0f;
290 mat[1][2] = 0.0f;
291 mat[2][0] = 0.0f;
292 mat[2][1] = 0.0f;
293 mat[2][2] = 1.0f;
294 }
295 else {
296 copy_v3_v3(mat[0], vec);
297
298 if (is_camera || fabsf(vec[2]) < 1e-3f) {
299 mat[0][2] = 0.0f;
300 mat[2][0] = 0.0f;
301 mat[2][1] = 0.0f;
302 mat[2][2] = 1.0f;
303 cross_v3_v3v3(mat[1], mat[2], mat[0]);
304 }
305 else {
306 vec[2] = 0.0f;
307
308 cross_v3_v3v3(mat[1], mat[0], vec);
309 cross_v3_v3v3(mat[2], mat[0], mat[1]);
310 }
311 }
312 }
313 else {
314 if (fabsf(dvec[0]) < 1e-3f) {
315 flip = true;
316
317 mat[0][0] = -1.0f;
318 mat[0][1] = 0.0f;
319 mat[0][2] = 0.0f;
320 mat[1][0] = 0.0f;
321 mat[1][1] = -1.0f;
322 mat[1][2] = 0.0f;
323 mat[2][0] = 0.0f;
324 mat[2][1] = 0.0f;
325 mat[2][2] = 1.0f;
326 }
327 else {
328 copy_v3_v3(mat[1], vec);
329
330 if (is_camera || fabsf(vec[2]) < 1e-3f) {
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 cross_v3_v3v3(mat[0], mat[1], mat[2]);
336 }
337 else {
338 vec[2] = 0.0f;
339
340 cross_v3_v3v3(mat[0], vec, mat[1]);
341 cross_v3_v3v3(mat[2], mat[0], mat[1]);
342 }
343 }
344 }
345
346 normalize_v3(mat[0]);
347 normalize_v3(mat[1]);
348 normalize_v3(mat[2]);
349
350 if (is_camera) {
351 invert_m4(mat);
352
353 mul_m4_m4m4(mat, mat, obmat);
354 }
355 else {
356 if (!flip) {
357 float lmat[4][4], ilmat[4][4], rmat[3][3];
358
359 BKE_object_rot_to_mat3(ob, rmat, true);
360 invert_m3(rmat);
361 mul_m4_m4m3(mat, mat, rmat);
362
363 unit_m4(lmat);
364 copy_v3_v3(lmat[3], obmat[3]);
365 invert_m4_m4(ilmat, lmat);
366
367 mul_m4_series(mat, lmat, mat, ilmat, obmat);
368 }
369 else {
370 mul_m4_m4m4(mat, obmat, mat);
371 }
372 }
373
374 BKE_object_apply_mat4(ob, mat, false, false);
375}
376
378{
381 Scene *scene = CTX_data_scene(C);
382 MovieTracking *tracking = &clip->tracking;
383 const MovieTrackingTrack *axis_track = nullptr;
384 Object *camera = get_camera_with_movieclip(scene, clip);
385 int tot = 0;
386 float vec[3][3], mat[4][4], obmat[4][4], newmat[4][4], orig[3] = {0.0f, 0.0f, 0.0f};
387 int plane = RNA_enum_get(op->ptr, "plane");
388 float rot[4][4] = {
389 {0.0f, 0.0f, -1.0f, 0.0f},
390 {0.0f, 1.0f, 0.0f, 0.0f},
391 {1.0f, 0.0f, 0.0f, 0.0f},
392 {0.0f, 0.0f, 0.0f, 1.0f},
393 }; /* 90 degrees Y-axis rotation matrix */
394
395 if (count_selected_bundles(C) != 3) {
396 BKE_report(op->reports, RPT_ERROR, "Three tracks with bundles are needed to orient the floor");
397
398 return OPERATOR_CANCELLED;
399 }
400
401 const MovieTrackingObject *tracking_object = BKE_tracking_object_get_active(tracking);
402
403 Object *object = get_orientation_object(C);
404 if (object == nullptr) {
405 BKE_report(op->reports, RPT_ERROR, "No object to apply orientation on");
406 return OPERATOR_CANCELLED;
407 }
408
410
411 /* Get 3 bundles to use as reference. */
412 {
413 const MovieTrackingTrack *track = static_cast<const MovieTrackingTrack *>(
414 tracking_object->tracks.first);
415 while (track && tot < 3) {
416 if (track->flag & TRACK_HAS_BUNDLE && TRACK_VIEW_SELECTED(sc, track)) {
417 mul_v3_m4v3(vec[tot], mat, track->bundle_pos);
418 if (tot == 0 || track == tracking_object->active_track) {
419 copy_v3_v3(orig, vec[tot]);
420 }
421 else {
422 axis_track = track;
423 }
424 tot++;
425 }
426 track = track->next;
427 }
428 }
429
430 sub_v3_v3(vec[1], vec[0]);
431 sub_v3_v3(vec[2], vec[0]);
432
433 /* Construct ortho-normal basis. */
434 unit_m4(mat);
435 if (plane == 0) { /* floor */
436 cross_v3_v3v3(mat[0], vec[1], vec[2]);
437 copy_v3_v3(mat[1], vec[1]);
438 cross_v3_v3v3(mat[2], mat[0], mat[1]);
439 }
440 else if (plane == 1) { /* wall */
441 cross_v3_v3v3(mat[2], vec[1], vec[2]);
442 copy_v3_v3(mat[1], vec[1]);
443 cross_v3_v3v3(mat[0], mat[1], mat[2]);
444 }
445
446 normalize_v3(mat[0]);
447 normalize_v3(mat[1]);
448 normalize_v3(mat[2]);
449
450 /* Move to origin point. */
451 mat[3][0] = orig[0];
452 mat[3][1] = orig[1];
453 mat[3][2] = orig[2];
454
455 if (tracking_object->flag & TRACKING_OBJECT_CAMERA) {
456 invert_m4(mat);
457
458 BKE_object_to_mat4(object, obmat);
459 mul_m4_m4m4(mat, mat, obmat);
460 mul_m4_m4m4(newmat, rot, mat);
461 BKE_object_apply_mat4(object, newmat, false, false);
462
463 /* Make camera have positive z-coordinate. */
464 if (object->loc[2] < 0) {
465 invert_m4(rot);
466 mul_m4_m4m4(newmat, rot, mat);
467 BKE_object_apply_mat4(object, newmat, false, false);
468 }
469 }
470 else {
471 BKE_object_apply_mat4(object, mat, false, false);
472 }
473
476 Object *object_eval = DEG_get_evaluated_object(depsgraph, object);
477 BKE_object_transform_copy(object_eval, object);
478 BKE_object_where_is_calc(depsgraph, scene_eval, object_eval);
479 BKE_object_transform_copy(object, object_eval);
480
481 set_axis(scene, object, clip, tracking_object, axis_track, 'X');
482
483 DEG_id_tag_update(&clip->id, 0);
485
488
489 return OPERATOR_FINISHED;
490}
491
493{
494 static const EnumPropertyItem plane_items[] = {
495 {0, "FLOOR", 0, "Floor", "Set floor plane"},
496 {1, "WALL", 0, "Wall", "Set wall plane"},
497 {0, nullptr, 0, nullptr, nullptr},
498 };
499
500 /* identifiers */
501 ot->name = "Set Plane";
502 ot->description =
503 "Set plane based on 3 selected bundles by moving camera "
504 "(or its parent if present) in 3D space";
505 ot->idname = "CLIP_OT_set_plane";
506
507 /* api callbacks */
510
511 /* flags */
513
514 /* properties */
515 RNA_def_enum(ot->srna, "plane", plane_items, 0, "Plane", "Plane to be used for orientation");
516}
517
518/********************** set axis operator *********************/
519
521{
524 MovieTracking *tracking = &clip->tracking;
525 MovieTrackingObject *tracking_object = BKE_tracking_object_get_active(tracking);
526 Scene *scene = CTX_data_scene(C);
527 Object *object;
528 int axis = RNA_enum_get(op->ptr, "axis");
529
530 if (count_selected_bundles(C) != 1) {
532 op->reports, RPT_ERROR, "Single track with bundle should be selected to define axis");
533 return OPERATOR_CANCELLED;
534 }
535
536 object = get_orientation_object(C);
537 if (object == nullptr) {
538 BKE_report(op->reports, RPT_ERROR, "No object to apply orientation on");
539 return OPERATOR_CANCELLED;
540 }
541
542 const MovieTrackingTrack *track = static_cast<const MovieTrackingTrack *>(
543 tracking_object->tracks.first);
544 while (track) {
545 if (TRACK_VIEW_SELECTED(sc, track) && (track->flag & TRACK_HAS_BUNDLE)) {
546 break;
547 }
548 track = track->next;
549 }
550
551 set_axis(scene, object, clip, tracking_object, track, axis == 0 ? 'X' : 'Y');
552
553 DEG_id_tag_update(&clip->id, 0);
555
558
559 return OPERATOR_FINISHED;
560}
561
563{
564 static const EnumPropertyItem axis_actions[] = {
565 {0, "X", 0, "X", "Align bundle align X axis"},
566 {1, "Y", 0, "Y", "Align bundle align Y axis"},
567 {0, nullptr, 0, nullptr, nullptr},
568 };
569
570 /* identifiers */
571 ot->name = "Set Axis";
572 ot->description =
573 "Set the direction of a scene axis by rotating the camera "
574 "(or its parent if present). This assumes that the selected "
575 "track lies on a real axis connecting it to the origin";
576 ot->idname = "CLIP_OT_set_axis";
577
578 /* api callbacks */
581
582 /* flags */
584
585 /* properties */
586 RNA_def_enum(ot->srna, "axis", axis_actions, 0, "Axis", "Axis to use to align bundle along");
587}
588
589/********************** set scale operator *********************/
590
591static int do_set_scale(bContext *C, wmOperator *op, bool scale_solution, bool apply_scale)
592{
595 MovieTracking *tracking = &clip->tracking;
596 MovieTrackingObject *tracking_object = BKE_tracking_object_get_active(tracking);
597 Scene *scene = CTX_data_scene(C);
598 Object *object = nullptr;
599 Object *camera = get_camera_with_movieclip(scene, clip);
600 int tot = 0;
601 float vec[2][3], mat[4][4], scale;
602 float dist = RNA_float_get(op->ptr, "distance");
603
604 if (count_selected_bundles(C) != 2) {
605 BKE_report(op->reports, RPT_ERROR, "Two tracks with bundles should be selected to set scale");
606 return OPERATOR_CANCELLED;
607 }
608
609 if (!scale_solution && !apply_scale) {
610 object = get_orientation_object(C);
611 if (object == nullptr) {
612 BKE_report(op->reports, RPT_ERROR, "No object to apply orientation on");
613 return OPERATOR_CANCELLED;
614 }
615 }
616
618
619 LISTBASE_FOREACH (MovieTrackingTrack *, track, &tracking_object->tracks) {
620 if (TRACK_VIEW_SELECTED(sc, track)) {
621 mul_v3_m4v3(vec[tot], mat, track->bundle_pos);
622 tot++;
623 }
624 }
625
626 sub_v3_v3(vec[0], vec[1]);
627
628 if (len_v3(vec[0]) > 1e-5f) {
629 scale = dist / len_v3(vec[0]);
630 if (apply_scale) {
631 /* Apply scale on reconstructed scene itself. */
633 MovieReconstructedCamera *reconstructed_cameras;
634 int i;
635
636 LISTBASE_FOREACH (MovieTrackingTrack *, track, &tracking_object->tracks) {
637 mul_v3_fl(track->bundle_pos, scale);
638 }
639
640 reconstructed_cameras = reconstruction->cameras;
641 for (i = 0; i < reconstruction->camnr; i++) {
642 mul_v3_fl(reconstructed_cameras[i].mat[3], scale);
643 }
644
646
649 }
650 else {
651 if (tracking_object->flag & TRACKING_OBJECT_CAMERA) {
652 mul_v3_fl(object->scale, scale);
653 mul_v3_fl(object->loc, scale);
654 }
655 else if (!scale_solution) {
656 Object *solver_camera = object_solver_camera(scene, object);
657
658 object->scale[0] = object->scale[1] = object->scale[2] = 1.0f / scale;
659
660 if (solver_camera) {
661 object->scale[0] /= solver_camera->scale[0];
662 object->scale[1] /= solver_camera->scale[1];
663 object->scale[2] /= solver_camera->scale[2];
664 }
665 }
666 else {
667 tracking_object->scale = scale;
668 }
669
670 DEG_id_tag_update(&clip->id, 0);
671
672 if (object) {
674 }
675
678 }
679 }
680
681 return OPERATOR_FINISHED;
682}
683
685{
686 return do_set_scale(C, op, false, false);
687}
688
689static int set_scale_invoke(bContext *C, wmOperator *op, const wmEvent * /*event*/)
690{
693
694 if (!RNA_struct_property_is_set(op->ptr, "distance")) {
695 RNA_float_set(op->ptr, "distance", clip->tracking.settings.dist);
696 }
697
698 return set_scale_exec(C, op);
699}
700
702{
703 /* identifiers */
704 ot->name = "Set Scale";
705 ot->description = "Set scale of scene by scaling camera (or its parent if present)";
706 ot->idname = "CLIP_OT_set_scale";
707
708 /* api callbacks */
712
713 /* flags */
715
716 /* properties */
718 "distance",
719 0.0f,
720 -FLT_MAX,
721 FLT_MAX,
722 "Distance",
723 "Distance between selected tracks",
724 -100.0f,
725 100.0f);
726}
727
728/********************** set solution scale operator *********************/
729
731{
733 if (sc != nullptr) {
735 if (clip != nullptr) {
736 MovieTracking *tracking = &clip->tracking;
737 MovieTrackingObject *tracking_object = BKE_tracking_object_get_active(tracking);
738 return (tracking_object->flag & TRACKING_OBJECT_CAMERA) == 0;
739 }
740 }
741 return false;
742}
743
745{
746 return do_set_scale(C, op, true, false);
747}
748
749static int set_solution_scale_invoke(bContext *C, wmOperator *op, const wmEvent * /*event*/)
750{
753
754 if (!RNA_struct_property_is_set(op->ptr, "distance")) {
755 RNA_float_set(op->ptr, "distance", clip->tracking.settings.object_distance);
756 }
757
758 return set_solution_scale_exec(C, op);
759}
760
762{
763 /* identifiers */
764 ot->name = "Set Solution Scale";
765 ot->description =
766 "Set object solution scale using distance between "
767 "two selected tracks";
768 ot->idname = "CLIP_OT_set_solution_scale";
769
770 /* api callbacks */
774
775 /* flags */
777
778 /* properties */
780 "distance",
781 0.0f,
782 -FLT_MAX,
783 FLT_MAX,
784 "Distance",
785 "Distance between selected tracks",
786 -100.0f,
787 100.0f);
788}
789
790/********************** apply solution scale operator *********************/
791
793{
795 if (sc != nullptr) {
797 if (clip != nullptr) {
798 MovieTracking *tracking = &clip->tracking;
799 MovieTrackingObject *tracking_object = BKE_tracking_object_get_active(tracking);
800 return (tracking_object->flag & TRACKING_OBJECT_CAMERA) != 0;
801 }
802 }
803 return false;
804}
805
807{
808 return do_set_scale(C, op, false, true);
809}
810
811static int apply_solution_scale_invoke(bContext *C, wmOperator *op, const wmEvent * /*event*/)
812{
815 if (!RNA_struct_property_is_set(op->ptr, "distance")) {
816 RNA_float_set(op->ptr, "distance", clip->tracking.settings.dist);
817 }
818 return apply_solution_scale_exec(C, op);
819}
820
822{
823 /* identifiers */
824 ot->name = "Apply Solution Scale";
825 ot->description =
826 "Apply scale on solution itself to make distance between "
827 "selected tracks equals to desired";
828 ot->idname = "CLIP_OT_apply_solution_scale";
829
830 /* api callbacks */
834
835 /* flags */
837
838 /* properties */
840 "distance",
841 0.0f,
842 -FLT_MAX,
843 FLT_MAX,
844 "Distance",
845 "Distance between selected tracks",
846 -100.0f,
847 100.0f);
848}
#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)
void BKE_report(ReportList *reports, eReportType type, const char *message)
Definition report.cc:125
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])
void unit_m4(float m[4][4])
Definition rct.c:1127
#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])
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)
Object * DEG_get_evaluated_object(const Depsgraph *depsgraph, Object *object)
@ ID_RECALC_TRANSFORM
Definition DNA_ID.h:1021
@ ID_RECALC_SYNC_TO_EVAL
Definition DNA_ID.h:1085
@ CONSTRAINT_TYPE_OBJECTSOLVER
Object is a sort of wrapper for general info.
@ OB_CAMERA
@ TRACK_HAS_BUNDLE
@ TRACKING_OBJECT_CAMERA
MovieClip * ED_space_clip_get_clip(const SpaceClip *sc)
Read Guarded memory(de)allocation.
in reality light always falls off quadratically Particle Retrieve the data of the particle that spawned the object for example to give variation to multiple instances of an object Point Retrieve information about points in a point cloud Retrieve the edges of an object as it appears to Cycles topology will always appear triangulated Convert a blackbody temperature to an RGB value Normal Generate a perturbed normal from an RGB normal map image Typically used for faking highly detailed surfaces Generate an OSL shader from a file or text data block Image Sample an image file as a texture Gabor Generate Gabor noise Gradient Generate interpolated color and intensity values based on the input vector Magic Generate a psychedelic color texture Voronoi Generate Worley noise based on the distance to random points Typically used to generate textures such as or biological cells Brick Generate a procedural texture producing bricks Texture Retrieve multiple types of texture coordinates nTypically used as inputs for texture nodes Vector Convert a or normal between camera
@ OPTYPE_UNDO
Definition WM_types.hh:162
@ OPTYPE_REGISTER
Definition WM_types.hh:160
#define NA_EVALUATED
Definition WM_types.hh:551
#define NC_MOVIECLIP
Definition WM_types.hh:364
#define ND_TRANSFORM
Definition WM_types.hh:423
#define NC_OBJECT
Definition WM_types.hh:346
const Depsgraph * depsgraph
#define fabsf(x)
#define rot(x, k)
const ProjectiveReconstruction & reconstruction
Definition intersect.cc:198
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
MovieTrackingReconstruction reconstruction
MovieTrackingTrack * active_track
struct MovieTrackingTrack * next
ListBase constraints
float scale[3]
const char * name
Definition WM_types.hh:990
bool(* poll)(bContext *C) ATTR_WARN_UNUSED_RESULT
Definition WM_types.hh:1042
const char * idname
Definition WM_types.hh:992
int(* invoke)(bContext *C, wmOperator *op, const wmEvent *event) ATTR_WARN_UNUSED_RESULT
Definition WM_types.hh:1022
int(* exec)(bContext *C, wmOperator *op) ATTR_WARN_UNUSED_RESULT
Definition WM_types.hh:1006
const char * description
Definition WM_types.hh:996
StructRNA * srna
Definition WM_types.hh:1080
struct ReportList * reports
struct PointerRNA * ptr
void CLIP_OT_set_origin(wmOperatorType *ot)
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 int apply_solution_scale_exec(bContext *C, wmOperator *op)
static int set_scale_invoke(bContext *C, wmOperator *op, const wmEvent *)
static int apply_solution_scale_invoke(bContext *C, wmOperator *op, const wmEvent *)
static bool set_solution_scale_poll(bContext *C)
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 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 int set_axis_exec(bContext *C, wmOperator *op)
static Object * get_camera_with_movieclip(Scene *scene, const MovieClip *clip)
static int set_plane_exec(bContext *C, wmOperator *op)
static int set_solution_scale_invoke(bContext *C, wmOperator *op, const wmEvent *)
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 void set_axis(Scene *scene, Object *ob, const MovieClip *clip, const MovieTrackingObject *tracking_object, const MovieTrackingTrack *track, char axis)
void WM_event_add_notifier(const bContext *C, uint type, void *reference)
wmOperatorType * ot
Definition wm_files.cc:4125