mirror of
https://github.com/godotengine/godot.git
synced 2024-11-10 14:12:51 +00:00
Implement a more coherent (and way less hack) way to block animation updates, fixes #24618
This commit is contained in:
parent
ae886a6f32
commit
8b4c4d9b2f
@ -239,6 +239,10 @@ void UndoRedo::_pop_history_tail() {
|
||||
}
|
||||
}
|
||||
|
||||
bool UndoRedo::is_commiting_action() const {
|
||||
return commiting > 0;
|
||||
}
|
||||
|
||||
void UndoRedo::commit_action() {
|
||||
|
||||
ERR_FAIL_COND(action_level <= 0);
|
||||
@ -321,10 +325,13 @@ bool UndoRedo::redo() {
|
||||
|
||||
if ((current_action + 1) >= actions.size())
|
||||
return false; //nothing to redo
|
||||
|
||||
commiting++;
|
||||
current_action++;
|
||||
|
||||
_process_operation_list(actions.write[current_action].do_ops.front());
|
||||
version++;
|
||||
commiting--;
|
||||
|
||||
return true;
|
||||
}
|
||||
@ -334,10 +341,11 @@ bool UndoRedo::undo() {
|
||||
ERR_FAIL_COND_V(action_level > 0, false);
|
||||
if (current_action < 0)
|
||||
return false; //nothing to redo
|
||||
commiting++;
|
||||
_process_operation_list(actions.write[current_action].undo_ops.front());
|
||||
current_action--;
|
||||
version--;
|
||||
|
||||
commiting--;
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -386,6 +394,7 @@ void UndoRedo::set_property_notify_callback(PropertyNotifyCallback p_property_ca
|
||||
|
||||
UndoRedo::UndoRedo() {
|
||||
|
||||
commiting = 0;
|
||||
version = 1;
|
||||
action_level = 0;
|
||||
current_action = -1;
|
||||
@ -484,6 +493,7 @@ void UndoRedo::_bind_methods() {
|
||||
|
||||
ClassDB::bind_method(D_METHOD("create_action", "name", "merge_mode"), &UndoRedo::create_action, DEFVAL(MERGE_DISABLE));
|
||||
ClassDB::bind_method(D_METHOD("commit_action"), &UndoRedo::commit_action);
|
||||
ClassDB::bind_method(D_METHOD("is_commiting_action"), &UndoRedo::is_commiting_action);
|
||||
|
||||
//ClassDB::bind_method(D_METHOD("add_do_method","p_object", "p_method", "VARIANT_ARG_LIST"),&UndoRedo::add_do_method);
|
||||
//ClassDB::bind_method(D_METHOD("add_undo_method","p_object", "p_method", "VARIANT_ARG_LIST"),&UndoRedo::add_undo_method);
|
||||
|
@ -94,6 +94,8 @@ private:
|
||||
MethodNotifyCallback method_callback;
|
||||
PropertyNotifyCallback property_callback;
|
||||
|
||||
int commiting;
|
||||
|
||||
protected:
|
||||
static void _bind_methods();
|
||||
|
||||
@ -107,6 +109,7 @@ public:
|
||||
void add_do_reference(Object *p_object);
|
||||
void add_undo_reference(Object *p_object);
|
||||
|
||||
bool is_commiting_action() const;
|
||||
void commit_action();
|
||||
|
||||
bool redo();
|
||||
|
@ -692,12 +692,10 @@ void AnimationTimelineEdit::_anim_length_changed(double p_new_len) {
|
||||
p_new_len = MAX(0.001, p_new_len);
|
||||
|
||||
editing = true;
|
||||
*block_animation_update_ptr = true;
|
||||
undo_redo->create_action(TTR("Change Animation Length"));
|
||||
undo_redo->add_do_method(animation.ptr(), "set_length", p_new_len);
|
||||
undo_redo->add_undo_method(animation.ptr(), "set_length", animation->get_length());
|
||||
undo_redo->commit_action();
|
||||
*block_animation_update_ptr = false;
|
||||
editing = false;
|
||||
update();
|
||||
|
||||
@ -706,12 +704,10 @@ void AnimationTimelineEdit::_anim_length_changed(double p_new_len) {
|
||||
|
||||
void AnimationTimelineEdit::_anim_loop_pressed() {
|
||||
|
||||
*block_animation_update_ptr = true;
|
||||
undo_redo->create_action(TTR("Change Animation Loop"));
|
||||
undo_redo->add_do_method(animation.ptr(), "set_loop", loop->is_pressed());
|
||||
undo_redo->add_undo_method(animation.ptr(), "set_loop", animation->has_loop());
|
||||
undo_redo->commit_action();
|
||||
*block_animation_update_ptr = false;
|
||||
}
|
||||
|
||||
int AnimationTimelineEdit::get_buttons_width() const {
|
||||
@ -936,10 +932,6 @@ Size2 AnimationTimelineEdit::get_minimum_size() const {
|
||||
return ms;
|
||||
}
|
||||
|
||||
void AnimationTimelineEdit::set_block_animation_update_ptr(bool *p_block_ptr) {
|
||||
block_animation_update_ptr = p_block_ptr;
|
||||
}
|
||||
|
||||
void AnimationTimelineEdit::set_undo_redo(UndoRedo *p_undo_redo) {
|
||||
undo_redo = p_undo_redo;
|
||||
}
|
||||
@ -1080,7 +1072,6 @@ void AnimationTimelineEdit::_bind_methods() {
|
||||
|
||||
AnimationTimelineEdit::AnimationTimelineEdit() {
|
||||
|
||||
block_animation_update_ptr = NULL;
|
||||
editing = false;
|
||||
name_limit = 150;
|
||||
zoom = NULL;
|
||||
@ -1884,12 +1875,10 @@ void AnimationTrackEdit::_gui_input(const Ref<InputEvent> &p_event) {
|
||||
Point2 pos = mb->get_position();
|
||||
|
||||
if (check_rect.has_point(pos)) {
|
||||
*block_animation_update_ptr = true;
|
||||
undo_redo->create_action(TTR("Toggle Track Enabled"));
|
||||
undo_redo->add_do_method(animation.ptr(), "track_set_enabled", track, !animation->track_is_enabled(track));
|
||||
undo_redo->add_undo_method(animation.ptr(), "track_set_enabled", track, animation->track_is_enabled(track));
|
||||
undo_redo->commit_action();
|
||||
*block_animation_update_ptr = false;
|
||||
update();
|
||||
accept_event();
|
||||
}
|
||||
@ -2186,12 +2175,10 @@ void AnimationTrackEdit::_menu_selected(int p_index) {
|
||||
case MENU_CALL_MODE_CAPTURE: {
|
||||
|
||||
Animation::UpdateMode update_mode = Animation::UpdateMode(p_index);
|
||||
*block_animation_update_ptr = true;
|
||||
undo_redo->create_action(TTR("Change Animation Update Mode"));
|
||||
undo_redo->add_do_method(animation.ptr(), "value_track_set_update_mode", track, update_mode);
|
||||
undo_redo->add_undo_method(animation.ptr(), "value_track_set_update_mode", track, animation->value_track_get_update_mode(track));
|
||||
undo_redo->commit_action();
|
||||
*block_animation_update_ptr = false;
|
||||
update();
|
||||
|
||||
} break;
|
||||
@ -2200,24 +2187,20 @@ void AnimationTrackEdit::_menu_selected(int p_index) {
|
||||
case MENU_INTERPOLATION_CUBIC: {
|
||||
|
||||
Animation::InterpolationType interp_mode = Animation::InterpolationType(p_index - MENU_INTERPOLATION_NEAREST);
|
||||
*block_animation_update_ptr = true;
|
||||
undo_redo->create_action(TTR("Change Animation Interpolation Mode"));
|
||||
undo_redo->add_do_method(animation.ptr(), "track_set_interpolation_type", track, interp_mode);
|
||||
undo_redo->add_undo_method(animation.ptr(), "track_set_interpolation_type", track, animation->track_get_interpolation_type(track));
|
||||
undo_redo->commit_action();
|
||||
*block_animation_update_ptr = false;
|
||||
update();
|
||||
} break;
|
||||
case MENU_LOOP_WRAP:
|
||||
case MENU_LOOP_CLAMP: {
|
||||
|
||||
bool loop_wrap = p_index == MENU_LOOP_WRAP;
|
||||
*block_animation_update_ptr = true;
|
||||
undo_redo->create_action(TTR("Change Animation Loop Mode"));
|
||||
undo_redo->add_do_method(animation.ptr(), "track_set_interpolation_loop_wrap", track, loop_wrap);
|
||||
undo_redo->add_undo_method(animation.ptr(), "track_set_interpolation_loop_wrap", track, animation->track_get_interpolation_loop_wrap(track));
|
||||
undo_redo->commit_action();
|
||||
*block_animation_update_ptr = false;
|
||||
update();
|
||||
|
||||
} break;
|
||||
@ -2235,10 +2218,6 @@ void AnimationTrackEdit::_menu_selected(int p_index) {
|
||||
}
|
||||
}
|
||||
|
||||
void AnimationTrackEdit::set_block_animation_update_ptr(bool *p_block_ptr) {
|
||||
block_animation_update_ptr = p_block_ptr;
|
||||
}
|
||||
|
||||
void AnimationTrackEdit::cancel_drop() {
|
||||
if (dropping_at != 0) {
|
||||
dropping_at = 0;
|
||||
@ -2301,7 +2280,6 @@ AnimationTrackEdit::AnimationTrackEdit() {
|
||||
root = NULL;
|
||||
path = NULL;
|
||||
menu = NULL;
|
||||
block_animation_update_ptr = NULL;
|
||||
clicking_on_name = false;
|
||||
dropping_at = 0;
|
||||
|
||||
@ -3384,7 +3362,6 @@ void AnimationTrackEditor::_update_tracks() {
|
||||
|
||||
track_edit->set_undo_redo(undo_redo);
|
||||
track_edit->set_timeline(timeline);
|
||||
track_edit->set_block_animation_update_ptr(&block_animation_update);
|
||||
track_edit->set_root(root);
|
||||
track_edit->set_animation_and_track(animation, i);
|
||||
track_edit->set_play_position(timeline->get_play_position());
|
||||
@ -3425,7 +3402,7 @@ void AnimationTrackEditor::_animation_changed() {
|
||||
|
||||
timeline->update();
|
||||
timeline->update_values();
|
||||
if (block_animation_update) {
|
||||
if (undo_redo->is_commiting_action()) {
|
||||
for (int i = 0; i < track_edits.size(); i++) {
|
||||
track_edits[i]->update();
|
||||
}
|
||||
@ -4075,9 +4052,7 @@ void AnimationTrackEditor::_move_selection_commit() {
|
||||
undo_redo->add_undo_method(this, "_select_at_anim", animation, E->key().track, oldpos);
|
||||
}
|
||||
|
||||
block_animation_update = true; //animation will change and this is triggered from a signal, so block updates
|
||||
undo_redo->commit_action();
|
||||
block_animation_update = false;
|
||||
|
||||
moving_selection = false;
|
||||
for (int i = 0; i < track_edits.size(); i++) {
|
||||
@ -4778,7 +4753,6 @@ void AnimationTrackEditor::_bind_methods() {
|
||||
|
||||
AnimationTrackEditor::AnimationTrackEditor() {
|
||||
root = NULL;
|
||||
block_animation_update = false;
|
||||
|
||||
undo_redo = EditorNode::get_singleton()->get_undo_redo();
|
||||
|
||||
@ -4796,7 +4770,6 @@ AnimationTrackEditor::AnimationTrackEditor() {
|
||||
timeline_vbox->add_constant_override("separation", 0);
|
||||
|
||||
timeline = memnew(AnimationTimelineEdit);
|
||||
timeline->set_block_animation_update_ptr(&block_animation_update);
|
||||
timeline->set_undo_redo(undo_redo);
|
||||
timeline_vbox->add_child(timeline);
|
||||
timeline->connect("timeline_changed", this, "_timeline_changed");
|
||||
@ -4815,7 +4788,6 @@ AnimationTrackEditor::AnimationTrackEditor() {
|
||||
|
||||
bezier_edit = memnew(AnimationBezierTrackEdit);
|
||||
timeline_vbox->add_child(bezier_edit);
|
||||
bezier_edit->set_block_animation_update_ptr(&block_animation_update);
|
||||
bezier_edit->set_undo_redo(undo_redo);
|
||||
bezier_edit->set_editor(this);
|
||||
bezier_edit->set_timeline(timeline);
|
||||
|
@ -76,7 +76,6 @@ class AnimationTimelineEdit : public Range {
|
||||
Rect2 hsize_rect;
|
||||
|
||||
bool editing;
|
||||
bool *block_animation_update_ptr; //used to block all tracks re-gen (speed up)
|
||||
|
||||
bool panning_timeline;
|
||||
float panning_timeline_from;
|
||||
@ -104,7 +103,6 @@ public:
|
||||
void set_zoom(Range *p_zoom);
|
||||
Range *get_zoom() const { return zoom; }
|
||||
void set_undo_redo(UndoRedo *p_undo_redo);
|
||||
void set_block_animation_update_ptr(bool *p_block_ptr);
|
||||
|
||||
void set_play_position(float p_pos);
|
||||
float get_play_position() const;
|
||||
@ -170,8 +168,6 @@ class AnimationTrackEdit : public Control {
|
||||
|
||||
void _menu_selected(int p_index);
|
||||
|
||||
bool *block_animation_update_ptr; //used to block all tracks re-gen (speed up)
|
||||
|
||||
void _path_entered(const String &p_text);
|
||||
void _play_position_draw();
|
||||
mutable int dropping_at;
|
||||
@ -216,7 +212,6 @@ public:
|
||||
AnimationTimelineEdit *get_timeline() const { return timeline; }
|
||||
AnimationTrackEditor *get_editor() const { return editor; }
|
||||
UndoRedo *get_undo_redo() const { return undo_redo; }
|
||||
bool *get_block_animation_update_ptr() { return block_animation_update_ptr; }
|
||||
|
||||
void set_animation_and_track(const Ref<Animation> &p_animation, int p_track);
|
||||
virtual Size2 get_minimum_size() const;
|
||||
@ -226,8 +221,6 @@ public:
|
||||
void set_editor(AnimationTrackEditor *p_editor);
|
||||
void set_root(Node *p_root);
|
||||
|
||||
void set_block_animation_update_ptr(bool *p_block_ptr);
|
||||
|
||||
void set_play_position(float p_pos);
|
||||
void update_play_position();
|
||||
void cancel_drop();
|
||||
@ -313,8 +306,6 @@ class AnimationTrackEditor : public VBoxContainer {
|
||||
Vector<AnimationTrackEdit *> track_edits;
|
||||
Vector<AnimationTrackEditGroup *> groups;
|
||||
|
||||
bool block_animation_update;
|
||||
|
||||
int _get_track_selected();
|
||||
void _animation_changed();
|
||||
void _update_tracks();
|
||||
|
@ -1004,12 +1004,10 @@ void AnimationTrackEditTypeAudio::drop_data(const Point2 &p_point, const Variant
|
||||
ofs += 0.001;
|
||||
}
|
||||
|
||||
*get_block_animation_update_ptr() = true;
|
||||
get_undo_redo()->create_action(TTR("Add Audio Track Clip"));
|
||||
get_undo_redo()->add_do_method(get_animation().ptr(), "audio_track_insert_key", get_track(), ofs, stream);
|
||||
get_undo_redo()->add_undo_method(get_animation().ptr(), "track_remove_key_at_position", get_track(), ofs);
|
||||
get_undo_redo()->commit_action();
|
||||
*get_block_animation_update_ptr() = false;
|
||||
|
||||
update();
|
||||
return;
|
||||
@ -1098,21 +1096,17 @@ void AnimationTrackEditTypeAudio::_gui_input(const Ref<InputEvent> &p_event) {
|
||||
float ofs_local = -len_resizing_rel / get_timeline()->get_zoom_scale();
|
||||
if (len_resizing_start) {
|
||||
float prev_ofs = get_animation()->audio_track_get_key_start_offset(get_track(), len_resizing_index);
|
||||
*get_block_animation_update_ptr() = true;
|
||||
get_undo_redo()->create_action(TTR("Change Audio Track Clip Start Offset"));
|
||||
get_undo_redo()->add_do_method(get_animation().ptr(), "audio_track_set_key_start_offset", get_track(), len_resizing_index, prev_ofs + ofs_local);
|
||||
get_undo_redo()->add_undo_method(get_animation().ptr(), "audio_track_set_key_start_offset", get_track(), len_resizing_index, prev_ofs);
|
||||
get_undo_redo()->commit_action();
|
||||
*get_block_animation_update_ptr() = false;
|
||||
|
||||
} else {
|
||||
float prev_ofs = get_animation()->audio_track_get_key_end_offset(get_track(), len_resizing_index);
|
||||
*get_block_animation_update_ptr() = true;
|
||||
get_undo_redo()->create_action(TTR("Change Audio Track Clip End Offset"));
|
||||
get_undo_redo()->add_do_method(get_animation().ptr(), "audio_track_set_key_end_offset", get_track(), len_resizing_index, prev_ofs + ofs_local);
|
||||
get_undo_redo()->add_undo_method(get_animation().ptr(), "audio_track_set_key_end_offset", get_track(), len_resizing_index, prev_ofs);
|
||||
get_undo_redo()->commit_action();
|
||||
*get_block_animation_update_ptr() = false;
|
||||
}
|
||||
|
||||
len_resizing = false;
|
||||
|
@ -308,7 +308,6 @@ LRESULT OS_Windows::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
switch (uMsg) // Check For Windows Messages
|
||||
{
|
||||
case WM_SETFOCUS: {
|
||||
@ -3004,9 +3003,9 @@ bool OS_Windows::is_disable_crash_handler() const {
|
||||
|
||||
void OS_Windows::process_and_drop_events() {
|
||||
|
||||
drop_events=true;
|
||||
drop_events = true;
|
||||
process_events();
|
||||
drop_events=false;
|
||||
drop_events = false;
|
||||
}
|
||||
|
||||
Error OS_Windows::move_to_trash(const String &p_path) {
|
||||
|
Loading…
Reference in New Issue
Block a user