tween.cpp 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983
  1. /*************************************************************************/
  2. /* tween.cpp */
  3. /*************************************************************************/
  4. /* This file is part of: */
  5. /* GODOT ENGINE */
  6. /* https://godotengine.org */
  7. /*************************************************************************/
  8. /* Copyright (c) 2007-2022 Juan Linietsky, Ariel Manzur. */
  9. /* Copyright (c) 2014-2022 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. Variant::Type property_type = p_target->get_indexed(p_property.get_as_property_path().get_subnames()).get_type();
  69. if (property_type != p_to.get_type()) {
  70. // Cast p_to between floats and ints to avoid minor annoyances.
  71. if (property_type == Variant::FLOAT && p_to.get_type() == Variant::INT) {
  72. p_to = float(p_to);
  73. } else if (property_type == Variant::INT && p_to.get_type() == Variant::FLOAT) {
  74. p_to = int(p_to);
  75. } else {
  76. ERR_FAIL_V_MSG(Ref<PropertyTweener>(), "Type mismatch between property and final value: " + Variant::get_type_name(property_type) + " and " + Variant::get_type_name(p_to.get_type()));
  77. }
  78. }
  79. Ref<PropertyTweener> tweener = memnew(PropertyTweener(p_target, p_property, p_to, p_duration));
  80. append(tweener);
  81. return tweener;
  82. }
  83. Ref<IntervalTweener> Tween::tween_interval(float p_time) {
  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<IntervalTweener> tweener = memnew(IntervalTweener(p_time));
  87. append(tweener);
  88. return tweener;
  89. }
  90. Ref<CallbackTweener> Tween::tween_callback(Callable p_callback) {
  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<CallbackTweener> tweener = memnew(CallbackTweener(p_callback));
  94. append(tweener);
  95. return tweener;
  96. }
  97. Ref<MethodTweener> Tween::tween_method(Callable p_callback, Variant p_from, Variant p_to, float p_duration) {
  98. ERR_FAIL_COND_V_MSG(!valid, nullptr, "Tween invalid. Either finished or created outside scene tree.");
  99. ERR_FAIL_COND_V_MSG(started, nullptr, "Can't append to a Tween that has started. Use stop() first.");
  100. Ref<MethodTweener> tweener = memnew(MethodTweener(p_callback, p_from, p_to, p_duration));
  101. append(tweener);
  102. return tweener;
  103. }
  104. void Tween::append(Ref<Tweener> p_tweener) {
  105. p_tweener->set_tween(this);
  106. if (parallel_enabled) {
  107. current_step = MAX(current_step, 0);
  108. } else {
  109. current_step++;
  110. }
  111. parallel_enabled = default_parallel;
  112. tweeners.resize(current_step + 1);
  113. tweeners.write[current_step].push_back(p_tweener);
  114. }
  115. void Tween::stop() {
  116. started = false;
  117. running = false;
  118. dead = false;
  119. total_time = 0;
  120. }
  121. void Tween::pause() {
  122. running = false;
  123. }
  124. void Tween::play() {
  125. ERR_FAIL_COND_MSG(!valid, "Tween invalid. Either finished or created outside scene tree.");
  126. ERR_FAIL_COND_MSG(dead, "Can't play finished Tween, use stop() first to reset its state.");
  127. running = true;
  128. }
  129. void Tween::kill() {
  130. running = false; // For the sake of is_running().
  131. dead = true;
  132. }
  133. bool Tween::is_running() {
  134. return running;
  135. }
  136. bool Tween::is_valid() {
  137. return valid;
  138. }
  139. void Tween::clear() {
  140. valid = false;
  141. for (List<Ref<Tweener>> &step : tweeners) {
  142. for (Ref<Tweener> &tweener : step) {
  143. tweener->clear_tween();
  144. }
  145. }
  146. tweeners.clear();
  147. }
  148. Ref<Tween> Tween::bind_node(Node *p_node) {
  149. ERR_FAIL_NULL_V(p_node, this);
  150. bound_node = p_node->get_instance_id();
  151. is_bound = true;
  152. return this;
  153. }
  154. Ref<Tween> Tween::set_process_mode(TweenProcessMode p_mode) {
  155. process_mode = p_mode;
  156. return this;
  157. }
  158. Tween::TweenProcessMode Tween::get_process_mode() {
  159. return process_mode;
  160. }
  161. Ref<Tween> Tween::set_pause_mode(TweenPauseMode p_mode) {
  162. pause_mode = p_mode;
  163. return this;
  164. }
  165. Tween::TweenPauseMode Tween::get_pause_mode() {
  166. return pause_mode;
  167. }
  168. Ref<Tween> Tween::set_parallel(bool p_parallel) {
  169. default_parallel = p_parallel;
  170. parallel_enabled = p_parallel;
  171. return this;
  172. }
  173. Ref<Tween> Tween::set_loops(int p_loops) {
  174. loops = p_loops;
  175. return this;
  176. }
  177. Ref<Tween> Tween::set_speed_scale(float p_speed) {
  178. speed_scale = p_speed;
  179. return this;
  180. }
  181. Ref<Tween> Tween::set_trans(TransitionType p_trans) {
  182. default_transition = p_trans;
  183. return this;
  184. }
  185. Tween::TransitionType Tween::get_trans() {
  186. return default_transition;
  187. }
  188. Ref<Tween> Tween::set_ease(EaseType p_ease) {
  189. default_ease = p_ease;
  190. return this;
  191. }
  192. Tween::EaseType Tween::get_ease() {
  193. return default_ease;
  194. }
  195. Ref<Tween> Tween::parallel() {
  196. parallel_enabled = true;
  197. return this;
  198. }
  199. Ref<Tween> Tween::chain() {
  200. parallel_enabled = false;
  201. return this;
  202. }
  203. bool Tween::custom_step(float p_delta) {
  204. bool r = running;
  205. running = true;
  206. bool ret = step(p_delta);
  207. running = running && r; // Running might turn false when Tween finished.
  208. return ret;
  209. }
  210. bool Tween::step(float p_delta) {
  211. if (dead) {
  212. return false;
  213. }
  214. if (!running) {
  215. return true;
  216. }
  217. if (is_bound) {
  218. Node *bound_node = get_bound_node();
  219. if (bound_node) {
  220. if (!bound_node->is_inside_tree()) {
  221. return true;
  222. }
  223. } else {
  224. return false;
  225. }
  226. }
  227. if (!started) {
  228. ERR_FAIL_COND_V_MSG(tweeners.is_empty(), false, "Tween started, but has no Tweeners.");
  229. current_step = 0;
  230. loops_done = 0;
  231. total_time = 0;
  232. start_tweeners();
  233. started = true;
  234. }
  235. float rem_delta = p_delta * speed_scale;
  236. bool step_active = false;
  237. total_time += rem_delta;
  238. #ifdef DEBUG_ENABLED
  239. float initial_delta = rem_delta;
  240. bool potential_infinite = false;
  241. #endif
  242. while (rem_delta > 0 && running) {
  243. float step_delta = rem_delta;
  244. step_active = false;
  245. for (Ref<Tweener> &tweener : tweeners.write[current_step]) {
  246. // Modified inside Tweener.step().
  247. float temp_delta = rem_delta;
  248. // Turns to true if any Tweener returns true (i.e. is still not finished).
  249. step_active = tweener->step(temp_delta) || step_active;
  250. step_delta = MIN(temp_delta, step_delta);
  251. }
  252. rem_delta = step_delta;
  253. if (!step_active) {
  254. emit_signal(SNAME("step_finished"), current_step);
  255. current_step++;
  256. if (current_step == tweeners.size()) {
  257. loops_done++;
  258. if (loops_done == loops) {
  259. running = false;
  260. dead = true;
  261. emit_signal(SNAME("finished"));
  262. } else {
  263. emit_signal(SNAME("loop_finished"), loops_done);
  264. current_step = 0;
  265. start_tweeners();
  266. #ifdef DEBUG_ENABLED
  267. if (loops <= 0 && Math::is_equal_approx(rem_delta, initial_delta)) {
  268. if (!potential_infinite) {
  269. potential_infinite = true;
  270. } else {
  271. // Looped twice without using any time, this is 100% certain infinite loop.
  272. ERR_FAIL_V_MSG(false, "Infinite loop detected. Check set_loops() description for more info.");
  273. }
  274. }
  275. #endif
  276. }
  277. } else {
  278. start_tweeners();
  279. }
  280. }
  281. }
  282. return true;
  283. }
  284. bool Tween::can_process(bool p_tree_paused) const {
  285. if (is_bound && pause_mode == TWEEN_PAUSE_BOUND) {
  286. Node *bound_node = get_bound_node();
  287. if (bound_node) {
  288. return bound_node->is_inside_tree() && bound_node->can_process();
  289. }
  290. }
  291. return !p_tree_paused || pause_mode == TWEEN_PAUSE_PROCESS;
  292. }
  293. Node *Tween::get_bound_node() const {
  294. if (is_bound) {
  295. return Object::cast_to<Node>(ObjectDB::get_instance(bound_node));
  296. } else {
  297. return nullptr;
  298. }
  299. }
  300. float Tween::get_total_time() const {
  301. return total_time;
  302. }
  303. 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) {
  304. if (p_duration == 0) {
  305. // Special case to avoid dividing by 0 in equations.
  306. return p_initial + p_delta;
  307. }
  308. interpolater func = interpolaters[p_trans_type][p_ease_type];
  309. return func(p_time, p_initial, p_delta, p_duration);
  310. }
  311. Variant Tween::interpolate_variant(Variant p_initial_val, Variant p_delta_val, float p_time, float p_duration, TransitionType p_trans, EaseType p_ease) {
  312. ERR_FAIL_INDEX_V(p_trans, TransitionType::TRANS_MAX, Variant());
  313. ERR_FAIL_INDEX_V(p_ease, EaseType::EASE_MAX, Variant());
  314. // Helper macro to run equation on sub-elements of the value (e.g. x and y of Vector2).
  315. #define APPLY_EQUATION(element) \
  316. r.element = run_equation(p_trans, p_ease, p_time, i.element, d.element, p_duration);
  317. switch (p_initial_val.get_type()) {
  318. case Variant::BOOL: {
  319. return (run_equation(p_trans, p_ease, p_time, p_initial_val, p_delta_val, p_duration)) >= 0.5;
  320. }
  321. case Variant::INT: {
  322. return (int)run_equation(p_trans, p_ease, p_time, (int)p_initial_val, (int)p_delta_val, p_duration);
  323. }
  324. case Variant::FLOAT: {
  325. return run_equation(p_trans, p_ease, p_time, (real_t)p_initial_val, (real_t)p_delta_val, p_duration);
  326. }
  327. case Variant::VECTOR2: {
  328. Vector2 i = p_initial_val;
  329. Vector2 d = p_delta_val;
  330. Vector2 r;
  331. APPLY_EQUATION(x);
  332. APPLY_EQUATION(y);
  333. return r;
  334. }
  335. case Variant::VECTOR2I: {
  336. Vector2i i = p_initial_val;
  337. Vector2i d = p_delta_val;
  338. Vector2i r;
  339. APPLY_EQUATION(x);
  340. APPLY_EQUATION(y);
  341. return r;
  342. }
  343. case Variant::RECT2: {
  344. Rect2 i = p_initial_val;
  345. Rect2 d = p_delta_val;
  346. Rect2 r;
  347. APPLY_EQUATION(position.x);
  348. APPLY_EQUATION(position.y);
  349. APPLY_EQUATION(size.x);
  350. APPLY_EQUATION(size.y);
  351. return r;
  352. }
  353. case Variant::RECT2I: {
  354. Rect2i i = p_initial_val;
  355. Rect2i d = p_delta_val;
  356. Rect2i r;
  357. APPLY_EQUATION(position.x);
  358. APPLY_EQUATION(position.y);
  359. APPLY_EQUATION(size.x);
  360. APPLY_EQUATION(size.y);
  361. return r;
  362. }
  363. case Variant::VECTOR3: {
  364. Vector3 i = p_initial_val;
  365. Vector3 d = p_delta_val;
  366. Vector3 r;
  367. APPLY_EQUATION(x);
  368. APPLY_EQUATION(y);
  369. APPLY_EQUATION(z);
  370. return r;
  371. }
  372. case Variant::VECTOR3I: {
  373. Vector3i i = p_initial_val;
  374. Vector3i d = p_delta_val;
  375. Vector3i r;
  376. APPLY_EQUATION(x);
  377. APPLY_EQUATION(y);
  378. APPLY_EQUATION(z);
  379. return r;
  380. }
  381. case Variant::TRANSFORM2D: {
  382. Transform2D i = p_initial_val;
  383. Transform2D d = p_delta_val;
  384. Transform2D r;
  385. APPLY_EQUATION(columns[0][0]);
  386. APPLY_EQUATION(columns[0][1]);
  387. APPLY_EQUATION(columns[1][0]);
  388. APPLY_EQUATION(columns[1][1]);
  389. APPLY_EQUATION(columns[2][0]);
  390. APPLY_EQUATION(columns[2][1]);
  391. return r;
  392. }
  393. case Variant::VECTOR4: {
  394. Vector4 i = p_initial_val;
  395. Vector4 d = p_delta_val;
  396. Vector4 r;
  397. APPLY_EQUATION(x);
  398. APPLY_EQUATION(y);
  399. APPLY_EQUATION(z);
  400. APPLY_EQUATION(w);
  401. return r;
  402. }
  403. case Variant::QUATERNION: {
  404. Quaternion i = p_initial_val;
  405. Quaternion d = p_delta_val;
  406. Quaternion r = i * d;
  407. r = i.slerp(r, run_equation(p_trans, p_ease, p_time, 0.0, 1.0, p_duration));
  408. return r;
  409. }
  410. case Variant::AABB: {
  411. AABB i = p_initial_val;
  412. AABB d = p_delta_val;
  413. AABB r;
  414. APPLY_EQUATION(position.x);
  415. APPLY_EQUATION(position.y);
  416. APPLY_EQUATION(position.z);
  417. APPLY_EQUATION(size.x);
  418. APPLY_EQUATION(size.y);
  419. APPLY_EQUATION(size.z);
  420. return r;
  421. }
  422. case Variant::BASIS: {
  423. Basis i = p_initial_val;
  424. Basis d = p_delta_val;
  425. Basis r;
  426. APPLY_EQUATION(rows[0][0]);
  427. APPLY_EQUATION(rows[0][1]);
  428. APPLY_EQUATION(rows[0][2]);
  429. APPLY_EQUATION(rows[1][0]);
  430. APPLY_EQUATION(rows[1][1]);
  431. APPLY_EQUATION(rows[1][2]);
  432. APPLY_EQUATION(rows[2][0]);
  433. APPLY_EQUATION(rows[2][1]);
  434. APPLY_EQUATION(rows[2][2]);
  435. return r;
  436. }
  437. case Variant::TRANSFORM3D: {
  438. Transform3D i = p_initial_val;
  439. Transform3D d = p_delta_val;
  440. Transform3D r;
  441. APPLY_EQUATION(basis.rows[0][0]);
  442. APPLY_EQUATION(basis.rows[0][1]);
  443. APPLY_EQUATION(basis.rows[0][2]);
  444. APPLY_EQUATION(basis.rows[1][0]);
  445. APPLY_EQUATION(basis.rows[1][1]);
  446. APPLY_EQUATION(basis.rows[1][2]);
  447. APPLY_EQUATION(basis.rows[2][0]);
  448. APPLY_EQUATION(basis.rows[2][1]);
  449. APPLY_EQUATION(basis.rows[2][2]);
  450. APPLY_EQUATION(origin.x);
  451. APPLY_EQUATION(origin.y);
  452. APPLY_EQUATION(origin.z);
  453. return r;
  454. }
  455. case Variant::COLOR: {
  456. Color i = p_initial_val;
  457. Color d = p_delta_val;
  458. Color r;
  459. APPLY_EQUATION(r);
  460. APPLY_EQUATION(g);
  461. APPLY_EQUATION(b);
  462. APPLY_EQUATION(a);
  463. return r;
  464. }
  465. default: {
  466. return p_initial_val;
  467. }
  468. };
  469. #undef APPLY_EQUATION
  470. }
  471. Variant Tween::calculate_delta_value(Variant p_intial_val, Variant p_final_val) {
  472. 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()));
  473. switch (p_intial_val.get_type()) {
  474. case Variant::BOOL: {
  475. return (int)p_final_val - (int)p_intial_val;
  476. }
  477. case Variant::RECT2: {
  478. Rect2 i = p_intial_val;
  479. Rect2 f = p_final_val;
  480. return Rect2(f.position - i.position, f.size - i.size);
  481. }
  482. case Variant::RECT2I: {
  483. Rect2i i = p_intial_val;
  484. Rect2i f = p_final_val;
  485. return Rect2i(f.position - i.position, f.size - i.size);
  486. }
  487. case Variant::TRANSFORM2D: {
  488. Transform2D i = p_intial_val;
  489. Transform2D f = p_final_val;
  490. return Transform2D(f.columns[0][0] - i.columns[0][0],
  491. f.columns[0][1] - i.columns[0][1],
  492. f.columns[1][0] - i.columns[1][0],
  493. f.columns[1][1] - i.columns[1][1],
  494. f.columns[2][0] - i.columns[2][0],
  495. f.columns[2][1] - i.columns[2][1]);
  496. }
  497. case Variant::AABB: {
  498. AABB i = p_intial_val;
  499. AABB f = p_final_val;
  500. return AABB(f.position - i.position, f.size - i.size);
  501. }
  502. case Variant::BASIS: {
  503. Basis i = p_intial_val;
  504. Basis f = p_final_val;
  505. return Basis(f.rows[0][0] - i.rows[0][0],
  506. f.rows[0][1] - i.rows[0][1],
  507. f.rows[0][2] - i.rows[0][2],
  508. f.rows[1][0] - i.rows[1][0],
  509. f.rows[1][1] - i.rows[1][1],
  510. f.rows[1][2] - i.rows[1][2],
  511. f.rows[2][0] - i.rows[2][0],
  512. f.rows[2][1] - i.rows[2][1],
  513. f.rows[2][2] - i.rows[2][2]);
  514. }
  515. case Variant::TRANSFORM3D: {
  516. Transform3D i = p_intial_val;
  517. Transform3D f = p_final_val;
  518. return Transform3D(f.basis.rows[0][0] - i.basis.rows[0][0],
  519. f.basis.rows[0][1] - i.basis.rows[0][1],
  520. f.basis.rows[0][2] - i.basis.rows[0][2],
  521. f.basis.rows[1][0] - i.basis.rows[1][0],
  522. f.basis.rows[1][1] - i.basis.rows[1][1],
  523. f.basis.rows[1][2] - i.basis.rows[1][2],
  524. f.basis.rows[2][0] - i.basis.rows[2][0],
  525. f.basis.rows[2][1] - i.basis.rows[2][1],
  526. f.basis.rows[2][2] - i.basis.rows[2][2],
  527. f.origin.x - i.origin.x,
  528. f.origin.y - i.origin.y,
  529. f.origin.z - i.origin.z);
  530. }
  531. default: {
  532. return Variant::evaluate(Variant::OP_SUBTRACT, p_final_val, p_intial_val);
  533. }
  534. };
  535. }
  536. void Tween::_bind_methods() {
  537. ClassDB::bind_method(D_METHOD("tween_property", "object", "property", "final_val", "duration"), &Tween::tween_property);
  538. ClassDB::bind_method(D_METHOD("tween_interval", "time"), &Tween::tween_interval);
  539. ClassDB::bind_method(D_METHOD("tween_callback", "callback"), &Tween::tween_callback);
  540. ClassDB::bind_method(D_METHOD("tween_method", "method", "from", "to", "duration"), &Tween::tween_method);
  541. ClassDB::bind_method(D_METHOD("custom_step", "delta"), &Tween::custom_step);
  542. ClassDB::bind_method(D_METHOD("stop"), &Tween::stop);
  543. ClassDB::bind_method(D_METHOD("pause"), &Tween::pause);
  544. ClassDB::bind_method(D_METHOD("play"), &Tween::play);
  545. ClassDB::bind_method(D_METHOD("kill"), &Tween::kill);
  546. ClassDB::bind_method(D_METHOD("get_total_elapsed_time"), &Tween::get_total_time);
  547. ClassDB::bind_method(D_METHOD("is_running"), &Tween::is_running);
  548. ClassDB::bind_method(D_METHOD("is_valid"), &Tween::is_valid);
  549. ClassDB::bind_method(D_METHOD("bind_node", "node"), &Tween::bind_node);
  550. ClassDB::bind_method(D_METHOD("set_process_mode", "mode"), &Tween::set_process_mode);
  551. ClassDB::bind_method(D_METHOD("set_pause_mode", "mode"), &Tween::set_pause_mode);
  552. ClassDB::bind_method(D_METHOD("set_parallel", "parallel"), &Tween::set_parallel, DEFVAL(true));
  553. ClassDB::bind_method(D_METHOD("set_loops", "loops"), &Tween::set_loops, DEFVAL(0));
  554. ClassDB::bind_method(D_METHOD("set_speed_scale", "speed"), &Tween::set_speed_scale);
  555. ClassDB::bind_method(D_METHOD("set_trans", "trans"), &Tween::set_trans);
  556. ClassDB::bind_method(D_METHOD("set_ease", "ease"), &Tween::set_ease);
  557. ClassDB::bind_method(D_METHOD("parallel"), &Tween::parallel);
  558. ClassDB::bind_method(D_METHOD("chain"), &Tween::chain);
  559. ClassDB::bind_static_method("Tween", D_METHOD("interpolate_value", "initial_value", "delta_value", "elapsed_time", "duration", "trans_type", "ease_type"), &Tween::interpolate_variant);
  560. ADD_SIGNAL(MethodInfo("step_finished", PropertyInfo(Variant::INT, "idx")));
  561. ADD_SIGNAL(MethodInfo("loop_finished", PropertyInfo(Variant::INT, "loop_count")));
  562. ADD_SIGNAL(MethodInfo("finished"));
  563. BIND_ENUM_CONSTANT(TWEEN_PROCESS_PHYSICS);
  564. BIND_ENUM_CONSTANT(TWEEN_PROCESS_IDLE);
  565. BIND_ENUM_CONSTANT(TWEEN_PAUSE_BOUND);
  566. BIND_ENUM_CONSTANT(TWEEN_PAUSE_STOP);
  567. BIND_ENUM_CONSTANT(TWEEN_PAUSE_PROCESS);
  568. BIND_ENUM_CONSTANT(TRANS_LINEAR);
  569. BIND_ENUM_CONSTANT(TRANS_SINE);
  570. BIND_ENUM_CONSTANT(TRANS_QUINT);
  571. BIND_ENUM_CONSTANT(TRANS_QUART);
  572. BIND_ENUM_CONSTANT(TRANS_QUAD);
  573. BIND_ENUM_CONSTANT(TRANS_EXPO);
  574. BIND_ENUM_CONSTANT(TRANS_ELASTIC);
  575. BIND_ENUM_CONSTANT(TRANS_CUBIC);
  576. BIND_ENUM_CONSTANT(TRANS_CIRC);
  577. BIND_ENUM_CONSTANT(TRANS_BOUNCE);
  578. BIND_ENUM_CONSTANT(TRANS_BACK);
  579. BIND_ENUM_CONSTANT(EASE_IN);
  580. BIND_ENUM_CONSTANT(EASE_OUT);
  581. BIND_ENUM_CONSTANT(EASE_IN_OUT);
  582. BIND_ENUM_CONSTANT(EASE_OUT_IN);
  583. }
  584. Tween::Tween() {
  585. ERR_FAIL_MSG("Tween can't be created directly. Use create_tween() method.");
  586. }
  587. Tween::Tween(bool p_valid) {
  588. valid = p_valid;
  589. }
  590. Ref<PropertyTweener> PropertyTweener::from(Variant p_value) {
  591. initial_val = p_value;
  592. do_continue = false;
  593. return this;
  594. }
  595. Ref<PropertyTweener> PropertyTweener::from_current() {
  596. do_continue = false;
  597. return this;
  598. }
  599. Ref<PropertyTweener> PropertyTweener::as_relative() {
  600. relative = true;
  601. return this;
  602. }
  603. Ref<PropertyTweener> PropertyTweener::set_trans(Tween::TransitionType p_trans) {
  604. trans_type = p_trans;
  605. return this;
  606. }
  607. Ref<PropertyTweener> PropertyTweener::set_ease(Tween::EaseType p_ease) {
  608. ease_type = p_ease;
  609. return this;
  610. }
  611. Ref<PropertyTweener> PropertyTweener::set_delay(float p_delay) {
  612. delay = p_delay;
  613. return this;
  614. }
  615. void PropertyTweener::start() {
  616. elapsed_time = 0;
  617. finished = false;
  618. Object *target_instance = ObjectDB::get_instance(target);
  619. if (!target_instance) {
  620. WARN_PRINT("Target object freed before starting, aborting Tweener.");
  621. return;
  622. }
  623. if (do_continue) {
  624. initial_val = target_instance->get_indexed(property);
  625. }
  626. if (relative) {
  627. final_val = Variant::evaluate(Variant::Operator::OP_ADD, initial_val, base_final_val);
  628. }
  629. delta_val = tween->calculate_delta_value(initial_val, final_val);
  630. }
  631. bool PropertyTweener::step(float &r_delta) {
  632. if (finished) {
  633. // This is needed in case there's a parallel Tweener with longer duration.
  634. return false;
  635. }
  636. Object *target_instance = ObjectDB::get_instance(target);
  637. if (!target_instance) {
  638. return false;
  639. }
  640. elapsed_time += r_delta;
  641. if (elapsed_time < delay) {
  642. r_delta = 0;
  643. return true;
  644. }
  645. float time = MIN(elapsed_time - delay, duration);
  646. if (time < duration) {
  647. target_instance->set_indexed(property, tween->interpolate_variant(initial_val, delta_val, time, duration, trans_type, ease_type));
  648. r_delta = 0;
  649. return true;
  650. } else {
  651. target_instance->set_indexed(property, final_val);
  652. finished = true;
  653. r_delta = elapsed_time - delay - duration;
  654. emit_signal(SNAME("finished"));
  655. return false;
  656. }
  657. }
  658. void PropertyTweener::set_tween(Ref<Tween> p_tween) {
  659. tween = p_tween;
  660. if (trans_type == Tween::TRANS_MAX) {
  661. trans_type = tween->get_trans();
  662. }
  663. if (ease_type == Tween::EASE_MAX) {
  664. ease_type = tween->get_ease();
  665. }
  666. }
  667. void PropertyTweener::_bind_methods() {
  668. ClassDB::bind_method(D_METHOD("from", "value"), &PropertyTweener::from);
  669. ClassDB::bind_method(D_METHOD("from_current"), &PropertyTweener::from_current);
  670. ClassDB::bind_method(D_METHOD("as_relative"), &PropertyTweener::as_relative);
  671. ClassDB::bind_method(D_METHOD("set_trans", "trans"), &PropertyTweener::set_trans);
  672. ClassDB::bind_method(D_METHOD("set_ease", "ease"), &PropertyTweener::set_ease);
  673. ClassDB::bind_method(D_METHOD("set_delay", "delay"), &PropertyTweener::set_delay);
  674. }
  675. PropertyTweener::PropertyTweener(Object *p_target, NodePath p_property, Variant p_to, float p_duration) {
  676. target = p_target->get_instance_id();
  677. property = p_property.get_as_property_path().get_subnames();
  678. initial_val = p_target->get_indexed(property);
  679. base_final_val = p_to;
  680. final_val = base_final_val;
  681. duration = p_duration;
  682. }
  683. PropertyTweener::PropertyTweener() {
  684. ERR_FAIL_MSG("Can't create empty PropertyTweener. Use get_tree().tween_property() or tween_property() instead.");
  685. }
  686. void IntervalTweener::start() {
  687. elapsed_time = 0;
  688. finished = false;
  689. }
  690. bool IntervalTweener::step(float &r_delta) {
  691. if (finished) {
  692. return false;
  693. }
  694. elapsed_time += r_delta;
  695. if (elapsed_time < duration) {
  696. r_delta = 0;
  697. return true;
  698. } else {
  699. finished = true;
  700. r_delta = elapsed_time - duration;
  701. emit_signal(SNAME("finished"));
  702. return false;
  703. }
  704. }
  705. IntervalTweener::IntervalTweener(float p_time) {
  706. duration = p_time;
  707. }
  708. IntervalTweener::IntervalTweener() {
  709. ERR_FAIL_MSG("Can't create empty IntervalTweener. Use get_tree().tween_interval() instead.");
  710. }
  711. Ref<CallbackTweener> CallbackTweener::set_delay(float p_delay) {
  712. delay = p_delay;
  713. return this;
  714. }
  715. void CallbackTweener::start() {
  716. elapsed_time = 0;
  717. finished = false;
  718. }
  719. bool CallbackTweener::step(float &r_delta) {
  720. if (finished) {
  721. return false;
  722. }
  723. elapsed_time += r_delta;
  724. if (elapsed_time >= delay) {
  725. Variant result;
  726. Callable::CallError ce;
  727. callback.callp(nullptr, 0, result, ce);
  728. if (ce.error != Callable::CallError::CALL_OK) {
  729. ERR_FAIL_V_MSG(false, "Error calling method from CallbackTweener: " + Variant::get_callable_error_text(callback, nullptr, 0, ce));
  730. }
  731. finished = true;
  732. r_delta = elapsed_time - delay;
  733. emit_signal(SNAME("finished"));
  734. return false;
  735. }
  736. r_delta = 0;
  737. return true;
  738. }
  739. void CallbackTweener::_bind_methods() {
  740. ClassDB::bind_method(D_METHOD("set_delay", "delay"), &CallbackTweener::set_delay);
  741. }
  742. CallbackTweener::CallbackTweener(Callable p_callback) {
  743. callback = p_callback;
  744. }
  745. CallbackTweener::CallbackTweener() {
  746. ERR_FAIL_MSG("Can't create empty CallbackTweener. Use get_tree().tween_callback() instead.");
  747. }
  748. Ref<MethodTweener> MethodTweener::set_delay(float p_delay) {
  749. delay = p_delay;
  750. return this;
  751. }
  752. Ref<MethodTweener> MethodTweener::set_trans(Tween::TransitionType p_trans) {
  753. trans_type = p_trans;
  754. return this;
  755. }
  756. Ref<MethodTweener> MethodTweener::set_ease(Tween::EaseType p_ease) {
  757. ease_type = p_ease;
  758. return this;
  759. }
  760. void MethodTweener::start() {
  761. elapsed_time = 0;
  762. finished = false;
  763. }
  764. bool MethodTweener::step(float &r_delta) {
  765. if (finished) {
  766. return false;
  767. }
  768. elapsed_time += r_delta;
  769. if (elapsed_time < delay) {
  770. r_delta = 0;
  771. return true;
  772. }
  773. Variant current_val;
  774. float time = MIN(elapsed_time - delay, duration);
  775. if (time < duration) {
  776. current_val = tween->interpolate_variant(initial_val, delta_val, time, duration, trans_type, ease_type);
  777. } else {
  778. current_val = final_val;
  779. }
  780. const Variant **argptr = (const Variant **)alloca(sizeof(Variant *));
  781. argptr[0] = &current_val;
  782. Variant result;
  783. Callable::CallError ce;
  784. callback.callp(argptr, 1, result, ce);
  785. if (ce.error != Callable::CallError::CALL_OK) {
  786. ERR_FAIL_V_MSG(false, "Error calling method from MethodTweener: " + Variant::get_callable_error_text(callback, argptr, 1, ce));
  787. }
  788. if (time < duration) {
  789. r_delta = 0;
  790. return true;
  791. } else {
  792. finished = true;
  793. r_delta = elapsed_time - delay - duration;
  794. emit_signal(SNAME("finished"));
  795. return false;
  796. }
  797. }
  798. void MethodTweener::set_tween(Ref<Tween> p_tween) {
  799. tween = p_tween;
  800. if (trans_type == Tween::TRANS_MAX) {
  801. trans_type = tween->get_trans();
  802. }
  803. if (ease_type == Tween::EASE_MAX) {
  804. ease_type = tween->get_ease();
  805. }
  806. }
  807. void MethodTweener::_bind_methods() {
  808. ClassDB::bind_method(D_METHOD("set_delay", "delay"), &MethodTweener::set_delay);
  809. ClassDB::bind_method(D_METHOD("set_trans", "trans"), &MethodTweener::set_trans);
  810. ClassDB::bind_method(D_METHOD("set_ease", "ease"), &MethodTweener::set_ease);
  811. }
  812. MethodTweener::MethodTweener(Callable p_callback, Variant p_from, Variant p_to, float p_duration) {
  813. callback = p_callback;
  814. initial_val = p_from;
  815. delta_val = tween->calculate_delta_value(p_from, p_to);
  816. final_val = p_to;
  817. duration = p_duration;
  818. }
  819. MethodTweener::MethodTweener() {
  820. ERR_FAIL_MSG("Can't create empty MethodTweener. Use get_tree().tween_method() instead.");
  821. }