Merge pull request #61826 from guilhermefelipecgs/fix_leak

Fix ObjectDB instances leaked on state machine when editor closes
This commit is contained in:
Rémi Verschelde 2022-06-23 09:58:51 +02:00 committed by GitHub
commit 21b51fdf7e
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 17 additions and 17 deletions

View file

@ -817,11 +817,11 @@ bool AnimationNodeStateMachineEditor::_create_submenu(PopupMenu *p_menu, Ref<Ani
Vector<Ref<AnimationNodeStateMachine>> parents = p_parents; Vector<Ref<AnimationNodeStateMachine>> parents = p_parents;
if (from_root) { if (from_root) {
Ref<AnimationNodeStateMachine> prev = p_nodesm->get_prev_state_machine(); AnimationNodeStateMachine *prev = p_nodesm->get_prev_state_machine();
while (prev.is_valid()) { while (prev != nullptr) {
parents.push_back(prev); parents.push_back(prev);
p_nodesm = prev; p_nodesm = Ref<AnimationNodeStateMachine>(prev);
prev_path += "../"; prev_path += "../";
prev = prev->get_prev_state_machine(); prev = prev->get_prev_state_machine();
} }

View file

@ -435,7 +435,7 @@ double AnimationNodeStateMachinePlayback::process(AnimationNodeStateMachine *p_s
// handles start_node: if previous state machine is pointing to a node inside the current state machine, starts the current machine from start_node to prev_local_to // handles start_node: if previous state machine is pointing to a node inside the current state machine, starts the current machine from start_node to prev_local_to
if (p_state_machine->start_node == current && p_state_machine->transitions[i].local_from == current) { if (p_state_machine->start_node == current && p_state_machine->transitions[i].local_from == current) {
if (p_state_machine->prev_state_machine.is_valid()) { if (p_state_machine->prev_state_machine != nullptr) {
Ref<AnimationNodeStateMachinePlayback> prev_playback = p_state_machine->prev_state_machine->get_parameter("playback"); Ref<AnimationNodeStateMachinePlayback> prev_playback = p_state_machine->prev_state_machine->get_parameter("playback");
if (prev_playback.is_valid()) { if (prev_playback.is_valid()) {
@ -471,9 +471,9 @@ double AnimationNodeStateMachinePlayback::process(AnimationNodeStateMachine *p_s
} }
if (next == p_state_machine->end_node) { if (next == p_state_machine->end_node) {
Ref<AnimationNodeStateMachine> prev_state_machine = p_state_machine->prev_state_machine; AnimationNodeStateMachine *prev_state_machine = p_state_machine->prev_state_machine;
if (prev_state_machine.is_valid()) { if (prev_state_machine != nullptr) {
Ref<AnimationNodeStateMachinePlayback> prev_playback = prev_state_machine->get_parameter("playback"); Ref<AnimationNodeStateMachinePlayback> prev_playback = prev_state_machine->get_parameter("playback");
if (prev_playback.is_valid()) { if (prev_playback.is_valid()) {
@ -655,7 +655,7 @@ void AnimationNodeStateMachine::add_node(const StringName &p_name, Ref<Animation
if (anodesm.is_valid()) { if (anodesm.is_valid()) {
anodesm->state_machine_name = p_name; anodesm->state_machine_name = p_name;
anodesm->prev_state_machine = (Ref<AnimationNodeStateMachine>)this; anodesm->prev_state_machine = this;
} }
emit_changed(); emit_changed();
@ -821,7 +821,7 @@ void AnimationNodeStateMachine::_rename_transition(const StringName &p_name, con
void AnimationNodeStateMachine::get_node_list(List<StringName> *r_nodes) const { void AnimationNodeStateMachine::get_node_list(List<StringName> *r_nodes) const {
List<StringName> nodes; List<StringName> nodes;
for (const KeyValue<StringName, State> &E : states) { for (const KeyValue<StringName, State> &E : states) {
if (E.key == end_node && !prev_state_machine.is_valid()) { if (E.key == end_node && prev_state_machine == nullptr) {
continue; continue;
} }
@ -834,7 +834,7 @@ void AnimationNodeStateMachine::get_node_list(List<StringName> *r_nodes) const {
} }
} }
Ref<AnimationNodeStateMachine> AnimationNodeStateMachine::get_prev_state_machine() const { AnimationNodeStateMachine *AnimationNodeStateMachine::get_prev_state_machine() const {
return prev_state_machine; return prev_state_machine;
} }
@ -862,10 +862,10 @@ int AnimationNodeStateMachine::find_transition(const StringName &p_from, const S
return -1; return -1;
} }
bool AnimationNodeStateMachine::_can_connect(const StringName &p_name, Vector<Ref<AnimationNodeStateMachine>> p_parents) const { bool AnimationNodeStateMachine::_can_connect(const StringName &p_name, Vector<AnimationNodeStateMachine *> p_parents) {
if (p_parents.is_empty()) { if (p_parents.is_empty()) {
Ref<AnimationNodeStateMachine> prev = (Ref<AnimationNodeStateMachine>)this; AnimationNodeStateMachine *prev = this;
while (prev.is_valid()) { while (prev != nullptr) {
p_parents.push_back(prev); p_parents.push_back(prev);
prev = prev->prev_state_machine; prev = prev->prev_state_machine;
} }
@ -874,7 +874,7 @@ bool AnimationNodeStateMachine::_can_connect(const StringName &p_name, Vector<Re
if (states.has(p_name)) { if (states.has(p_name)) {
Ref<AnimationNodeStateMachine> anodesm = states[p_name].node; Ref<AnimationNodeStateMachine> anodesm = states[p_name].node;
if (anodesm.is_valid() && p_parents.find(anodesm) != -1) { if (anodesm.is_valid() && p_parents.find(anodesm.ptr()) != -1) {
return false; return false;
} }
@ -889,7 +889,7 @@ bool AnimationNodeStateMachine::_can_connect(const StringName &p_name, Vector<Re
} }
if (path[0] == "..") { if (path[0] == "..") {
if (prev_state_machine.is_valid()) { if (prev_state_machine != nullptr) {
return prev_state_machine->_can_connect(name.replace_first("../", ""), p_parents); return prev_state_machine->_can_connect(name.replace_first("../", ""), p_parents);
} }
} else if (states.has(path[0])) { } else if (states.has(path[0])) {

View file

@ -166,7 +166,7 @@ private:
StringName playback = "playback"; StringName playback = "playback";
StringName state_machine_name; StringName state_machine_name;
Ref<AnimationNodeStateMachine> prev_state_machine; AnimationNodeStateMachine *prev_state_machine = nullptr;
bool updating_transitions = false; bool updating_transitions = false;
Vector2 graph_offset; Vector2 graph_offset;
@ -174,7 +174,7 @@ private:
void _tree_changed(); void _tree_changed();
void _remove_transition(const Ref<AnimationNodeStateMachineTransition> p_transition); void _remove_transition(const Ref<AnimationNodeStateMachineTransition> p_transition);
void _rename_transition(const StringName &p_name, const StringName &p_new_name); void _rename_transition(const StringName &p_name, const StringName &p_new_name);
bool _can_connect(const StringName &p_name, const Vector<Ref<AnimationNodeStateMachine>> p_parents = Vector<Ref<AnimationNodeStateMachine>>()) const; bool _can_connect(const StringName &p_name, Vector<AnimationNodeStateMachine *> p_parents = Vector<AnimationNodeStateMachine *>());
StringName _get_shortest_path(const StringName &p_path) const; StringName _get_shortest_path(const StringName &p_path) const;
protected: protected:
@ -221,7 +221,7 @@ public:
bool can_edit_node(const StringName &p_name) const; bool can_edit_node(const StringName &p_name) const;
Ref<AnimationNodeStateMachine> get_prev_state_machine() const; AnimationNodeStateMachine *get_prev_state_machine() const;
void set_graph_offset(const Vector2 &p_offset); void set_graph_offset(const Vector2 &p_offset);
Vector2 get_graph_offset() const; Vector2 get_graph_offset() const;