Blender  V3.3
tracking_test.cc
Go to the documentation of this file.
1 /* SPDX-License-Identifier: Apache-2.0 */
2 
3 #include "testing/testing.h"
4 
5 #include "DNA_tracking_types.h"
6 
7 #include "BKE_tracking.h"
8 #include "BLI_math_vec_types.hh"
9 #include "BLI_math_vector.h"
10 
11 namespace blender {
12 
13 namespace {
14 
15 class TrackingTest : public ::testing::Test {
16  protected:
17  MovieTrackingMarker *addMarkerToTrack(MovieTrackingTrack *track,
18  int frame_number,
19  const float2 &position = float2(0.0f, 0.0f),
20  int flag = 0)
21  {
22  MovieTrackingMarker marker = {{0.0f}};
23  copy_v2_v2(marker.pos, position);
24  marker.framenr = frame_number;
25  marker.flag = flag;
26  return BKE_tracking_marker_insert(track, &marker);
27  }
28 };
29 
30 } // namespace
31 
33 {
34  {
35  MovieTrackingTrack track = {nullptr};
36 
37  addMarkerToTrack(&track, 10);
38 
39  EXPECT_EQ(BKE_tracking_marker_get(&track, 0), &track.markers[0]);
40  EXPECT_EQ(BKE_tracking_marker_get(&track, 10), &track.markers[0]);
41  EXPECT_EQ(BKE_tracking_marker_get(&track, 20), &track.markers[0]);
42 
44  }
45 
46  {
47  MovieTrackingTrack track = {nullptr};
48 
49  addMarkerToTrack(&track, 1);
50  addMarkerToTrack(&track, 10);
51 
52  {
53  const MovieTrackingMarker *marker = BKE_tracking_marker_get(&track, 1);
54  EXPECT_NE(marker, nullptr);
55  EXPECT_EQ(marker->framenr, 1);
56  }
57 
58  {
59  const MovieTrackingMarker *marker = BKE_tracking_marker_get(&track, 5);
60  EXPECT_NE(marker, nullptr);
61  EXPECT_EQ(marker->framenr, 1);
62  }
63 
65  }
66 
67  {
68  {
69  MovieTrackingTrack track = {nullptr};
70 
71  addMarkerToTrack(&track, 1);
72  addMarkerToTrack(&track, 2);
73  addMarkerToTrack(&track, 10);
74 
75  EXPECT_EQ(BKE_tracking_marker_get(&track, 0), &track.markers[0]);
76  EXPECT_EQ(BKE_tracking_marker_get(&track, 1), &track.markers[0]);
77  EXPECT_EQ(BKE_tracking_marker_get(&track, 2), &track.markers[1]);
78  EXPECT_EQ(BKE_tracking_marker_get(&track, 3), &track.markers[1]);
79  EXPECT_EQ(BKE_tracking_marker_get(&track, 9), &track.markers[1]);
80  EXPECT_EQ(BKE_tracking_marker_get(&track, 10), &track.markers[2]);
81  EXPECT_EQ(BKE_tracking_marker_get(&track, 11), &track.markers[2]);
82 
84  }
85  }
86 }
87 
89 {
90  MovieTrackingTrack track = {nullptr};
91 
92  addMarkerToTrack(&track, 1);
93  addMarkerToTrack(&track, 10);
94 
95  {
96  const MovieTrackingMarker *marker = BKE_tracking_marker_get_exact(&track, 1);
97  EXPECT_NE(marker, nullptr);
98  EXPECT_EQ(marker->framenr, 1);
99  }
100 
101  {
102  const MovieTrackingMarker *marker = BKE_tracking_marker_get_exact(&track, 5);
103  EXPECT_EQ(marker, nullptr);
104  }
105 
106  BKE_tracking_track_free(&track);
107 }
108 
110 {
111  /* Simple case, no disabled markers in a way. */
112  {
113  MovieTrackingTrack track = {nullptr};
114 
115  addMarkerToTrack(&track, 1, float2(1.0f, 5.0f));
116  addMarkerToTrack(&track, 10, float2(2.0f, 1.0f));
117 
118  {
119  MovieTrackingMarker interpolated_marker;
120  EXPECT_TRUE(BKE_tracking_marker_get_interpolated(&track, 1, &interpolated_marker));
121  EXPECT_EQ(interpolated_marker.framenr, 1);
122  EXPECT_V2_NEAR(interpolated_marker.pos, float2(1.0f, 5.0f), 1e-6f);
123  }
124 
125  {
126  MovieTrackingMarker interpolated_marker;
127  EXPECT_TRUE(BKE_tracking_marker_get_interpolated(&track, 10, &interpolated_marker));
128  EXPECT_EQ(interpolated_marker.framenr, 10);
129  EXPECT_V2_NEAR(interpolated_marker.pos, float2(2.0f, 1.0f), 1e-6f);
130  }
131 
132  {
133  MovieTrackingMarker interpolated_marker;
134  EXPECT_TRUE(BKE_tracking_marker_get_interpolated(&track, 4, &interpolated_marker));
135  EXPECT_EQ(interpolated_marker.framenr, 4);
136  EXPECT_V2_NEAR(interpolated_marker.pos, float2(1.3333333f, 3.6666666f), 1e-6f);
137  }
138 
139  BKE_tracking_track_free(&track);
140  }
141 
142  /* More comprehensive test, which resembles real-life tracking scenario better. */
143  {
144  MovieTrackingTrack track = {nullptr};
145 
146  addMarkerToTrack(&track, 1, float2(1.0f, 5.0f));
147  addMarkerToTrack(&track, 2, float2(0.0f, 0.0f), MARKER_DISABLED);
148  addMarkerToTrack(&track, 9, float2(0.0f, 0.0f), MARKER_DISABLED);
149  addMarkerToTrack(&track, 10, float2(2.0f, 1.0f));
150 
151  {
152  MovieTrackingMarker interpolated_marker;
153  EXPECT_TRUE(BKE_tracking_marker_get_interpolated(&track, 1, &interpolated_marker));
154  EXPECT_EQ(interpolated_marker.framenr, 1);
155  EXPECT_V2_NEAR(interpolated_marker.pos, float2(1.0f, 5.0f), 1e-6f);
156  }
157 
158  {
159  MovieTrackingMarker interpolated_marker;
160  EXPECT_TRUE(BKE_tracking_marker_get_interpolated(&track, 10, &interpolated_marker));
161  EXPECT_EQ(interpolated_marker.framenr, 10);
162  EXPECT_V2_NEAR(interpolated_marker.pos, float2(2.0f, 1.0f), 1e-6f);
163  }
164 
165  {
166  MovieTrackingMarker interpolated_marker;
167  EXPECT_TRUE(BKE_tracking_marker_get_interpolated(&track, 4, &interpolated_marker));
168  EXPECT_EQ(interpolated_marker.framenr, 4);
169  EXPECT_V2_NEAR(interpolated_marker.pos, float2(1.3333333f, 3.6666666f), 1e-6f);
170  }
171 
172  {
173  MovieTrackingMarker interpolated_marker;
174  EXPECT_TRUE(BKE_tracking_marker_get_interpolated(&track, 9, &interpolated_marker));
175  EXPECT_EQ(interpolated_marker.framenr, 9);
176  EXPECT_V2_NEAR(interpolated_marker.pos, float2(1.888888f, 1.4444444f), 1e-6f);
177  }
178 
179  BKE_tracking_track_free(&track);
180  }
181 
182  /* Tracked/keyframed flag check. */
183  {
184  MovieTrackingTrack track = {nullptr};
185 
186  addMarkerToTrack(&track, 1, float2(1.0f, 5.0f), MARKER_TRACKED);
187  addMarkerToTrack(&track, 10, float2(2.0f, 1.0f), MARKER_TRACKED);
188 
189  {
190  MovieTrackingMarker interpolated_marker;
191  EXPECT_TRUE(BKE_tracking_marker_get_interpolated(&track, 1, &interpolated_marker));
192  EXPECT_EQ(interpolated_marker.flag, MARKER_TRACKED);
193  }
194 
195  {
196  MovieTrackingMarker interpolated_marker;
197  EXPECT_TRUE(BKE_tracking_marker_get_interpolated(&track, 10, &interpolated_marker));
198  EXPECT_EQ(interpolated_marker.flag, MARKER_TRACKED);
199  }
200 
201  {
202  MovieTrackingMarker interpolated_marker;
203  EXPECT_TRUE(BKE_tracking_marker_get_interpolated(&track, 4, &interpolated_marker));
204  EXPECT_EQ(interpolated_marker.flag, 0);
205  }
206 
207  BKE_tracking_track_free(&track);
208  }
209 }
210 
211 } // namespace blender
struct MovieTrackingMarker * BKE_tracking_marker_insert(struct MovieTrackingTrack *track, struct MovieTrackingMarker *marker)
Definition: tracking.c:1302
struct MovieTrackingMarker * BKE_tracking_marker_get_exact(struct MovieTrackingTrack *track, int framenr)
Definition: tracking.c:1457
void BKE_tracking_track_free(struct MovieTrackingTrack *track)
Definition: tracking.c:606
bool BKE_tracking_marker_get_interpolated(struct MovieTrackingTrack *track, int framenr, struct MovieTrackingMarker *r_marker)
Definition: tracking.c:1505
struct MovieTrackingMarker * BKE_tracking_marker_get(struct MovieTrackingTrack *track, int framenr)
Definition: tracking.c:1424
EXPECT_EQ(BLI_expr_pylike_eval(expr, nullptr, 0, &result), EXPR_PYLIKE_INVALID)
MINLINE void copy_v2_v2(float r[2], const float a[2])
@ MARKER_TRACKED
@ MARKER_DISABLED
vec_base< float, 2 > float2
TEST_F(TrackingTest, BKE_tracking_marker_get)
MovieTrackingMarker * markers