diff options
author | Lukas Tönne <lukas.toenne@gmail.com> | 2022-07-26 00:43:48 +0300 |
---|---|---|
committer | Lukas Tönne <lukas.toenne@gmail.com> | 2022-07-26 00:43:48 +0300 |
commit | f081e76037432cb926be45e980eac201d337032c (patch) | |
tree | dd1225521c12ea21c0b0c3d51ec1ae3f8730755f /source/blender/editors/space_clip | |
parent | fa2084ae58a77b1201289b6bedac427f73c762d1 (diff) | |
parent | 462f99bf38648a08226b1fba423315aec2bc577b (diff) |
Merge branch 'master' into geometry-nodes-iterative-cachegeometry-nodes-rigid-body-integration
Diffstat (limited to 'source/blender/editors/space_clip')
-rw-r--r-- | source/blender/editors/space_clip/clip_draw.c | 22 | ||||
-rw-r--r-- | source/blender/editors/space_clip/clip_editor.c | 6 | ||||
-rw-r--r-- | source/blender/editors/space_clip/clip_graph_ops.c | 8 | ||||
-rw-r--r-- | source/blender/editors/space_clip/clip_intern.h | 3 | ||||
-rw-r--r-- | source/blender/editors/space_clip/clip_ops.c | 10 | ||||
-rw-r--r-- | source/blender/editors/space_clip/clip_utils.c | 12 | ||||
-rw-r--r-- | source/blender/editors/space_clip/space_clip.c | 3 | ||||
-rw-r--r-- | source/blender/editors/space_clip/tracking_ops.c | 154 | ||||
-rw-r--r-- | source/blender/editors/space_clip/tracking_ops_track.c | 4 |
9 files changed, 184 insertions, 38 deletions
diff --git a/source/blender/editors/space_clip/clip_draw.c b/source/blender/editors/space_clip/clip_draw.c index 7800ce797aa..78174160eb8 100644 --- a/source/blender/editors/space_clip/clip_draw.c +++ b/source/blender/editors/space_clip/clip_draw.c @@ -131,7 +131,7 @@ static void draw_movieclip_cache(SpaceClip *sc, ARegion *region, MovieClip *clip { float x; int *points, totseg, i, a; - float sfra = SFRA, efra = EFRA, framelen = region->winx / (efra - sfra + 1); + float sfra = scene->r.sfra, efra = scene->r.efra, framelen = region->winx / (efra - sfra + 1); MovieTracking *tracking = &clip->tracking; MovieTrackingObject *act_object = BKE_tracking_object_get_active(tracking); MovieTrackingTrack *act_track = BKE_tracking_track_get_active(&clip->tracking); @@ -245,14 +245,16 @@ static void draw_movieclip_cache(SpaceClip *sc, ARegion *region, MovieClip *clip /* solver keyframes */ immUniformColor4ub(175, 255, 0, 255); - draw_keyframe(act_object->keyframe1 + clip->start_frame - 1, CFRA, sfra, framelen, 2, pos); - draw_keyframe(act_object->keyframe2 + clip->start_frame - 1, CFRA, sfra, framelen, 2, pos); + draw_keyframe( + act_object->keyframe1 + clip->start_frame - 1, scene->r.cfra, sfra, framelen, 2, pos); + draw_keyframe( + act_object->keyframe2 + clip->start_frame - 1, scene->r.cfra, sfra, framelen, 2, pos); immUnbindProgram(); /* movie clip animation */ if ((sc->mode == SC_MODE_MASKEDIT) && sc->mask_info.mask) { - ED_mask_draw_frames(sc->mask_info.mask, region, CFRA, sfra, efra); + ED_mask_draw_frames(sc->mask_info.mask, region, scene->r.cfra, sfra, efra); } } @@ -1175,17 +1177,9 @@ static void draw_plane_marker_image(Scene *scene, ibuf = BKE_image_acquire_ibuf(image, NULL, &lock); if (ibuf) { - uchar *display_buffer; void *cache_handle; - - if (image->flag & IMA_VIEW_AS_RENDER) { - display_buffer = IMB_display_buffer_acquire( - ibuf, &scene->view_settings, &scene->display_settings, &cache_handle); - } - else { - display_buffer = IMB_display_buffer_acquire( - ibuf, NULL, &scene->display_settings, &cache_handle); - } + uchar *display_buffer = IMB_display_buffer_acquire( + ibuf, &scene->view_settings, &scene->display_settings, &cache_handle); if (display_buffer) { float frame_corners[4][2] = {{0.0f, 0.0f}, {1.0f, 0.0f}, {1.0f, 1.0f}, {0.0f, 1.0f}}; diff --git a/source/blender/editors/space_clip/clip_editor.c b/source/blender/editors/space_clip/clip_editor.c index cf7c3b51ae3..9a690f36aab 100644 --- a/source/blender/editors/space_clip/clip_editor.c +++ b/source/blender/editors/space_clip/clip_editor.c @@ -1046,7 +1046,7 @@ static int prefetch_get_start_frame(const bContext *C) { Scene *scene = CTX_data_scene(C); - return SFRA; + return scene->r.sfra; } static int prefetch_get_final_frame(const bContext *C) @@ -1057,10 +1057,10 @@ static int prefetch_get_final_frame(const bContext *C) int end_frame; /* check whether all the frames from prefetch range are cached */ - end_frame = EFRA; + end_frame = scene->r.efra; if (clip->len) { - end_frame = min_ii(end_frame, SFRA + clip->len - 1); + end_frame = min_ii(end_frame, scene->r.sfra + clip->len - 1); } return end_frame; diff --git a/source/blender/editors/space_clip/clip_graph_ops.c b/source/blender/editors/space_clip/clip_graph_ops.c index d07cf09ffa6..67565a88bab 100644 --- a/source/blender/editors/space_clip/clip_graph_ops.c +++ b/source/blender/editors/space_clip/clip_graph_ops.c @@ -629,8 +629,8 @@ static int view_all_exec(bContext *C, wmOperator *UNUSED(op)) NULL); /* set extents of view to start/end frames */ - v2d->cur.xmin = (float)SFRA; - v2d->cur.xmax = (float)EFRA; + v2d->cur.xmin = (float)scene->r.sfra; + v2d->cur.xmax = (float)scene->r.efra; if (userdata.min < userdata.max) { v2d->cur.ymin = userdata.min; @@ -675,8 +675,8 @@ void ED_clip_graph_center_current_frame(Scene *scene, ARegion *region) float extra = BLI_rctf_size_x(&v2d->cur) / 2.0f; /* set extents of view to start/end frames */ - v2d->cur.xmin = (float)CFRA - extra; - v2d->cur.xmax = (float)CFRA + extra; + v2d->cur.xmin = (float)scene->r.cfra - extra; + v2d->cur.xmax = (float)scene->r.cfra + extra; } static int center_current_frame_exec(bContext *C, wmOperator *UNUSED(op)) diff --git a/source/blender/editors/space_clip/clip_intern.h b/source/blender/editors/space_clip/clip_intern.h index 7f9cf61b748..2efd6b6b473 100644 --- a/source/blender/editors/space_clip/clip_intern.h +++ b/source/blender/editors/space_clip/clip_intern.h @@ -251,6 +251,9 @@ void CLIP_OT_slide_plane_marker(struct wmOperatorType *ot); void CLIP_OT_keyframe_insert(struct wmOperatorType *ot); void CLIP_OT_keyframe_delete(struct wmOperatorType *ot); +void CLIP_OT_new_image_from_plane_marker(struct wmOperatorType *ot); +void CLIP_OT_update_image_from_plane_marker(struct wmOperatorType *ot); + /* tracking_select.c */ void CLIP_OT_select(struct wmOperatorType *ot); diff --git a/source/blender/editors/space_clip/clip_ops.c b/source/blender/editors/space_clip/clip_ops.c index f5bf850791a..f276c2acd1a 100644 --- a/source/blender/editors/space_clip/clip_ops.c +++ b/source/blender/editors/space_clip/clip_ops.c @@ -1061,9 +1061,9 @@ static void change_frame_apply(bContext *C, wmOperator *op) Scene *scene = CTX_data_scene(C); /* set the new frame number */ - CFRA = RNA_int_get(op->ptr, "frame"); - FRAMENUMBER_MIN_CLAMP(CFRA); - SUBFRA = 0.0f; + scene->r.cfra = RNA_int_get(op->ptr, "frame"); + FRAMENUMBER_MIN_CLAMP(scene->r.cfra); + scene->r.subframe = 0.0f; /* do updates */ DEG_id_tag_update(&scene->id, ID_RECALC_FRAME_CHANGE); @@ -1084,7 +1084,7 @@ static int frame_from_event(bContext *C, const wmEvent *event) int framenr = 0; if (region->regiontype == RGN_TYPE_WINDOW) { - float sfra = SFRA, efra = EFRA, framelen = region->winx / (efra - sfra + 1); + float sfra = scene->r.sfra, efra = scene->r.efra, framelen = region->winx / (efra - sfra + 1); framenr = sfra + event->mval[0] / framelen; } @@ -1399,7 +1399,7 @@ static void do_sequence_proxy(void *pjv, ProxyJob *pj = pjv; MovieClip *clip = pj->clip; Scene *scene = pj->scene; - int sfra = SFRA, efra = EFRA; + int sfra = scene->r.sfra, efra = scene->r.efra; ProxyThread *handles; int tot_thread = BLI_task_scheduler_num_threads(); int width, height; diff --git a/source/blender/editors/space_clip/clip_utils.c b/source/blender/editors/space_clip/clip_utils.c index 01f2b24c8a4..221b87a8b5a 100644 --- a/source/blender/editors/space_clip/clip_utils.c +++ b/source/blender/editors/space_clip/clip_utils.c @@ -617,8 +617,8 @@ void clip_draw_sfra_efra(View2D *v2d, Scene *scene) immBindBuiltinProgram(GPU_SHADER_2D_UNIFORM_COLOR); immUniformColor4f(0.0f, 0.0f, 0.0f, 0.4f); - immRectf(pos, v2d->cur.xmin, v2d->cur.ymin, (float)SFRA, v2d->cur.ymax); - immRectf(pos, (float)EFRA, v2d->cur.ymin, v2d->cur.xmax, v2d->cur.ymax); + immRectf(pos, v2d->cur.xmin, v2d->cur.ymin, (float)scene->r.sfra, v2d->cur.ymax); + immRectf(pos, (float)scene->r.efra, v2d->cur.ymin, v2d->cur.xmax, v2d->cur.ymax); GPU_blend(GPU_BLEND_NONE); @@ -628,10 +628,10 @@ void clip_draw_sfra_efra(View2D *v2d, Scene *scene) GPU_line_width(1.0f); immBegin(GPU_PRIM_LINES, 4); - immVertex2f(pos, (float)SFRA, v2d->cur.ymin); - immVertex2f(pos, (float)SFRA, v2d->cur.ymax); - immVertex2f(pos, (float)EFRA, v2d->cur.ymin); - immVertex2f(pos, (float)EFRA, v2d->cur.ymax); + immVertex2f(pos, (float)scene->r.sfra, v2d->cur.ymin); + immVertex2f(pos, (float)scene->r.sfra, v2d->cur.ymax); + immVertex2f(pos, (float)scene->r.efra, v2d->cur.ymin); + immVertex2f(pos, (float)scene->r.efra, v2d->cur.ymax); immEnd(); immUnbindProgram(); diff --git a/source/blender/editors/space_clip/space_clip.c b/source/blender/editors/space_clip/space_clip.c index a73883e7624..ce6409a7784 100644 --- a/source/blender/editors/space_clip/space_clip.c +++ b/source/blender/editors/space_clip/space_clip.c @@ -515,6 +515,9 @@ static void clip_operatortypes(void) WM_operatortype_append(CLIP_OT_keyframe_insert); WM_operatortype_append(CLIP_OT_keyframe_delete); + WM_operatortype_append(CLIP_OT_new_image_from_plane_marker); + WM_operatortype_append(CLIP_OT_update_image_from_plane_marker); + /* ** clip_graph_ops.c ** */ /* graph editing */ diff --git a/source/blender/editors/space_clip/tracking_ops.c b/source/blender/editors/space_clip/tracking_ops.c index ca224b04da5..cba4157d044 100644 --- a/source/blender/editors/space_clip/tracking_ops.c +++ b/source/blender/editors/space_clip/tracking_ops.c @@ -16,6 +16,7 @@ #include "BLI_utildefines.h" #include "BKE_context.h" +#include "BKE_image.h" #include "BKE_movieclip.h" #include "BKE_report.h" #include "BKE_tracking.h" @@ -33,6 +34,9 @@ #include "BLT_translation.h" +#include "IMB_imbuf.h" +#include "IMB_imbuf_types.h" + #include "clip_intern.h" #include "tracking_ops_intern.h" @@ -1267,7 +1271,8 @@ static int frame_jump_exec(bContext *C, wmOperator *op) } delta = pos == 1 ? 1 : -1; - while (sc->user.framenr + delta >= SFRA && sc->user.framenr + delta <= EFRA) { + while (sc->user.framenr + delta >= scene->r.sfra && + sc->user.framenr + delta <= scene->r.efra) { int framenr = BKE_movieclip_remap_scene_to_clip_frame(clip, sc->user.framenr + delta); MovieTrackingMarker *marker = BKE_tracking_marker_get_exact(track, framenr); @@ -1286,7 +1291,7 @@ static int frame_jump_exec(bContext *C, wmOperator *op) delta = pos == 3 ? 1 : -1; framenr += delta; - while (framenr + delta >= SFRA && framenr + delta <= EFRA) { + while (framenr + delta >= scene->r.sfra && framenr + delta <= scene->r.efra) { MovieReconstructedCamera *cam = BKE_tracking_camera_get_reconstructed( tracking, object, framenr); @@ -1300,8 +1305,8 @@ static int frame_jump_exec(bContext *C, wmOperator *op) } } - if (CFRA != sc->user.framenr) { - CFRA = sc->user.framenr; + if (scene->r.cfra != sc->user.framenr) { + scene->r.cfra = sc->user.framenr; DEG_id_tag_update(&scene->id, ID_RECALC_FRAME_CHANGE); WM_event_add_notifier(C, NC_SCENE | ND_FRAME, scene); @@ -2212,3 +2217,144 @@ void CLIP_OT_keyframe_delete(wmOperatorType *ot) } /** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Image from plane track marker + * \{ */ + +static ImBuf *sample_plane_marker_image_for_operator(bContext *C) +{ + SpaceClip *space_clip = CTX_wm_space_clip(C); + const int clip_frame_number = ED_space_clip_get_clip_frame_number(space_clip); + + MovieClip *clip = ED_space_clip_get_clip(space_clip); + + MovieTracking *tracking = &clip->tracking; + MovieTrackingPlaneTrack *plane_track = tracking->act_plane_track; + const MovieTrackingPlaneMarker *plane_marker = BKE_tracking_plane_marker_get(plane_track, + clip_frame_number); + + ImBuf *frame_ibuf = ED_space_clip_get_buffer(space_clip); + if (frame_ibuf == NULL) { + return NULL; + } + + ImBuf *plane_ibuf = BKE_tracking_get_plane_imbuf(frame_ibuf, plane_marker); + + IMB_freeImBuf(frame_ibuf); + + return plane_ibuf; +} + +static bool new_image_from_plane_marker_poll(bContext *C) +{ + if (!ED_space_clip_tracking_poll(C)) { + return false; + } + + SpaceClip *space_clip = CTX_wm_space_clip(C); + MovieClip *clip = ED_space_clip_get_clip(space_clip); + const MovieTracking *tracking = &clip->tracking; + + if (tracking->act_plane_track == NULL) { + return false; + } + + return true; +} + +static int new_image_from_plane_marker_exec(bContext *C, wmOperator *UNUSED(op)) +{ + SpaceClip *space_clip = CTX_wm_space_clip(C); + MovieClip *clip = ED_space_clip_get_clip(space_clip); + MovieTracking *tracking = &clip->tracking; + MovieTrackingPlaneTrack *plane_track = tracking->act_plane_track; + + ImBuf *plane_ibuf = sample_plane_marker_image_for_operator(C); + if (plane_ibuf == NULL) { + return OPERATOR_CANCELLED; + } + + plane_track->image = BKE_image_add_from_imbuf(CTX_data_main(C), plane_ibuf, plane_track->name); + + IMB_freeImBuf(plane_ibuf); + + WM_event_add_notifier(C, NC_MOVIECLIP | NA_EDITED, clip); + + return OPERATOR_FINISHED; +} + +void CLIP_OT_new_image_from_plane_marker(wmOperatorType *ot) +{ + /* identifiers */ + ot->name = "New Image from Plane Marker"; + ot->description = "Create new image from the content of the plane marker"; + ot->idname = "CLIP_OT_new_image_from_plane_marker"; + + /* api callbacks */ + ot->poll = new_image_from_plane_marker_poll; + ot->exec = new_image_from_plane_marker_exec; + + /* flags */ + ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; +} + +static bool update_image_from_plane_marker_poll(bContext *C) +{ + if (!ED_space_clip_tracking_poll(C)) { + return false; + } + + SpaceClip *space_clip = CTX_wm_space_clip(C); + MovieClip *clip = ED_space_clip_get_clip(space_clip); + const MovieTracking *tracking = &clip->tracking; + + if (tracking->act_plane_track == NULL || tracking->act_plane_track->image == NULL) { + return false; + } + + const Image *image = tracking->act_plane_track->image; + return image->type == IMA_TYPE_IMAGE && ELEM(image->source, IMA_SRC_FILE, IMA_SRC_GENERATED); +} + +static int update_image_from_plane_marker_exec(bContext *C, wmOperator *UNUSED(op)) +{ + SpaceClip *space_clip = CTX_wm_space_clip(C); + MovieClip *clip = ED_space_clip_get_clip(space_clip); + MovieTracking *tracking = &clip->tracking; + MovieTrackingPlaneTrack *plane_track = tracking->act_plane_track; + + ImBuf *plane_ibuf = sample_plane_marker_image_for_operator(C); + if (plane_ibuf == NULL) { + return OPERATOR_CANCELLED; + } + + BKE_image_replace_imbuf(plane_track->image, plane_ibuf); + + IMB_freeImBuf(plane_ibuf); + + WM_event_add_notifier(C, NC_MOVIECLIP | NA_EDITED, clip); + WM_event_add_notifier(C, NC_IMAGE | NA_EDITED, plane_track->image); + + BKE_image_partial_update_mark_full_update(plane_track->image); + + return OPERATOR_FINISHED; +} + +void CLIP_OT_update_image_from_plane_marker(wmOperatorType *ot) +{ + /* identifiers */ + ot->name = "Update Image from Plane Marker"; + ot->description = + "Update current image used by plane marker from the content of the plane marker"; + ot->idname = "CLIP_OT_update_image_from_plane_marker"; + + /* api callbacks */ + ot->poll = update_image_from_plane_marker_poll; + ot->exec = update_image_from_plane_marker_exec; + + /* flags */ + ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; +} + +/** \} */ diff --git a/source/blender/editors/space_clip/tracking_ops_track.c b/source/blender/editors/space_clip/tracking_ops_track.c index d5223d57490..f6fd2980c19 100644 --- a/source/blender/editors/space_clip/tracking_ops_track.c +++ b/source/blender/editors/space_clip/tracking_ops_track.c @@ -131,10 +131,10 @@ static bool track_markers_initjob(bContext *C, TrackMarkersJob *tmj, bool backwa if (sequence) { if (backwards) { - tmj->efra = SFRA; + tmj->efra = scene->r.sfra; } else { - tmj->efra = EFRA; + tmj->efra = scene->r.efra; } tmj->efra = BKE_movieclip_remap_scene_to_clip_frame(clip, tmj->efra); } |