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