Fix minor onion layering control errors
This commit is contained in:
parent
02ed4b392c
commit
8a9b3d24f5
2 changed files with 66 additions and 78 deletions
|
@ -58,6 +58,7 @@ void AnimationPlayerEditor::_node_removed(Node *p_node) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void AnimationPlayerEditor::_notification(int p_what) {
|
void AnimationPlayerEditor::_notification(int p_what) {
|
||||||
|
|
||||||
switch (p_what) {
|
switch (p_what) {
|
||||||
case NOTIFICATION_PROCESS: {
|
case NOTIFICATION_PROCESS: {
|
||||||
|
|
||||||
|
@ -84,17 +85,13 @@ void AnimationPlayerEditor::_notification(int p_what) {
|
||||||
EditorNode::get_singleton()->get_inspector()->refresh();
|
EditorNode::get_singleton()->get_inspector()->refresh();
|
||||||
|
|
||||||
} else if (last_active) {
|
} else if (last_active) {
|
||||||
//need the last frame after it stopped
|
// Need the last frame after it stopped.
|
||||||
|
|
||||||
frame->set_value(player->get_current_animation_position());
|
frame->set_value(player->get_current_animation_position());
|
||||||
}
|
}
|
||||||
|
|
||||||
last_active = player->is_playing();
|
last_active = player->is_playing();
|
||||||
//seek->set_val(player->get_position());
|
|
||||||
updating = false;
|
updating = false;
|
||||||
|
|
||||||
} break;
|
} break;
|
||||||
|
|
||||||
case NOTIFICATION_ENTER_TREE: {
|
case NOTIFICATION_ENTER_TREE: {
|
||||||
|
|
||||||
tool_anim->get_popup()->connect("id_pressed", this, "_animation_tool_menu");
|
tool_anim->get_popup()->connect("id_pressed", this, "_animation_tool_menu");
|
||||||
|
@ -107,12 +104,10 @@ void AnimationPlayerEditor::_notification(int p_what) {
|
||||||
|
|
||||||
add_style_override("panel", editor->get_gui_base()->get_stylebox("panel", "Panel"));
|
add_style_override("panel", editor->get_gui_base()->get_stylebox("panel", "Panel"));
|
||||||
} break;
|
} break;
|
||||||
|
|
||||||
case EditorSettings::NOTIFICATION_EDITOR_SETTINGS_CHANGED: {
|
case EditorSettings::NOTIFICATION_EDITOR_SETTINGS_CHANGED: {
|
||||||
|
|
||||||
add_style_override("panel", editor->get_gui_base()->get_stylebox("panel", "Panel"));
|
add_style_override("panel", editor->get_gui_base()->get_stylebox("panel", "Panel"));
|
||||||
} break;
|
} break;
|
||||||
|
|
||||||
case NOTIFICATION_THEME_CHANGED: {
|
case NOTIFICATION_THEME_CHANGED: {
|
||||||
|
|
||||||
autoplay->set_icon(get_icon("AutoPlay", "EditorIcons"));
|
autoplay->set_icon(get_icon("AutoPlay", "EditorIcons"));
|
||||||
|
@ -144,9 +139,6 @@ void AnimationPlayerEditor::_notification(int p_what) {
|
||||||
ITEM_ICON(TOOL_EDIT_TRANSITIONS, "Blend");
|
ITEM_ICON(TOOL_EDIT_TRANSITIONS, "Blend");
|
||||||
ITEM_ICON(TOOL_EDIT_RESOURCE, "Edit");
|
ITEM_ICON(TOOL_EDIT_RESOURCE, "Edit");
|
||||||
ITEM_ICON(TOOL_REMOVE_ANIM, "Remove");
|
ITEM_ICON(TOOL_REMOVE_ANIM, "Remove");
|
||||||
//ITEM_ICON(TOOL_COPY_ANIM, "Copy");
|
|
||||||
//ITEM_ICON(TOOL_PASTE_ANIM, "Paste");
|
|
||||||
|
|
||||||
} break;
|
} break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -197,8 +189,6 @@ void AnimationPlayerEditor::_play_pressed() {
|
||||||
|
|
||||||
//unstop
|
//unstop
|
||||||
stop->set_pressed(false);
|
stop->set_pressed(false);
|
||||||
//unpause
|
|
||||||
//pause->set_pressed(false);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void AnimationPlayerEditor::_play_from_pressed() {
|
void AnimationPlayerEditor::_play_from_pressed() {
|
||||||
|
@ -224,8 +214,6 @@ void AnimationPlayerEditor::_play_from_pressed() {
|
||||||
|
|
||||||
//unstop
|
//unstop
|
||||||
stop->set_pressed(false);
|
stop->set_pressed(false);
|
||||||
//unpause
|
|
||||||
//pause->set_pressed(false);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void AnimationPlayerEditor::_play_bw_pressed() {
|
void AnimationPlayerEditor::_play_bw_pressed() {
|
||||||
|
@ -245,8 +233,6 @@ void AnimationPlayerEditor::_play_bw_pressed() {
|
||||||
|
|
||||||
//unstop
|
//unstop
|
||||||
stop->set_pressed(false);
|
stop->set_pressed(false);
|
||||||
//unpause
|
|
||||||
//pause->set_pressed(false);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void AnimationPlayerEditor::_play_bw_from_pressed() {
|
void AnimationPlayerEditor::_play_bw_from_pressed() {
|
||||||
|
@ -269,8 +255,6 @@ void AnimationPlayerEditor::_play_bw_from_pressed() {
|
||||||
|
|
||||||
//unstop
|
//unstop
|
||||||
stop->set_pressed(false);
|
stop->set_pressed(false);
|
||||||
//unpause
|
|
||||||
//pause->set_pressed(false);
|
|
||||||
}
|
}
|
||||||
void AnimationPlayerEditor::_stop_pressed() {
|
void AnimationPlayerEditor::_stop_pressed() {
|
||||||
|
|
||||||
|
@ -281,14 +265,8 @@ void AnimationPlayerEditor::_stop_pressed() {
|
||||||
player->stop(false);
|
player->stop(false);
|
||||||
play->set_pressed(false);
|
play->set_pressed(false);
|
||||||
stop->set_pressed(true);
|
stop->set_pressed(true);
|
||||||
//pause->set_pressed(false);
|
|
||||||
//player->set_pause(false);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void AnimationPlayerEditor::_pause_pressed() {
|
|
||||||
|
|
||||||
//player->set_pause( pause->is_pressed() );
|
|
||||||
}
|
|
||||||
void AnimationPlayerEditor::_animation_selected(int p_which) {
|
void AnimationPlayerEditor::_animation_selected(int p_which) {
|
||||||
|
|
||||||
if (updating)
|
if (updating)
|
||||||
|
@ -469,13 +447,17 @@ void AnimationPlayerEditor::_animation_remove_confirmed() {
|
||||||
if (player->get_autoplay() == current) {
|
if (player->get_autoplay() == current) {
|
||||||
undo_redo->add_do_method(player, "set_autoplay", "");
|
undo_redo->add_do_method(player, "set_autoplay", "");
|
||||||
undo_redo->add_undo_method(player, "set_autoplay", current);
|
undo_redo->add_undo_method(player, "set_autoplay", current);
|
||||||
// Avoid having the autoplay icon linger around if there is only one animation in the player
|
// Avoid having the autoplay icon linger around if there is only one animation in the player.
|
||||||
undo_redo->add_do_method(this, "_animation_player_changed", player);
|
undo_redo->add_do_method(this, "_animation_player_changed", player);
|
||||||
}
|
}
|
||||||
undo_redo->add_do_method(player, "remove_animation", current);
|
undo_redo->add_do_method(player, "remove_animation", current);
|
||||||
undo_redo->add_undo_method(player, "add_animation", current, anim);
|
undo_redo->add_undo_method(player, "add_animation", current, anim);
|
||||||
undo_redo->add_do_method(this, "_animation_player_changed", player);
|
undo_redo->add_do_method(this, "_animation_player_changed", player);
|
||||||
undo_redo->add_undo_method(this, "_animation_player_changed", player);
|
undo_redo->add_undo_method(this, "_animation_player_changed", player);
|
||||||
|
if (animation->get_item_count() == 1) {
|
||||||
|
undo_redo->add_do_method(this, "_stop_onion_skinning");
|
||||||
|
undo_redo->add_undo_method(this, "_start_onion_skinning");
|
||||||
|
}
|
||||||
undo_redo->commit_action();
|
undo_redo->commit_action();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -545,6 +527,10 @@ void AnimationPlayerEditor::_animation_name_edited() {
|
||||||
undo_redo->add_undo_method(player, "remove_animation", new_name);
|
undo_redo->add_undo_method(player, "remove_animation", new_name);
|
||||||
undo_redo->add_do_method(this, "_animation_player_changed", player);
|
undo_redo->add_do_method(this, "_animation_player_changed", player);
|
||||||
undo_redo->add_undo_method(this, "_animation_player_changed", player);
|
undo_redo->add_undo_method(this, "_animation_player_changed", player);
|
||||||
|
if (animation->get_item_count() == 0) {
|
||||||
|
undo_redo->add_do_method(this, "_start_onion_skinning");
|
||||||
|
undo_redo->add_undo_method(this, "_stop_onion_skinning");
|
||||||
|
}
|
||||||
undo_redo->commit_action();
|
undo_redo->commit_action();
|
||||||
|
|
||||||
_select_anim_by_name(new_name);
|
_select_anim_by_name(new_name);
|
||||||
|
@ -844,7 +830,8 @@ void AnimationPlayerEditor::_update_player() {
|
||||||
animation->set_disabled(animlist.size() == 0);
|
animation->set_disabled(animlist.size() == 0);
|
||||||
autoplay->set_disabled(animlist.size() == 0);
|
autoplay->set_disabled(animlist.size() == 0);
|
||||||
tool_anim->set_disabled(player == NULL);
|
tool_anim->set_disabled(player == NULL);
|
||||||
onion_skinning->set_disabled(player == NULL);
|
onion_toggle->set_disabled(animlist.size() == 0);
|
||||||
|
onion_skinning->set_disabled(animlist.size() == 0);
|
||||||
pin->set_disabled(player == NULL);
|
pin->set_disabled(player == NULL);
|
||||||
|
|
||||||
if (!player) {
|
if (!player) {
|
||||||
|
@ -895,17 +882,25 @@ void AnimationPlayerEditor::_update_player() {
|
||||||
|
|
||||||
void AnimationPlayerEditor::edit(AnimationPlayer *p_player) {
|
void AnimationPlayerEditor::edit(AnimationPlayer *p_player) {
|
||||||
|
|
||||||
if (onion.enabled)
|
|
||||||
_start_onion_skinning();
|
|
||||||
|
|
||||||
if (player && pin->is_pressed())
|
if (player && pin->is_pressed())
|
||||||
return; //ignore, pinned
|
return; // Ignore, pinned.
|
||||||
player = p_player;
|
player = p_player;
|
||||||
|
|
||||||
if (player) {
|
if (player) {
|
||||||
_update_player();
|
_update_player();
|
||||||
|
|
||||||
|
if (onion.enabled) {
|
||||||
|
if (animation->get_item_count() > 0)
|
||||||
|
_start_onion_skinning();
|
||||||
|
else
|
||||||
|
_stop_onion_skinning();
|
||||||
|
}
|
||||||
|
|
||||||
track_editor->show_select_node_warning(false);
|
track_editor->show_select_node_warning(false);
|
||||||
} else {
|
} else {
|
||||||
|
if (onion.enabled)
|
||||||
|
_stop_onion_skinning();
|
||||||
|
|
||||||
track_editor->show_select_node_warning(true);
|
track_editor->show_select_node_warning(true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -915,13 +910,13 @@ void AnimationPlayerEditor::forward_canvas_force_draw_over_viewport(Control *p_o
|
||||||
if (!onion.can_overlay)
|
if (!onion.can_overlay)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// Can happen on viewport resize, at least
|
// Can happen on viewport resize, at least.
|
||||||
if (!_are_onion_layers_valid())
|
if (!_are_onion_layers_valid())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
RID ci = p_overlay->get_canvas_item();
|
RID ci = p_overlay->get_canvas_item();
|
||||||
Rect2 src_rect = p_overlay->get_global_rect();
|
Rect2 src_rect = p_overlay->get_global_rect();
|
||||||
// Re-flip since captures are already flipped
|
// Re-flip since captures are already flipped.
|
||||||
src_rect.position.y = onion.capture_size.y - (src_rect.position.y + src_rect.size.y);
|
src_rect.position.y = onion.capture_size.y - (src_rect.position.y + src_rect.size.y);
|
||||||
src_rect.size.y *= -1;
|
src_rect.size.y *= -1;
|
||||||
|
|
||||||
|
@ -955,7 +950,7 @@ void AnimationPlayerEditor::forward_canvas_force_draw_over_viewport(Control *p_o
|
||||||
}
|
}
|
||||||
|
|
||||||
cidx++;
|
cidx++;
|
||||||
} while (cidx < base_cidx + onion.steps); // In case there's the present capture at the end, skip it
|
} while (cidx < base_cidx + onion.steps); // In case there's the present capture at the end, skip it.
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1053,7 +1048,7 @@ void AnimationPlayerEditor::_animation_player_changed(Object *p_pl) {
|
||||||
|
|
||||||
_update_player();
|
_update_player();
|
||||||
if (blend_editor.dialog->is_visible_in_tree())
|
if (blend_editor.dialog->is_visible_in_tree())
|
||||||
_animation_blend(); //update
|
_animation_blend(); // Update.
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1092,8 +1087,6 @@ void AnimationPlayerEditor::_animation_key_editor_seek(float p_pos, bool p_drag)
|
||||||
_seek_value_changed(p_pos, !p_drag);
|
_seek_value_changed(p_pos, !p_drag);
|
||||||
|
|
||||||
EditorNode::get_singleton()->get_inspector()->refresh();
|
EditorNode::get_singleton()->get_inspector()->refresh();
|
||||||
|
|
||||||
//seekit
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void AnimationPlayerEditor::_hide_anim_editors() {
|
void AnimationPlayerEditor::_hide_anim_editors() {
|
||||||
|
@ -1113,8 +1106,9 @@ void AnimationPlayerEditor::_animation_about_to_show_menu() {
|
||||||
void AnimationPlayerEditor::_animation_tool_menu(int p_option) {
|
void AnimationPlayerEditor::_animation_tool_menu(int p_option) {
|
||||||
|
|
||||||
String current;
|
String current;
|
||||||
if (animation->get_selected() >= 0 && animation->get_selected() < animation->get_item_count())
|
if (animation->get_selected() >= 0 && animation->get_selected() < animation->get_item_count()) {
|
||||||
current = animation->get_item_text(animation->get_selected());
|
current = animation->get_item_text(animation->get_selected());
|
||||||
|
}
|
||||||
|
|
||||||
Ref<Animation> anim;
|
Ref<Animation> anim;
|
||||||
if (current != String()) {
|
if (current != String()) {
|
||||||
|
@ -1124,33 +1118,39 @@ void AnimationPlayerEditor::_animation_tool_menu(int p_option) {
|
||||||
switch (p_option) {
|
switch (p_option) {
|
||||||
|
|
||||||
case TOOL_NEW_ANIM: {
|
case TOOL_NEW_ANIM: {
|
||||||
|
|
||||||
_animation_new();
|
_animation_new();
|
||||||
} break;
|
} break;
|
||||||
|
|
||||||
case TOOL_LOAD_ANIM: {
|
case TOOL_LOAD_ANIM: {
|
||||||
|
|
||||||
_animation_load();
|
_animation_load();
|
||||||
break;
|
|
||||||
} break;
|
} break;
|
||||||
case TOOL_SAVE_ANIM: {
|
case TOOL_SAVE_ANIM: {
|
||||||
|
|
||||||
if (anim.is_valid()) {
|
if (anim.is_valid()) {
|
||||||
_animation_save(anim);
|
_animation_save(anim);
|
||||||
}
|
}
|
||||||
} break;
|
} break;
|
||||||
case TOOL_SAVE_AS_ANIM: {
|
case TOOL_SAVE_AS_ANIM: {
|
||||||
|
|
||||||
if (anim.is_valid()) {
|
if (anim.is_valid()) {
|
||||||
_animation_save_as(anim);
|
_animation_save_as(anim);
|
||||||
}
|
}
|
||||||
} break;
|
} break;
|
||||||
case TOOL_DUPLICATE_ANIM: {
|
case TOOL_DUPLICATE_ANIM: {
|
||||||
|
|
||||||
_animation_duplicate();
|
_animation_duplicate();
|
||||||
} break;
|
} break;
|
||||||
case TOOL_RENAME_ANIM: {
|
case TOOL_RENAME_ANIM: {
|
||||||
|
|
||||||
_animation_rename();
|
_animation_rename();
|
||||||
} break;
|
} break;
|
||||||
case TOOL_EDIT_TRANSITIONS: {
|
case TOOL_EDIT_TRANSITIONS: {
|
||||||
|
|
||||||
_animation_blend();
|
_animation_blend();
|
||||||
} break;
|
} break;
|
||||||
case TOOL_REMOVE_ANIM: {
|
case TOOL_REMOVE_ANIM: {
|
||||||
|
|
||||||
_animation_remove();
|
_animation_remove();
|
||||||
} break;
|
} break;
|
||||||
case TOOL_COPY_ANIM: {
|
case TOOL_COPY_ANIM: {
|
||||||
|
@ -1163,9 +1163,7 @@ void AnimationPlayerEditor::_animation_tool_menu(int p_option) {
|
||||||
|
|
||||||
String current2 = animation->get_item_text(animation->get_selected());
|
String current2 = animation->get_item_text(animation->get_selected());
|
||||||
Ref<Animation> anim2 = player->get_animation(current2);
|
Ref<Animation> anim2 = player->get_animation(current2);
|
||||||
//editor->edit_resource(anim2);
|
|
||||||
EditorSettings::get_singleton()->set_resource_clipboard(anim2);
|
EditorSettings::get_singleton()->set_resource_clipboard(anim2);
|
||||||
|
|
||||||
} break;
|
} break;
|
||||||
case TOOL_PASTE_ANIM: {
|
case TOOL_PASTE_ANIM: {
|
||||||
|
|
||||||
|
@ -1197,7 +1195,6 @@ void AnimationPlayerEditor::_animation_tool_menu(int p_option) {
|
||||||
undo_redo->commit_action();
|
undo_redo->commit_action();
|
||||||
|
|
||||||
_select_anim_by_name(name);
|
_select_anim_by_name(name);
|
||||||
|
|
||||||
} break;
|
} break;
|
||||||
case TOOL_EDIT_RESOURCE: {
|
case TOOL_EDIT_RESOURCE: {
|
||||||
|
|
||||||
|
@ -1210,7 +1207,6 @@ void AnimationPlayerEditor::_animation_tool_menu(int p_option) {
|
||||||
String current2 = animation->get_item_text(animation->get_selected());
|
String current2 = animation->get_item_text(animation->get_selected());
|
||||||
Ref<Animation> anim2 = player->get_animation(current2);
|
Ref<Animation> anim2 = player->get_animation(current2);
|
||||||
editor->edit_resource(anim2);
|
editor->edit_resource(anim2);
|
||||||
|
|
||||||
} break;
|
} break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1232,22 +1228,19 @@ void AnimationPlayerEditor::_onion_skinning_menu(int p_option) {
|
||||||
_stop_onion_skinning();
|
_stop_onion_skinning();
|
||||||
|
|
||||||
} break;
|
} break;
|
||||||
|
|
||||||
case ONION_SKINNING_PAST: {
|
case ONION_SKINNING_PAST: {
|
||||||
|
|
||||||
// Ensure at least one of past/future is checjed
|
// Ensure at least one of past/future is checked.
|
||||||
onion.past = onion.future ? !onion.past : true;
|
onion.past = onion.future ? !onion.past : true;
|
||||||
menu->set_item_checked(idx, onion.past);
|
menu->set_item_checked(idx, onion.past);
|
||||||
} break;
|
} break;
|
||||||
|
|
||||||
case ONION_SKINNING_FUTURE: {
|
case ONION_SKINNING_FUTURE: {
|
||||||
|
|
||||||
// Ensure at least one of past/future is checjed
|
// Ensure at least one of past/future is checked.
|
||||||
onion.future = onion.past ? !onion.future : true;
|
onion.future = onion.past ? !onion.future : true;
|
||||||
menu->set_item_checked(idx, onion.future);
|
menu->set_item_checked(idx, onion.future);
|
||||||
} break;
|
} break;
|
||||||
|
case ONION_SKINNING_1_STEP: // Fall-through.
|
||||||
case ONION_SKINNING_1_STEP: // Fall-through
|
|
||||||
case ONION_SKINNING_2_STEPS:
|
case ONION_SKINNING_2_STEPS:
|
||||||
case ONION_SKINNING_3_STEPS: {
|
case ONION_SKINNING_3_STEPS: {
|
||||||
|
|
||||||
|
@ -1257,19 +1250,16 @@ void AnimationPlayerEditor::_onion_skinning_menu(int p_option) {
|
||||||
menu->set_item_checked(one_frame_idx + i, onion.steps == i + 1);
|
menu->set_item_checked(one_frame_idx + i, onion.steps == i + 1);
|
||||||
}
|
}
|
||||||
} break;
|
} break;
|
||||||
|
|
||||||
case ONION_SKINNING_DIFFERENCES_ONLY: {
|
case ONION_SKINNING_DIFFERENCES_ONLY: {
|
||||||
|
|
||||||
onion.differences_only = !onion.differences_only;
|
onion.differences_only = !onion.differences_only;
|
||||||
menu->set_item_checked(idx, onion.differences_only);
|
menu->set_item_checked(idx, onion.differences_only);
|
||||||
} break;
|
} break;
|
||||||
|
|
||||||
case ONION_SKINNING_FORCE_WHITE_MODULATE: {
|
case ONION_SKINNING_FORCE_WHITE_MODULATE: {
|
||||||
|
|
||||||
onion.force_white_modulate = !onion.force_white_modulate;
|
onion.force_white_modulate = !onion.force_white_modulate;
|
||||||
menu->set_item_checked(idx, onion.force_white_modulate);
|
menu->set_item_checked(idx, onion.force_white_modulate);
|
||||||
} break;
|
} break;
|
||||||
|
|
||||||
case ONION_SKINNING_INCLUDE_GIZMOS: {
|
case ONION_SKINNING_INCLUDE_GIZMOS: {
|
||||||
|
|
||||||
onion.include_gizmos = !onion.include_gizmos;
|
onion.include_gizmos = !onion.include_gizmos;
|
||||||
|
@ -1306,7 +1296,7 @@ void AnimationPlayerEditor::_unhandled_key_input(const Ref<InputEvent> &p_ev) {
|
||||||
|
|
||||||
void AnimationPlayerEditor::_editor_visibility_changed() {
|
void AnimationPlayerEditor::_editor_visibility_changed() {
|
||||||
|
|
||||||
if (is_visible()) {
|
if (is_visible() && animation->get_item_count() > 0) {
|
||||||
_start_onion_skinning();
|
_start_onion_skinning();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1332,7 +1322,7 @@ void AnimationPlayerEditor::_allocate_onion_layers() {
|
||||||
for (int i = 0; i < captures; i++) {
|
for (int i = 0; i < captures; i++) {
|
||||||
bool is_present = onion.differences_only && i == captures - 1;
|
bool is_present = onion.differences_only && i == captures - 1;
|
||||||
|
|
||||||
// Each capture is a viewport with a canvas item attached that renders a full-size rect with the contents of the main viewport
|
// Each capture is a viewport with a canvas item attached that renders a full-size rect with the contents of the main viewport.
|
||||||
onion.captures.write[i] = VS::get_singleton()->viewport_create();
|
onion.captures.write[i] = VS::get_singleton()->viewport_create();
|
||||||
VS::get_singleton()->viewport_set_usage(onion.captures[i], VS::VIEWPORT_USAGE_2D);
|
VS::get_singleton()->viewport_set_usage(onion.captures[i], VS::VIEWPORT_USAGE_2D);
|
||||||
VS::get_singleton()->viewport_set_size(onion.captures[i], capture_size.width, capture_size.height);
|
VS::get_singleton()->viewport_set_size(onion.captures[i], capture_size.width, capture_size.height);
|
||||||
|
@ -1342,7 +1332,7 @@ void AnimationPlayerEditor::_allocate_onion_layers() {
|
||||||
VS::get_singleton()->viewport_attach_canvas(onion.captures[i], onion.capture.canvas);
|
VS::get_singleton()->viewport_attach_canvas(onion.captures[i], onion.capture.canvas);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Reset the capture canvas item to the current root viewport texture (defensive)
|
// Reset the capture canvas item to the current root viewport texture (defensive).
|
||||||
VS::get_singleton()->canvas_item_clear(onion.capture.canvas_item);
|
VS::get_singleton()->canvas_item_clear(onion.capture.canvas_item);
|
||||||
VS::get_singleton()->canvas_item_add_texture_rect(onion.capture.canvas_item, Rect2(Point2(), capture_size), get_tree()->get_root()->get_texture()->get_rid());
|
VS::get_singleton()->canvas_item_add_texture_rect(onion.capture.canvas_item, Rect2(Point2(), capture_size), get_tree()->get_root()->get_texture()->get_rid());
|
||||||
|
|
||||||
|
@ -1362,7 +1352,7 @@ void AnimationPlayerEditor::_free_onion_layers() {
|
||||||
|
|
||||||
void AnimationPlayerEditor::_prepare_onion_layers_1() {
|
void AnimationPlayerEditor::_prepare_onion_layers_1() {
|
||||||
|
|
||||||
// This would be called per viewport and we want to act once only
|
// This would be called per viewport and we want to act once only.
|
||||||
int64_t frame = get_tree()->get_frame();
|
int64_t frame = get_tree()->get_frame();
|
||||||
if (frame == onion.last_frame)
|
if (frame == onion.last_frame)
|
||||||
return;
|
return;
|
||||||
|
@ -1374,14 +1364,14 @@ void AnimationPlayerEditor::_prepare_onion_layers_1() {
|
||||||
|
|
||||||
onion.last_frame = frame;
|
onion.last_frame = frame;
|
||||||
|
|
||||||
// Refresh viewports with no onion layers overlaid
|
// Refresh viewports with no onion layers overlaid.
|
||||||
onion.can_overlay = false;
|
onion.can_overlay = false;
|
||||||
plugin->update_overlays();
|
plugin->update_overlays();
|
||||||
|
|
||||||
if (player->is_playing())
|
if (player->is_playing())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// And go to next step afterwards
|
// And go to next step afterwards.
|
||||||
call_deferred("_prepare_onion_layers_2");
|
call_deferred("_prepare_onion_layers_2");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1394,7 +1384,7 @@ void AnimationPlayerEditor::_prepare_onion_layers_2() {
|
||||||
if (!_are_onion_layers_valid())
|
if (!_are_onion_layers_valid())
|
||||||
_allocate_onion_layers();
|
_allocate_onion_layers();
|
||||||
|
|
||||||
// Hide superfluous elements that would make the overlay unnecessary cluttered
|
// Hide superfluous elements that would make the overlay unnecessary cluttered.
|
||||||
Dictionary canvas_edit_state;
|
Dictionary canvas_edit_state;
|
||||||
Dictionary spatial_edit_state;
|
Dictionary spatial_edit_state;
|
||||||
if (SpatialEditor::get_singleton()->is_visible()) {
|
if (SpatialEditor::get_singleton()->is_visible()) {
|
||||||
|
@ -1415,7 +1405,7 @@ void AnimationPlayerEditor::_prepare_onion_layers_2() {
|
||||||
vp[i] = d;
|
vp[i] = d;
|
||||||
}
|
}
|
||||||
new_state["viewports"] = vp;
|
new_state["viewports"] = vp;
|
||||||
// TODO: Save/restore only affected entries
|
// TODO: Save/restore only affected entries.
|
||||||
SpatialEditor::get_singleton()->set_state(new_state);
|
SpatialEditor::get_singleton()->set_state(new_state);
|
||||||
} else { // CanvasItemEditor
|
} else { // CanvasItemEditor
|
||||||
// 2D
|
// 2D
|
||||||
|
@ -1426,11 +1416,11 @@ void AnimationPlayerEditor::_prepare_onion_layers_2() {
|
||||||
new_state["show_guides"] = false;
|
new_state["show_guides"] = false;
|
||||||
new_state["show_helpers"] = false;
|
new_state["show_helpers"] = false;
|
||||||
new_state["show_zoom_control"] = false;
|
new_state["show_zoom_control"] = false;
|
||||||
// TODO: Save/restore only affected entries
|
// TODO: Save/restore only affected entries.
|
||||||
CanvasItemEditor::get_singleton()->set_state(new_state);
|
CanvasItemEditor::get_singleton()->set_state(new_state);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Tweak the root viewport to ensure it's rendered before our target
|
// Tweak the root viewport to ensure it's rendered before our target.
|
||||||
RID root_vp = get_tree()->get_root()->get_viewport_rid();
|
RID root_vp = get_tree()->get_root()->get_viewport_rid();
|
||||||
Rect2 root_vp_screen_rect = get_tree()->get_root()->get_attach_to_screen_rect();
|
Rect2 root_vp_screen_rect = get_tree()->get_root()->get_attach_to_screen_rect();
|
||||||
VS::get_singleton()->viewport_attach_to_screen(root_vp, Rect2());
|
VS::get_singleton()->viewport_attach_to_screen(root_vp, Rect2());
|
||||||
|
@ -1438,7 +1428,7 @@ void AnimationPlayerEditor::_prepare_onion_layers_2() {
|
||||||
|
|
||||||
RID present_rid;
|
RID present_rid;
|
||||||
if (onion.differences_only) {
|
if (onion.differences_only) {
|
||||||
// Capture present scene as it is
|
// Capture present scene as it is.
|
||||||
VS::get_singleton()->canvas_item_set_material(onion.capture.canvas_item, RID());
|
VS::get_singleton()->canvas_item_set_material(onion.capture.canvas_item, RID());
|
||||||
present_rid = onion.captures[onion.captures.size() - 1];
|
present_rid = onion.captures[onion.captures.size() - 1];
|
||||||
VS::get_singleton()->viewport_set_active(present_rid, true);
|
VS::get_singleton()->viewport_set_active(present_rid, true);
|
||||||
|
@ -1447,11 +1437,11 @@ void AnimationPlayerEditor::_prepare_onion_layers_2() {
|
||||||
VS::get_singleton()->viewport_set_active(present_rid, false);
|
VS::get_singleton()->viewport_set_active(present_rid, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Backup current animation state
|
// Backup current animation state.
|
||||||
AnimatedValuesBackup values_backup = player->backup_animated_values();
|
AnimatedValuesBackup values_backup = player->backup_animated_values();
|
||||||
float cpos = player->get_current_animation_position();
|
float cpos = player->get_current_animation_position();
|
||||||
|
|
||||||
// Render every past/future step with the capture shader
|
// Render every past/future step with the capture shader.
|
||||||
|
|
||||||
VS::get_singleton()->canvas_item_set_material(onion.capture.canvas_item, onion.capture.material->get_rid());
|
VS::get_singleton()->canvas_item_set_material(onion.capture.canvas_item, onion.capture.material->get_rid());
|
||||||
onion.capture.material->set_shader_param("bkg_color", GLOBAL_GET("rendering/environment/default_clear_color"));
|
onion.capture.material->set_shader_param("bkg_color", GLOBAL_GET("rendering/environment/default_clear_color"));
|
||||||
|
@ -1465,7 +1455,7 @@ void AnimationPlayerEditor::_prepare_onion_layers_2() {
|
||||||
for (int step_off = step_off_a; step_off <= step_off_b; step_off++) {
|
for (int step_off = step_off_a; step_off <= step_off_b; step_off++) {
|
||||||
|
|
||||||
if (step_off == 0) {
|
if (step_off == 0) {
|
||||||
// Skip present step and switch to the color of future
|
// Skip present step and switch to the color of future.
|
||||||
if (!onion.force_white_modulate)
|
if (!onion.force_white_modulate)
|
||||||
onion.capture.material->set_shader_param("dir_color", EDITOR_GET("editors/animation/onion_layers_future_color"));
|
onion.capture.material->set_shader_param("dir_color", EDITOR_GET("editors/animation/onion_layers_future_color"));
|
||||||
continue;
|
continue;
|
||||||
|
@ -1477,8 +1467,8 @@ void AnimationPlayerEditor::_prepare_onion_layers_2() {
|
||||||
onion.captures_valid.write[cidx] = valid;
|
onion.captures_valid.write[cidx] = valid;
|
||||||
if (valid) {
|
if (valid) {
|
||||||
player->seek(pos, true);
|
player->seek(pos, true);
|
||||||
get_tree()->flush_transform_notifications(); // Needed for transforms of Spatials
|
get_tree()->flush_transform_notifications(); // Needed for transforms of Spatials.
|
||||||
values_backup.update_skeletons(); // Needed for Skeletons (2D & 3D)
|
values_backup.update_skeletons(); // Needed for Skeletons (2D & 3D).
|
||||||
|
|
||||||
VS::get_singleton()->viewport_set_active(onion.captures[cidx], true);
|
VS::get_singleton()->viewport_set_active(onion.captures[cidx], true);
|
||||||
VS::get_singleton()->viewport_set_parent_viewport(root_vp, onion.captures[cidx]);
|
VS::get_singleton()->viewport_set_parent_viewport(root_vp, onion.captures[cidx]);
|
||||||
|
@ -1489,18 +1479,18 @@ void AnimationPlayerEditor::_prepare_onion_layers_2() {
|
||||||
cidx++;
|
cidx++;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Restore root viewport
|
// Restore root viewport.
|
||||||
VS::get_singleton()->viewport_set_parent_viewport(root_vp, RID());
|
VS::get_singleton()->viewport_set_parent_viewport(root_vp, RID());
|
||||||
VS::get_singleton()->viewport_attach_to_screen(root_vp, root_vp_screen_rect);
|
VS::get_singleton()->viewport_attach_to_screen(root_vp, root_vp_screen_rect);
|
||||||
VS::get_singleton()->viewport_set_update_mode(root_vp, VS::VIEWPORT_UPDATE_WHEN_VISIBLE);
|
VS::get_singleton()->viewport_set_update_mode(root_vp, VS::VIEWPORT_UPDATE_WHEN_VISIBLE);
|
||||||
|
|
||||||
// Restore animation state
|
// Restore animation state
|
||||||
// (Seeking with update=true wouldn't do the trick because the current value of the properties
|
// (Seeking with update=true wouldn't do the trick because the current value of the properties
|
||||||
// may not match their value for the current point in the animation)
|
// may not match their value for the current point in the animation).
|
||||||
player->seek(cpos, false);
|
player->seek(cpos, false);
|
||||||
player->restore_animated_values(values_backup);
|
player->restore_animated_values(values_backup);
|
||||||
|
|
||||||
// Restor state of main editors
|
// Restor state of main editors.
|
||||||
if (SpatialEditor::get_singleton()->is_visible()) {
|
if (SpatialEditor::get_singleton()->is_visible()) {
|
||||||
// 3D
|
// 3D
|
||||||
SpatialEditor::get_singleton()->set_state(spatial_edit_state);
|
SpatialEditor::get_singleton()->set_state(spatial_edit_state);
|
||||||
|
@ -1509,14 +1499,14 @@ void AnimationPlayerEditor::_prepare_onion_layers_2() {
|
||||||
CanvasItemEditor::get_singleton()->set_state(canvas_edit_state);
|
CanvasItemEditor::get_singleton()->set_state(canvas_edit_state);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Update viewports with skin layers overlaid for the actual engine loop render
|
// Update viewports with skin layers overlaid for the actual engine loop render.
|
||||||
onion.can_overlay = true;
|
onion.can_overlay = true;
|
||||||
plugin->update_overlays();
|
plugin->update_overlays();
|
||||||
}
|
}
|
||||||
|
|
||||||
void AnimationPlayerEditor::_start_onion_skinning() {
|
void AnimationPlayerEditor::_start_onion_skinning() {
|
||||||
|
|
||||||
// FIXME: Using "idle_frame" makes onion layers update one frame behind the current
|
// FIXME: Using "idle_frame" makes onion layers update one frame behind the current.
|
||||||
if (!get_tree()->is_connected("idle_frame", this, "call_deferred")) {
|
if (!get_tree()->is_connected("idle_frame", this, "call_deferred")) {
|
||||||
get_tree()->connect("idle_frame", this, "call_deferred", varray("_prepare_onion_layers_1"));
|
get_tree()->connect("idle_frame", this, "call_deferred", varray("_prepare_onion_layers_1"));
|
||||||
}
|
}
|
||||||
|
@ -1537,6 +1527,7 @@ void AnimationPlayerEditor::_stop_onion_skinning() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void AnimationPlayerEditor::_pin_pressed() {
|
void AnimationPlayerEditor::_pin_pressed() {
|
||||||
|
|
||||||
EditorNode::get_singleton()->get_scene_tree_dock()->get_tree_editor()->update_tree();
|
EditorNode::get_singleton()->get_scene_tree_dock()->get_tree_editor()->update_tree();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1549,7 +1540,6 @@ void AnimationPlayerEditor::_bind_methods() {
|
||||||
ClassDB::bind_method(D_METHOD("_play_bw_from_pressed"), &AnimationPlayerEditor::_play_bw_from_pressed);
|
ClassDB::bind_method(D_METHOD("_play_bw_from_pressed"), &AnimationPlayerEditor::_play_bw_from_pressed);
|
||||||
ClassDB::bind_method(D_METHOD("_stop_pressed"), &AnimationPlayerEditor::_stop_pressed);
|
ClassDB::bind_method(D_METHOD("_stop_pressed"), &AnimationPlayerEditor::_stop_pressed);
|
||||||
ClassDB::bind_method(D_METHOD("_autoplay_pressed"), &AnimationPlayerEditor::_autoplay_pressed);
|
ClassDB::bind_method(D_METHOD("_autoplay_pressed"), &AnimationPlayerEditor::_autoplay_pressed);
|
||||||
ClassDB::bind_method(D_METHOD("_pause_pressed"), &AnimationPlayerEditor::_pause_pressed);
|
|
||||||
ClassDB::bind_method(D_METHOD("_animation_selected"), &AnimationPlayerEditor::_animation_selected);
|
ClassDB::bind_method(D_METHOD("_animation_selected"), &AnimationPlayerEditor::_animation_selected);
|
||||||
ClassDB::bind_method(D_METHOD("_animation_name_edited"), &AnimationPlayerEditor::_animation_name_edited);
|
ClassDB::bind_method(D_METHOD("_animation_name_edited"), &AnimationPlayerEditor::_animation_name_edited);
|
||||||
ClassDB::bind_method(D_METHOD("_animation_new"), &AnimationPlayerEditor::_animation_new);
|
ClassDB::bind_method(D_METHOD("_animation_new"), &AnimationPlayerEditor::_animation_new);
|
||||||
|
@ -1564,10 +1554,7 @@ void AnimationPlayerEditor::_bind_methods() {
|
||||||
ClassDB::bind_method(D_METHOD("_seek_value_changed"), &AnimationPlayerEditor::_seek_value_changed, DEFVAL(true));
|
ClassDB::bind_method(D_METHOD("_seek_value_changed"), &AnimationPlayerEditor::_seek_value_changed, DEFVAL(true));
|
||||||
ClassDB::bind_method(D_METHOD("_animation_player_changed"), &AnimationPlayerEditor::_animation_player_changed);
|
ClassDB::bind_method(D_METHOD("_animation_player_changed"), &AnimationPlayerEditor::_animation_player_changed);
|
||||||
ClassDB::bind_method(D_METHOD("_blend_edited"), &AnimationPlayerEditor::_blend_edited);
|
ClassDB::bind_method(D_METHOD("_blend_edited"), &AnimationPlayerEditor::_blend_edited);
|
||||||
//ClassDB::bind_method(D_METHOD("_seek_frame_changed"),&AnimationPlayerEditor::_seek_frame_changed);
|
|
||||||
ClassDB::bind_method(D_METHOD("_scale_changed"), &AnimationPlayerEditor::_scale_changed);
|
ClassDB::bind_method(D_METHOD("_scale_changed"), &AnimationPlayerEditor::_scale_changed);
|
||||||
//ClassDB::bind_method(D_METHOD("_editor_store_all"),&AnimationPlayerEditor::_editor_store_all);
|
|
||||||
//ClassDB::bind_method(D_METHOD("_editor_load_all"),&AnimationPlayerEditor::_editor_load_all);
|
|
||||||
ClassDB::bind_method(D_METHOD("_list_changed"), &AnimationPlayerEditor::_list_changed);
|
ClassDB::bind_method(D_METHOD("_list_changed"), &AnimationPlayerEditor::_list_changed);
|
||||||
ClassDB::bind_method(D_METHOD("_animation_key_editor_seek"), &AnimationPlayerEditor::_animation_key_editor_seek);
|
ClassDB::bind_method(D_METHOD("_animation_key_editor_seek"), &AnimationPlayerEditor::_animation_key_editor_seek);
|
||||||
ClassDB::bind_method(D_METHOD("_animation_key_editor_anim_len_changed"), &AnimationPlayerEditor::_animation_key_editor_anim_len_changed);
|
ClassDB::bind_method(D_METHOD("_animation_key_editor_anim_len_changed"), &AnimationPlayerEditor::_animation_key_editor_anim_len_changed);
|
||||||
|
@ -1582,6 +1569,8 @@ void AnimationPlayerEditor::_bind_methods() {
|
||||||
ClassDB::bind_method(D_METHOD("_editor_visibility_changed"), &AnimationPlayerEditor::_editor_visibility_changed);
|
ClassDB::bind_method(D_METHOD("_editor_visibility_changed"), &AnimationPlayerEditor::_editor_visibility_changed);
|
||||||
ClassDB::bind_method(D_METHOD("_prepare_onion_layers_1"), &AnimationPlayerEditor::_prepare_onion_layers_1);
|
ClassDB::bind_method(D_METHOD("_prepare_onion_layers_1"), &AnimationPlayerEditor::_prepare_onion_layers_1);
|
||||||
ClassDB::bind_method(D_METHOD("_prepare_onion_layers_2"), &AnimationPlayerEditor::_prepare_onion_layers_2);
|
ClassDB::bind_method(D_METHOD("_prepare_onion_layers_2"), &AnimationPlayerEditor::_prepare_onion_layers_2);
|
||||||
|
ClassDB::bind_method(D_METHOD("_start_onion_skinning"), &AnimationPlayerEditor::_start_onion_skinning);
|
||||||
|
ClassDB::bind_method(D_METHOD("_stop_onion_skinning"), &AnimationPlayerEditor::_stop_onion_skinning);
|
||||||
|
|
||||||
ClassDB::bind_method(D_METHOD("_pin_pressed"), &AnimationPlayerEditor::_pin_pressed);
|
ClassDB::bind_method(D_METHOD("_pin_pressed"), &AnimationPlayerEditor::_pin_pressed);
|
||||||
}
|
}
|
||||||
|
|
|
@ -170,7 +170,6 @@ class AnimationPlayerEditor : public VBoxContainer {
|
||||||
void _play_bw_from_pressed();
|
void _play_bw_from_pressed();
|
||||||
void _autoplay_pressed();
|
void _autoplay_pressed();
|
||||||
void _stop_pressed();
|
void _stop_pressed();
|
||||||
void _pause_pressed();
|
|
||||||
void _animation_selected(int p_which);
|
void _animation_selected(int p_which);
|
||||||
void _animation_new();
|
void _animation_new();
|
||||||
void _animation_rename();
|
void _animation_rename();
|
||||||
|
|
Loading…
Reference in a new issue