Blender V4.3
transform_snap_object_camera.cc
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2023 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
9#include "BLI_math_matrix.hh"
10
11#include "BKE_bvhutils.hh"
12#include "BKE_object.hh"
13#include "BKE_tracking.h"
14
16
18
19using namespace blender;
20
22 const Object *object,
23 const float4x4 &obmat,
24 eSnapMode snap_to_flag)
25{
27
28 if (!(sctx->runtime.snap_to_flag & SCE_SNAP_TO_POINT)) {
29 return retval;
30 }
31
32 Scene *scene = sctx->scene;
33
34 MovieClip *clip = BKE_object_movieclip_get(scene, object, false);
35 if (clip == nullptr) {
36 return snap_object_center(sctx, object, obmat, snap_to_flag);
37 }
38
39 if (object->transflag & OB_DUPLI) {
40 return retval;
41 }
42
43 float4x4 orig_camera_mat;
44 BKE_tracking_get_camera_object_matrix(object, orig_camera_mat.ptr());
45
46 SnapData nearest2d(sctx);
47 nearest2d.clip_planes_enable(sctx, object);
48
49 MovieTracking *tracking = &clip->tracking;
50 LISTBASE_FOREACH (MovieTrackingObject *, tracking_object, &tracking->objects) {
51 float4x4 reconstructed_camera_imat;
52
53 if ((tracking_object->flag & TRACKING_OBJECT_CAMERA) == 0) {
54 float4x4 reconstructed_camera_mat;
56 tracking, tracking_object, scene->r.cfra, reconstructed_camera_mat.ptr());
57
58 reconstructed_camera_imat = math::invert(reconstructed_camera_mat) * obmat;
59 }
60
61 LISTBASE_FOREACH (MovieTrackingTrack *, track, &tracking_object->tracks) {
62 float3 bundle_pos;
63
64 if ((track->flag & TRACK_HAS_BUNDLE) == 0) {
65 continue;
66 }
67
68 if (tracking_object->flag & TRACKING_OBJECT_CAMERA) {
69 bundle_pos = math::transform_point(orig_camera_mat, float3(track->bundle_pos));
70 }
71 else {
72 bundle_pos = math::transform_point(reconstructed_camera_imat, float3(track->bundle_pos));
73 }
74
75 if (nearest2d.snap_point(bundle_pos)) {
76 retval = SCE_SNAP_TO_POINT;
77 }
78 }
79 }
80
81 if (retval) {
82 nearest2d.register_result(sctx, object, static_cast<const ID *>(object->data));
83 }
84 return retval;
85}
General operations, lookup, etc. for blender objects.
MovieClip * BKE_object_movieclip_get(Scene *scene, const Object *ob, bool use_default)
void BKE_tracking_get_camera_object_matrix(const struct Object *camera_object, float mat[4][4])
void BKE_tracking_camera_get_reconstructed_interpolate(struct MovieTracking *tracking, struct MovieTrackingObject *tracking_object, float framenr, float mat[4][4])
Definition tracking.cc:2146
#define LISTBASE_FOREACH(type, var, list)
@ OB_DUPLI
@ SCE_SNAP_TO_POINT
@ SCE_SNAP_TO_NONE
@ TRACK_HAS_BUNDLE
@ TRACKING_OBJECT_CAMERA
void clip_planes_enable(SnapObjectContext *sctx, const Object *ob_eval, bool skip_occlusion_plane=false)
bool snap_point(const blender::float3 &co, int index=-1)
static void register_result(SnapObjectContext *sctx, const Object *ob_eval, const ID *id_eval, const blender::float4x4 &obmat, BVHTreeNearest *r_nearest)
CartesianBasis invert(const CartesianBasis &basis)
VecBase< T, 3 > transform_point(const CartesianBasis &basis, const VecBase< T, 3 > &v)
VecBase< float, 3 > float3
Definition DNA_ID.h:413
struct SnapObjectContext::@589 runtime
const c_style_mat & ptr() const
eSnapMode snap_object_center(SnapObjectContext *sctx, const Object *ob_eval, const float4x4 &obmat, eSnapMode snap_to_flag)
eSnapMode snapCamera(SnapObjectContext *sctx, const Object *object, const float4x4 &obmat, eSnapMode snap_to_flag)