28#include "RNA_prototypes.hh"
74 &clip->
id, track, &RNA_MovieTrackingTrack,
"weight", 0,
nullptr);
76 for (
int a = 0; a < track->
markersnr; a++) {
80 float weight = track->
weight;
90 (marker->
pos[0] + track->
offset[0]) * width,
91 (marker->
pos[1] + track->
offset[1]) * height,
109 libmv_reconstruction);
126 bool origin_set =
false;
127 int sfra = context->sfra, efra = context->efra;
131 context->object_name);
142 track->bundle_pos[0] =
pos[0];
143 track->bundle_pos[1] =
pos[1];
144 track->bundle_pos[2] =
pos[2];
153 printf(
"Unable to reconstruct position for track #%d '%s'\n", track_index, track->name);
162 reconstruction->
camnr = 0;
163 reconstruction->
cameras =
nullptr;
166 (efra - sfra + 1),
"temp reconstructed camera");
168 for (
int a = sfra; a <= efra; a++) {
176 for (
int i = 0;
i < 4;
i++) {
177 for (
int j = 0; j < 4; j++) {
178 mat[
i][j] = matd[
i][j];
202 &reconstructed_cameras[reconstruction->
camnr];
204 reconstructed_camera->
framenr = a;
206 reconstruction->
camnr++;
210 printf(
"No camera for frame %d\n", a);
214 if (reconstruction->
camnr) {
217 "reconstructed camera");
218 memcpy(reconstruction->
cameras, reconstructed_cameras,
size);
224 mul_v3_m4v3(track->bundle_pos, imat, track->bundle_pos);
304 N_(
"At least 8 common tracks on both keyframes are needed for reconstruction"),
313 error_msg,
N_(
"Blender is compiled without motion tracking library"), error_size);
330 "MovieReconstructContext data");
333 int sfra = INT_MAX, efra = INT_MIN;
342 tracking, width, height, &context->camera_intrinsics_options);
344 context->tracks_map =
tracks_map_new(context->object_name, num_tracks);
347 int first = 0, last = track->markersnr - 1;
363 if (first <= track->markersnr - 1) {
374 context->sfra = sfra;
375 context->efra = efra;
378 context->keyframe1 = keyframe1;
379 context->keyframe2 = keyframe2;
382 context->error_message[0] =
'\0';
388 const char *error_message)
390 if (context->error_message[0]) {
399 return context->error_message;
404 if (context->reconstruction) {
435 reconstruction_options->
keyframe1 = context->keyframe1;
436 reconstruction_options->
keyframe2 = context->keyframe2;
454 progressdata.
stop = stop;
464 &context->camera_intrinsics_options,
465 &reconstruction_options,
471 &context->camera_intrinsics_options,
472 &reconstruction_options,
476 if (context->select_keyframes) {
478 context->keyframe1 = reconstruction_options.
keyframe1;
479 context->keyframe2 = reconstruction_options.
keyframe2;
485 context->reprojection_error =
error;
492 context,
"Failed to solve the motion: most likely there are no good keyframes");
500 context->object_name);
504 if (context->select_keyframes) {
505 tracking_object->
keyframe1 = context->keyframe1;
506 tracking_object->
keyframe2 = context->keyframe2;
509 reconstruction->
error = context->reprojection_error;
521 const float scale[3])
523 float first_camera_delta[3] = {0.0f, 0.0f, 0.0f};
525 if (reconstruction->
camnr > 0) {
529 for (
int i = 0;
i < reconstruction->
camnr;
i++) {
538 sub_v3_v3(track->bundle_pos, first_camera_delta);
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)
float BKE_movieclip_remap_clip_to_scene_frame(const struct MovieClip *clip, float framenr)
struct MovieTrackingObject * BKE_tracking_object_get_named(struct MovieTracking *tracking, const char *name)
bool BKE_tracking_track_has_enabled_marker_at_frame(struct MovieTrackingTrack *track, int framenr)
void BKE_tracking_dopesheet_tag_update(struct MovieTracking *tracking)
#define LISTBASE_FOREACH(type, var, list)
#define LISTBASE_FOREACH_INDEX(type, var, list, index_var)
int BLI_listbase_count(const ListBase *listbase) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
MINLINE int min_ii(int a, int b)
MINLINE int max_ii(int a, int b)
void mul_m4_m4m4(float R[4][4], const float A[4][4], const float B[4][4])
void copy_m4_m4(float m1[4][4], const float m2[4][4])
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])
void unit_m4(float m[4][4])
MINLINE void mul_v3_v3(float r[3], const float a[3])
MINLINE void sub_v3_v3(float r[3], const float a[3])
MINLINE void mul_v3_v3v3(float r[3], const float v1[3], const float v2[3])
size_t size_t size_t BLI_snprintf_utf8(char *__restrict dst, size_t dst_maxncpy, const char *__restrict format,...) ATTR_NONNULL(1
char * BLI_strncpy_utf8(char *__restrict dst, const char *__restrict src, size_t dst_maxncpy) ATTR_NONNULL(1
#define STRNCPY_UTF8(dst, src)
@ REFINE_TANGENTIAL_DISTORTION
@ REFINE_RADIAL_DISTORTION
@ TRACKING_USE_KEYFRAME_SELECTION
Read Guarded memory(de)allocation.
static DBVT_INLINE btScalar size(const btDbvtVolume &a)
void libmv_cameraIntrinsicsExtractOptions(const libmv_CameraIntrinsics *libmv_intrinsics, libmv_CameraIntrinsicsOptions *camera_intrinsics_options)
struct libmv_CameraIntrinsics libmv_CameraIntrinsics
libmv_Reconstruction * libmv_solveModal(const libmv_Tracks *libmv_tracks, const libmv_CameraIntrinsicsOptions *libmv_camera_intrinsics_options, const libmv_ReconstructionOptions *libmv_reconstruction_options, reconstruct_progress_update_cb progress_update_callback, void *callback_customdata)
double libmv_reprojectionErrorForImage(const libmv_Reconstruction *libmv_reconstruction, int image)
double libmv_reprojectionError(const libmv_Reconstruction *libmv_reconstruction)
void libmv_reconstructionDestroy(libmv_Reconstruction *libmv_reconstruction)
int libmv_reconstructionIsValid(libmv_Reconstruction *libmv_reconstruction)
int libmv_reprojectionCameraForImage(const libmv_Reconstruction *libmv_reconstruction, int image, double mat[4][4])
libmv_CameraIntrinsics * libmv_reconstructionExtractIntrinsics(libmv_Reconstruction *libmv_reconstruction)
int libmv_reprojectionPointForTrack(const libmv_Reconstruction *libmv_reconstruction, int track, double pos[3])
libmv_Reconstruction * libmv_solveReconstruction(const libmv_Tracks *libmv_tracks, const libmv_CameraIntrinsicsOptions *libmv_camera_intrinsics_options, libmv_ReconstructionOptions *libmv_reconstruction_options, reconstruct_progress_update_cb progress_update_callback, void *callback_customdata)
double libmv_reprojectionErrorForTrack(const libmv_Reconstruction *libmv_reconstruction, int track)
@ LIBMV_REFINE_TANGENTIAL_DISTORTION
@ LIBMV_REFINE_FOCAL_LENGTH
@ LIBMV_REFINE_RADIAL_DISTORTION
@ LIBMV_REFINE_PRINCIPAL_POINT
struct libmv_Tracks libmv_Tracks
void * MEM_calloc_arrayN(size_t len, size_t size, const char *str)
void * MEM_callocN(size_t len, const char *str)
void MEM_freeN(void *vmemh)
static void error(const char *str)
struct MovieTracking tracking
char object_name[MAX_NAME]
libmv_CameraIntrinsicsOptions camera_intrinsics_options
libmv_Reconstruction * reconstruction
MovieTrackingReconstruction reconstruction
struct MovieReconstructedCamera * cameras
int refine_camera_intrinsics
MovieTrackingMarker * markers
struct MovieTrackingTrack * next
MovieTrackingCamera camera
MovieTrackingSettings settings
libmv_Tracks * libmv_tracksNew(void)
void libmv_tracksDestroy(libmv_Tracks *)
void libmv_tracksInsert(libmv_Tracks *, int, int, double, double, double)
static void reconstruct_update_solve_cb(void *customdata, double progress, const char *message)
MovieReconstructContext * BKE_tracking_reconstruction_context_new(MovieClip *clip, MovieTrackingObject *tracking_object, int keyframe1, int keyframe2, int width, int height)
void BKE_tracking_reconstruction_solve(MovieReconstructContext *context, bool *stop, bool *do_update, float *progress, char *stats_message, int message_size)
void BKE_tracking_reconstruction_context_free(MovieReconstructContext *context)
static void reconstruct_retrieve_libmv_intrinsics(MovieReconstructContext *context, MovieTracking *tracking)
bool BKE_tracking_reconstruction_finish(MovieReconstructContext *context, MovieTracking *tracking)
static libmv_Tracks * libmv_tracks_new(MovieClip *clip, ListBase *tracksbase, int width, int height)
void BKE_tracking_reconstruction_report_error_message(MovieReconstructContext *context, const char *error_message)
static int reconstruct_count_tracks_on_both_keyframes(MovieTrackingObject *tracking_object)
const char * BKE_tracking_reconstruction_error_message_get(const MovieReconstructContext *context)
static bool reconstruct_retrieve_libmv_tracks(MovieReconstructContext *context, MovieTracking *tracking)
static int reconstruct_retrieve_libmv(MovieReconstructContext *context, MovieTracking *tracking)
void BKE_tracking_reconstruction_scale(MovieTracking *tracking, float scale[3])
static int reconstruct_refine_intrinsics_get_flags(MovieTracking *tracking, MovieTrackingObject *tracking_object)
static void tracking_scale_reconstruction(ListBase *tracksbase, MovieTrackingReconstruction *reconstruction, const float scale[3])
bool BKE_tracking_reconstruction_check(MovieTracking *tracking, MovieTrackingObject *tracking_object, char *error_msg, int error_size)
static void reconstructionOptionsFromContext(libmv_ReconstructionOptions *reconstruction_options, MovieReconstructContext *context)
void tracks_map_free(TracksMap *map)
void tracking_cameraIntrinscisOptionsFromTracking(MovieTracking *tracking, const int calibration_width, const int calibration_height, libmv_CameraIntrinsicsOptions *camera_intrinsics_options)
void tracks_map_insert(TracksMap *map, MovieTrackingTrack *track)
void tracking_trackingCameraFromIntrinscisOptions(MovieTracking *tracking, const libmv_CameraIntrinsicsOptions *camera_intrinsics_options)
TracksMap * tracks_map_new(const char *object_name, int num_tracks)
void tracks_map_merge(TracksMap *map, MovieTracking *tracking)