tween.cpp 27 KB

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