Skip to content

Commit ccc134f

Browse files
committed
Tween code improvements
1 parent 4cf0231 commit ccc134f

File tree

4 files changed

+49
-59
lines changed

4 files changed

+49
-59
lines changed

scene/animation/tween.cpp

Lines changed: 19 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,11 @@ void Tweener::set_tween(const Ref<Tween> &p_tween) {
5757
tween_id = p_tween->get_instance_id();
5858
}
5959

60+
void Tweener::start() {
61+
elapsed_time = 0;
62+
finished = false;
63+
}
64+
6065
Ref<Tween> Tweener::_get_tween() {
6166
return Ref<Tween>(ObjectDB::get_instance(tween_id));
6267
}
@@ -121,23 +126,26 @@ Ref<PropertyTweener> Tween::tween_property(const Object *p_target, const NodePat
121126
return nullptr;
122127
}
123128

124-
Ref<PropertyTweener> tweener = memnew(PropertyTweener(p_target, property_subnames, p_to, p_duration));
129+
Ref<PropertyTweener> tweener;
130+
tweener.instantiate(p_target, property_subnames, p_to, p_duration);
125131
append(tweener);
126132
return tweener;
127133
}
128134

129135
Ref<IntervalTweener> Tween::tween_interval(double p_time) {
130136
CHECK_VALID();
131137

132-
Ref<IntervalTweener> tweener = memnew(IntervalTweener(p_time));
138+
Ref<IntervalTweener> tweener;
139+
tweener.instantiate(p_time);
133140
append(tweener);
134141
return tweener;
135142
}
136143

137144
Ref<CallbackTweener> Tween::tween_callback(const Callable &p_callback) {
138145
CHECK_VALID();
139146

140-
Ref<CallbackTweener> tweener = memnew(CallbackTweener(p_callback));
147+
Ref<CallbackTweener> tweener;
148+
tweener.instantiate(p_callback);
141149
append(tweener);
142150
return tweener;
143151
}
@@ -149,7 +157,8 @@ Ref<MethodTweener> Tween::tween_method(const Callable &p_callback, const Variant
149157
return nullptr;
150158
}
151159

152-
Ref<MethodTweener> tweener = memnew(MethodTweener(p_callback, p_from, p_to, p_duration));
160+
Ref<MethodTweener> tweener;
161+
tweener.instantiate(p_callback, p_from, p_to, p_duration);
153162
append(tweener);
154163
return tweener;
155164
}
@@ -232,7 +241,7 @@ Ref<Tween> Tween::set_process_mode(TweenProcessMode p_mode) {
232241
return this;
233242
}
234243

