WIP: Onion Skinning Prototype #107641
|
@ -396,7 +396,7 @@ static void ANIM_OT_change_frame(wmOperatorType *ot)
|
||||||
/** \} */
|
/** \} */
|
||||||
|
|
||||||
/* Set the new frame number */
|
/* Set the new frame number */
|
||||||
static void change_onion_skin_range_apply(bContext *C, wmOperator *op, const bool always_update)
|
static void change_onion_skin_range_apply(bContext *C, wmOperator *op)
|
||||||
{
|
{
|
||||||
Scene *scene = CTX_data_scene(C);
|
Scene *scene = CTX_data_scene(C);
|
||||||
const int left = RNA_int_get(op->ptr, "left");
|
const int left = RNA_int_get(op->ptr, "left");
|
||||||
|
@ -405,10 +405,20 @@ static void change_onion_skin_range_apply(bContext *C, wmOperator *op, const boo
|
||||||
scene->onion_skin_cache.relative_left = left;
|
scene->onion_skin_cache.relative_left = left;
|
||||||
scene->onion_skin_cache.relative_right = right;
|
scene->onion_skin_cache.relative_right = right;
|
||||||
|
|
||||||
/* do updates */
|
DEG_id_tag_update(&scene->id, ID_RECALC_FRAME_CHANGE);
|
||||||
if (always_update) {
|
WM_event_add_notifier(C, NC_SCENE | ND_FRAME, scene);
|
||||||
DEG_id_tag_update(&scene->id, ID_RECALC_FRAME_CHANGE);
|
}
|
||||||
WM_event_add_notifier(C, NC_SCENE | ND_FRAME, scene);
|
|
||||||
|
static void onion_skin_range_foo(bContext *C, wmOperator *op, const wmEvent *event)
|
||||||
|
{
|
||||||
|
Scene *scene = CTX_data_scene(C);
|
||||||
|
const int clicked_frame = roundf(frame_from_event(C, event));
|
||||||
|
const int current_scene_frame = BKE_scene_ctime_get(scene);
|
||||||
|
if (clicked_frame > current_scene_frame) {
|
||||||
|
RNA_int_set(op->ptr, "right", clicked_frame - current_scene_frame);
|
||||||
|
}
|
||||||
|
else if (clicked_frame < current_scene_frame) {
|
||||||
|
RNA_int_set(op->ptr, "left", current_scene_frame - clicked_frame);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -439,19 +449,8 @@ static int change_onion_skin_range_modal(bContext *C, wmOperator *op, const wmEv
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case MOUSEMOVE:
|
case MOUSEMOVE:
|
||||||
Scene *scene = CTX_data_scene(C);
|
onion_skin_range_foo(C, op, event);
|
||||||
const int clicked_frame = roundf(frame_from_event(C, event));
|
change_onion_skin_range_apply(C, op);
|
||||||
const int current_scene_frame = BKE_scene_ctime_get(scene);
|
|
||||||
if (clicked_frame > current_scene_frame) {
|
|
||||||
RNA_int_set(op->ptr, "right", clicked_frame);
|
|
||||||
}
|
|
||||||
else if (clicked_frame < current_scene_frame) {
|
|
||||||
RNA_int_set(op->ptr, "left", clicked_frame);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return OPERATOR_CANCELLED;
|
|
||||||
}
|
|
||||||
change_onion_skin_range_apply(C, op, false);
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case LEFTMOUSE:
|
case LEFTMOUSE:
|
||||||
|
@ -468,10 +467,6 @@ static int change_onion_skin_range_modal(bContext *C, wmOperator *op, const wmEv
|
||||||
bScreen *screen = CTX_wm_screen(C);
|
bScreen *screen = CTX_wm_screen(C);
|
||||||
screen->scrubbing = false;
|
screen->scrubbing = false;
|
||||||
|
|
||||||
SpaceSeq *sseq = CTX_wm_space_seq(C);
|
|
||||||
if (sseq != NULL) {
|
|
||||||
change_frame_seq_preview_end(sseq);
|
|
||||||
}
|
|
||||||
if (need_extra_redraw_after_scrubbing_ends(C)) {
|
if (need_extra_redraw_after_scrubbing_ends(C)) {
|
||||||
Scene *scene = CTX_data_scene(C);
|
Scene *scene = CTX_data_scene(C);
|
||||||
WM_event_add_notifier(C, NC_SCENE | ND_FRAME, scene);
|
WM_event_add_notifier(C, NC_SCENE | ND_FRAME, scene);
|
||||||
|
@ -494,21 +489,11 @@ static int change_onion_skin_range_invoke(bContext *C, wmOperator *op, const wmE
|
||||||
RNA_int_set(op->ptr, "right", scene->onion_skin_cache.relative_right);
|
RNA_int_set(op->ptr, "right", scene->onion_skin_cache.relative_right);
|
||||||
RNA_int_set(op->ptr, "left", scene->onion_skin_cache.relative_left);
|
RNA_int_set(op->ptr, "left", scene->onion_skin_cache.relative_left);
|
||||||
|
|
||||||
const int clicked_frame = roundf(frame_from_event(C, event));
|
onion_skin_range_foo(C, op, event);
|
||||||
const int current_scene_frame = BKE_scene_ctime_get(scene);
|
|
||||||
if (clicked_frame > current_scene_frame) {
|
|
||||||
RNA_int_set(op->ptr, "right", clicked_frame);
|
|
||||||
}
|
|
||||||
else if (clicked_frame < current_scene_frame) {
|
|
||||||
RNA_int_set(op->ptr, "left", clicked_frame);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return OPERATOR_CANCELLED;
|
|
||||||
}
|
|
||||||
|
|
||||||
screen->scrubbing = true;
|
screen->scrubbing = true;
|
||||||
|
|
||||||
change_onion_skin_range_apply(C, op, true);
|
change_onion_skin_range_apply(C, op);
|
||||||
|
|
||||||
/* add temp handler */
|
/* add temp handler */
|
||||||
WM_event_add_modal_handler(C, op);
|
WM_event_add_modal_handler(C, op);
|
||||||
|
@ -518,7 +503,7 @@ static int change_onion_skin_range_invoke(bContext *C, wmOperator *op, const wmE
|
||||||
|
|
||||||
static int change_onion_skin_range_exec(bContext *C, wmOperator *op)
|
static int change_onion_skin_range_exec(bContext *C, wmOperator *op)
|
||||||
{
|
{
|
||||||
change_onion_skin_range_apply(C, op, true);
|
change_onion_skin_range_apply(C, op);
|
||||||
return OPERATOR_FINISHED;
|
return OPERATOR_FINISHED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -155,7 +155,7 @@ static void draw_current_frame(const Scene *scene,
|
||||||
}
|
}
|
||||||
if (scene->onion_skin_cache.relative_right != 0) {
|
if (scene->onion_skin_cache.relative_right != 0) {
|
||||||
const int frame_relative_right = UI_view2d_view_to_region_x(
|
const int frame_relative_right = UI_view2d_view_to_region_x(
|
||||||
v2d, current_frame - scene->onion_skin_cache.relative_right);
|
v2d, current_frame + scene->onion_skin_cache.relative_right);
|
||||||
UI_draw_roundbox_4fv_ex(
|
UI_draw_roundbox_4fv_ex(
|
||||||
&(const rctf){
|
&(const rctf){
|
||||||
.xmin = frame_relative_right - box_width / 4 + U.pixelsize / 2,
|
.xmin = frame_relative_right - box_width / 4 + U.pixelsize / 2,
|
||||||
|
|
Loading…
Reference in New Issue