53#include "RNA_prototypes.hh"
143 if (channel->segments) {
147 channel = channel->next;
164 if (tracking->camera.intrinsics) {
201 if (track_src->markers) {
218 const ListBase *plane_tracks_list_src,
225 if (plane_track_src->markers) {
229 plane_track_dst->
point_tracks = MEM_cnew_array<MovieTrackingTrack *>(
239 BLI_addtail(plane_tracks_list_dst, plane_track_dst);
251 *reconstruction_dst = *reconstruction_src;
252 if (reconstruction_src->
cameras) {
263 *stabilization_dst = *stabilization_src;
273 *tracking_object_dst = *tracking_object_src;
297 const ListBase *tracking_objects_src,
305 BLI_addtail(tracking_objects_dst, tracking_object_dst);
313 *tracking_dst = *tracking_src;
326 tracking_dst->
stats =
nullptr;
331 tracking->camera.sensor_width = 35.0f;
332 tracking->camera.pixel_aspect = 1.0f;
336 tracking->settings.default_minimum_correlation = 0.75;
337 tracking->settings.default_pattern_size = 21;
338 tracking->settings.default_search_size = 71;
340 tracking->settings.default_weight = 1.0f;
341 tracking->settings.dist = 1;
342 tracking->settings.object_distance = 1;
345 tracking->stabilization.scaleinf = 1.0f;
346 tracking->stabilization.anchor_frame = 1;
347 zero_v2(tracking->stabilization.target_pos);
348 tracking->stabilization.target_rot = 0.0f;
349 tracking->stabilization.scale = 1.0f;
351 tracking->stabilization.act_track = 0;
352 tracking->stabilization.act_rot_track = 0;
353 tracking->stabilization.tot_track = 0;
354 tracking->stabilization.tot_rot_track = 0;
356 tracking->stabilization.scaleinf = 1.0f;
357 tracking->stabilization.locinf = 1.0f;
358 tracking->stabilization.rotinf = 1.0f;
359 tracking->stabilization.maxscale = 2.0f;
394 float lens = tracking->camera.focal * tracking->camera.sensor_width /
float(winx);
395 float viewfac, pixsize,
left, right, bottom,
top, clipsta, clipend;
397 float ycor = 1.0f / tracking->camera.pixel_aspect;
398 float shiftx, shifty, winside =
float(
min_ii(winx, winy));
406 viewfac = (lens * winx) / tracking->camera.sensor_width;
409 viewfac = (ycor * lens * winy) / tracking->camera.sensor_width;
412 pixsize = clipsta / viewfac;
414 left = -0.5f *
float(winx) + shiftx * winside;
415 bottom = -0.5f * (ycor) *
float(winy) + shifty * winside;
416 right = 0.5f *
float(winx) + shiftx * winside;
417 top = 0.5f * (ycor) *
float(winy) + shifty * winside;
424 perspective_m4(winmat, left, right, bottom, top, clipsta, clipend);
449 next_track = track->
next;
488 if (track->prev ==
nullptr) {
511 track->
margin = settings->default_margin;
514 track->
flag = settings->default_flag;
516 track->
weight = settings->default_weight;
538 const float half_pattern_px = settings->default_pattern_size / 2.0f;
539 const float half_search_px = settings->default_search_size / 2.0f;
541 const float pattern_size[2] = {half_pattern_px / width, half_pattern_px / height};
542 const float search_size[2] = {half_search_px / width, half_search_px / height};
544 memset(&marker, 0,
sizeof(marker));
570 new_track = MEM_cnew<MovieTrackingTrack>(
"tracking_track_duplicate new_track");
573 new_track->
next = new_track->
prev =
nullptr;
580 new_track->
flag &= ~TRACK_USE_2D_STAB;
581 new_track->
flag &= ~TRACK_USE_2D_STAB_ROT;
593 sizeof(track->
name));
608 const int last_marker_index = track->
markersnr - 1;
614 const int num_tracks,
618 *r_first_frame = INT_MAX;
619 *r_last_frame = INT_MIN;
620 for (
int i = 0; i < num_tracks; ++i) {
622 int track_first_frame, track_last_frame;
624 *r_first_frame =
min_ii(*r_first_frame, track_first_frame);
625 *r_last_frame =
max_ii(*r_last_frame, track_last_frame);
631 int num_selected_tracks = 0;
634 ++num_selected_tracks;
637 return num_selected_tracks;
655 if (num_selected_tracks == 0) {
660 num_selected_tracks,
"selected tracks array");
661 int source_track_index = 0;
666 source_tracks[source_track_index] = track;
667 ++source_track_index;
670 *r_num_tracks = num_selected_tracks;
672 return source_tracks;
699 track->
flag &= ~flag;
723 for (
int a = 1; a < track->
markersnr; a++) {
740 for (
int a = track->
markersnr - 1; a >= 0; a--) {
764 marker_new = *marker;
797 int i = 0, a = 0,
b = 0, tot;
801 markers = MEM_cnew_array<MovieTrackingMarker>(tot,
"tmp tracking joined tracks");
833 marker_a = &src_track->
markers[a];
854 for (
int j = 0; j <
len; j++) {
858 fac = 1.0f / (
len - 1) * j;
865 marker_a = &src_track->
markers[a];
897 dst_track->
markers = MEM_cnew_array<MovieTrackingMarker>(i,
"tracking joined tracks");
917 for (
int corner = 0; corner < 4; ++corner) {
926 dst_marker->
flag &= ~MARKER_DISABLED;
928 dst_marker->
flag &= ~MARKER_TRACKED;
935 for (
int corner = 0; corner < 4; ++corner) {
946 const int num_src_tracks)
949 int first_frame, last_frame;
951 src_tracks, num_src_tracks, &first_frame, &last_frame);
952 if (last_frame < first_frame) {
955 const int num_frames = last_frame - first_frame + 1;
959 num_frames,
"tracks average accumulator");
960 int *counters = MEM_cnew_array<int>(num_frames,
"tracks accumulator counters");
961 for (
int frame = first_frame; frame <= last_frame; ++frame) {
962 const int frame_index = frame - first_frame;
963 accumulator[frame_index].
framenr = frame;
968 for (
int track_index = 0; track_index < num_src_tracks; ++track_index) {
970 for (
int frame = first_frame; frame <= last_frame; ++frame) {
975 const int frame_index = frame - first_frame;
977 ++counters[frame_index];
982 for (
int frame = first_frame; frame <= last_frame; ++frame) {
984 const int frame_index = frame - first_frame;
985 if (!counters[frame_index]) {
988 const float multiplier = 1.0f /
float(counters[frame_index]);
1003 const int num_src_tracks)
1007 for (
int track_index = 0; track_index < num_src_tracks; track_index++) {
1015 const int num_src_tracks)
1017 if (num_src_tracks == 0) {
1026 int selection_index,
1034 if (cur == selection_index) {
1035 *r_tracksbase = &
object->tracks;
1044 *r_tracksbase =
nullptr;
1070 frame = frame->
next;
1078 layer = layer->
next;
1094 size_t index_end = size_t(y) * data->mask_width + x_end;
1096 data->mask[index] = 1.0f;
1097 }
while (++index != index_end);
1101 const int frame_height,
1102 const float region_min[2],
1105 const int mask_width,
1106 const int mask_height)
1112 data.mask_width = mask_width;
1113 data.mask_height = mask_height;
1123 mask_points[i][0] = stroke_points[i].
x * frame_width - region_min[0];
1124 mask_points[i][1] = stroke_points[i].
y * frame_height - region_min[1];
1130 stroke = stroke->
next;
1132 frame = frame->
next;
1137 const int frame_height,
1138 const float region_min[2],
1139 const float region_max[2],
1142 float *mask =
nullptr;
1144 if (layer !=
nullptr) {
1145 const int mask_width = region_max[0] - region_min[0];
1146 const int mask_height = region_max[1] - region_min[1];
1147 mask = MEM_cnew_array<float>(mask_width * mask_height,
"track mask");
1149 frame_width, frame_height, region_min, layer, mask, mask_width, mask_height);
1155 const int frame_height,
1160 const float region_min[2] = {
1164 const float region_max[2] = {
1169 frame_width, frame_height, region_min, region_max, track);
1176 const FCurve *weight_fcurve;
1177 float weight = track->
weight;
1180 &clip->id, track, &RNA_MovieTrackingTrack,
"weight", 0,
nullptr);
1182 if (weight_fcurve) {
1246 *old_marker = *marker;
1267 track->
markers = MEM_cnew<MovieTrackingMarker>(
"MovieTracking markers");
1271 memmove(track->
markers + a + 2,
1276 track->
markers[a + 1] = *marker;
1278 return &track->
markers[a + 1];
1285 while (a < track->markersnr) {
1310 float pat_min[2], pat_max[2];
1313 for (
int a = 0; a < 2; a++) {
1315 for (
int b = 0;
b < 4;
b++) {
1320 for (
int b = 0;
b < 4;
b++) {
1329 float pat_min[2], pat_max[2];
1332 for (
int a = 0; a < 2; a++) {
1340 float pat_min[2], pat_max[2];
1346 for (
int a = 0; a < 2; a++) {
1360 const int num_markers = track->
markersnr;
1362 if (num_markers == 0) {
1363 BLI_assert_msg(0,
"Detected degenerated track, should never happen.");
1367 int left_boundary = 0;
1368 int right_boundary = num_markers;
1369 while (left_boundary < right_boundary) {
1370 const int median_index = (left_boundary + right_boundary) / 2;
1373 if (marker->
framenr == framenr) {
1377 if (marker->
framenr < framenr) {
1378 left_boundary = median_index + 1;
1382 right_boundary = median_index - 1;
1386 const int closest_index =
clamp_i(right_boundary, 0, num_markers - 1);
1388 return &track->
markers[closest_index];
1395 if (marker->
framenr != framenr) {
1406 if (marker->
framenr != framenr) {
1409 marker_new = *marker;
1427 while (current_marker >= track->
markers && current_marker <= last_marker) {
1429 return current_marker;
1431 current_marker += direction;
1442 if (closest_marker ==
nullptr) {
1446 *r_marker = *closest_marker;
1451 track, closest_marker, -1);
1452 if (left_marker ==
nullptr) {
1457 track, closest_marker + 1, 1);
1458 if (right_marker ==
nullptr) {
1462 if (left_marker == right_marker) {
1463 *r_marker = *left_marker;
1467 const float factor =
float(framenr - left_marker->
framenr) /
1472 for (
int i = 0; i < 4; i++) {
1485 if (framenr == left_marker->
framenr) {
1486 r_marker->
flag = left_marker->
flag;
1488 else if (framenr == right_marker->
framenr) {
1489 r_marker->
flag = right_marker->
flag;
1514 if (marker != marker_last) {
1522 float fac = (framenr -
int(framenr)) / (marker_next->
framenr - marker->
framenr);
1549 float tracks_min[2], tracks_max[2];
1550 int num_selected_tracks = 0;
1559 float pattern_min[2], pattern_max[2];
1565 num_selected_tracks++;
1569 if (num_selected_tracks < 4) {
1574 plane_track = MEM_cnew<MovieTrackingPlaneTrack>(
"new plane track");
1582 plane_track->
point_tracks = MEM_cnew_array<MovieTrackingTrack *>(num_selected_tracks,
1583 "new plane tracks array");
1584 int track_index = 0;
1594 plane_marker.
framenr = framenr;
1595 plane_marker.
flag = 0;
1600 plane_marker.
corners[1][0] = tracks_max[0];
1601 plane_marker.
corners[1][1] = tracks_min[1];
1602 plane_marker.
corners[3][0] = tracks_min[0];
1603 plane_marker.
corners[3][1] = tracks_max[1];
1622 sizeof(plane_track->
name));
1637 plane_track->flag &= ~SELECT;
1662 for (
int i = 0, track_index = 0; i < plane_track->
point_tracksnr; i++) {
1664 new_point_tracks[track_index++] = plane_track->
point_tracks[i];
1728 if (old_plane_marker) {
1730 *old_plane_marker = *plane_marker;
1732 return old_plane_marker;
1750 memmove(plane_track->
markers + a + 2,
1755 plane_track->
markers[a + 1] = *plane_marker;
1757 return &plane_track->
markers[a + 1];
1764 while (a < plane_track->markersnr) {
1767 memmove(plane_track->
markers + a,
1776 plane_track->
markers =
nullptr;
1801 if (framenr < plane_track->
markers[0].framenr) {
1802 return &plane_track->
markers[0];
1810 while (a < plane_track->markersnr && plane_track->
markers[a].
framenr <= framenr) {
1814 return &plane_track->
markers[a];
1820 return &plane_track->
markers[a - 1];
1827 return &plane_track->
markers[a];
1834 return &plane_track->
markers[a];
1842 if (plane_marker->
framenr != framenr) {
1846 return plane_marker;
1854 if (plane_marker->
framenr != framenr) {
1857 plane_marker_new = *plane_marker;
1858 plane_marker_new.
framenr = framenr;
1863 return plane_marker;
1868 float corners[4][2])
1872 if (marker != marker_last) {
1875 float fac = (framenr -
int(framenr)) / (marker_next->
framenr - marker->
framenr);
1876 for (
int i = 0; i < 4; i++) {
1881 for (
int i = 0; i < 4; i++) {
1887 for (
int i = 0; i < 4; i++) {
1901 if (tracking->tot_object == 0) {
1913 tracking->tot_object++;
1916 tracking_object->
scale = 1.0f;
1923 return tracking_object;
1928 const int index =
BLI_findindex(&tracking->objects, tracking_object);
1942 tracking->tot_object--;
1945 tracking->objectnr = index - 1;
1948 tracking->objectnr = 0;
1963 sizeof(tracking_object->
name));
1969 if (
STREQ(tracking_object->name, name)) {
1970 return tracking_object;
1986 return tracking_object;
1997 if (
STREQ(track->name, name)) {
2009 if (
STREQ(plane_track->name, name)) {
2032 if (framenr < cameras[0].framenr) {
2052 if (cameras[a].framenr >= framenr) {
2056 while (a >= 0 && a < reconstruction->camnr) {
2057 int cfra = cameras[a].
framenr;
2061 if (d > 0 && cfra > framenr) {
2070 if (d < 0 && cfra < framenr) {
2079 if (cfra == framenr) {
2103 MovieTracking *tracking,
int winx,
int winy,
float *shiftx,
float *shifty)
2105 float principal_px[2];
2107 tracking->camera.principal_point, winx, winy, principal_px);
2111 *shiftx = (0.5f * winx - principal_px[0]) / winx;
2112 *shifty = (0.5f * winy - principal_px[1]) / winx;
2118 float focal = tracking->camera.focal;
2120 camera->sensor_x = tracking->camera.sensor_width;
2122 camera->lens = focal * camera->sensor_x / width;
2124 scene->r.xsch = width;
2125 scene->r.ysch = height;
2127 scene->r.xasp = tracking->camera.pixel_aspect;
2128 scene->r.yasp = 1.0f;
2161 if ((a < reconstruction->camnr - 1) && (cameras[a].framenr != framenr)) {
2163 (cameras[a + 1].framenr - cameras[a].framenr);
2174 float r_principal_point_pixel[2])
2178 int frame_width, frame_height;
2183 camera->principal_point, frame_width, frame_height, r_principal_point_pixel);
2187 const float principal_point_pixel[2])
2191 int frame_width, frame_height;
2196 principal_point_pixel, frame_width, frame_height, camera->principal_point);
2202 if (a->pixel_aspect !=
b->pixel_aspect || a->focal !=
b->focal ||
2208 if (a->distortion_model !=
b->distortion_model) {
2212 switch (a->distortion_model) {
2214 return a->k1 ==
b->k1 && a->k2 ==
b->k2 && a->k3 ==
b->k3;
2216 return a->division_k1 ==
b->division_k1 && a->division_k2 ==
b->division_k2;
2218 return a->nuke_k1 ==
b->nuke_k1 && a->nuke_k2 ==
b->nuke_k2;
2220 return a->brown_k1 ==
b->brown_k1 && a->brown_k2 ==
b->brown_k2 &&
2221 a->brown_k3 ==
b->brown_k3 && a->brown_k4 ==
b->brown_k4 &&
2222 a->brown_p1 ==
b->brown_p1 && a->brown_p2 ==
b->brown_p2;
2232 switch (camera->distortion_model) {
2234 return get_default_hash(camera->distortion_model,
2235 float2(camera->pixel_aspect, camera->focal),
2236 float2(camera->principal_point),
2237 float3(camera->k1, camera->k2, camera->k3));
2239 return get_default_hash(camera->distortion_model,
2240 float2(camera->pixel_aspect, camera->focal),
2241 float2(camera->principal_point),
2242 float2(camera->division_k1, camera->division_k2));
2244 return get_default_hash(camera->distortion_model,
2245 float2(camera->pixel_aspect, camera->focal),
2246 float2(camera->principal_point),
2247 float2(camera->nuke_k1, camera->nuke_k2));
2249 return get_default_hash(
2250 float2(camera->pixel_aspect, camera->focal),
2251 float2(camera->principal_point),
2252 float4(camera->brown_k1, camera->brown_k2, camera->brown_k3, camera->brown_k4),
2253 float2(camera->brown_p1, camera->brown_p2));
2264 int calibration_width,
2265 int calibration_height)
2271 tracking, calibration_width, calibration_height, &camera_intrinsics_options);
2273 distortion = MEM_cnew<MovieDistortion>(
"BKE_tracking_distortion_create");
2280 distortion->principal_px);
2281 distortion->pixel_aspect = camera->pixel_aspect;
2282 distortion->focal = camera->focal;
2289 int calibration_width,
2290 int calibration_height)
2295 tracking, calibration_width, calibration_height, &camera_intrinsics_options);
2301 distortion->principal_px);
2302 distortion->pixel_aspect = camera->pixel_aspect;
2303 distortion->focal = camera->focal;
2317 new_distortion = MEM_cnew<MovieDistortion>(
"BKE_tracking_distortion_create");
2318 *new_distortion = *distortion;
2321 return new_distortion;
2327 int calibration_width,
2328 int calibration_height,
2388 const float aspy = 1.0f / distortion->pixel_aspect;
2391 float inv_focal = 1.0f / distortion->focal;
2392 double x = (co[0] - distortion->principal_px[0]) * inv_focal,
2393 y = (co[1] - distortion->principal_px[1] * aspy) * inv_focal;
2406 double x = co[0], y = co[1];
2409 const float aspy = 1.0f / distortion->pixel_aspect;
2410 r_co[0] =
float(x) * distortion->focal + distortion->principal_px[0];
2411 r_co[1] =
float(y) * distortion->focal + distortion->principal_px[1] * aspy;
2425 const float aspy = 1.0f / tracking->camera.
pixel_aspect;
2432 float principal_px[2];
2437 double x = (co[0] - principal_px[0]) / camera->focal,
2438 y = (co[1] - principal_px[1] * aspy) / camera->focal;
2452 const float aspy = 1.0f / tracking->camera.
pixel_aspect;
2459 double x = co[0], y = co[1];
2463 float principal_px[2];
2467 r_co[0] =
float(x) * camera->focal + principal_px[0];
2468 r_co[1] =
float(y) * camera->focal + principal_px[1] * aspy;
2473 int calibration_width,
2474 int calibration_height,
2479 if (camera->intrinsics ==
nullptr) {
2481 tracking, calibration_width, calibration_height);
2495 int calibration_width,
2496 int calibration_height,
2501 if (camera->intrinsics ==
nullptr) {
2503 tracking, calibration_width, calibration_height);
2519 const bool undistort,
2522 float pos[2], warped_pos[2];
2523 const int coord_delta = 5;
2537 r_delta[0] = r_delta[1] = -
FLT_MAX;
2539 for (
int a = rect->
xmin; a <= rect->
xmax + coord_delta; a += coord_delta) {
2540 if (a > rect->
xmax) {
2562 if (a >= rect->
xmax) {
2567 for (
int a = rect->
ymin; a <= rect->
ymax + coord_delta; a += coord_delta) {
2568 if (a > rect->
ymax) {
2590 if (a >= rect->
ymax) {
2602 const bool grayscale)
2612 const int frame_height,
2613 const ImBuf *search_ibuf,
2616 const bool from_anchor,
2617 const bool use_mask,
2618 const int num_samples_x,
2619 const int num_samples_y,
2622 ImBuf *pattern_ibuf;
2623 double src_pixel_x[5], src_pixel_y[5];
2624 double warped_position_x, warped_position_y;
2625 float *mask =
nullptr;
2627 if (num_samples_x <= 0 || num_samples_y <= 0) {
2635 frame_width, frame_height, marker, src_pixel_x, src_pixel_y);
2645 for (
int a = 0; a < 5; a++) {
2646 src_pixel_x[a] +=
double((track->
offset[0] * frame_width) -
2647 int(track->
offset[0] * frame_width));
2648 src_pixel_y[a] +=
double((track->
offset[1] * frame_height) -
2649 int(track->
offset[1] * frame_height));
2652 if (track->
offset[0] < 0.0f) {
2653 src_pixel_x[a] += 1.0;
2655 if (track->
offset[1] < 0.0f) {
2656 src_pixel_y[a] += 1.0;
2677 &warped_position_y);
2691 &warped_position_y);
2695 pos[0] = warped_position_x;
2696 pos[1] = warped_position_y;
2703 return pattern_ibuf;
2709 const bool anchored,
2710 const bool disable_channels)
2712 ImBuf *pattern_ibuf, *search_ibuf;
2713 float pat_min[2], pat_max[2];
2714 int num_samples_x, num_samples_y;
2718 num_samples_x = (pat_max[0] - pat_min[0]) * ibuf->
x;
2719 num_samples_y = (pat_max[1] - pat_min[1]) * ibuf->
y;
2738 pattern_ibuf =
nullptr;
2741 return pattern_ibuf;
2747 const bool anchored,
2748 const bool disable_channels)
2752 float search_origin[2];
2756 x = search_origin[0];
2757 y = search_origin[1];
2760 x += track->
offset[0] * ibuf->
x;
2761 y += track->
offset[1] * ibuf->
y;
2767 if (
w <= 0 || h <= 0) {
2775 if (disable_channels) {
2788 const int frame_width,
2789 const int frame_height)
2791 const float a_px[2] = {a[0] * frame_width, a[1] * frame_height};
2792 const float b_px[2] = {
b[0] * frame_width,
b[1] * frame_height};
2804 const int frame_width = frame_ibuf->
x;
2805 const int frame_height = frame_ibuf->
y;
2809 corners[0], corners[3], frame_width, frame_height);
2811 corners[1], corners[2], frame_width, frame_height);
2815 corners[3], corners[2], frame_width, frame_height);
2817 corners[0], corners[1], frame_width, frame_height);
2820 const int num_samples_x =
max_ii(top_side_len_px, bottom_side_len_px);
2821 const int num_samples_y =
max_ii(left_side_len_px, right_side_len_px);
2828 const double src_pixel_x[4] = {corners[0][0] * frame_width,
2829 corners[1][0] * frame_width,
2830 corners[2][0] * frame_width,
2831 corners[3][0] * frame_width};
2832 const double src_pixel_y[4] = {corners[0][1] * frame_height,
2833 corners[1][1] * frame_height,
2834 corners[2][1] * frame_height,
2835 corners[3][1] * frame_height};
2838 double warped_position_x, warped_position_y;
2853 &warped_position_y);
2867 &warped_position_y);
2877 ImBuf *ibuf,
bool disable_red,
bool disable_green,
bool disable_blue,
bool grayscale)
2879 if (!disable_red && !disable_green && !disable_blue && !grayscale) {
2886 float scale = (disable_red ? 0.0f : 0.2126f) + (disable_green ? 0.0f : 0.7152f) +
2887 (disable_blue ? 0.0f : 0.0722f);
2889 for (
int y = 0; y < ibuf->
y; y++) {
2890 for (
int x = 0; x < ibuf->
x; x++) {
2891 int pixel = ibuf->
x * y +
x;
2895 float r = disable_red ? 0.0f : rrgbf[0];
2896 float g = disable_green ? 0.0f : rrgbf[1];
2897 float b = disable_blue ? 0.0f : rrgbf[2];
2900 float gray = (0.2126f * r + 0.7152f * g + 0.0722f *
b) / scale;
2902 rrgbf[0] = rrgbf[1] = rrgbf[2] = gray;
2912 uchar r = disable_red ? 0 : rrgb[0];
2913 uchar g = disable_green ? 0 : rrgb[1];
2914 uchar b = disable_blue ? 0 : rrgb[2];
2917 float gray = (0.2126f * r + 0.7152f * g + 0.0722f *
b) / scale;
2919 rrgb[0] = rrgb[1] = rrgb[2] = gray;
3002 bool inverse,
bool a_markerless,
int a_value,
bool b_markerless,
int b_value)
3004 if (a_markerless && b_markerless) {
3020 if (a_value < b_value) {
3026 if (a_value > b_value) {
3134 bool first_not_disabled_marker_framenr_set;
3136 channel->tot_segment = 0;
3137 channel->max_segment = 0;
3138 channel->total_frames = 0;
3140 channel->first_not_disabled_marker_framenr = 0;
3141 channel->last_not_disabled_marker_framenr = 0;
3149 first_not_disabled_marker_framenr_set =
false;
3150 while (i < track->markersnr) {
3157 while (i < track->markersnr) {
3160 if (marker->
framenr != prev_fra + 1) {
3167 if (!first_not_disabled_marker_framenr_set) {
3168 channel->first_not_disabled_marker_framenr = marker->
framenr;
3169 first_not_disabled_marker_framenr_set =
true;
3171 channel->last_not_disabled_marker_framenr = marker->
framenr;
3178 channel->tot_segment++;
3185 if (!channel->tot_segment) {
3189 channel->segments = MEM_cnew_array<int>(2 * channel->tot_segment,
"tracking channel segments");
3194 while (i < track->markersnr) {
3202 while (i < track->markersnr) {
3205 if (marker->
framenr != prev_fra + 1) {
3213 channel->total_frames++;
3218 channel->segments[2 * segment] = start_marker->
framenr;
3219 channel->segments[2 * segment + 1] = start_marker->
framenr +
len;
3221 channel->max_segment =
max_ii(channel->max_segment,
len);
3240 if (!show_hidden && (track->flag &
TRACK_HIDDEN) != 0) {
3249 "tracking dopesheet channel");
3250 channel->track = track;
3253 SNPRINTF(channel->name,
"%s (%.4f)", track->name, track->error);
3256 STRNCPY(channel->name, track->name);
3337 int frames, start_frame = INT_MAX, end_frame = -INT_MAX;
3338 int *per_frame_counter;
3339 int prev_coverage, last_segment_frame;
3343 start_frame =
min_ii(start_frame, track->markers[0].framenr);
3344 end_frame =
max_ii(end_frame, track->markers[track->markersnr - 1].framenr);
3347 if (start_frame > end_frame) {
3352 frames = end_frame - start_frame + 1;
3355 per_frame_counter = MEM_cnew_array<int>(frames,
"per frame track counter");
3359 for (
int i = 0; i < track->markersnr; i++) {
3364 per_frame_counter[marker->
framenr - start_frame]++;
3371 last_segment_frame = start_frame;
3374 if (!per_frame_counter[0]) {
3378 for (
int i = 1; i < frames; i++) {
3382 if (i == frames - 1 && !per_frame_counter[i]) {
3386 if (coverage != prev_coverage || i == frames - 1) {
3388 int end_segment_frame = i - 1 + start_frame;
3390 if (end_segment_frame == last_segment_frame) {
3391 end_segment_frame++;
3394 coverage_segment = MEM_cnew<MovieTrackingDopesheetCoverageSegment>(
3395 "tracking coverage segment");
3396 coverage_segment->
coverage = prev_coverage;
3397 coverage_segment->
start_frame = last_segment_frame;
3398 coverage_segment->
end_frame = end_segment_frame;
3402 last_segment_frame = end_segment_frame;
3405 prev_coverage = coverage;
3415 dopesheet->
ok =
false;
3425 if (dopesheet->
ok) {
3438 dopesheet->
ok =
true;
3446 return tracking_object;
3456 if (
BLI_findindex(&tracking_object->plane_tracks, plane_track) != -1) {
3457 return tracking_object;
3466 size_t rna_path_maxncpy)
3471 if (tracking_object ==
nullptr) {
3472 BLI_snprintf(rna_path, rna_path_maxncpy,
"tracking.tracks[\"%s\"]", track_name_esc);
3475 char object_name_esc[
MAX_NAME * 2];
3479 "tracking.objects[\"%s\"].tracks[\"%s\"]",
3488 size_t rna_path_maxncpy)
3491 if (tracking_object ==
nullptr) {
3492 BLI_strncpy(rna_path,
"tracking.tracks", rna_path_maxncpy);
3495 char object_name_esc[
MAX_NAME * 2];
3497 BLI_snprintf(rna_path, rna_path_maxncpy,
"tracking.objects[\"%s\"]", object_name_esc);
3504 size_t rna_path_maxncpy)
3510 if (tracking_object ==
nullptr) {
3511 BLI_snprintf(rna_path, rna_path_maxncpy,
"tracking.plane_tracks[\"%s\"]", track_name_esc);
3514 char object_name_esc[
MAX_NAME * 2];
3518 "tracking.objects[\"%s\"].plane_tracks[\"%s\"]",
3527 size_t rna_path_maxncpy)
3531 if (tracking_object ==
nullptr) {
3532 BLI_strncpy(rna_path,
"tracking.plane_tracks", rna_path_maxncpy);
3535 char object_name_esc[
MAX_NAME * 2];
3538 rna_path, rna_path_maxncpy,
"tracking.objects[\"%s\"].plane_tracks", object_name_esc);
float evaluate_fcurve(const FCurve *fcu, float evaltime)
FCurve * id_data_find_fcurve(ID *id, void *data, StructRNA *type, const char *prop_name, int index, bool *r_driven)
@ LIB_ID_CREATE_NO_USER_REFCOUNT
void BKE_movieclip_get_size(struct MovieClip *clip, const struct MovieClipUser *user, int *r_width, int *r_height)
float BKE_movieclip_remap_clip_to_scene_frame(const struct MovieClip *clip, float framenr)
General operations, lookup, etc. for blender objects.
void BKE_object_where_is_calc_mat4(const Object *ob, float r_obmat[4][4])
#define TRACK_SELECTED(track)
#define BLI_assert_unreachable()
#define BLI_assert_msg(a, msg)
void BLI_bitmap_draw_2d_poly_v2i_n(int xmin, int ymin, int xmax, int ymax, blender::Span< blender::int2 > verts, void(*callback)(int x, int x_end, int y, void *), void *user_data)
GHash * BLI_ghash_ptr_new(const char *info) ATTR_MALLOC ATTR_WARN_UNUSED_RESULT
void * BLI_ghash_lookup(const GHash *gh, const void *key) ATTR_WARN_UNUSED_RESULT
void BLI_ghash_insert(GHash *gh, void *key, void *val)
void BLI_ghash_free(GHash *gh, GHashKeyFreeFP keyfreefp, GHashValFreeFP valfreefp)
BLI_INLINE bool BLI_listbase_is_empty(const struct ListBase *lb)
#define LISTBASE_FOREACH(type, var, list)
void BLI_freelinkN(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
#define LISTBASE_FOREACH_MUTABLE(type, var, list)
BLI_INLINE void BLI_listbase_clear(struct ListBase *lb)
void * BLI_findlink(const struct ListBase *listbase, int number) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
void void BLI_freelistN(struct ListBase *listbase) ATTR_NONNULL(1)
void void BLI_listbase_sort(struct ListBase *listbase, int(*cmp)(const void *, const void *)) ATTR_NONNULL(1
void BLI_addtail(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
int BLI_findindex(const struct ListBase *listbase, const void *vlink) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
int BLI_listbase_count(const struct ListBase *listbase) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
MINLINE float max_ff(float a, float b)
MINLINE int min_ii(int a, int b)
MINLINE float min_ff(float a, float b)
MINLINE int max_ii(int a, int b)
MINLINE int clamp_i(int value, int min, int max)
void perspective_m4(float mat[4][4], float left, float right, float bottom, float top, float nearClip, float farClip)
static constexpr int image_width
static constexpr int image_height
void mul_m4_m4m4(float R[4][4], const float A[4][4], const float B[4][4])
void blend_m4_m4m4(float out[4][4], const float dst[4][4], const float src[4][4], float srcweight)
void unit_m4(float m[4][4])
void scale_m4_fl(float R[4][4], float scale)
void copy_m4_m4(float m1[4][4], const float m2[4][4])
bool invert_m4_m4(float inverse[4][4], const float mat[4][4])
MINLINE float len_v2v2(const float v1[2], const float v2[2]) ATTR_WARN_UNUSED_RESULT
MINLINE void mul_v2_fl(float r[2], float f)
void interp_v2_v2v2(float r[2], const float a[2], const float b[2], float t)
MINLINE void copy_v2_v2(float r[2], const float a[2])
void minmax_v2v2_v2(float min[2], float max[2], const float vec[2])
MINLINE void add_v2_v2(float r[2], const float a[2])
MINLINE void negate_v2_v2(float r[2], const float a[2])
MINLINE bool equals_v2v2(const float v1[2], const float v2[2]) ATTR_WARN_UNUSED_RESULT
MINLINE void sub_v2_v2v2(float r[2], const float a[2], const float b[2])
MINLINE void zero_v2(float r[2])
bool is_finite_v2(const float v[2]) ATTR_WARN_UNUSED_RESULT
#define STRNCPY(dst, src)
#define SNPRINTF(dst, format,...)
int char char int BLI_strcasecmp(const char *s1, const char *s2) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1
size_t BLI_snprintf(char *__restrict dst, size_t dst_maxncpy, const char *__restrict format,...) ATTR_NONNULL(1
size_t BLI_str_escape(char *__restrict dst, const char *__restrict src, size_t dst_maxncpy) ATTR_NONNULL(1
char * BLI_strncpy(char *__restrict dst, const char *__restrict src, size_t dst_maxncpy) ATTR_NONNULL(1
void BLI_uniquename(const struct ListBase *list, void *vlink, const char *defname, char delim, int name_offset, size_t name_maxncpy) ATTR_NONNULL(1
#define INIT_MINMAX2(min, max)
#define CTX_DATA_(context, msgid)
#define BLT_I18NCONTEXT_ID_MOVIECLIP
typedef double(DMatrix)[4][4]
#define DNA_struct_default_get(struct_name)
Object is a sort of wrapper for general info.
@ TRACKING_FILTER_BILINEAR
@ TRACKING_DOPE_SORT_START
@ TRACKING_DOPE_SORT_AVERAGE_ERROR
@ TRACKING_DOPE_SORT_LONGEST
@ TRACKING_DOPE_SORT_NAME
@ TRACKING_DOPE_SORT_TOTAL
@ TRACKING_SHOW_STAB_TRACKS
@ TRACKING_DISTORTION_MODEL_DIVISION
@ TRACKING_DISTORTION_MODEL_POLYNOMIAL
@ TRACKING_DISTORTION_MODEL_NUKE
@ TRACKING_DISTORTION_MODEL_BROWN
@ TRACK_PREVIEW_GRAYSCALE
@ TRACK_ALGORITHM_FLAG_USE_BRUTE
@ TRACKING_COVERAGE_ACCEPTABLE
@ TRACK_MOTION_MODEL_TRANSLATION
@ TRACKING_DOPE_SELECTED_ONLY
@ TRACKING_DOPE_SORT_INVERSE
@ TRACKING_DOPE_SHOW_HIDDEN
void imb_freerectImBuf(ImBuf *ibuf)
ImBuf * IMB_dupImBuf(const ImBuf *ibuf1)
void IMB_rectcpy(ImBuf *dbuf, const ImBuf *sbuf, int destx, int desty, int srcx, int srcy, int width, int height)
Contains defines and structs used throughout the imbuf module.
Read Guarded memory(de)allocation.
#define MEM_reallocN(vmemh, len)
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
btMatrix3x3 inverse() const
Return the inverse of the matrix.
SIMD_FORCE_INLINE const btScalar & w() const
Return the w value.
IndexRange index_range() const
local_group_size(16, 16) .push_constant(Type b
draw_view in_light_buf[] float
draw_view push_constant(Type::INT, "radiance_src") .push_constant(Type capture_info_buf storage_buf(1, Qualifier::READ, "ObjectBounds", "bounds_buf[]") .push_constant(Type draw_view int
struct ImBuf * IMB_allocImBuf(unsigned int, unsigned int, unsigned char, unsigned int)
void IMB_freeImBuf(ImBuf *)
const vector< Marker > & markers
void libmv_cameraIntrinsicsUndistortFloat(const libmv_CameraIntrinsics *libmv_intrinsics, const float *source_image, int width, int height, float overscan, int channels, float *destination_image)
void libmv_cameraIntrinsicsDestroy(libmv_CameraIntrinsics *libmv_intrinsics)
libmv_CameraIntrinsics * libmv_cameraIntrinsicsCopy(const libmv_CameraIntrinsics *libmv_intrinsics)
void libmv_cameraIntrinsicsUndistortByte(const libmv_CameraIntrinsics *libmv_intrinsics, const unsigned char *source_image, int width, int height, float overscan, int channels, unsigned char *destination_image)
void libmv_cameraIntrinsicsDistortByte(const struct libmv_CameraIntrinsics *libmv_intrinsics, const unsigned char *source_image, int width, int height, float overscan, int channels, unsigned char *destination_image)
void libmv_cameraIntrinsicsApply(const struct libmv_CameraIntrinsics *libmv_intrinsics, double x, double y, double *x1, double *y1)
void libmv_cameraIntrinsicsDistortFloat(const libmv_CameraIntrinsics *libmv_intrinsics, float *source_image, int width, int height, float overscan, int channels, float *destination_image)
void libmv_cameraIntrinsicsSetThreads(libmv_CameraIntrinsics *libmv_intrinsics, int threads)
void libmv_cameraIntrinsicsUpdate(const libmv_CameraIntrinsicsOptions *libmv_camera_intrinsics_options, libmv_CameraIntrinsics *libmv_intrinsics)
void libmv_cameraIntrinsicsInvert(const struct libmv_CameraIntrinsics *libmv_intrinsics, double x, double y, double *x1, double *y1)
libmv_CameraIntrinsics * libmv_cameraIntrinsicsNew(const libmv_CameraIntrinsicsOptions *libmv_camera_intrinsics_options)
struct libmv_CameraIntrinsics libmv_CameraIntrinsics
void libmv_samplePlanarPatchFloat(const float *image, int width, int height, int channels, const double *xs, const double *ys, int num_samples_x, int num_samples_y, const float *mask, float *patch, double *warped_position_x, double *warped_position_y)
void libmv_samplePlanarPatchByte(const unsigned char *image, int width, int height, int channels, const double *xs, const double *ys, int num_samples_x, int num_samples_y, const float *mask, unsigned char *patch, double *warped_position_x, double *warped_position_y)
const ProjectiveReconstruction & reconstruction
void MEM_freeN(void *vmemh)
void *(* MEM_dupallocN)(const void *vmemh)
ccl_device_inline float4 mask(const int4 mask, const float4 a)
unsigned __int64 uint64_t
ImBufFloatBuffer float_buffer
ImBufByteBuffer byte_buffer
libmv_CameraIntrinsics * intrinsics
int last_not_disabled_marker_framenr
int first_not_disabled_marker_framenr
MovieTrackingTrack * track
ListBase coverage_segments
float pattern_corners[4][2]
MovieTrackingPlaneTrack * active_plane_track
MovieTrackingReconstruction reconstruction
MovieTrackingTrack * active_track
MovieTrackingTrack ** point_tracks
MovieTrackingPlaneMarker * markers
struct MovieReconstructedCamera * cameras
float minimum_correlation
MovieTrackingMarker * markers
struct MovieTrackingTrack * next
struct MovieTrackingTrack * prev
MovieTrackingDopesheet dopesheet
MovieTrackingStats * stats
MovieTrackingStabilization stabilization
MovieTrackingCamera camera
GHash * old_to_new_plane_track_map
GHash * old_to_new_track_map
int BKE_tracking_count_selected_tracks_in_list(const ListBase *tracks_list)
static void tracking_dopesheet_calc_coverage(MovieTracking *tracking)
static void tracking_tracks_free(ListBase *tracks)
void BKE_tracking_distortion_undistort_v2(MovieDistortion *distortion, const float co[2], float r_co[2])
uint64_t BKE_tracking_camera_distortion_hash(const MovieTrackingCamera *camera)
static const MovieTrackingMarker * get_usable_marker_for_interpolation(MovieTrackingTrack *track, const MovieTrackingMarker *anchor_marker, const int direction)
MovieTrackingPlaneMarker * BKE_tracking_plane_marker_get_exact(MovieTrackingPlaneTrack *plane_track, int framenr)
MovieTrackingTrack * BKE_tracking_track_get_for_selection_index(MovieTracking *tracking, int selection_index, ListBase **r_tracksbase)
bool BKE_tracking_camera_distortion_equal(const MovieTrackingCamera *a, const MovieTrackingCamera *b)
float BKE_tracking_track_get_weight_for_marker(MovieClip *clip, MovieTrackingTrack *track, MovieTrackingMarker *marker)
static void tracking_tracks_copy(TrackingCopyContext *ctx, ListBase *tracks_dst, const ListBase *tracks_src, const int flag)
static void reconstructed_camera_scale_set(const MovieTrackingObject *tracking_object, float mat[4][4])
void BKE_tracking_plane_marker_get_subframe_corners(MovieTrackingPlaneTrack *plane_track, float framenr, float corners[4][2])
MovieTrackingPlaneMarker * BKE_tracking_plane_marker_insert(MovieTrackingPlaneTrack *plane_track, MovieTrackingPlaneMarker *plane_marker)
void BKE_tracking_track_deselect(MovieTrackingTrack *track, int area)
static void tracking_object_copy(MovieTrackingObject *tracking_object_dst, const MovieTrackingObject *tracking_object_src, const int flag)
void BKE_tracking_camera_get_reconstructed_interpolate(MovieTracking *, MovieTrackingObject *tracking_object, float framenr, float mat[4][4])
ImBuf * BKE_tracking_distort_frame(MovieTracking *tracking, ImBuf *ibuf, int calibration_width, int calibration_height, float overscan)
static void tracking_plane_tracks_free(ListBase *plane_tracks)
MovieTrackingPlaneTrack * BKE_tracking_plane_track_add(MovieTracking *tracking, ListBase *plane_tracks_base, ListBase *tracks, int framenr)
void BKE_tracking_distortion_free(MovieDistortion *distortion)
int BKE_tracking_count_selected_tracks_in_active_object(MovieTracking *tracking)
void BKE_tracking_get_rna_path_for_track(const MovieTracking *tracking, const MovieTrackingTrack *track, char *rna_path, size_t rna_path_maxncpy)
static void tracking_copy_context_delete(TrackingCopyContext *ctx)
void BKE_tracking_object_unique_name(MovieTracking *tracking, MovieTrackingObject *tracking_object)
MovieTrackingMarker * BKE_tracking_marker_insert(MovieTrackingTrack *track, MovieTrackingMarker *marker)
void BKE_tracking_get_camera_object_matrix(const Object *camera_object, float mat[4][4])
void BKE_tracking_track_first_last_frame_get(const MovieTrackingTrack *track, int *r_first_frame, int *r_last_frame)
void BKE_tracking_settings_init(MovieTracking *tracking)
ImBuf * BKE_tracking_get_pattern_imbuf(const ImBuf *ibuf, const MovieTrackingTrack *track, const MovieTrackingMarker *marker, const bool anchored, const bool disable_channels)
void BKE_tracking_marker_pattern_minmax(const MovieTrackingMarker *marker, float min[2], float max[2])
MovieTrackingTrack ** BKE_tracking_selected_tracks_in_active_object(MovieTracking *tracking, int *r_num_tracks)
void BKE_tracking_marker_clamp_pattern_position(MovieTrackingMarker *marker)
static struct @97 tracking_clipboard
void BKE_tracking_track_select(ListBase *tracksbase, MovieTrackingTrack *track, int area, bool extend)
void BKE_tracking_camera_to_blender(MovieTracking *tracking, Scene *scene, Camera *camera, int width, int height)
void BKE_tracking_disable_channels(ImBuf *ibuf, bool disable_red, bool disable_green, bool disable_blue, bool grayscale)
static int channels_alpha_inverse_sort(const void *a, const void *b)
float * BKE_tracking_track_get_mask(const int frame_width, const int frame_height, const MovieTrackingTrack *track, const MovieTrackingMarker *marker)
static void tracking_objects_free(ListBase *objects)
static int channels_average_error_sort(const void *a, const void *b)
ImBuf * BKE_tracking_get_plane_imbuf(const ImBuf *frame_ibuf, const MovieTrackingPlaneMarker *plane_marker)
static TrackingCopyContext tracking_copy_context_new()
MovieTrackingTrack * BKE_tracking_track_add_empty(MovieTracking *tracking, ListBase *tracks_list)
void BKE_tracking_track_flag_set(MovieTrackingTrack *track, int area, int flag)
ImBuf * BKE_tracking_sample_pattern(const int frame_width, const int frame_height, const ImBuf *search_ibuf, const MovieTrackingTrack *track, const MovieTrackingMarker *marker, const bool from_anchor, const bool use_mask, const int num_samples_x, const int num_samples_y, float pos[2])
static void tracking_objects_copy(ListBase *tracking_objects_dst, const ListBase *tracking_objects_src, const int flag)
static void multiply_marker(MovieTrackingMarker *marker, const float multiplier)
void BKE_tracking_track_path_clear(MovieTrackingTrack *track, const int ref_frame, const eTrackClearAction action)
ImBuf * BKE_tracking_get_search_imbuf(const ImBuf *ibuf, const MovieTrackingTrack *track, const MovieTrackingMarker *marker, const bool anchored, const bool disable_channels)
static void tracking_dopesheet_channels_sort(MovieTracking *tracking, int sort_method, bool inverse)
static void path_clear_all(MovieTrackingTrack *track, const int ref_frame)
static int channels_end_inverse_sort(const void *a, const void *b)
static int channels_total_track_sort(const void *a, const void *b)
MovieTrackingTrack * BKE_tracking_track_duplicate(MovieTrackingTrack *track)
MovieTrackingMarker * BKE_tracking_marker_ensure(MovieTrackingTrack *track, int framenr)
static void path_clear_remained(MovieTrackingTrack *track, const int ref_frame)
bool BKE_tracking_plane_track_has_point_track(MovieTrackingPlaneTrack *plane_track, MovieTrackingTrack *track)
bool BKE_tracking_object_delete(MovieTracking *tracking, MovieTrackingObject *tracking_object)
void BKE_tracking_clipboard_free()
static void path_clear_up_to(MovieTrackingTrack *track, const int ref_frame)
static void tracking_average_markers(MovieTrackingTrack *dst_track, MovieTrackingTrack **src_tracks, const int num_src_tracks)
static void tracking_object_free(MovieTrackingObject *tracking_object)
static void accumulate_marker(MovieTrackingMarker *dst_marker, const MovieTrackingMarker *src_marker)
void BKE_tracking_marker_get_subframe_position(MovieTrackingTrack *track, float framenr, float pos[2])
static int channels_start_sort(const void *a, const void *b)
void BKE_tracking_track_free(MovieTrackingTrack *track)
void BKE_tracking_camera_principal_point_pixel_get(MovieClip *clip, float r_principal_point_pixel[2])
MovieTrackingObject * BKE_tracking_find_object_for_track(const MovieTracking *tracking, const MovieTrackingTrack *track)
MovieTrackingMarker * BKE_tracking_marker_get_exact(MovieTrackingTrack *track, int framenr)
void BKE_tracking_free(MovieTracking *tracking)
static void tracking_reconstruction_copy(TrackingCopyContext *, MovieTrackingReconstruction *reconstruction_dst, const MovieTrackingReconstruction *reconstruction_src, const int)
void BKE_tracking_track_unique_name(ListBase *tracksbase, MovieTrackingTrack *track)
void BKE_tracking_plane_track_unique_name(ListBase *plane_tracks_base, MovieTrackingPlaneTrack *plane_track)
bool BKE_tracking_track_has_enabled_marker_at_frame(MovieTrackingTrack *track, int framenr)
void BKE_tracking_undistort_v2(MovieTracking *tracking, int image_width, int image_height, const float co[2], float r_co[2])
void BKE_tracking_plane_tracks_replace_point_track(MovieTracking *tracking, MovieTrackingTrack *old_track, MovieTrackingTrack *new_track)
static void tracking_dopesheet_channels_calc(MovieTracking *tracking)
void BKE_tracking_tracks_average(MovieTrackingTrack *dst_track, MovieTrackingTrack **src_tracks, const int num_src_tracks)
MovieTrackingTrack * BKE_tracking_track_add(MovieTracking *tracking, ListBase *tracksbase, float x, float y, int framenr, int width, int height)
MovieTrackingPlaneMarker * BKE_tracking_plane_marker_get(MovieTrackingPlaneTrack *plane_track, int framenr)
void BKE_tracking_plane_track_replace_point_track(MovieTrackingPlaneTrack *plane_track, MovieTrackingTrack *old_track, MovieTrackingTrack *new_track)
static void tracking_dopesheet_free(MovieTrackingDopesheet *dopesheet)
void BKE_tracking_distort_v2(MovieTracking *tracking, int image_width, int image_height, const float co[2], float r_co[2])
void BKE_tracking_camera_principal_point_pixel_set(MovieClip *clip, const float principal_point_pixel[2])
MovieTrackingObject * BKE_tracking_find_object_for_plane_track(const MovieTracking *tracking, const MovieTrackingPlaneTrack *plane_track)
static int channels_end_sort(const void *a, const void *b)
MovieDistortion * BKE_tracking_distortion_new(MovieTracking *tracking, int calibration_width, int calibration_height)
static bGPDlayer * track_mask_gpencil_layer_get(const MovieTrackingTrack *track)
void BKE_tracking_marker_clamp_search_size(MovieTrackingMarker *marker)
void BKE_tracking_tracks_join(MovieTracking *tracking, MovieTrackingTrack *dst_track, MovieTrackingTrack *src_track)
static int channels_longest_segment_sort(const void *a, const void *b)
static void tracking_reconstruction_free(MovieTrackingReconstruction *reconstruction)
void BKE_tracking_get_rna_path_for_plane_track(const MovieTracking *tracking, const MovieTrackingPlaneTrack *plane_track, char *rna_path, size_t rna_path_maxncpy)
static void tracking_dopesheet_channels_segments_calc(MovieTrackingDopesheetChannel *channel)
void BKE_tracking_clipboard_copy_tracks(MovieTracking *, MovieTrackingObject *tracking_object)
float * tracking_track_get_mask_for_region(const int frame_width, const int frame_height, const float region_min[2], const float region_max[2], const MovieTrackingTrack *track)
MovieTrackingTrack * BKE_tracking_object_find_track_with_name(MovieTrackingObject *tracking_object, const char *name)
void BKE_tracking_get_rna_path_prefix_for_plane_track(const MovieTracking *tracking, const MovieTrackingPlaneTrack *plane_track, char *rna_path, size_t rna_path_maxncpy)
MovieTrackingPlaneTrack * BKE_tracking_object_find_plane_track_with_name(MovieTrackingObject *tracking_object, const char *name)
MovieTrackingObject * BKE_tracking_object_get_camera(const MovieTracking *tracking)
void BKE_tracking_camera_shift_get(MovieTracking *tracking, int winx, int winy, float *shiftx, float *shifty)
static void tracking_average_tracks(MovieTrackingTrack *dst_track, MovieTrackingTrack **src_tracks, const int num_src_tracks)
bool BKE_tracking_plane_track_remove_point_track(MovieTrackingPlaneTrack *plane_track, MovieTrackingTrack *track)
static int channels_alpha_sort(const void *a, const void *b)
MovieTrackingPlaneMarker * BKE_tracking_plane_marker_ensure(MovieTrackingPlaneTrack *plane_track, int framenr)
ImBuf * BKE_tracking_undistort_frame(MovieTracking *tracking, ImBuf *ibuf, int calibration_width, int calibration_height, float overscan)
void BKE_tracking_distortion_distort_v2(MovieDistortion *distortion, const float co[2], float r_co[2])
static void track_mask_set_pixel_cb(int x, int x_end, int y, void *user_data)
void BKE_tracking_clipboard_paste_tracks(MovieTracking *, MovieTrackingObject *tracking_object)
bool BKE_tracking_track_has_marker_at_frame(MovieTrackingTrack *track, int framenr)
void BKE_tracking_track_flag_clear(MovieTrackingTrack *track, int area, int flag)
void BKE_tracking_tracks_deselect_all(ListBase *tracksbase)
static int compare_firstlast_putting_undefined_first(bool inverse, bool a_markerless, int a_value, bool b_markerless, int b_value)
bool BKE_tracking_clipboard_has_tracks()
void BKE_tracking_distortion_update(MovieDistortion *distortion, MovieTracking *tracking, int calibration_width, int calibration_height)
static void disable_imbuf_channels(ImBuf *ibuf, const MovieTrackingTrack *track, const bool grayscale)
bool BKE_tracking_marker_get_interpolated(MovieTrackingTrack *track, const int framenr, MovieTrackingMarker *r_marker)
static int reconstructed_camera_index_get(MovieTrackingReconstruction *reconstruction, int framenr, bool nearest)
static int coverage_from_count(int count)
void BKE_tracking_distortion_set_threads(MovieDistortion *distortion, int threads)
void BKE_tracking_marker_delete(MovieTrackingTrack *track, int framenr)
void BKE_tracking_marker_clamp_search_position(MovieTrackingMarker *marker)
static int channels_start_inverse_sort(const void *a, const void *b)
MovieTrackingObject * BKE_tracking_object_get_active(const MovieTracking *tracking)
static int channels_longest_segment_inverse_sort(const void *a, const void *b)
static void track_mask_gpencil_layer_rasterize(const int frame_width, const int frame_height, const float region_min[2], const bGPDlayer *layer, float *mask, const int mask_width, const int mask_height)
void BKE_tracking_get_projection_matrix(MovieTracking *tracking, MovieTrackingObject *tracking_object, int framenr, int winx, int winy, float mat[4][4])
MovieDistortion * BKE_tracking_distortion_copy(MovieDistortion *distortion)
static void tracking_plane_tracks_copy(TrackingCopyContext *ctx, ListBase *plane_tracks_list_dst, const ListBase *plane_tracks_list_src, const int flag)
void BKE_tracking_tracks_first_last_frame_minmax(MovieTrackingTrack **tracks, const int num_tracks, int *r_first_frame, int *r_last_frame)
void BKE_tracking_max_distortion_delta_across_bound(MovieTracking *tracking, const int image_width, const int image_height, const rcti *rect, const bool undistort, float r_delta[2])
MovieTrackingObject * BKE_tracking_object_add(MovieTracking *tracking, const char *name)
void BKE_tracking_plane_marker_delete(MovieTrackingPlaneTrack *plane_track, int framenr)
void BKE_tracking_copy(MovieTracking *tracking_dst, const MovieTracking *tracking_src, const int flag)
MovieReconstructedCamera * BKE_tracking_camera_get_reconstructed(MovieTracking *, MovieTrackingObject *tracking_object, int framenr)
void BKE_tracking_dopesheet_update(MovieTracking *tracking)
MovieTrackingMarker * BKE_tracking_marker_get(MovieTrackingTrack *track, int framenr)
void BKE_tracking_plane_tracks_remove_point_track(MovieTracking *tracking, MovieTrackingTrack *track)
void BKE_tracking_plane_tracks_deselect_all(ListBase *plane_tracks_base)
void BKE_tracking_plane_track_free(MovieTrackingPlaneTrack *plane_track)
static int channels_average_error_inverse_sort(const void *a, const void *b)
MovieTrackingObject * BKE_tracking_object_get_named(MovieTracking *tracking, const char *name)
static void tracking_stabilization_copy(MovieTrackingStabilization *stabilization_dst, const MovieTrackingStabilization *stabilization_src, const int)
void BKE_tracking_dopesheet_tag_update(MovieTracking *tracking)
void BKE_tracking_get_rna_path_prefix_for_track(const MovieTracking *tracking, const MovieTrackingTrack *track, char *rna_path, size_t rna_path_maxncpy)
BLI_INLINE int plane_marker_size_len_in_pixels(const float a[2], const float b[2], const int frame_width, const int frame_height)
ImBuf * BKE_tracking_distortion_exec(MovieDistortion *distortion, MovieTracking *tracking, ImBuf *ibuf, int calibration_width, int calibration_height, float overscan, bool undistort)
static int channels_total_track_inverse_sort(const void *a, const void *b)
void tracking_marker_insert_disabled(MovieTrackingTrack *track, const MovieTrackingMarker *ref_marker, bool before, bool overwrite)
void tracking_principal_point_pixel_to_normalized(const float principal_point_pixel[2], const int frame_width, const int frame_height, float r_principal_point_normalized[2])
void tracking_cameraIntrinscisOptionsFromTracking(MovieTracking *tracking, const int calibration_width, const int calibration_height, libmv_CameraIntrinsicsOptions *camera_intrinsics_options)
void tracking_get_marker_coords_for_tracking(int frame_width, int frame_height, const MovieTrackingMarker *marker, double search_pixel_x[5], double search_pixel_y[5])
void tracking_get_search_origin_frame_pixel(int frame_width, int frame_height, const MovieTrackingMarker *marker, float frame_pixel[2])
void tracking_principal_point_normalized_to_pixel(const float principal_point_normalized[2], const int frame_width, const int frame_height, float r_principal_point_pixel[2])