235-
Tween::TweenProcessMode Tween::get_process_mode() {
244+
Tween::TweenProcessMode Tween::get_process_mode() const {
236245
return process_mode;
237246
}
238247

@@ -241,7 +250,7 @@ Ref<Tween> Tween::set_pause_mode(TweenPauseMode p_mode) {
241250
return this;
242251
}
243252

244-
Tween::TweenPauseMode Tween::get_pause_mode() {
253+
Tween::TweenPauseMode Tween::get_pause_mode() const {
245254
return pause_mode;
246255
}
247256

@@ -283,7 +292,7 @@ Ref<Tween> Tween::set_trans(TransitionType p_trans) {
283292
return this;
284293
}
285294

286-
Tween::TransitionType Tween::get_trans() {
295+
Tween::TransitionType Tween::get_trans() const {
287296
return default_transition;
288297
}
289298

@@ -292,7 +301,7 @@ Ref<Tween> Tween::set_ease(EaseType p_ease) {
292301
return this;
293302
}
294303

295-
Tween::EaseType Tween::get_ease() {
304+
Tween::EaseType Tween::get_ease() const {
296305
return default_ease;
297306
}
298307

@@ -528,10 +537,6 @@ Tween::Tween() {
528537
ERR_FAIL_MSG("Tween can't be created directly. Use create_tween() method.");
529538
}
530539

531-
Tween::Tween(bool p_valid) {
532-
valid = p_valid;
533-
}
534-
535540
Tween::Tween(SceneTree *p_parent_tree) {
536541
parent_tree = p_parent_tree;
537542
valid = true;
@@ -582,8 +587,7 @@ Ref<PropertyTweener> PropertyTweener::set_delay(double p_delay) {
582587
}
583588

584589
void PropertyTweener::start() {
585-
elapsed_time = 0;
586-
finished = false;
590+
Tweener::start();
587591

588592
Object *target_instance = ObjectDB::get_instance(target);
589593
if (!target_instance) {
@@ -696,11 +700,6 @@ PropertyTweener::PropertyTweener() {
696700
ERR_FAIL_MSG("PropertyTweener can't be created directly. Use the tween_property() method in Tween.");
697701
}
698702

699-
void IntervalTweener::start() {
700-
elapsed_time = 0;
701-
finished = false;
702-
}
703-
704703
bool IntervalTweener::step(double &r_delta) {
705704
if (finished) {
706705
return false;
@@ -731,11 +730,6 @@ Ref<CallbackTweener> CallbackTweener::set_delay(double p_delay) {
731730
return this;
732731
}
733732

734-
void CallbackTweener::start() {
735-
elapsed_time = 0;
736-
finished = false;
737-
}
738-
739733
bool CallbackTweener::step(double &r_delta) {
740734
if (finished) {
741735
return false;
@@ -796,11 +790,6 @@ Ref<MethodTweener> MethodTweener::set_ease(Tween::EaseType p_ease) {
796790
return this;
797791
}
798792

799-
void MethodTweener::start() {
800-
elapsed_time = 0;
801-
finished = false;
802-
}
803-
804793
bool MethodTweener::step(double &r_delta) {
805794
if (finished) {
806795
return false;
@@ -881,8 +870,7 @@ MethodTweener::MethodTweener() {
881870
}
882871

883872
void SubtweenTweener::start() {
884-
elapsed_time = 0;
885-
finished = false;
873+
Tweener::start();
886874

887875
// Reset the subtween.
888876
subtween->stop();

scene/animation/tween.h

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ class Tweener : public RefCounted {
4444

4545
public:
4646
virtual void set_tween(const Ref<Tween> &p_tween);
47-
virtual void start() = 0;
47+
virtual void start();
4848
virtual bool step(double &r_delta) = 0;
4949

5050
protected:
@@ -163,9 +163,9 @@ class Tween : public RefCounted {
163163

164164
Ref<Tween> bind_node(const Node *p_node);
165165
Ref<Tween> set_process_mode(TweenProcessMode p_mode);
166-
TweenProcessMode get_process_mode();
166+
TweenProcessMode get_process_mode() const;
167167
Ref<Tween> set_pause_mode(TweenPauseMode p_mode);
168-
TweenPauseMode get_pause_mode();
168+
TweenPauseMode get_pause_mode() const;
169169
Ref<Tween> set_ignore_time_scale(bool p_ignore = true);
170170
bool is_ignoring_time_scale() const;
171171

@@ -174,9 +174,9 @@ class Tween : public RefCounted {
174174
int get_loops_left() const;
175175
Ref<Tween> set_speed_scale(float p_speed);
176176
Ref<Tween> set_trans(TransitionType p_trans);
177-
TransitionType get_trans();
177+
TransitionType get_trans() const;
178178
Ref<Tween> set_ease(EaseType p_ease);
179-
EaseType get_ease();
179+
EaseType get_ease() const;
180180

181181
Ref<Tween> parallel();
182182
Ref<Tween> chain();
@@ -190,7 +190,6 @@ class Tween : public RefCounted {
190190
double get_total_time() const;
191191

192192
Tween();
193-
Tween(bool p_valid);
194193
Tween(SceneTree *p_parent_tree);
195194
};
196195

@@ -246,7 +245,6 @@ class IntervalTweener : public Tweener {
246245
GDCLASS(IntervalTweener, Tweener);
247246

248247
public:
249-
void start() override;
250248
bool step(double &r_delta) override;
251249

252250
IntervalTweener(double p_time);
@@ -262,7 +260,6 @@ class CallbackTweener : public Tweener {
262260
public:
263261
Ref<CallbackTweener> set_delay(double p_delay);
264262

265-
void start() override;
266263
bool step(double &r_delta) override;
267264

268265
CallbackTweener(const Callable &p_callback);
@@ -287,7 +284,6 @@ class MethodTweener : public Tweener {
287284
Ref<MethodTweener> set_delay(double p_delay);
288285

289286
void set_tween(const Ref<Tween> &p_tween) override;
290-
void start() override;
291287
bool step(double &r_delta) override;
292288

293289
MethodTweener(const Callable &p_callback, const Variant &p_from, const Variant &p_to, double p_duration);

scene/main/scene_tree.cpp

Lines changed: 24 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -644,32 +644,31 @@ bool SceneTree::process(double p_time) {
644644

645645
void SceneTree::process_timers(double p_delta, bool p_physics_frame) {
646646
_THREAD_SAFE_METHOD_
647-
List<Ref<SceneTreeTimer>>::Element *L = timers.back(); //last element
647+
const List<Ref<SceneTreeTimer>>::Element *L = timers.back(); // Last element.
648+
const double unscaled_delta = Engine::get_singleton()->get_process_step();
648649

649650
for (List<Ref<SceneTreeTimer>>::Element *E = timers.front(); E;) {
650651
List<Ref<SceneTreeTimer>>::Element *N = E->next();
651-
if ((paused && !E->get()->is_process_always()) || (E->get()->is_process_in_physics() != p_physics_frame)) {
652+
Ref<SceneTreeTimer> timer = E->get();
653+
654+
if ((paused && !timer->is_process_always()) || (timer->is_process_in_physics() != p_physics_frame)) {
652655
if (E == L) {
653-
break; //break on last, so if new timers were added during list traversal, ignore them.
656+
break; // Break on last, so if new timers were added during list traversal, ignore them.
654657
}
655658
E = N;
656659
continue;
657660
}
658661

659-
double time_left = E->get()->get_time_left();
660-
if (E->get()->is_ignoring_time_scale()) {
661-
time_left -= Engine::get_singleton()->get_process_step();
662-
} else {
663-
time_left -= p_delta;
664-
}
665-
E->get()->set_time_left(time_left);
662+
double time_left = timer->get_time_left();
663+
time_left -= timer->is_ignoring_time_scale() ? unscaled_delta : p_delta;
664+
timer->set_time_left(time_left);
666665

667666
if (time_left <= 0) {
668667
E->get()->emit_signal(SNAME("timeout"));
669668
timers.erase(E);
670669
}
671670
if (E == L) {
672-
break; //break on last, so if new timers were added during list traversal, ignore them.
671+
break; // Break on last, so if new timers were added during list traversal, ignore them.
673672
}
674673
E = N;
675674
}
@@ -678,22 +677,24 @@ void SceneTree::process_timers(double p_delta, bool p_physics_frame) {
678677
void SceneTree::process_tweens(double p_delta, bool p_physics) {
679678
_THREAD_SAFE_METHOD_
680679
// This methods works similarly to how SceneTreeTimers are handled.
681-
List<Ref<Tween>>::Element *L = tweens.back();
680+
const List<Ref<Tween>>::Element *L = tweens.back();
681+
const double unscaled_delta = Engine::get_singleton()->get_process_step();
682682

683683
for (List<Ref<Tween>>::Element *E = tweens.front(); E;) {
684684
List<Ref<Tween>>::Element *N = E->next();
685+
Ref<Tween> &tween = E->get();
686+
685687
// Don't process if paused or process mode doesn't match.
686-
if (!E->get()->can_process(paused) || (p_physics == (E->get()->get_process_mode() == Tween::TWEEN_PROCESS_IDLE))) {
688+
if (!tween->can_process(paused) || (p_physics == (tween->get_process_mode() == Tween::TWEEN_PROCESS_IDLE))) {
687689
if (E == L) {
688690
break;
689691
}
690692
E = N;
691693
continue;
692694
}
693695

694-
double time_step = E->get()->is_ignoring_time_scale() ? Engine::get_singleton()->get_process_step() : p_delta;
695-
if (!E->get()->step(time_step)) {
696-
E->get()->clear();
696+
if (!tween->step(tween->is_ignoring_time_scale() ? unscaled_delta : p_delta)) {
697+
tween->clear();
697698
tweens.erase(E);
698699
}
699700
if (E == L) {
@@ -1589,9 +1590,14 @@ Ref<Tween> SceneTree::create_tween() {
15891590
return tween;
15901591
}
15911592

1592-
bool SceneTree::remove_tween(const Ref<Tween> &p_tween) {
1593+
void SceneTree::remove_tween(const Ref<Tween> &p_tween) {
15931594
_THREAD_SAFE_METHOD_
1594-
return tweens.erase(p_tween);
1595+
for (List<Ref<Tween>>::Element *E = tweens.back(); E; E = E->prev()) {
1596+
if (E->get() == p_tween) {
1597+
E->erase();
1598+
break;
1599+
}
1600+
}
15951601
}
15961602

15971603
TypedArray<Tween> SceneTree::get_processed_tweens() {

scene/main/scene_tree.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -411,7 +411,7 @@ class SceneTree : public MainLoop {
411411

412412
Ref<SceneTreeTimer> create_timer(double p_delay_sec, bool p_process_always = true, bool p_process_in_physics = false, bool p_ignore_time_scale = false);
413413
Ref<Tween> create_tween();
414-
bool remove_tween(const Ref<Tween> &p_tween);
414+
void remove_tween(const Ref<Tween> &p_tween);
415415
TypedArray<Tween> get_processed_tweens();
416416

417417
//used by Main::start, don't use otherwise

0 commit comments

Comments
 (0)