You've already forked godot
mirror of
https://github.com/godotengine/godot.git
synced 2025-11-04 12:00:25 +00:00
[Animation] Improvements to Tween memory management
Using `ObjectID` instead of manually breaking reference cycles.
This commit is contained in:
@@ -54,11 +54,11 @@ Tween::interpolater Tween::interpolaters[Tween::TRANS_MAX][Tween::EASE_MAX] = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
void Tweener::set_tween(const Ref<Tween> &p_tween) {
|
void Tweener::set_tween(const Ref<Tween> &p_tween) {
|
||||||
tween = p_tween;
|
tween_id = p_tween->get_instance_id();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Tweener::clear_tween() {
|
Ref<Tween> Tweener::_get_tween() {
|
||||||
tween.unref();
|
return Ref<Tween>(ObjectDB::get_instance(tween_id));
|
||||||
}
|
}
|
||||||
|
|
||||||
void Tweener::_bind_methods() {
|
void Tweener::_bind_methods() {
|
||||||
@@ -192,12 +192,6 @@ bool Tween::is_valid() {
|
|||||||
|
|
||||||
void Tween::clear() {
|
void Tween::clear() {
|
||||||
valid = false;
|
valid = false;
|
||||||
|
|
||||||
for (List<Ref<Tweener>> &step : tweeners) {
|
|
||||||
for (Ref<Tweener> &tweener : step) {
|
|
||||||
tweener->clear_tween();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
tweeners.clear();
|
tweeners.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -504,6 +498,7 @@ Tween::Tween(bool p_valid) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Ref<PropertyTweener> PropertyTweener::from(const Variant &p_value) {
|
Ref<PropertyTweener> PropertyTweener::from(const Variant &p_value) {
|
||||||
|
Ref<Tween> tween = _get_tween();
|
||||||
ERR_FAIL_COND_V(tween.is_null(), nullptr);
|
ERR_FAIL_COND_V(tween.is_null(), nullptr);
|
||||||
|
|
||||||
Variant from_value = p_value;
|
Variant from_value = p_value;
|
||||||
@@ -592,6 +587,8 @@ bool PropertyTweener::step(double &r_delta) {
|
|||||||
do_continue_delayed = false;
|
do_continue_delayed = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Ref<Tween> tween = _get_tween();
|
||||||
|
|
||||||
double time = MIN(elapsed_time - delay, duration);
|
double time = MIN(elapsed_time - delay, duration);
|
||||||
if (time < duration) {
|
if (time < duration) {
|
||||||
if (custom_method.is_valid()) {
|
if (custom_method.is_valid()) {
|
||||||
@@ -623,12 +620,12 @@ bool PropertyTweener::step(double &r_delta) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void PropertyTweener::set_tween(const Ref<Tween> &p_tween) {
|
void PropertyTweener::set_tween(const Ref<Tween> &p_tween) {
|
||||||
tween = p_tween;
|
Tweener::set_tween(p_tween);
|
||||||
if (trans_type == Tween::TRANS_MAX) {
|
if (trans_type == Tween::TRANS_MAX) {
|
||||||
trans_type = tween->get_trans();
|
trans_type = p_tween->get_trans();
|
||||||
}
|
}
|
||||||
if (ease_type == Tween::EASE_MAX) {
|
if (ease_type == Tween::EASE_MAX) {
|
||||||
ease_type = tween->get_ease();
|
ease_type = p_tween->get_ease();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -781,6 +778,8 @@ bool MethodTweener::step(double &r_delta) {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Ref<Tween> tween = _get_tween();
|
||||||
|
|
||||||
Variant current_val;
|
Variant current_val;
|
||||||
double time = MIN(elapsed_time - delay, duration);
|
double time = MIN(elapsed_time - delay, duration);
|
||||||
if (time < duration) {
|
if (time < duration) {
|
||||||
@@ -810,12 +809,12 @@ bool MethodTweener::step(double &r_delta) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void MethodTweener::set_tween(const Ref<Tween> &p_tween) {
|
void MethodTweener::set_tween(const Ref<Tween> &p_tween) {
|
||||||
tween = p_tween;
|
Tweener::set_tween(p_tween);
|
||||||
if (trans_type == Tween::TRANS_MAX) {
|
if (trans_type == Tween::TRANS_MAX) {
|
||||||
trans_type = tween->get_trans();
|
trans_type = p_tween->get_trans();
|
||||||
}
|
}
|
||||||
if (ease_type == Tween::EASE_MAX) {
|
if (ease_type == Tween::EASE_MAX) {
|
||||||
ease_type = tween->get_ease();
|
ease_type = p_tween->get_ease();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -39,16 +39,18 @@ class Node;
|
|||||||
class Tweener : public RefCounted {
|
class Tweener : public RefCounted {
|
||||||
GDCLASS(Tweener, RefCounted);
|
GDCLASS(Tweener, RefCounted);
|
||||||
|
|
||||||
|
ObjectID tween_id;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
virtual void set_tween(const Ref<Tween> &p_tween);
|
virtual void set_tween(const Ref<Tween> &p_tween);
|
||||||
virtual void start() = 0;
|
virtual void start() = 0;
|
||||||
virtual bool step(double &r_delta) = 0;
|
virtual bool step(double &r_delta) = 0;
|
||||||
void clear_tween();
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
static void _bind_methods();
|
static void _bind_methods();
|
||||||
|
|
||||||
Ref<Tween> tween;
|
Ref<Tween> _get_tween();
|
||||||
|
|
||||||
double elapsed_time = 0;
|
double elapsed_time = 0;
|
||||||
bool finished = false;
|
bool finished = false;
|
||||||
};
|
};
|
||||||
@@ -291,7 +293,6 @@ private:
|
|||||||
Tween::TransitionType trans_type = Tween::TRANS_MAX;
|
Tween::TransitionType trans_type = Tween::TRANS_MAX;
|
||||||
Tween::EaseType ease_type = Tween::EASE_MAX;
|
Tween::EaseType ease_type = Tween::EASE_MAX;
|
||||||
|
|
||||||
Ref<Tween> tween;
|
|
||||||
Variant initial_val;
|
Variant initial_val;
|
||||||
Variant delta_val;
|
Variant delta_val;
|
||||||
Variant final_val;
|
Variant final_val;
|
||||||
|
|||||||
Reference in New Issue
Block a user