tween.cpp 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932
  1. /*************************************************************************/
  2. /* tween.cpp */
  3. /*************************************************************************/
  4. /* This file is part of: */
  5. /* GODOT ENGINE */
  6. /* https://godotengine.org */
  7. /*************************************************************************/
  8. /* Copyright (c) 2007-2021 Juan Linietsky, Ariel Manzur. */
  9. /* Copyright (c) 2014-2021 Godot Engine contributors (cf. AUTHORS.md). */
  10. /* */
  11. /* Permission is hereby granted, free of charge, to any person obtaining */
  12. /* a copy of this software and associated documentation files (the */
  13. /* "Software"), to deal in the Software without restriction, including */
  14. /* without limitation the rights to use, copy, modify, merge, publish, */
  15. /* distribute, sublicense, and/or sell copies of the Software, and to */
  16. /* permit persons to whom the Software is furnished to do so, subject to */
  17. /* the following conditions: */
  18. /* */
  19. /* The above copyright notice and this permission notice shall be */
  20. /* included in all copies or substantial portions of the Software. */
  21. /* */
  22. /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
  23. /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
  24. /* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
  25. /* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
  26. /* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
  27. /* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
  28. /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
  29. /*************************************************************************/
  30. #include "tween.h"
  31. #include "scene/animation/easing_equations.h"
  32. #include "scene/main/node.h"
  33. Tween::interpolater Tween::interpolaters[Tween::TRANS_MAX][Tween::EASE_MAX] = {
  34. { &linear::in, &linear::in, &linear::in, &linear::in }, // Linear is the same for each easing.
  35. { &sine::in, &sine::out, &sine::in_out, &sine::out_in },
  36. { &quint::in, &quint::out, &quint::in_out, &quint::out_in },
  37. { &quart::in, &quart::out, &quart::in_out, &quart::out_in },
  38. { &quad::in, &quad::out, &quad::in_out, &quad::out_in },
  39. { &expo::in, &expo::out, &expo::in_out, &expo::out_in },
  40. { &elastic::in, &elastic::out, &elastic::in_out, &elastic::out_in },
  41. { &cubic::in, &cubic::out, &cubic::in_out, &cubic::out_in },
  42. { &circ::in, &circ::out, &circ::in_out, &circ::out_in },
  43. { &bounce::in, &bounce::out, &bounce::in_out, &bounce::out_in },
  44. { &back::in, &back::out, &back::in_out, &back::out_in },
  45. };
  46. void Tweener::set_tween(Ref<Tween> p_tween) {
  47. tween = p_tween;
  48. }
  49. void Tweener::clear_tween() {
  50. tween.unref();
  51. }
  52. void Tweener::_bind_methods() {
  53. ADD_SIGNAL(MethodInfo("finished"));
  54. }
  55. void Tween::start_tweeners() {
  56. if (tweeners.is_empty()) {
  57. dead = true;
  58. ERR_FAIL_MSG("Tween without commands, aborting.");
  59. }
  60. for (Ref<Tweener> &tweener : tweeners.write[current_step]) {
  61. tweener->start();
  62. }
  63. }
  64. Ref<PropertyTweener> Tween::tween_property(Object *p_target, NodePath p_property, Variant p_to, float p_duration) {
  65. ERR_FAIL_NULL_V(p_target, nullptr);
  66. ERR_FAIL_COND_V_MSG(!valid, nullptr, "Tween invalid. Either finished or created outside scene tree.");
  67. ERR_FAIL_COND_V_MSG(started, nullptr, "Can't append to a Tween that has started. Use stop() first.");
  68. #ifdef DEBUG_ENABLED
  69. Variant::Type property_type = p_target->get_indexed(p_property.get_as_property_path().get_subnames()).get_type();
  70. ERR_FAIL_COND_V_MSG(property_type != p_to.get_type(), Ref<PropertyTweener>(), "Type mismatch between property and final value: " + Variant::get_type_name(property_type) + " and " + Variant::get_type_name(p_to.get_type()));
  71. #endif
  72. Ref<PropertyTweener> tweener = memnew(PropertyTweener(p_target, p_property, p_to, p_duration));
  73. append(tweener);
  74. return tweener;
  75. }
  76. Ref<IntervalTweener> Tween::tween_interval(float p_time) {
  77. ERR_FAIL_COND_V_MSG(!valid, nullptr, "Tween invalid. Either finished or created outside scene tree.");
  78. ERR_FAIL_COND_V_MSG(started, nullptr, "Can't append to a Tween that has started. Use stop() first.");
  79. Ref<IntervalTweener> tweener = memnew(IntervalTweener(p_time));
  80. append(tweener);
  81. return tweener;
  82. }
  83. Ref<CallbackTweener> Tween::tween_callback(Callable p_callback) {
  84. ERR_FAIL_COND_V_MSG(!valid, nullptr, "Tween invalid. Either finished or created outside scene tree.");
  85. ERR_FAIL_COND_V_MSG(started, nullptr, "Can't append to a Tween that has started. Use stop() first.");
  86. Ref<CallbackTweener> tweener = memnew(CallbackTweener(p_callback));
  87. append(tweener);
  88. return tweener;
  89. }
  90. Ref<MethodTweener> Tween::tween_method(Callable p_callback, Variant p_from, Variant p_to, float p_duration) {
  91. ERR_FAIL_COND_V_MSG(!valid, nullptr, "Tween invalid. Either finished or created outside scene tree.");
  92. ERR_FAIL_COND_V_MSG(started, nullptr, "Can't append to a Tween that has started. Use stop() first.");
  93. Ref<MethodTweener> tweener = memnew(MethodTweener(p_callback, p_from, p_to, p_duration));
  94. append(tweener);
  95. return tweener;
  96. }
  97. void Tween::append(Ref<Tweener> p_tweener) {
  98. p_tweener->set_tween(this);
  99. if (parallel_enabled) {
  100. current_step = MAX(current_step, 0);
  101. } else {
  102. current_step++;
  103. }
  104. parallel_enabled = default_parallel;
  105. tweeners.resize(current_step + 1);
  106. tweeners.write[current_step].push_back(p_tweener);
  107. }
  108. void Tween::stop() {
  109. started = false;
  110. running = false;
  111. dead = false;
  112. }
  113. void Tween::pause() {
  114. running = false;
  115. }
  116. void Tween::play() {
  117. ERR_FAIL_COND_MSG(!valid, "Tween invalid. Either finished or created outside scene tree.");
  118. ERR_FAIL_COND_MSG(dead, "Can't play finished Tween, use stop() first to reset its state.");
  119. running = true;
  120. }
  121. void Tween::kill() {
  122. running = false; // For the sake of is_running().
  123. dead = true;
  124. }
  125. bool Tween::is_running() {
  126. return running;
  127. }
  128. void Tween::set_valid(bool p_valid) {
  129. valid = p_valid;
  130. }
  131. bool Tween::is_valid() {
  132. return valid;
  133. }
  134. void Tween::clear() {
  135. valid = false;
  136. for (List<Ref<Tweener>> &step : tweeners) {
  137. for (Ref<Tweener> &tweener : step) {
  138. tweener->clear_tween();
  139. }
  140. }
  141. tweeners.clear();
  142. }
  143. Ref<Tween> Tween::bind_node(Node *p_node) {
  144. ERR_FAIL_NULL_V(p_node, this);
  145. bound_node = p_node->get_instance_id();
  146. is_bound = true;
  147. return this;
  148. }
  149. Ref<Tween> Tween::set_process_mode(TweenProcessMode p_mode) {
  150. process_mode = p_mode;
  151. return this;
  152. }
  153. Tween::TweenProcessMode Tween::get_process_mode() {
  154. return process_mode;
  155. }
  156. Ref<Tween> Tween::set_pause_mode(TweenPauseMode p_mode) {
  157. pause_mode = p_mode;
  158. return this;
  159. }
  160. Tween::TweenPauseMode Tween::get_pause_mode() {
  161. return pause_mode;
  162. }
  163. Ref<Tween> Tween::set_parallel(bool p_parallel) {
  164. default_parallel = p_parallel;
  165. parallel_enabled = p_parallel;
  166. return this;
  167. }
  168. Ref<Tween> Tween::set_loops(int p_loops) {
  169. loops = p_loops;
  170. return this;
  171. }
  172. Ref<Tween> Tween::set_speed_scale(float p_speed) {
  173. speed_scale = p_speed;
  174. return this;
  175. }
  176. Ref<Tween> Tween::set_trans(TransitionType p_trans) {
  177. default_transition = p_trans;
  178. return this;
  179. }
  180. Tween::TransitionType Tween::get_trans() {
  181. return default_transition;
  182. }
  183. Ref<Tween> Tween::set_ease(EaseType p_ease) {
  184. default_ease = p_ease;
  185. return this;
  186. }
  187. Tween::EaseType Tween::get_ease() {
  188. return default_ease;
  189. }
  190. Ref<Tween> Tween::parallel() {
  191. parallel_enabled = true;
  192. return this;
  193. }
  194. Ref<Tween> Tween::chain() {
  195. parallel_enabled = false;
  196. return this;
  197. }
  198. bool Tween::custom_step(float p_delta) {
  199. bool r = running;
  200. running = true;
  201. bool ret = step(p_delta);
  202. running = running && r; // Running might turn false when Tween finished.
  203. return ret;
  204. }
  205. bool Tween::step(float p_delta) {
  206. ERR_FAIL_COND_V_MSG(tweeners.is_empty(), false, "Tween started, but has no Tweeners.");
  207. if (dead) {
  208. return false;
  209. }
  210. if (!running) {
  211. return true;
  212. }
  213. if (is_bound) {
  214. Object *bound_instance = ObjectDB::get_instance(bound_node);
  215. if (bound_instance) {
  216. Node *bound_node = Object::cast_to<Node>(bound_instance);
  217. // This can't by anything else than Node, so we can omit checking if casting succeeded.
  218. if (!bound_node->is_inside_tree()) {
  219. return true;
  220. }
  221. } else {
  222. return false;
  223. }
  224. }
  225. if (!started) {
  226. current_step = 0;
  227. loops_done = 0;
  228. start_tweeners();
  229. started = true;
  230. }
  231. float rem_delta = p_delta * speed_scale;
  232. bool step_active = false;
  233. while (rem_delta > 0 && running) {
  234. float step_delta = rem_delta;
  235. step_active = false;
  236. for (Ref<Tweener> &tweener : tweeners.write[current_step]) {
  237. // Modified inside Tweener.step().
  238. float temp_delta = rem_delta;
  239. // Turns to true if any Tweener returns true (i.e. is still not finished).
  240. step_active = tweener->step(temp_delta) || step_active;
  241. step_delta = MIN(temp_delta, step_delta);
  242. }
  243. rem_delta = step_delta;
  244. if (!step_active) {
  245. emit_signal(SNAME("step_finished"), current_step);
  246. current_step++;
  247. if (current_step == tweeners.size()) {
  248. loops_done++;
  249. if (loops_done == loops) {
  250. running = false;
  251. dead = true;
  252. emit_signal(SNAME("finished"));
  253. } else {
  254. emit_signal(SNAME("loop_finished"), loops_done);
  255. current_step = 0;
  256. start_tweeners();
  257. }
  258. } else {
  259. start_tweeners();
  260. }
  261. }
  262. }
  263. return true;
  264. }
  265. bool Tween::should_pause() {
  266. if (is_bound && pause_mode == TWEEN_PAUSE_BOUND) {
  267. Object *bound_instance = ObjectDB::get_instance(bound_node);
  268. if (bound_instance) {
  269. Node *bound_node = Object::cast_to<Node>(bound_instance);
  270. return !bound_node->can_process();
  271. }
  272. }
  273. return pause_mode != TWEEN_PAUSE_PROCESS;
  274. }
  275. real_t Tween::run_equation(TransitionType p_trans_type, EaseType p_ease_type, real_t p_time, real_t p_initial, real_t p_delta, real_t p_duration) {
  276. if (p_duration == 0) {
  277. // Special case to avoid dividing by 0 in equations.
  278. return p_initial + p_delta;
  279. }
  280. interpolater func = interpolaters[p_trans_type][p_ease_type];
  281. return func(p_time, p_initial, p_delta, p_duration);
  282. }
  283. Variant Tween::interpolate_variant(Variant p_initial_val, Variant p_delta_val, float p_time, float p_duration, TransitionType p_trans, EaseType p_ease) {
  284. ERR_FAIL_INDEX_V(p_trans, TransitionType::TRANS_MAX, Variant());
  285. ERR_FAIL_INDEX_V(p_ease, EaseType::EASE_MAX, Variant());
  286. // Helper macro to run equation on sub-elements of the value (e.g. x and y of Vector2).
  287. #define APPLY_EQUATION(element) \
  288. r.element = run_equation(p_trans, p_ease, p_time, i.element, d.element, p_duration);
  289. switch (p_initial_val.get_type()) {
  290. case Variant::BOOL: {
  291. return (run_equation(p_trans, p_ease, p_time, p_initial_val, p_delta_val, p_duration)) >= 0.5;
  292. }
  293. case Variant::INT: {
  294. return (int)run_equation(p_trans, p_ease, p_time, (int)p_initial_val, (int)p_delta_val, p_duration);
  295. }
  296. case Variant::FLOAT: {
  297. return run_equation(p_trans, p_ease, p_time, (real_t)p_initial_val, (real_t)p_delta_val, p_duration);
  298. }
  299. case Variant::VECTOR2: {
  300. Vector2 i = p_initial_val;
  301. Vector2 d = p_delta_val;
  302. Vector2 r;
  303. APPLY_EQUATION(x);
  304. APPLY_EQUATION(y);
  305. return r;
  306. }
  307. case Variant::VECTOR2I: {
  308. Vector2i i = p_initial_val;
  309. Vector2i d = p_delta_val;
  310. Vector2i r;
  311. APPLY_EQUATION(x);
  312. APPLY_EQUATION(y);
  313. return r;
  314. }
  315. case Variant::RECT2: {
  316. Rect2 i = p_initial_val;
  317. Rect2 d = p_delta_val;
  318. Rect2 r;
  319. APPLY_EQUATION(position.x);
  320. APPLY_EQUATION(position.y);
  321. APPLY_EQUATION(size.x);
  322. APPLY_EQUATION(size.y);
  323. return r;
  324. }
  325. case Variant::RECT2I: {
  326. Rect2i i = p_initial_val;
  327. Rect2i d = p_delta_val;
  328. Rect2i r;
  329. APPLY_EQUATION(position.x);
  330. APPLY_EQUATION(position.y);
  331. APPLY_EQUATION(size.x);
  332. APPLY_EQUATION(size.y);
  333. return r;
  334. }
  335. case Variant::VECTOR3: {
  336. Vector3 i = p_initial_val;
  337. Vector3 d = p_delta_val;
  338. Vector3 r;
  339. APPLY_EQUATION(x);
  340. APPLY_EQUATION(y);
  341. APPLY_EQUATION(z);
  342. return r;
  343. }
  344. case Variant::VECTOR3I: {
  345. Vector3i i = p_initial_val;
  346. Vector3i d = p_delta_val;
  347. Vector3i r;
  348. APPLY_EQUATION(x);
  349. APPLY_EQUATION(y);
  350. APPLY_EQUATION(z);
  351. return r;
  352. }
  353. case Variant::TRANSFORM2D: {
  354. Transform2D i = p_initial_val;
  355. Transform2D d = p_delta_val;
  356. Transform2D r;
  357. APPLY_EQUATION(elements[0][0]);
  358. APPLY_EQUATION(elements[0][1]);
  359. APPLY_EQUATION(elements[1][0]);
  360. APPLY_EQUATION(elements[1][1]);
  361. APPLY_EQUATION(elements[2][0]);
  362. APPLY_EQUATION(elements[2][1]);
  363. return r;
  364. }
  365. case Variant::QUATERNION: {
  366. Quaternion i = p_initial_val;
  367. Quaternion d = p_delta_val;
  368. Quaternion r;
  369. APPLY_EQUATION(x);
  370. APPLY_EQUATION(y);
  371. APPLY_EQUATION(z);
  372. APPLY_EQUATION(w);
  373. return r;
  374. }
  375. case Variant::AABB: {
  376. AABB i = p_initial_val;
  377. AABB d = p_delta_val;
  378. AABB r;
  379. APPLY_EQUATION(position.x);
  380. APPLY_EQUATION(position.y);
  381. APPLY_EQUATION(position.z);
  382. APPLY_EQUATION(size.x);
  383. APPLY_EQUATION(size.y);
  384. APPLY_EQUATION(size.z);
  385. return r;
  386. }
  387. case Variant::BASIS: {
  388. Basis i = p_initial_val;
  389. Basis d = p_delta_val;
  390. Basis r;
  391. APPLY_EQUATION(elements[0][0]);
  392. APPLY_EQUATION(elements[0][1]);
  393. APPLY_EQUATION(elements[0][2]);
  394. APPLY_EQUATION(elements[1][0]);
  395. APPLY_EQUATION(elements[1][1]);
  396. APPLY_EQUATION(elements[1][2]);
  397. APPLY_EQUATION(elements[2][0]);
  398. APPLY_EQUATION(elements[2][1]);
  399. APPLY_EQUATION(elements[2][2]);
  400. return r;
  401. }
  402. case Variant::TRANSFORM3D: {
  403. Transform3D i = p_initial_val;
  404. Transform3D d = p_delta_val;
  405. Transform3D r;
  406. APPLY_EQUATION(basis.elements[0][0]);
  407. APPLY_EQUATION(basis.elements[0][1]);
  408. APPLY_EQUATION(basis.elements[0][2]);
  409. APPLY_EQUATION(basis.elements[1][0]);
  410. APPLY_EQUATION(basis.elements[1][1]);
  411. APPLY_EQUATION(basis.elements[1][2]);
  412. APPLY_EQUATION(basis.elements[2][0]);
  413. APPLY_EQUATION(basis.elements[2][1]);
  414. APPLY_EQUATION(basis.elements[2][2]);
  415. APPLY_EQUATION(origin.x);
  416. APPLY_EQUATION(origin.y);
  417. APPLY_EQUATION(origin.z);
  418. return r;
  419. }
  420. case Variant::COLOR: {
  421. Color i = p_initial_val;
  422. Color d = p_delta_val;
  423. Color r;
  424. APPLY_EQUATION(r);
  425. APPLY_EQUATION(g);
  426. APPLY_EQUATION(b);
  427. APPLY_EQUATION(a);
  428. return r;
  429. }
  430. default: {
  431. return p_initial_val;
  432. }
  433. };
  434. #undef APPLY_EQUATION
  435. }
  436. Variant Tween::calculate_delta_value(Variant p_intial_val, Variant p_final_val) {
  437. ERR_FAIL_COND_V_MSG(p_intial_val.get_type() != p_final_val.get_type(), p_intial_val, "Type mismatch between initial and final value: " + Variant::get_type_name(p_intial_val.get_type()) + " and " + Variant::get_type_name(p_final_val.get_type()));
  438. switch (p_intial_val.get_type()) {
  439. case Variant::BOOL: {
  440. return (int)p_final_val - (int)p_intial_val;
  441. }
  442. case Variant::RECT2: {
  443. Rect2 i = p_intial_val;
  444. Rect2 f = p_final_val;
  445. return Rect2(f.position - i.position, f.size - i.size);
  446. }
  447. case Variant::RECT2I: {
  448. Rect2i i = p_intial_val;
  449. Rect2i f = p_final_val;
  450. return Rect2i(f.position - i.position, f.size - i.size);
  451. }
  452. case Variant::TRANSFORM2D: {
  453. Transform2D i = p_intial_val;
  454. Transform2D f = p_final_val;
  455. return Transform2D(f.elements[0][0] - i.elements[0][0],
  456. f.elements[0][1] - i.elements[0][1],
  457. f.elements[1][0] - i.elements[1][0],
  458. f.elements[1][1] - i.elements[1][1],
  459. f.elements[2][0] - i.elements[2][0],
  460. f.elements[2][1] - i.elements[2][1]);
  461. }
  462. case Variant::AABB: {
  463. AABB i = p_intial_val;
  464. AABB f = p_final_val;
  465. return AABB(f.position - i.position, f.size - i.size);
  466. }
  467. case Variant::BASIS: {
  468. Basis i = p_intial_val;
  469. Basis f = p_final_val;
  470. return Basis(f.elements[0][0] - i.elements[0][0],
  471. f.elements[0][1] - i.elements[0][1],
  472. f.elements[0][2] - i.elements[0][2],
  473. f.elements[1][0] - i.elements[1][0],
  474. f.elements[1][1] - i.elements[1][1],
  475. f.elements[1][2] - i.elements[1][2],
  476. f.elements[2][0] - i.elements[2][0],
  477. f.elements[2][1] - i.elements[2][1],
  478. f.elements[2][2] - i.elements[2][2]);
  479. }
  480. case Variant::TRANSFORM3D: {
  481. Transform3D i = p_intial_val;
  482. Transform3D f = p_final_val;
  483. return Transform3D(f.basis.elements[0][0] - i.basis.elements[0][0],
  484. f.basis.elements[0][1] - i.basis.elements[0][1],
  485. f.basis.elements[0][2] - i.basis.elements[0][2],
  486. f.basis.elements[1][0] - i.basis.elements[1][0],
  487. f.basis.elements[1][1] - i.basis.elements[1][1],
  488. f.basis.elements[1][2] - i.basis.elements[1][2],
  489. f.basis.elements[2][0] - i.basis.elements[2][0],
  490. f.basis.elements[2][1] - i.basis.elements[2][1],
  491. f.basis.elements[2][2] - i.basis.elements[2][2],
  492. f.origin.x - i.origin.x,
  493. f.origin.y - i.origin.y,
  494. f.origin.z - i.origin.z);
  495. }
  496. default: {
  497. return Variant::evaluate(Variant::OP_SUBTRACT, p_final_val, p_intial_val);
  498. }
  499. };
  500. }
  501. void Tween::_bind_methods() {
  502. ClassDB::bind_method(D_METHOD("tween_property", "object", "property", "final_val", "duration"), &Tween::tween_property);
  503. ClassDB::bind_method(D_METHOD("tween_interval", "time"), &Tween::tween_interval);
  504. ClassDB::bind_method(D_METHOD("tween_callback", "callback"), &Tween::tween_callback);
  505. ClassDB::bind_method(D_METHOD("tween_method", "method", "from", "to", "duration"), &Tween::tween_method);
  506. ClassDB::bind_method(D_METHOD("custom_step", "delta"), &Tween::custom_step);
  507. ClassDB::bind_method(D_METHOD("stop"), &Tween::stop);
  508. ClassDB::bind_method(D_METHOD("pause"), &Tween::pause);
  509. ClassDB::bind_method(D_METHOD("play"), &Tween::play);
  510. ClassDB::bind_method(D_METHOD("kill"), &Tween::kill);
  511. ClassDB::bind_method(D_METHOD("is_running"), &Tween::is_running);
  512. ClassDB::bind_method(D_METHOD("is_valid"), &Tween::is_valid);
  513. ClassDB::bind_method(D_METHOD("bind_node", "node"), &Tween::bind_node);
  514. ClassDB::bind_method(D_METHOD("set_process_mode", "mode"), &Tween::set_process_mode);
  515. ClassDB::bind_method(D_METHOD("set_pause_mode", "mode"), &Tween::set_pause_mode);
  516. ClassDB::bind_method(D_METHOD("set_parallel", "parallel"), &Tween::set_parallel, DEFVAL(true));
  517. ClassDB::bind_method(D_METHOD("set_loops", "loops"), &Tween::set_loops, DEFVAL(0));
  518. ClassDB::bind_method(D_METHOD("set_speed_scale", "speed"), &Tween::set_speed_scale);
  519. ClassDB::bind_method(D_METHOD("set_trans", "trans"), &Tween::set_trans);
  520. ClassDB::bind_method(D_METHOD("set_ease", "ease"), &Tween::set_ease);
  521. ClassDB::bind_method(D_METHOD("parallel"), &Tween::parallel);
  522. ClassDB::bind_method(D_METHOD("chain"), &Tween::chain);
  523. ClassDB::bind_method(D_METHOD("interpolate_value", "initial_value", "delta_value", "elapsed_time", "duration", "trans_type", "ease_type"), &Tween::interpolate_variant);
  524. ADD_SIGNAL(MethodInfo("step_finished", PropertyInfo(Variant::INT, "idx")));
  525. ADD_SIGNAL(MethodInfo("loop_finished", PropertyInfo(Variant::INT, "loop_count")));
  526. ADD_SIGNAL(MethodInfo("finished"));
  527. BIND_ENUM_CONSTANT(TWEEN_PROCESS_PHYSICS);
  528. BIND_ENUM_CONSTANT(TWEEN_PROCESS_IDLE);
  529. BIND_ENUM_CONSTANT(TWEEN_PAUSE_BOUND);
  530. BIND_ENUM_CONSTANT(TWEEN_PAUSE_STOP);
  531. BIND_ENUM_CONSTANT(TWEEN_PAUSE_PROCESS);
  532. BIND_ENUM_CONSTANT(TRANS_LINEAR);
  533. BIND_ENUM_CONSTANT(TRANS_SINE);
  534. BIND_ENUM_CONSTANT(TRANS_QUINT);
  535. BIND_ENUM_CONSTANT(TRANS_QUART);
  536. BIND_ENUM_CONSTANT(TRANS_QUAD);
  537. BIND_ENUM_CONSTANT(TRANS_EXPO);
  538. BIND_ENUM_CONSTANT(TRANS_ELASTIC);
  539. BIND_ENUM_CONSTANT(TRANS_CUBIC);
  540. BIND_ENUM_CONSTANT(TRANS_CIRC);
  541. BIND_ENUM_CONSTANT(TRANS_BOUNCE);
  542. BIND_ENUM_CONSTANT(TRANS_BACK);
  543. BIND_ENUM_CONSTANT(EASE_IN);
  544. BIND_ENUM_CONSTANT(EASE_OUT);
  545. BIND_ENUM_CONSTANT(EASE_IN_OUT);
  546. BIND_ENUM_CONSTANT(EASE_OUT_IN);
  547. }
  548. Ref<PropertyTweener> PropertyTweener::from(Variant p_value) {
  549. initial_val = p_value;
  550. do_continue = false;
  551. return this;
  552. }
  553. Ref<PropertyTweener> PropertyTweener::from_current() {
  554. do_continue = false;
  555. return this;
  556. }
  557. Ref<PropertyTweener> PropertyTweener::as_relative() {
  558. relative = true;
  559. return this;
  560. }
  561. Ref<PropertyTweener> PropertyTweener::set_trans(Tween::TransitionType p_trans) {
  562. trans_type = p_trans;
  563. return this;
  564. }
  565. Ref<PropertyTweener> PropertyTweener::set_ease(Tween::EaseType p_ease) {
  566. ease_type = p_ease;
  567. return this;
  568. }
  569. Ref<PropertyTweener> PropertyTweener::set_delay(float p_delay) {
  570. delay = p_delay;
  571. return this;
  572. }
  573. void PropertyTweener::start() {
  574. elapsed_time = 0;
  575. finished = false;
  576. Object *target_instance = ObjectDB::get_instance(target);
  577. if (!target_instance) {
  578. WARN_PRINT("Target object freed before starting, aborting Tweener.");
  579. return;
  580. }
  581. if (do_continue) {
  582. initial_val = target_instance->get_indexed(property);
  583. }
  584. if (relative) {
  585. final_val = Variant::evaluate(Variant::Operator::OP_ADD, initial_val, base_final_val);
  586. }
  587. delta_val = tween->calculate_delta_value(initial_val, final_val);
  588. }
  589. bool PropertyTweener::step(float &r_delta) {
  590. if (finished) {
  591. // This is needed in case there's a parallel Tweener with longer duration.
  592. return false;
  593. }
  594. Object *target_instance = ObjectDB::get_instance(target);
  595. if (!target_instance) {
  596. return false;
  597. }
  598. elapsed_time += r_delta;
  599. if (elapsed_time < delay) {
  600. r_delta = 0;
  601. return true;
  602. }
  603. float time = MIN(elapsed_time - delay, duration);
  604. target_instance->set_indexed(property, tween->interpolate_variant(initial_val, delta_val, time, duration, trans_type, ease_type));
  605. if (time < duration) {
  606. r_delta = 0;
  607. return true;
  608. } else {
  609. finished = true;
  610. r_delta = elapsed_time - delay - duration;
  611. emit_signal(SNAME("finished"));
  612. return false;
  613. }
  614. }
  615. void PropertyTweener::set_tween(Ref<Tween> p_tween) {
  616. tween = p_tween;
  617. if (trans_type == Tween::TRANS_MAX) {
  618. trans_type = tween->get_trans();
  619. }
  620. if (ease_type == Tween::EASE_MAX) {
  621. ease_type = tween->get_ease();
  622. }
  623. }
  624. void PropertyTweener::_bind_methods() {
  625. ClassDB::bind_method(D_METHOD("from", "value"), &PropertyTweener::from);
  626. ClassDB::bind_method(D_METHOD("from_current"), &PropertyTweener::from_current);
  627. ClassDB::bind_method(D_METHOD("as_relative"), &PropertyTweener::as_relative);
  628. ClassDB::bind_method(D_METHOD("set_trans", "trans"), &PropertyTweener::set_trans);
  629. ClassDB::bind_method(D_METHOD("set_ease", "ease"), &PropertyTweener::set_ease);
  630. ClassDB::bind_method(D_METHOD("set_delay", "delay"), &PropertyTweener::set_delay);
  631. }
  632. PropertyTweener::PropertyTweener(Object *p_target, NodePath p_property, Variant p_to, float p_duration) {
  633. target = p_target->get_instance_id();
  634. property = p_property.get_as_property_path().get_subnames();
  635. initial_val = p_target->get_indexed(property);
  636. base_final_val = p_to;
  637. final_val = base_final_val;
  638. duration = p_duration;
  639. }
  640. PropertyTweener::PropertyTweener() {
  641. ERR_FAIL_MSG("Can't create empty PropertyTweener. Use get_tree().tween_property() or tween_property() instead.");
  642. }
  643. void IntervalTweener::start() {
  644. elapsed_time = 0;
  645. finished = false;
  646. }
  647. bool IntervalTweener::step(float &r_delta) {
  648. if (finished) {
  649. return false;
  650. }
  651. elapsed_time += r_delta;
  652. if (elapsed_time < duration) {
  653. r_delta = 0;
  654. return true;
  655. } else {
  656. finished = true;
  657. r_delta = elapsed_time - duration;
  658. emit_signal(SNAME("finished"));
  659. return false;
  660. }
  661. }
  662. IntervalTweener::IntervalTweener(float p_time) {
  663. duration = p_time;
  664. }
  665. IntervalTweener::IntervalTweener() {
  666. ERR_FAIL_MSG("Can't create empty IntervalTweener. Use get_tree().tween_interval() instead.");
  667. }
  668. Ref<CallbackTweener> CallbackTweener::set_delay(float p_delay) {
  669. delay = p_delay;
  670. return this;
  671. }
  672. void CallbackTweener::start() {
  673. elapsed_time = 0;
  674. finished = false;
  675. }
  676. bool CallbackTweener::step(float &r_delta) {
  677. if (finished) {
  678. return false;
  679. }
  680. elapsed_time += r_delta;
  681. if (elapsed_time >= delay) {
  682. Variant result;
  683. Callable::CallError ce;
  684. callback.call(nullptr, 0, result, ce);
  685. if (ce.error != Callable::CallError::CALL_OK) {
  686. ERR_FAIL_V_MSG(false, "Error calling method from CallbackTweener: " + Variant::get_call_error_text(this, callback.get_method(), nullptr, 0, ce));
  687. }
  688. finished = true;
  689. r_delta = elapsed_time - delay;
  690. emit_signal(SNAME("finished"));
  691. return false;
  692. }
  693. r_delta = 0;
  694. return true;
  695. }
  696. void CallbackTweener::_bind_methods() {
  697. ClassDB::bind_method(D_METHOD("set_delay", "delay"), &CallbackTweener::set_delay);
  698. }
  699. CallbackTweener::CallbackTweener(Callable p_callback) {
  700. callback = p_callback;
  701. }
  702. CallbackTweener::CallbackTweener() {
  703. ERR_FAIL_MSG("Can't create empty CallbackTweener. Use get_tree().tween_callback() instead.");
  704. }
  705. Ref<MethodTweener> MethodTweener::set_delay(float p_delay) {
  706. delay = p_delay;
  707. return this;
  708. }
  709. Ref<MethodTweener> MethodTweener::set_trans(Tween::TransitionType p_trans) {
  710. trans_type = p_trans;
  711. return this;
  712. }
  713. Ref<MethodTweener> MethodTweener::set_ease(Tween::EaseType p_ease) {
  714. ease_type = p_ease;
  715. return this;
  716. }
  717. void MethodTweener::start() {
  718. elapsed_time = 0;
  719. finished = false;
  720. }
  721. bool MethodTweener::step(float &r_delta) {
  722. if (finished) {
  723. return false;
  724. }
  725. elapsed_time += r_delta;
  726. if (elapsed_time < delay) {
  727. r_delta = 0;
  728. return true;
  729. }
  730. float time = MIN(elapsed_time - delay, duration);
  731. Variant current_val = tween->interpolate_variant(initial_val, delta_val, time, duration, trans_type, ease_type);
  732. const Variant **argptr = (const Variant **)alloca(sizeof(Variant *));
  733. argptr[0] = &current_val;
  734. Variant result;
  735. Callable::CallError ce;
  736. callback.call(argptr, 1, result, ce);
  737. if (ce.error != Callable::CallError::CALL_OK) {
  738. ERR_FAIL_V_MSG(false, "Error calling method from MethodTweener: " + Variant::get_call_error_text(this, callback.get_method(), argptr, 1, ce));
  739. }
  740. if (time < duration) {
  741. r_delta = 0;
  742. return true;
  743. } else {
  744. finished = true;
  745. r_delta = elapsed_time - delay - duration;
  746. emit_signal(SNAME("finished"));
  747. return false;
  748. }
  749. }
  750. void MethodTweener::set_tween(Ref<Tween> p_tween) {
  751. tween = p_tween;
  752. if (trans_type == Tween::TRANS_MAX) {
  753. trans_type = tween->get_trans();
  754. }
  755. if (ease_type == Tween::EASE_MAX) {
  756. ease_type = tween->get_ease();
  757. }
  758. }
  759. void MethodTweener::_bind_methods() {
  760. ClassDB::bind_method(D_METHOD("set_delay", "delay"), &MethodTweener::set_delay);
  761. ClassDB::bind_method(D_METHOD("set_trans", "trans"), &MethodTweener::set_trans);
  762. ClassDB::bind_method(D_METHOD("set_ease", "ease"), &MethodTweener::set_ease);
  763. }
  764. MethodTweener::MethodTweener(Callable p_callback, Variant p_from, Variant p_to, float p_duration) {
  765. callback = p_callback;
  766. initial_val = p_from;
  767. delta_val = tween->calculate_delta_value(p_from, p_to);
  768. duration = p_duration;
  769. }
  770. MethodTweener::MethodTweener() {
  771. ERR_FAIL_MSG("Can't create empty MethodTweener. Use get_tree().tween_method() instead.");
  772. }