93
95
ED_space_clip_get_size(sc, &width, &height);
97
if (width == 0 || height == 0) {
95
101
track = BKE_tracking_track_add(tracking, tracksbase, x, y, framenr, width, height);
97
103
BKE_tracking_track_select(tracksbase, track, TRACK_AREA_ALL, 0);
99
105
clip->tracking.act_track = track;
102
110
static int add_marker_exec(bContext *C, wmOperator *op)
104
112
SpaceClip *sc = CTX_wm_space_clip(C);
105
113
MovieClip *clip = ED_space_clip_get_clip(sc);
109
ED_space_clip_get_size(sc, &width, &height);
111
if (!width || !height)
112
return OPERATOR_CANCELLED;
114
116
RNA_float_get_array(op->ptr, "location", pos);
116
add_marker(C, pos[0], pos[1]);
118
if (!add_marker(C, pos[0], pos[1])) {
119
return OPERATOR_CANCELLED;
118
122
/* reset offset from locked position, so frame jumping wouldn't be so confusing */
124
128
return OPERATOR_FINISHED;
127
static int add_marker_invoke(bContext *C, wmOperator *op, wmEvent *event)
131
static int add_marker_invoke(bContext *C, wmOperator *op, const wmEvent *event)
129
133
SpaceClip *sc = CTX_wm_space_clip(C);
130
134
ARegion *ar = CTX_wm_region(C);
134
ED_clip_mouse_pos(sc, ar, event->mval, co);
136
RNA_float_set_array(op->ptr, "location", co);
136
if (!RNA_struct_property_is_set(op->ptr, "location")) {
137
/* If location is not set, use mouse positio nas default. */
139
ED_clip_mouse_pos(sc, ar, event->mval, co);
140
RNA_float_set_array(op->ptr, "location", co);
138
143
return add_marker_exec(C, op);
158
163
"Location", "Location of marker on frame", -1.0f, 1.0f);
166
/********************** add marker operator *********************/
168
static int add_marker_at_click_invoke(bContext *C, wmOperator *op, const wmEvent *UNUSED(event))
170
ED_area_headerprint(CTX_wm_area(C), IFACE_("Use LMB click to define location where place the marker"));
172
/* add modal handler for ESC */
173
WM_event_add_modal_handler(C, op);
175
return OPERATOR_RUNNING_MODAL;
178
static int add_marker_at_click_modal(bContext *C, wmOperator *UNUSED(op), const wmEvent *event)
180
SpaceClip *sc = CTX_wm_space_clip(C);
181
MovieClip *clip = ED_space_clip_get_clip(sc);
182
ARegion *ar = CTX_wm_region(C);
185
switch (event->type) {
187
return OPERATOR_RUNNING_MODAL;
191
ED_area_headerprint(CTX_wm_area(C), NULL);
193
ED_clip_point_stable_pos(sc, ar,
194
event->x - ar->winrct.xmin,
195
event->y - ar->winrct.ymin,
198
if (!add_marker(C, pos[0], pos[1]))
199
return OPERATOR_CANCELLED;
201
WM_event_add_notifier(C, NC_MOVIECLIP | NA_EDITED, clip);
202
return OPERATOR_FINISHED;
206
ED_area_headerprint(CTX_wm_area(C), NULL);
207
return OPERATOR_CANCELLED;
210
return OPERATOR_PASS_THROUGH;
213
void CLIP_OT_add_marker_at_click(wmOperatorType *ot)
216
ot->name = "Add Marker at Click";
217
ot->idname = "CLIP_OT_add_marker_at_click";
218
ot->description = "Place new marker at the desired (clicked) position";
221
ot->invoke = add_marker_at_click_invoke;
222
ot->poll = ED_space_clip_tracking_poll;
223
ot->modal = add_marker_at_click_modal;
226
ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO | OPTYPE_BLOCKING;
161
229
/********************** delete track operator *********************/
163
231
static int delete_track_exec(bContext *C, wmOperator *UNUSED(op))
284
352
static SlideMarkerData *create_slide_marker_data(SpaceClip *sc, MovieTrackingTrack *track,
285
MovieTrackingMarker *marker, wmEvent *event,
353
MovieTrackingMarker *marker, const wmEvent *event,
286
354
int area, int corner, int action, int width, int height)
288
356
SlideMarkerData *data = MEM_callocN(sizeof(SlideMarkerData), "slide marker data");
524
589
WM_cursor_set(win, CURSOR_STD);
527
MovieTrackingTrack *tracking_marker_check_slide(bContext *C, wmEvent *event, int *area_r, int *action_r, int *corner_r)
592
MovieTrackingTrack *tracking_marker_check_slide(bContext *C, const wmEvent *event, int *area_r, int *action_r, int *corner_r)
529
594
SpaceClip *sc = CTX_wm_space_clip(C);
530
595
ARegion *ar = CTX_wm_region(C);
1286
1351
return OPERATOR_RUNNING_MODAL;
1289
static int track_markers_modal(bContext *C, wmOperator *UNUSED(op), wmEvent *event)
1354
static int track_markers_modal(bContext *C, wmOperator *UNUSED(op), const wmEvent *event)
1291
1356
/* no running tracking, remove handler and pass through */
1292
1357
if (0 == WM_jobs_test(CTX_wm_manager(C), CTX_wm_area(C), WM_JOB_TYPE_ANY))
1323
1388
RNA_def_boolean(ot->srna, "sequence", 0, "Track Sequence", "Track marker during image sequence rather than single image");
1391
/********************** refine track position operator *********************/
1393
static int refine_marker_exec(bContext *C, wmOperator *op)
1395
SpaceClip *sc = CTX_wm_space_clip(C);
1396
MovieClip *clip = ED_space_clip_get_clip(sc);
1397
MovieTracking *tracking = &clip->tracking;
1398
ListBase *tracksbase = BKE_tracking_get_active_tracks(tracking);
1399
MovieTrackingTrack *track;
1400
bool backwards = RNA_boolean_get(op->ptr, "backwards");
1401
int framenr = ED_space_clip_get_clip_frame_number(sc);
1403
for (track = tracksbase->first; track; track = track->next) {
1404
if (TRACK_VIEW_SELECTED(sc, track)) {
1405
MovieTrackingMarker *marker = BKE_tracking_marker_get(track, framenr);
1407
BKE_tracking_refine_marker(clip, track, marker, backwards);
1411
WM_event_add_notifier(C, NC_MOVIECLIP | NA_EVALUATED, clip);
1413
return OPERATOR_FINISHED;
1416
void CLIP_OT_refine_markers(wmOperatorType *ot)
1419
ot->name = "Refine Markers";
1420
ot->description = "Refine selected markers positions "
1421
"by running the tracker from track's reference to current frame";
1422
ot->idname = "CLIP_OT_refine_markers";
1425
ot->exec = refine_marker_exec;
1426
ot->poll = ED_space_clip_tracking_poll;
1429
ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
1432
RNA_def_boolean(ot->srna, "backwards", 0, "Backwards", "Do backwards tracking");
1326
1435
/********************** solve camera operator *********************/
1328
1437
typedef struct {
1507
1616
return OPERATOR_RUNNING_MODAL;
1510
static int solve_camera_modal(bContext *C, wmOperator *UNUSED(op), wmEvent *event)
1619
static int solve_camera_modal(bContext *C, wmOperator *UNUSED(op), const wmEvent *event)
1512
1621
/* no running solver, remove handler and pass through */
1513
1622
if (0 == WM_jobs_test(CTX_wm_manager(C), CTX_wm_area(C), WM_JOB_TYPE_ANY))
2036
2145
mul_serie_m4(mat, lmat, mat, ilmat, obmat, NULL, NULL, NULL, NULL);
2039
mult_m4_m4m4(mat, obmat, mat);
2148
mul_m4_m4m4(mat, obmat, mat);
2128
2237
invert_m4(mat);
2130
2239
BKE_object_to_mat4(object, obmat);
2131
mult_m4_m4m4(mat, mat, obmat);
2132
mult_m4_m4m4(newmat, rot, mat);
2240
mul_m4_m4m4(mat, mat, obmat);
2241
mul_m4_m4m4(newmat, rot, mat);
2133
2242
BKE_object_apply_mat4(object, newmat, 0, 0);
2135
2244
/* make camera have positive z-coordinate */
2136
2245
if (object->loc[2] < 0) {
2137
2246
invert_m4(rot);
2138
mult_m4_m4m4(newmat, rot, mat);
2247
mul_m4_m4m4(newmat, rot, mat);
2139
2248
BKE_object_apply_mat4(object, newmat, 0, 0);
2254
2363
/********************** set scale operator *********************/
2256
static int do_set_scale(bContext *C, wmOperator *op, int scale_solution)
2365
static int do_set_scale(bContext *C, wmOperator *op, bool scale_solution, bool apply_scale)
2258
2367
SpaceClip *sc = CTX_wm_space_clip(C);
2259
2368
MovieClip *clip = ED_space_clip_get_clip(sc);
2274
2383
return OPERATOR_CANCELLED;
2277
object = get_orientation_object(C);
2279
BKE_report(op->reports, RPT_ERROR, "No object to apply orientation on");
2386
if (!scale_solution && !apply_scale) {
2387
object = get_orientation_object(C);
2389
BKE_report(op->reports, RPT_ERROR, "No object to apply orientation on");
2281
return OPERATOR_CANCELLED;
2391
return OPERATOR_CANCELLED;
2284
2395
BKE_tracking_get_camera_object_matrix(scene, camera, mat);
2298
2409
if (len_v3(vec[0]) > 1e-5f) {
2299
2410
scale = dist / len_v3(vec[0]);
2301
if (tracking_object->flag & TRACKING_OBJECT_CAMERA) {
2302
mul_v3_fl(object->size, scale);
2303
mul_v3_fl(object->loc, scale);
2305
else if (!scale_solution) {
2306
Object *solver_camera = object_solver_camera(scene, object);
2308
object->size[0] = object->size[1] = object->size[2] = 1.0f / scale;
2310
if (solver_camera) {
2311
object->size[0] /= solver_camera->size[0];
2312
object->size[1] /= solver_camera->size[1];
2313
object->size[2] /= solver_camera->size[2];
2413
/* Apply scale on reconstructed scene itself */
2414
MovieTrackingReconstruction *reconstruction = BKE_tracking_get_active_reconstruction(tracking);
2415
MovieReconstructedCamera *reconstructed_cameras;
2418
for (track = tracksbase->first; track; track = track->next) {
2419
mul_v3_fl(track->bundle_pos, scale);
2422
reconstructed_cameras = reconstruction->cameras;
2423
for (i = 0; i < reconstruction->camnr; i++) {
2424
mul_v3_fl(reconstructed_cameras[i].mat[3], scale);
2427
WM_event_add_notifier(C, NC_MOVIECLIP | NA_EVALUATED, clip);
2428
WM_event_add_notifier(C, NC_OBJECT | ND_TRANSFORM, NULL);
2317
tracking_object->scale = scale;
2431
if (tracking_object->flag & TRACKING_OBJECT_CAMERA) {
2432
mul_v3_fl(object->size, scale);
2433
mul_v3_fl(object->loc, scale);
2435
else if (!scale_solution) {
2436
Object *solver_camera = object_solver_camera(scene, object);
2438
object->size[0] = object->size[1] = object->size[2] = 1.0f / scale;
2440
if (solver_camera) {
2441
object->size[0] /= solver_camera->size[0];
2442
object->size[1] /= solver_camera->size[1];
2443
object->size[2] /= solver_camera->size[2];
2447
tracking_object->scale = scale;
2450
DAG_id_tag_update(&clip->id, 0);
2453
DAG_id_tag_update(&object->id, OB_RECALC_OB);
2455
WM_event_add_notifier(C, NC_MOVIECLIP | NA_EVALUATED, clip);
2456
WM_event_add_notifier(C, NC_OBJECT | ND_TRANSFORM, NULL);
2320
DAG_id_tag_update(&clip->id, 0);
2323
DAG_id_tag_update(&object->id, OB_RECALC_OB);
2325
WM_event_add_notifier(C, NC_MOVIECLIP | NA_EVALUATED, clip);
2326
WM_event_add_notifier(C, NC_OBJECT | ND_TRANSFORM, NULL);
2329
2460
return OPERATOR_FINISHED;
2332
2463
static int set_scale_exec(bContext *C, wmOperator *op)
2334
return do_set_scale(C, op, 0);
2465
return do_set_scale(C, op, false, false);
2337
static int set_scale_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
2468
static int set_scale_invoke(bContext *C, wmOperator *op, const wmEvent *UNUSED(event))
2339
2470
SpaceClip *sc = CTX_wm_space_clip(C);
2340
2471
MovieClip *clip = ED_space_clip_get_clip(sc);
2388
2519
static int set_solution_scale_exec(bContext *C, wmOperator *op)
2390
return do_set_scale(C, op, 1);
2521
return do_set_scale(C, op, true, false);
2393
static int set_solution_scale_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
2524
static int set_solution_scale_invoke(bContext *C, wmOperator *op, const wmEvent *UNUSED(event))
2395
2526
SpaceClip *sc = CTX_wm_space_clip(C);
2396
2527
MovieClip *clip = ED_space_clip_get_clip(sc);
2421
2552
"Distance", "Distance between selected tracks", -100.0f, 100.0f);
2555
/********************** apply solution scale operator *********************/
2557
static int apply_solution_scale_poll(bContext *C)
2559
SpaceClip *sc = CTX_wm_space_clip(C);
2562
MovieClip *clip = ED_space_clip_get_clip(sc);
2565
MovieTracking *tracking = &clip->tracking;
2566
MovieTrackingObject *tracking_object = BKE_tracking_object_get_active(tracking);
2568
return tracking_object->flag & TRACKING_OBJECT_CAMERA;
2575
static int apply_solution_scale_exec(bContext *C, wmOperator *op)
2577
return do_set_scale(C, op, false, true);
2580
static int apply_solution_scale_invoke(bContext *C, wmOperator *op, const wmEvent *UNUSED(event))
2582
SpaceClip *sc = CTX_wm_space_clip(C);
2583
MovieClip *clip = ED_space_clip_get_clip(sc);
2585
if (!RNA_struct_property_is_set(op->ptr, "distance"))
2586
RNA_float_set(op->ptr, "distance", clip->tracking.settings.dist);
2588
return apply_solution_scale_exec(C, op);
2591
void CLIP_OT_apply_solution_scale(wmOperatorType *ot)
2594
ot->name = "Apply Solution Scale";
2595
ot->description = "Apply scale on solution itself to make distance between selected tracks equals to desired";
2596
ot->idname = "CLIP_OT_apply_solution_scale";
2599
ot->exec = apply_solution_scale_exec;
2600
ot->invoke = apply_solution_scale_invoke;
2601
ot->poll = apply_solution_scale_poll;
2604
ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
2607
RNA_def_float(ot->srna, "distance", 0.0f, -FLT_MAX, FLT_MAX,
2608
"Distance", "Distance between selected tracks", -100.0f, 100.0f);
2424
2611
/********************** set principal center operator *********************/
2426
2613
static int set_center_principal_exec(bContext *C, wmOperator *UNUSED(op))
2892
3079
ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
2894
3081
/* properties */
2895
RNA_def_enum(ot->srna, "keyframe", keyframe_items, 0, "Keyframe", "keyframe to set");
3082
RNA_def_enum(ot->srna, "keyframe", keyframe_items, 0, "Keyframe", "Keyframe to set");
2898
3085
/********************** track copy color operator *********************/