tween.cpp 42 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572
  1. /*************************************************************************/
  2. /* tween.cpp */
  3. /*************************************************************************/
  4. /* This file is part of: */
  5. /* GODOT ENGINE */
  6. /* http://www.godotengine.org */
  7. /*************************************************************************/
  8. /* Copyright (c) 2007-2016 Juan Linietsky, Ariel Manzur. */
  9. /* */
  10. /* Permission is hereby granted, free of charge, to any person obtaining */
  11. /* a copy of this software and associated documentation files (the */
  12. /* "Software"), to deal in the Software without restriction, including */
  13. /* without limitation the rights to use, copy, modify, merge, publish, */
  14. /* distribute, sublicense, and/or sell copies of the Software, and to */
  15. /* permit persons to whom the Software is furnished to do so, subject to */
  16. /* the following conditions: */
  17. /* */
  18. /* The above copyright notice and this permission notice shall be */
  19. /* included in all copies or substantial portions of the Software. */
  20. /* */
  21. /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
  22. /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
  23. /* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
  24. /* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
  25. /* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
  26. /* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
  27. /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
  28. /*************************************************************************/
  29. #include "tween.h"
  30. #include "method_bind_ext.inc"
  31. void Tween::_add_pending_command(StringName p_key
  32. ,const Variant& p_arg1 ,const Variant& p_arg2 ,const Variant& p_arg3 ,const Variant& p_arg4 ,const Variant& p_arg5
  33. ,const Variant& p_arg6 ,const Variant& p_arg7 ,const Variant& p_arg8 ,const Variant& p_arg9 ,const Variant& p_arg10
  34. ) {
  35. pending_commands.push_back(PendingCommand());
  36. PendingCommand& cmd = pending_commands.back()->get();
  37. cmd.key = p_key;
  38. int& count = cmd.args;
  39. if(p_arg10.get_type() != Variant::NIL)
  40. count = 10;
  41. else if(p_arg9.get_type() != Variant::NIL)
  42. count = 9;
  43. else if(p_arg8.get_type() != Variant::NIL)
  44. count = 8;
  45. else if(p_arg7.get_type() != Variant::NIL)
  46. count = 7;
  47. else if(p_arg6.get_type() != Variant::NIL)
  48. count = 6;
  49. else if(p_arg5.get_type() != Variant::NIL)
  50. count = 5;
  51. else if(p_arg4.get_type() != Variant::NIL)
  52. count = 4;
  53. else if(p_arg3.get_type() != Variant::NIL)
  54. count = 3;
  55. else if(p_arg2.get_type() != Variant::NIL)
  56. count = 2;
  57. else if(p_arg1.get_type() != Variant::NIL)
  58. count = 1;
  59. if(count > 0)
  60. cmd.arg[0] = p_arg1;
  61. if(count > 1)
  62. cmd.arg[1] = p_arg2;
  63. if(count > 2)
  64. cmd.arg[2] = p_arg3;
  65. if(count > 3)
  66. cmd.arg[3] = p_arg4;
  67. if(count > 4)
  68. cmd.arg[4] = p_arg5;
  69. if(count > 5)
  70. cmd.arg[5] = p_arg6;
  71. if(count > 6)
  72. cmd.arg[6] = p_arg7;
  73. if(count > 7)
  74. cmd.arg[7] = p_arg8;
  75. if(count > 8)
  76. cmd.arg[8] = p_arg9;
  77. if(count > 9)
  78. cmd.arg[9] = p_arg10;
  79. }
  80. void Tween::_process_pending_commands() {
  81. for(List<PendingCommand>::Element *E=pending_commands.front();E;E=E->next()) {
  82. PendingCommand& cmd = E->get();
  83. Variant::CallError err;
  84. Variant *arg[10] = {
  85. &cmd.arg[0],
  86. &cmd.arg[1],
  87. &cmd.arg[2],
  88. &cmd.arg[3],
  89. &cmd.arg[4],
  90. &cmd.arg[5],
  91. &cmd.arg[6],
  92. &cmd.arg[7],
  93. &cmd.arg[8],
  94. &cmd.arg[9],
  95. };
  96. this->call(cmd.key, (const Variant **) arg, cmd.args, err);
  97. }
  98. pending_commands.clear();
  99. }
  100. bool Tween::_set(const StringName& p_name, const Variant& p_value) {
  101. String name=p_name;
  102. if (name=="playback/speed" || name=="speed") { //bw compatibility
  103. set_speed(p_value);
  104. } else if (name=="playback/active") {
  105. set_active(p_value);
  106. } else if (name=="playback/repeat") {
  107. set_repeat(p_value);
  108. }
  109. return true;
  110. }
  111. bool Tween::_get(const StringName& p_name,Variant &r_ret) const {
  112. String name=p_name;
  113. if (name=="playback/speed") { //bw compatibility
  114. r_ret=speed_scale;
  115. } else if (name=="playback/active") {
  116. r_ret=is_active();
  117. } else if(name=="playback/repeat") {
  118. r_ret=is_repeat();
  119. }
  120. return true;
  121. }
  122. void Tween::_get_property_list(List<PropertyInfo> *p_list) const {
  123. p_list->push_back( PropertyInfo( Variant::BOOL, "playback/active", PROPERTY_HINT_NONE,"" ) );
  124. p_list->push_back( PropertyInfo( Variant::BOOL, "playback/repeat", PROPERTY_HINT_NONE,"" ) );
  125. p_list->push_back( PropertyInfo( Variant::REAL, "playback/speed", PROPERTY_HINT_RANGE, "-64,64,0.01") );
  126. }
  127. void Tween::_notification(int p_what) {
  128. switch(p_what) {
  129. case NOTIFICATION_ENTER_TREE: {
  130. if (!processing) {
  131. //make sure that a previous process state was not saved
  132. //only process if "processing" is set
  133. set_fixed_process(false);
  134. set_process(false);
  135. }
  136. } break;
  137. case NOTIFICATION_READY: {
  138. } break;
  139. case NOTIFICATION_PROCESS: {
  140. if (tween_process_mode==TWEEN_PROCESS_FIXED)
  141. break;
  142. if (processing)
  143. _tween_process( get_process_delta_time() );
  144. } break;
  145. case NOTIFICATION_FIXED_PROCESS: {
  146. if (tween_process_mode==TWEEN_PROCESS_IDLE)
  147. break;
  148. if (processing)
  149. _tween_process( get_fixed_process_delta_time() );
  150. } break;
  151. case NOTIFICATION_EXIT_TREE: {
  152. stop_all();
  153. } break;
  154. }
  155. }
  156. void Tween::_bind_methods() {
  157. ObjectTypeDB::bind_method(_MD("is_active"),&Tween::is_active );
  158. ObjectTypeDB::bind_method(_MD("set_active","active"),&Tween::set_active );
  159. ObjectTypeDB::bind_method(_MD("is_repeat"),&Tween::is_repeat );
  160. ObjectTypeDB::bind_method(_MD("set_repeat","repeat"),&Tween::set_repeat );
  161. ObjectTypeDB::bind_method(_MD("set_speed","speed"),&Tween::set_speed);
  162. ObjectTypeDB::bind_method(_MD("get_speed"),&Tween::get_speed);
  163. ObjectTypeDB::bind_method(_MD("set_tween_process_mode","mode"),&Tween::set_tween_process_mode);
  164. ObjectTypeDB::bind_method(_MD("get_tween_process_mode"),&Tween::get_tween_process_mode);
  165. ObjectTypeDB::bind_method(_MD("start"),&Tween::start );
  166. ObjectTypeDB::bind_method(_MD("reset","object","key"),&Tween::reset, DEFVAL("") );
  167. ObjectTypeDB::bind_method(_MD("reset_all"),&Tween::reset_all );
  168. ObjectTypeDB::bind_method(_MD("stop","object","key"),&Tween::stop, DEFVAL("") );
  169. ObjectTypeDB::bind_method(_MD("stop_all"),&Tween::stop_all );
  170. ObjectTypeDB::bind_method(_MD("resume","object","key"),&Tween::resume, DEFVAL("") );
  171. ObjectTypeDB::bind_method(_MD("resume_all"),&Tween::resume_all );
  172. ObjectTypeDB::bind_method(_MD("remove","object","key"),&Tween::remove, DEFVAL("") );
  173. ObjectTypeDB::bind_method(_MD("remove_all"),&Tween::remove_all );
  174. ObjectTypeDB::bind_method(_MD("seek","time"),&Tween::seek );
  175. ObjectTypeDB::bind_method(_MD("tell"),&Tween::tell );
  176. ObjectTypeDB::bind_method(_MD("get_runtime"),&Tween::get_runtime );
  177. ObjectTypeDB::bind_method(_MD("interpolate_property","object","property","initial_val","final_val","times_in_sec","trans_type","ease_type","delay"),&Tween::interpolate_property, DEFVAL(0) );
  178. ObjectTypeDB::bind_method(_MD("interpolate_method","object","method","initial_val","final_val","times_in_sec","trans_type","ease_type","delay"),&Tween::interpolate_method, DEFVAL(0) );
  179. ObjectTypeDB::bind_method(_MD("interpolate_callback","object","times_in_sec","callback","arg1", "arg2","arg3","arg4","arg5"),&Tween::interpolate_callback, DEFVAL(Variant()), DEFVAL(Variant()), DEFVAL(Variant()), DEFVAL(Variant()), DEFVAL(Variant()) );
  180. ObjectTypeDB::bind_method(_MD("interpolate_deferred_callback","object","times_in_sec","callback","arg1","arg2","arg3","arg4","arg5"),&Tween::interpolate_deferred_callback, DEFVAL(Variant()), DEFVAL(Variant()), DEFVAL(Variant()), DEFVAL(Variant()), DEFVAL(Variant()) );
  181. ObjectTypeDB::bind_method(_MD("follow_property","object","property","initial_val","target","target_property","times_in_sec","trans_type","ease_type","delay"),&Tween::follow_property, DEFVAL(0) );
  182. ObjectTypeDB::bind_method(_MD("follow_method","object","method","initial_val","target","target_method","times_in_sec","trans_type","ease_type","delay"),&Tween::follow_method, DEFVAL(0) );
  183. ObjectTypeDB::bind_method(_MD("targeting_property","object","property","initial","initial_val","final_val","times_in_sec","trans_type","ease_type","delay"),&Tween::targeting_property, DEFVAL(0) );
  184. ObjectTypeDB::bind_method(_MD("targeting_method","object","method","initial","initial_method","final_val","times_in_sec","trans_type","ease_type","delay"),&Tween::targeting_method, DEFVAL(0) );
  185. ADD_SIGNAL( MethodInfo("tween_start", PropertyInfo( Variant::OBJECT,"object"), PropertyInfo( Variant::STRING,"key")) );
  186. ADD_SIGNAL( MethodInfo("tween_step", PropertyInfo( Variant::OBJECT,"object"), PropertyInfo( Variant::STRING,"key"), PropertyInfo( Variant::REAL,"elapsed"), PropertyInfo( Variant::OBJECT,"value")) );
  187. ADD_SIGNAL( MethodInfo("tween_complete", PropertyInfo( Variant::OBJECT,"object"), PropertyInfo( Variant::STRING,"key")) );
  188. ADD_PROPERTY( PropertyInfo( Variant::INT, "playback/process_mode", PROPERTY_HINT_ENUM, "Fixed,Idle"), _SCS("set_tween_process_mode"), _SCS("get_tween_process_mode"));
  189. BIND_CONSTANT(TWEEN_PROCESS_FIXED);
  190. BIND_CONSTANT(TWEEN_PROCESS_IDLE);
  191. BIND_CONSTANT(TRANS_LINEAR);
  192. BIND_CONSTANT(TRANS_SINE);
  193. BIND_CONSTANT(TRANS_QUINT);
  194. BIND_CONSTANT(TRANS_QUART);
  195. BIND_CONSTANT(TRANS_QUAD);
  196. BIND_CONSTANT(TRANS_EXPO);
  197. BIND_CONSTANT(TRANS_ELASTIC);
  198. BIND_CONSTANT(TRANS_CUBIC);
  199. BIND_CONSTANT(TRANS_CIRC);
  200. BIND_CONSTANT(TRANS_BOUNCE);
  201. BIND_CONSTANT(TRANS_BACK);
  202. BIND_CONSTANT(EASE_IN);
  203. BIND_CONSTANT(EASE_OUT);
  204. BIND_CONSTANT(EASE_IN_OUT);
  205. BIND_CONSTANT(EASE_OUT_IN);
  206. }
  207. Variant& Tween::_get_initial_val(InterpolateData& p_data) {
  208. switch(p_data.type) {
  209. case INTER_PROPERTY:
  210. case INTER_METHOD:
  211. case FOLLOW_PROPERTY:
  212. case FOLLOW_METHOD:
  213. return p_data.initial_val;
  214. case TARGETING_PROPERTY:
  215. case TARGETING_METHOD: {
  216. Object *object = ObjectDB::get_instance(p_data.target_id);
  217. ERR_FAIL_COND_V(object == NULL,p_data.initial_val);
  218. static Variant initial_val;
  219. if(p_data.type == TARGETING_PROPERTY) {
  220. bool valid = false;
  221. initial_val = object->get(p_data.target_key, &valid);
  222. ERR_FAIL_COND_V(!valid,p_data.initial_val);
  223. } else {
  224. Variant::CallError error;
  225. initial_val = object->call(p_data.target_key, NULL, 0, error);
  226. ERR_FAIL_COND_V(error.error != Variant::CallError::CALL_OK,p_data.initial_val);
  227. }
  228. return initial_val;
  229. }
  230. break;
  231. }
  232. return p_data.delta_val;
  233. }
  234. Variant& Tween::_get_delta_val(InterpolateData& p_data) {
  235. switch(p_data.type) {
  236. case INTER_PROPERTY:
  237. case INTER_METHOD:
  238. return p_data.delta_val;
  239. case FOLLOW_PROPERTY:
  240. case FOLLOW_METHOD: {
  241. Object *target = ObjectDB::get_instance(p_data.target_id);
  242. ERR_FAIL_COND_V(target == NULL,p_data.initial_val);
  243. Variant final_val;
  244. if(p_data.type == FOLLOW_PROPERTY) {
  245. bool valid = false;
  246. final_val = target->get(p_data.target_key, &valid);
  247. ERR_FAIL_COND_V(!valid,p_data.initial_val);
  248. } else {
  249. Variant::CallError error;
  250. final_val = target->call(p_data.target_key, NULL, 0, error);
  251. ERR_FAIL_COND_V(error.error != Variant::CallError::CALL_OK,p_data.initial_val);
  252. }
  253. // convert INT to REAL is better for interpolaters
  254. if(final_val.get_type() == Variant::INT) final_val = final_val.operator real_t();
  255. _calc_delta_val(p_data.initial_val, final_val, p_data.delta_val);
  256. return p_data.delta_val;
  257. }
  258. break;
  259. case TARGETING_PROPERTY:
  260. case TARGETING_METHOD: {
  261. Variant initial_val = _get_initial_val(p_data);
  262. // convert INT to REAL is better for interpolaters
  263. if(initial_val.get_type() == Variant::INT) initial_val = initial_val.operator real_t();
  264. //_calc_delta_val(p_data.initial_val, p_data.final_val, p_data.delta_val);
  265. _calc_delta_val(initial_val, p_data.final_val, p_data.delta_val);
  266. return p_data.delta_val;
  267. }
  268. break;
  269. }
  270. return p_data.initial_val;
  271. }
  272. Variant Tween::_run_equation(InterpolateData& p_data) {
  273. Variant& initial_val = _get_initial_val(p_data);
  274. Variant& delta_val = _get_delta_val(p_data);
  275. Variant result;
  276. #define APPLY_EQUATION(element)\
  277. r.element = _run_equation(p_data.trans_type, p_data.ease_type, p_data.elapsed - p_data.delay, i.element, d.element, p_data.times_in_sec);
  278. switch(initial_val.get_type())
  279. {
  280. case Variant::BOOL:
  281. result = ( _run_equation(p_data.trans_type, p_data.ease_type, p_data.elapsed - p_data.delay, initial_val, delta_val, p_data.times_in_sec)) >= 0.5;
  282. break;
  283. case Variant::INT:
  284. result = (int) _run_equation(p_data.trans_type, p_data.ease_type, p_data.elapsed - p_data.delay, (int) initial_val, (int) delta_val, p_data.times_in_sec);
  285. break;
  286. case Variant::REAL:
  287. result = _run_equation(p_data.trans_type, p_data.ease_type, p_data.elapsed - p_data.delay, (real_t) initial_val, (real_t) delta_val, p_data.times_in_sec);
  288. break;
  289. case Variant::VECTOR2:
  290. {
  291. Vector2 i = initial_val;
  292. Vector2 d = delta_val;
  293. Vector2 r;
  294. APPLY_EQUATION(x);
  295. APPLY_EQUATION(y);
  296. result = r;
  297. }
  298. break;
  299. case Variant::VECTOR3:
  300. {
  301. Vector3 i = initial_val;
  302. Vector3 d = delta_val;
  303. Vector3 r;
  304. APPLY_EQUATION(x);
  305. APPLY_EQUATION(y);
  306. APPLY_EQUATION(z);
  307. result = r;
  308. }
  309. break;
  310. case Variant::MATRIX3:
  311. {
  312. Matrix3 i = initial_val;
  313. Matrix3 d = delta_val;
  314. Matrix3 r;
  315. APPLY_EQUATION(elements[0][0]);
  316. APPLY_EQUATION(elements[0][1]);
  317. APPLY_EQUATION(elements[0][2]);
  318. APPLY_EQUATION(elements[1][0]);
  319. APPLY_EQUATION(elements[1][1]);
  320. APPLY_EQUATION(elements[1][2]);
  321. APPLY_EQUATION(elements[2][0]);
  322. APPLY_EQUATION(elements[2][1]);
  323. APPLY_EQUATION(elements[2][2]);
  324. result = r;
  325. }
  326. break;
  327. case Variant::MATRIX32:
  328. {
  329. Matrix3 i = initial_val;
  330. Matrix3 d = delta_val;
  331. Matrix3 r;
  332. APPLY_EQUATION(elements[0][0]);
  333. APPLY_EQUATION(elements[0][1]);
  334. APPLY_EQUATION(elements[1][0]);
  335. APPLY_EQUATION(elements[1][1]);
  336. APPLY_EQUATION(elements[2][0]);
  337. APPLY_EQUATION(elements[2][1]);
  338. result = r;
  339. }
  340. break;
  341. case Variant::QUAT:
  342. {
  343. Quat i = initial_val;
  344. Quat d = delta_val;
  345. Quat r;
  346. APPLY_EQUATION(x);
  347. APPLY_EQUATION(y);
  348. APPLY_EQUATION(z);
  349. APPLY_EQUATION(w);
  350. result = r;
  351. }
  352. break;
  353. case Variant::_AABB:
  354. {
  355. AABB i = initial_val;
  356. AABB d = delta_val;
  357. AABB r;
  358. APPLY_EQUATION(pos.x);
  359. APPLY_EQUATION(pos.y);
  360. APPLY_EQUATION(pos.z);
  361. APPLY_EQUATION(size.x);
  362. APPLY_EQUATION(size.y);
  363. APPLY_EQUATION(size.z);
  364. result = r;
  365. }
  366. break;
  367. case Variant::TRANSFORM:
  368. {
  369. Transform i = initial_val;
  370. Transform d = delta_val;
  371. Transform r;
  372. APPLY_EQUATION(basis.elements[0][0]);
  373. APPLY_EQUATION(basis.elements[0][1]);
  374. APPLY_EQUATION(basis.elements[0][2]);
  375. APPLY_EQUATION(basis.elements[1][0]);
  376. APPLY_EQUATION(basis.elements[1][1]);
  377. APPLY_EQUATION(basis.elements[1][2]);
  378. APPLY_EQUATION(basis.elements[2][0]);
  379. APPLY_EQUATION(basis.elements[2][1]);
  380. APPLY_EQUATION(basis.elements[2][2]);
  381. APPLY_EQUATION(origin.x);
  382. APPLY_EQUATION(origin.y);
  383. APPLY_EQUATION(origin.z);
  384. result = r;
  385. }
  386. break;
  387. case Variant::COLOR:
  388. {
  389. Color i = initial_val;
  390. Color d = delta_val;
  391. Color r;
  392. APPLY_EQUATION(r);
  393. APPLY_EQUATION(g);
  394. APPLY_EQUATION(b);
  395. APPLY_EQUATION(a);
  396. result = r;
  397. }
  398. break;
  399. };
  400. #undef APPLY_EQUATION
  401. return result;
  402. }
  403. bool Tween::_apply_tween_value(InterpolateData& p_data, Variant& value) {
  404. Object *object = ObjectDB::get_instance(p_data.id);
  405. ERR_FAIL_COND_V(object == NULL, false);
  406. switch(p_data.type) {
  407. case INTER_PROPERTY:
  408. case FOLLOW_PROPERTY:
  409. case TARGETING_PROPERTY:
  410. {
  411. bool valid = false;
  412. object->set(p_data.key,value, &valid);
  413. return valid;
  414. }
  415. case INTER_METHOD:
  416. case FOLLOW_METHOD:
  417. case TARGETING_METHOD:
  418. {
  419. Variant::CallError error;
  420. if (value.get_type() != Variant::NIL) {
  421. Variant *arg[1] = { &value };
  422. object->call(p_data.key, (const Variant **) arg, 1, error);
  423. } else {
  424. object->call(p_data.key, NULL, 0, error);
  425. }
  426. if(error.error == Variant::CallError::CALL_OK)
  427. return true;
  428. return false;
  429. }
  430. case INTER_CALLBACK:
  431. break;
  432. };
  433. return true;
  434. }
  435. void Tween::_tween_process(float p_delta) {
  436. _process_pending_commands();
  437. if (speed_scale == 0)
  438. return;
  439. p_delta *= speed_scale;
  440. pending_update ++;
  441. // if repeat and all interpolates was finished then reset all interpolates
  442. if(repeat) {
  443. bool all_finished = true;
  444. for(List<InterpolateData>::Element *E=interpolates.front();E;E=E->next()) {
  445. InterpolateData& data = E->get();
  446. if(!data.finish) {
  447. all_finished = false;
  448. break;
  449. }
  450. }
  451. if(all_finished)
  452. reset_all();
  453. }
  454. for(List<InterpolateData>::Element *E=interpolates.front();E;E=E->next()) {
  455. InterpolateData& data = E->get();
  456. if(!data.active || data.finish)
  457. continue;
  458. Object *object = ObjectDB::get_instance(data.id);
  459. if(object == NULL)
  460. continue;
  461. bool prev_delaying = data.elapsed <= data.delay;
  462. data.elapsed += p_delta;
  463. if(data.elapsed < data.delay)
  464. continue;
  465. else if(prev_delaying) {
  466. emit_signal("tween_start",object,data.key);
  467. _apply_tween_value(data, data.initial_val);
  468. }
  469. if(data.elapsed > (data.delay + data.times_in_sec)) {
  470. data.elapsed = data.delay + data.times_in_sec;
  471. data.finish = true;
  472. }
  473. switch(data.type)
  474. {
  475. case INTER_PROPERTY:
  476. case INTER_METHOD:
  477. break;
  478. case INTER_CALLBACK:
  479. if(data.finish) {
  480. Variant::CallError error;
  481. if (data.call_deferred) {
  482. switch (data.args) {
  483. case 0:
  484. object->call_deferred(data.key); break;
  485. case 1:
  486. object->call_deferred(data.key, data.arg[0]); break;
  487. case 2:
  488. object->call_deferred(data.key, data.arg[0], data.arg[1]); break;
  489. case 3:
  490. object->call_deferred(data.key, data.arg[0], data.arg[1], data.arg[2]); break;
  491. case 4:
  492. object->call_deferred(data.key, data.arg[0], data.arg[1], data.arg[2], data.arg[3]); break;
  493. case 5:
  494. object->call_deferred(data.key, data.arg[0], data.arg[1], data.arg[2], data.arg[3], data.arg[4]); break;
  495. }
  496. }
  497. else {
  498. Variant *arg[5] = {
  499. &data.arg[0],
  500. &data.arg[1],
  501. &data.arg[2],
  502. &data.arg[3],
  503. &data.arg[4],
  504. };
  505. object->call(data.key, (const Variant **) arg, data.args, error);
  506. }
  507. if (!repeat)
  508. call_deferred("remove", object, data.key);
  509. }
  510. continue;
  511. }
  512. Variant result = _run_equation(data);
  513. emit_signal("tween_step",object,data.key,data.elapsed,result);
  514. _apply_tween_value(data, result);
  515. if (data.finish) {
  516. emit_signal("tween_complete",object,data.key);
  517. // not repeat mode, remove completed action
  518. if (!repeat)
  519. call_deferred("remove", object, data.key);
  520. }
  521. }
  522. pending_update --;
  523. }
  524. void Tween::set_tween_process_mode(TweenProcessMode p_mode) {
  525. if (tween_process_mode==p_mode)
  526. return;
  527. bool pr = processing;
  528. if (pr)
  529. _set_process(false);
  530. tween_process_mode=p_mode;
  531. if (pr)
  532. _set_process(true);
  533. }
  534. Tween::TweenProcessMode Tween::get_tween_process_mode() const {
  535. return tween_process_mode;
  536. }
  537. void Tween::_set_process(bool p_process,bool p_force) {
  538. if (processing==p_process && !p_force)
  539. return;
  540. switch(tween_process_mode) {
  541. case TWEEN_PROCESS_FIXED: set_fixed_process(p_process && active); break;
  542. case TWEEN_PROCESS_IDLE: set_process(p_process && active); break;
  543. }
  544. processing=p_process;
  545. }
  546. bool Tween::is_active() const {
  547. return active;
  548. }
  549. void Tween::set_active(bool p_active) {
  550. if (active==p_active)
  551. return;
  552. active=p_active;
  553. _set_process(processing,true);
  554. }
  555. bool Tween::is_repeat() const {
  556. return repeat;
  557. }
  558. void Tween::set_repeat(bool p_repeat) {
  559. repeat = p_repeat;
  560. }
  561. void Tween::set_speed(float p_speed) {
  562. speed_scale=p_speed;
  563. }
  564. float Tween::get_speed() const {
  565. return speed_scale;
  566. }
  567. bool Tween::start() {
  568. set_active(true);
  569. _set_process(true);
  570. return true;
  571. }
  572. bool Tween::reset(Object *p_object, String p_key) {
  573. pending_update ++;
  574. for(List<InterpolateData>::Element *E=interpolates.front();E;E=E->next()) {
  575. InterpolateData& data = E->get();
  576. Object *object = ObjectDB::get_instance(data.id);
  577. if(object == NULL)
  578. continue;
  579. if(object == p_object && (data.key == p_key || p_key == "")) {
  580. data.elapsed = 0;
  581. data.finish = false;
  582. if(data.delay == 0)
  583. _apply_tween_value(data, data.initial_val);
  584. }
  585. }
  586. pending_update --;
  587. return true;
  588. }
  589. bool Tween::reset_all() {
  590. pending_update ++;
  591. for(List<InterpolateData>::Element *E=interpolates.front();E;E=E->next()) {
  592. InterpolateData& data = E->get();
  593. data.elapsed = 0;
  594. data.finish = false;
  595. if(data.delay == 0)
  596. _apply_tween_value(data, data.initial_val);
  597. }
  598. pending_update --;
  599. return true;
  600. }
  601. bool Tween::stop(Object *p_object, String p_key) {
  602. pending_update ++;
  603. for(List<InterpolateData>::Element *E=interpolates.front();E;E=E->next()) {
  604. InterpolateData& data = E->get();
  605. Object *object = ObjectDB::get_instance(data.id);
  606. if(object == NULL)
  607. continue;
  608. if(object == p_object && (data.key == p_key || p_key == ""))
  609. data.active = false;
  610. }
  611. pending_update --;
  612. return true;
  613. }
  614. bool Tween::stop_all() {
  615. set_active(false);
  616. _set_process(false);
  617. pending_update ++;
  618. for(List<InterpolateData>::Element *E=interpolates.front();E;E=E->next()) {
  619. InterpolateData& data = E->get();
  620. data.active = false;
  621. }
  622. pending_update --;
  623. return true;
  624. }
  625. bool Tween::resume(Object *p_object, String p_key) {
  626. set_active(true);
  627. _set_process(true);
  628. pending_update ++;
  629. for(List<InterpolateData>::Element *E=interpolates.front();E;E=E->next()) {
  630. InterpolateData& data = E->get();
  631. Object *object = ObjectDB::get_instance(data.id);
  632. if(object == NULL)
  633. continue;
  634. if(object == p_object && (data.key == p_key || p_key == ""))
  635. data.active = true;
  636. }
  637. pending_update --;
  638. return true;
  639. }
  640. bool Tween::resume_all() {
  641. set_active(true);
  642. _set_process(true);
  643. pending_update ++;
  644. for(List<InterpolateData>::Element *E=interpolates.front();E;E=E->next()) {
  645. InterpolateData& data = E->get();
  646. data.active = true;
  647. }
  648. pending_update --;
  649. return true;
  650. }
  651. bool Tween::remove(Object *p_object, String p_key) {
  652. if(pending_update != 0) {
  653. call_deferred("remove", p_object, p_key);
  654. return true;
  655. }
  656. List<List<InterpolateData>::Element *> for_removal;
  657. for(List<InterpolateData>::Element *E=interpolates.front();E;E=E->next()) {
  658. InterpolateData& data = E->get();
  659. Object *object = ObjectDB::get_instance(data.id);
  660. if(object == NULL)
  661. continue;
  662. if(object == p_object && (data.key == p_key || p_key == "")) {
  663. for_removal.push_back(E);
  664. }
  665. }
  666. for(List<List<InterpolateData>::Element *>::Element *E=for_removal.front();E;E=E->next()) {
  667. interpolates.erase(E->get());
  668. }
  669. return true;
  670. }
  671. bool Tween::remove_all() {
  672. if(pending_update != 0) {
  673. call_deferred("remove_all");
  674. return true;
  675. }
  676. set_active(false);
  677. _set_process(false);
  678. interpolates.clear();
  679. return true;
  680. }
  681. bool Tween::seek(real_t p_time) {
  682. pending_update ++;
  683. for(List<InterpolateData>::Element *E=interpolates.front();E;E=E->next()) {
  684. InterpolateData& data = E->get();
  685. data.elapsed = p_time;
  686. if(data.elapsed < data.delay) {
  687. data.finish = false;
  688. continue;
  689. }
  690. else if(data.elapsed >= (data.delay + data.times_in_sec)) {
  691. data.finish = true;
  692. data.elapsed = (data.delay + data.times_in_sec);
  693. } else
  694. data.finish = false;
  695. switch(data.type)
  696. {
  697. case INTER_PROPERTY:
  698. case INTER_METHOD:
  699. break;
  700. case INTER_CALLBACK:
  701. continue;
  702. }
  703. Variant result = _run_equation(data);
  704. _apply_tween_value(data, result);
  705. }
  706. pending_update --;
  707. return true;
  708. }
  709. real_t Tween::tell() const {
  710. pending_update ++;
  711. real_t pos = 0;
  712. for(const List<InterpolateData>::Element *E=interpolates.front();E;E=E->next()) {
  713. const InterpolateData& data = E->get();
  714. if(data.elapsed > pos)
  715. pos = data.elapsed;
  716. }
  717. pending_update --;
  718. return pos;
  719. }
  720. real_t Tween::get_runtime() const {
  721. pending_update ++;
  722. real_t runtime = 0;
  723. for(const List<InterpolateData>::Element *E=interpolates.front();E;E=E->next()) {
  724. const InterpolateData& data = E->get();
  725. real_t t = data.delay + data.times_in_sec;
  726. if(t > runtime)
  727. runtime = t;
  728. }
  729. pending_update --;
  730. return runtime;
  731. }
  732. bool Tween::_calc_delta_val(const Variant& p_initial_val, const Variant& p_final_val, Variant& p_delta_val) {
  733. const Variant& initial_val = p_initial_val;
  734. const Variant& final_val = p_final_val;
  735. Variant& delta_val = p_delta_val;
  736. switch(initial_val.get_type()) {
  737. case Variant::BOOL:
  738. //delta_val = p_final_val;
  739. delta_val = (int) p_final_val - (int) p_initial_val;
  740. break;
  741. case Variant::INT:
  742. delta_val = (int) final_val - (int) initial_val;
  743. break;
  744. case Variant::REAL:
  745. delta_val = (real_t) final_val - (real_t) initial_val;
  746. break;
  747. case Variant::VECTOR2:
  748. delta_val = final_val.operator Vector2() - initial_val.operator Vector2();
  749. break;
  750. case Variant::VECTOR3:
  751. delta_val = final_val.operator Vector3() - initial_val.operator Vector3();
  752. break;
  753. case Variant::MATRIX3:
  754. {
  755. Matrix3 i = initial_val;
  756. Matrix3 f = final_val;
  757. delta_val = Matrix3(f.elements[0][0] - i.elements[0][0],
  758. f.elements[0][1] - i.elements[0][1],
  759. f.elements[0][2] - i.elements[0][2],
  760. f.elements[1][0] - i.elements[1][0],
  761. f.elements[1][1] - i.elements[1][1],
  762. f.elements[1][2] - i.elements[1][2],
  763. f.elements[2][0] - i.elements[2][0],
  764. f.elements[2][1] - i.elements[2][1],
  765. f.elements[2][2] - i.elements[2][2]
  766. );
  767. }
  768. break;
  769. case Variant::MATRIX32:
  770. {
  771. Matrix32 i = initial_val;
  772. Matrix32 f = final_val;
  773. Matrix32 d = Matrix32();
  774. d[0][0] = f.elements[0][0] - i.elements[0][0];
  775. d[0][1] = f.elements[0][1] - i.elements[0][1];
  776. d[1][0] = f.elements[1][0] - i.elements[1][0];
  777. d[1][1] = f.elements[1][1] - i.elements[1][1];
  778. d[2][0] = f.elements[2][0] - i.elements[2][0];
  779. d[2][1] = f.elements[2][1] - i.elements[2][1];
  780. delta_val = d;
  781. }
  782. break;
  783. case Variant::QUAT:
  784. delta_val = final_val.operator Quat() - initial_val.operator Quat();
  785. break;
  786. case Variant::_AABB:
  787. {
  788. AABB i = initial_val;
  789. AABB f = final_val;
  790. delta_val = AABB(f.pos - i.pos, f.size - i.size);
  791. }
  792. break;
  793. case Variant::TRANSFORM:
  794. {
  795. Transform i = initial_val;
  796. Transform f = final_val;
  797. Transform d;
  798. d.set(f.basis.elements[0][0] - i.basis.elements[0][0],
  799. f.basis.elements[0][1] - i.basis.elements[0][1],
  800. f.basis.elements[0][2] - i.basis.elements[0][2],
  801. f.basis.elements[1][0] - i.basis.elements[1][0],
  802. f.basis.elements[1][1] - i.basis.elements[1][1],
  803. f.basis.elements[1][2] - i.basis.elements[1][2],
  804. f.basis.elements[2][0] - i.basis.elements[2][0],
  805. f.basis.elements[2][1] - i.basis.elements[2][1],
  806. f.basis.elements[2][2] - i.basis.elements[2][2],
  807. f.origin.x - i.origin.x,
  808. f.origin.y - i.origin.y,
  809. f.origin.z - i.origin.z
  810. );
  811. delta_val = d;
  812. }
  813. break;
  814. case Variant::COLOR:
  815. {
  816. Color i = initial_val;
  817. Color f = final_val;
  818. delta_val = Color(f.r - i.r, f.g - i.g, f.b - i.b, f.a - i.a);
  819. }
  820. break;
  821. default:
  822. ERR_PRINT("Invalid param type, except(int/real/vector2/vector/matrix/matrix32/quat/aabb/transform/color)");
  823. return false;
  824. };
  825. return true;
  826. }
  827. bool Tween::interpolate_property(Object *p_object
  828. , String p_property
  829. , Variant p_initial_val
  830. , Variant p_final_val
  831. , real_t p_times_in_sec
  832. , TransitionType p_trans_type
  833. , EaseType p_ease_type
  834. , real_t p_delay
  835. ) {
  836. if(pending_update != 0) {
  837. _add_pending_command("interpolate_property"
  838. , p_object
  839. , p_property
  840. , p_initial_val
  841. , p_final_val
  842. , p_times_in_sec
  843. , p_trans_type
  844. , p_ease_type
  845. , p_delay
  846. );
  847. return true;
  848. }
  849. // convert INT to REAL is better for interpolaters
  850. if(p_initial_val.get_type() == Variant::INT) p_initial_val = p_initial_val.operator real_t();
  851. if(p_final_val.get_type() == Variant::INT) p_final_val = p_final_val.operator real_t();
  852. ERR_FAIL_COND_V(p_object == NULL, false);
  853. ERR_FAIL_COND_V(!ObjectDB::instance_validate(p_object), false);
  854. ERR_FAIL_COND_V(p_initial_val.get_type() != p_final_val.get_type(), false);
  855. ERR_FAIL_COND_V(p_times_in_sec <= 0, false);
  856. ERR_FAIL_COND_V(p_trans_type < 0 || p_trans_type >= TRANS_COUNT, false);
  857. ERR_FAIL_COND_V(p_ease_type < 0 || p_ease_type >= EASE_COUNT, false);
  858. ERR_FAIL_COND_V(p_delay < 0, false);
  859. bool prop_valid = false;
  860. p_object->get(p_property,&prop_valid);
  861. ERR_FAIL_COND_V(!prop_valid, false);
  862. InterpolateData data;
  863. data.active = true;
  864. data.type = INTER_PROPERTY;
  865. data.finish = false;
  866. data.elapsed = 0;
  867. data.id = p_object->get_instance_ID();
  868. data.key = p_property;
  869. data.initial_val = p_initial_val;
  870. data.final_val = p_final_val;
  871. data.times_in_sec = p_times_in_sec;
  872. data.trans_type = p_trans_type;
  873. data.ease_type = p_ease_type;
  874. data.delay = p_delay;
  875. if(!_calc_delta_val(data.initial_val, data.final_val, data.delta_val))
  876. return false;
  877. interpolates.push_back(data);
  878. return true;
  879. }
  880. bool Tween::interpolate_method(Object *p_object
  881. , String p_method
  882. , Variant p_initial_val
  883. , Variant p_final_val
  884. , real_t p_times_in_sec
  885. , TransitionType p_trans_type
  886. , EaseType p_ease_type
  887. , real_t p_delay
  888. ) {
  889. if(pending_update != 0) {
  890. _add_pending_command("interpolate_method"
  891. , p_object
  892. , p_method
  893. , p_initial_val
  894. , p_final_val
  895. , p_times_in_sec
  896. , p_trans_type
  897. , p_ease_type
  898. , p_delay
  899. );
  900. return true;
  901. }
  902. // convert INT to REAL is better for interpolaters
  903. if(p_initial_val.get_type() == Variant::INT) p_initial_val = p_initial_val.operator real_t();
  904. if(p_final_val.get_type() == Variant::INT) p_final_val = p_final_val.operator real_t();
  905. ERR_FAIL_COND_V(p_object == NULL, false);
  906. ERR_FAIL_COND_V(!ObjectDB::instance_validate(p_object), false);
  907. ERR_FAIL_COND_V(p_initial_val.get_type() != p_final_val.get_type(), false);
  908. ERR_FAIL_COND_V(p_times_in_sec <= 0, false);
  909. ERR_FAIL_COND_V(p_trans_type < 0 || p_trans_type >= TRANS_COUNT, false);
  910. ERR_FAIL_COND_V(p_ease_type < 0 || p_ease_type >= EASE_COUNT, false);
  911. ERR_FAIL_COND_V(p_delay < 0, false);
  912. ERR_EXPLAIN("Object has no method named: %s" + p_method);
  913. ERR_FAIL_COND_V(!p_object->has_method(p_method), false);
  914. InterpolateData data;
  915. data.active = true;
  916. data.type = INTER_METHOD;
  917. data.finish = false;
  918. data.elapsed = 0;
  919. data.id = p_object->get_instance_ID();
  920. data.key = p_method;
  921. data.initial_val = p_initial_val;
  922. data.final_val = p_final_val;
  923. data.times_in_sec = p_times_in_sec;
  924. data.trans_type = p_trans_type;
  925. data.ease_type = p_ease_type;
  926. data.delay = p_delay;
  927. if(!_calc_delta_val(data.initial_val, data.final_val, data.delta_val))
  928. return false;
  929. interpolates.push_back(data);
  930. return true;
  931. }
  932. bool Tween::interpolate_callback(Object *p_object
  933. , real_t p_times_in_sec
  934. , String p_callback
  935. , VARIANT_ARG_DECLARE
  936. ) {
  937. if(pending_update != 0) {
  938. _add_pending_command("interpolate_callback"
  939. , p_object
  940. , p_times_in_sec
  941. , p_callback
  942. , p_arg1
  943. , p_arg2
  944. , p_arg3
  945. , p_arg4
  946. , p_arg5
  947. );
  948. return true;
  949. }
  950. ERR_FAIL_COND_V(p_object == NULL, false);
  951. ERR_FAIL_COND_V(!ObjectDB::instance_validate(p_object), false);
  952. ERR_FAIL_COND_V(p_times_in_sec < 0, false);
  953. ERR_EXPLAIN("Object has no callback named: %s" + p_callback);
  954. ERR_FAIL_COND_V(!p_object->has_method(p_callback), false);
  955. InterpolateData data;
  956. data.active = true;
  957. data.type = INTER_CALLBACK;
  958. data.finish = false;
  959. data.call_deferred = false;
  960. data.elapsed = 0;
  961. data.id = p_object->get_instance_ID();
  962. data.key = p_callback;
  963. data.times_in_sec = p_times_in_sec;
  964. data.delay = 0;
  965. int args=0;
  966. if (p_arg5.get_type()!=Variant::NIL)
  967. args=5;
  968. else if (p_arg4.get_type()!=Variant::NIL)
  969. args=4;
  970. else if (p_arg3.get_type()!=Variant::NIL)
  971. args=3;
  972. else if (p_arg2.get_type()!=Variant::NIL)
  973. args=2;
  974. else if (p_arg1.get_type()!=Variant::NIL)
  975. args=1;
  976. else
  977. args=0;
  978. data.args = args;
  979. data.arg[0] = p_arg1;
  980. data.arg[1] = p_arg2;
  981. data.arg[2] = p_arg3;
  982. data.arg[3] = p_arg4;
  983. data.arg[4] = p_arg5;
  984. pending_update ++;
  985. interpolates.push_back(data);
  986. pending_update --;
  987. return true;
  988. }
  989. bool Tween::interpolate_deferred_callback(Object *p_object
  990. , real_t p_times_in_sec
  991. , String p_callback
  992. , VARIANT_ARG_DECLARE
  993. ) {
  994. if(pending_update != 0) {
  995. _add_pending_command("interpolate_deferred_callback"
  996. , p_object
  997. , p_times_in_sec
  998. , p_callback
  999. , p_arg1
  1000. , p_arg2
  1001. , p_arg3
  1002. , p_arg4
  1003. , p_arg5
  1004. );
  1005. return true;
  1006. }
  1007. ERR_FAIL_COND_V(p_object == NULL, false);
  1008. ERR_FAIL_COND_V(!ObjectDB::instance_validate(p_object), false);
  1009. ERR_FAIL_COND_V(p_times_in_sec < 0, false);
  1010. ERR_EXPLAIN("Object has no callback named: %s" + p_callback);
  1011. ERR_FAIL_COND_V(!p_object->has_method(p_callback), false);
  1012. InterpolateData data;
  1013. data.active = true;
  1014. data.type = INTER_CALLBACK;
  1015. data.finish = false;
  1016. data.call_deferred = true;
  1017. data.elapsed = 0;
  1018. data.id = p_object->get_instance_ID();
  1019. data.key = p_callback;
  1020. data.times_in_sec = p_times_in_sec;
  1021. data.delay = 0;
  1022. int args=0;
  1023. if (p_arg5.get_type()!=Variant::NIL)
  1024. args=5;
  1025. else if (p_arg4.get_type()!=Variant::NIL)
  1026. args=4;
  1027. else if (p_arg3.get_type()!=Variant::NIL)
  1028. args=3;
  1029. else if (p_arg2.get_type()!=Variant::NIL)
  1030. args=2;
  1031. else if (p_arg1.get_type()!=Variant::NIL)
  1032. args=1;
  1033. else
  1034. args=0;
  1035. data.args = args;
  1036. data.arg[0] = p_arg1;
  1037. data.arg[1] = p_arg2;
  1038. data.arg[2] = p_arg3;
  1039. data.arg[3] = p_arg4;
  1040. data.arg[4] = p_arg5;
  1041. pending_update ++;
  1042. interpolates.push_back(data);
  1043. pending_update --;
  1044. return true;
  1045. }
  1046. bool Tween::follow_property(Object *p_object
  1047. , String p_property
  1048. , Variant p_initial_val
  1049. , Object *p_target
  1050. , String p_target_property
  1051. , real_t p_times_in_sec
  1052. , TransitionType p_trans_type
  1053. , EaseType p_ease_type
  1054. , real_t p_delay
  1055. ) {
  1056. if(pending_update != 0) {
  1057. _add_pending_command("follow_property"
  1058. , p_object
  1059. , p_property
  1060. , p_initial_val
  1061. , p_target
  1062. , p_target_property
  1063. , p_times_in_sec
  1064. , p_trans_type
  1065. , p_ease_type
  1066. , p_delay
  1067. );
  1068. return true;
  1069. }
  1070. // convert INT to REAL is better for interpolaters
  1071. if(p_initial_val.get_type() == Variant::INT) p_initial_val = p_initial_val.operator real_t();
  1072. ERR_FAIL_COND_V(p_object == NULL, false);
  1073. ERR_FAIL_COND_V(!ObjectDB::instance_validate(p_object), false);
  1074. ERR_FAIL_COND_V(p_target == NULL, false);
  1075. ERR_FAIL_COND_V(!ObjectDB::instance_validate(p_target), false);
  1076. ERR_FAIL_COND_V(p_times_in_sec <= 0, false);
  1077. ERR_FAIL_COND_V(p_trans_type < 0 || p_trans_type >= TRANS_COUNT, false);
  1078. ERR_FAIL_COND_V(p_ease_type < 0 || p_ease_type >= EASE_COUNT, false);
  1079. ERR_FAIL_COND_V(p_delay < 0, false);
  1080. bool prop_valid = false;
  1081. p_object->get(p_property,&prop_valid);
  1082. ERR_FAIL_COND_V(!prop_valid, false);
  1083. bool target_prop_valid = false;
  1084. Variant target_val = p_target->get(p_target_property,&target_prop_valid);
  1085. ERR_FAIL_COND_V(!target_prop_valid, false);
  1086. // convert INT to REAL is better for interpolaters
  1087. if(target_val.get_type() == Variant::INT) target_val = target_val.operator real_t();
  1088. ERR_FAIL_COND_V(target_val.get_type() != p_initial_val.get_type(), false);
  1089. InterpolateData data;
  1090. data.active = true;
  1091. data.type = FOLLOW_PROPERTY;
  1092. data.finish = false;
  1093. data.elapsed = 0;
  1094. data.id = p_object->get_instance_ID();
  1095. data.key = p_property;
  1096. data.initial_val = p_initial_val;
  1097. data.target_id = p_target->get_instance_ID();
  1098. data.target_key = p_target_property;
  1099. data.times_in_sec = p_times_in_sec;
  1100. data.trans_type = p_trans_type;
  1101. data.ease_type = p_ease_type;
  1102. data.delay = p_delay;
  1103. interpolates.push_back(data);
  1104. return true;
  1105. }
  1106. bool Tween::follow_method(Object *p_object
  1107. , String p_method
  1108. , Variant p_initial_val
  1109. , Object *p_target
  1110. , String p_target_method
  1111. , real_t p_times_in_sec
  1112. , TransitionType p_trans_type
  1113. , EaseType p_ease_type
  1114. , real_t p_delay
  1115. ) {
  1116. if(pending_update != 0) {
  1117. _add_pending_command("follow_method"
  1118. , p_object
  1119. , p_method
  1120. , p_initial_val
  1121. , p_target
  1122. , p_target_method
  1123. , p_times_in_sec
  1124. , p_trans_type
  1125. , p_ease_type
  1126. , p_delay
  1127. );
  1128. return true;
  1129. }
  1130. // convert INT to REAL is better for interpolaters
  1131. if(p_initial_val.get_type() == Variant::INT) p_initial_val = p_initial_val.operator real_t();
  1132. ERR_FAIL_COND_V(p_object == NULL, false);
  1133. ERR_FAIL_COND_V(!ObjectDB::instance_validate(p_object), false);
  1134. ERR_FAIL_COND_V(p_target == NULL, false);
  1135. ERR_FAIL_COND_V(!ObjectDB::instance_validate(p_target), false);
  1136. ERR_FAIL_COND_V(p_times_in_sec <= 0, false);
  1137. ERR_FAIL_COND_V(p_trans_type < 0 || p_trans_type >= TRANS_COUNT, false);
  1138. ERR_FAIL_COND_V(p_ease_type < 0 || p_ease_type >= EASE_COUNT, false);
  1139. ERR_FAIL_COND_V(p_delay < 0, false);
  1140. ERR_EXPLAIN("Object has no method named: %s" + p_method);
  1141. ERR_FAIL_COND_V(!p_object->has_method(p_method), false);
  1142. ERR_EXPLAIN("Target has no method named: %s" + p_target_method);
  1143. ERR_FAIL_COND_V(!p_target->has_method(p_target_method), false);
  1144. Variant::CallError error;
  1145. Variant target_val = p_target->call(p_target_method, NULL, 0, error);
  1146. ERR_FAIL_COND_V(error.error != Variant::CallError::CALL_OK, false);
  1147. // convert INT to REAL is better for interpolaters
  1148. if(target_val.get_type() == Variant::INT) target_val = target_val.operator real_t();
  1149. ERR_FAIL_COND_V(target_val.get_type() != p_initial_val.get_type(), false);
  1150. InterpolateData data;
  1151. data.active = true;
  1152. data.type = FOLLOW_METHOD;
  1153. data.finish = false;
  1154. data.elapsed = 0;
  1155. data.id = p_object->get_instance_ID();
  1156. data.key = p_method;
  1157. data.initial_val = p_initial_val;
  1158. data.target_id = p_target->get_instance_ID();
  1159. data.target_key = p_target_method;
  1160. data.times_in_sec = p_times_in_sec;
  1161. data.trans_type = p_trans_type;
  1162. data.ease_type = p_ease_type;
  1163. data.delay = p_delay;
  1164. interpolates.push_back(data);
  1165. return true;
  1166. }
  1167. bool Tween::targeting_property(Object *p_object
  1168. , String p_property
  1169. , Object *p_initial
  1170. , String p_initial_property
  1171. , Variant p_final_val
  1172. , real_t p_times_in_sec
  1173. , TransitionType p_trans_type
  1174. , EaseType p_ease_type
  1175. , real_t p_delay
  1176. ) {
  1177. if(pending_update != 0) {
  1178. _add_pending_command("targeting_property"
  1179. , p_object
  1180. , p_property
  1181. , p_initial
  1182. , p_initial_property
  1183. , p_final_val
  1184. , p_times_in_sec
  1185. , p_trans_type
  1186. , p_ease_type
  1187. , p_delay
  1188. );
  1189. return true;
  1190. }
  1191. // convert INT to REAL is better for interpolaters
  1192. if(p_final_val.get_type() == Variant::INT) p_final_val = p_final_val.operator real_t();
  1193. ERR_FAIL_COND_V(p_object == NULL, false);
  1194. ERR_FAIL_COND_V(!ObjectDB::instance_validate(p_object), false);
  1195. ERR_FAIL_COND_V(p_initial == NULL, false);
  1196. ERR_FAIL_COND_V(!ObjectDB::instance_validate(p_initial), false);
  1197. ERR_FAIL_COND_V(p_times_in_sec <= 0, false);
  1198. ERR_FAIL_COND_V(p_trans_type < 0 || p_trans_type >= TRANS_COUNT, false);
  1199. ERR_FAIL_COND_V(p_ease_type < 0 || p_ease_type >= EASE_COUNT, false);
  1200. ERR_FAIL_COND_V(p_delay < 0, false);
  1201. bool prop_valid = false;
  1202. p_object->get(p_property,&prop_valid);
  1203. ERR_FAIL_COND_V(!prop_valid, false);
  1204. bool initial_prop_valid = false;
  1205. Variant initial_val = p_initial->get(p_initial_property,&initial_prop_valid);
  1206. ERR_FAIL_COND_V(!initial_prop_valid, false);
  1207. // convert INT to REAL is better for interpolaters
  1208. if(initial_val.get_type() == Variant::INT) initial_val = initial_val.operator real_t();
  1209. ERR_FAIL_COND_V(initial_val.get_type() != p_final_val.get_type(), false);
  1210. InterpolateData data;
  1211. data.active = true;
  1212. data.type = TARGETING_PROPERTY;
  1213. data.finish = false;
  1214. data.elapsed = 0;
  1215. data.id = p_object->get_instance_ID();
  1216. data.key = p_property;
  1217. data.target_id = p_initial->get_instance_ID();
  1218. data.target_key = p_initial_property;
  1219. data.initial_val = initial_val;
  1220. data.final_val = p_final_val;
  1221. data.times_in_sec = p_times_in_sec;
  1222. data.trans_type = p_trans_type;
  1223. data.ease_type = p_ease_type;
  1224. data.delay = p_delay;
  1225. if(!_calc_delta_val(data.initial_val, data.final_val, data.delta_val))
  1226. return false;
  1227. interpolates.push_back(data);
  1228. return true;
  1229. }
  1230. bool Tween::targeting_method(Object *p_object
  1231. , String p_method
  1232. , Object *p_initial
  1233. , String p_initial_method
  1234. , Variant p_final_val
  1235. , real_t p_times_in_sec
  1236. , TransitionType p_trans_type
  1237. , EaseType p_ease_type
  1238. , real_t p_delay
  1239. ) {
  1240. if(pending_update != 0) {
  1241. _add_pending_command("targeting_method"
  1242. , p_object
  1243. , p_method
  1244. , p_initial
  1245. , p_initial_method
  1246. , p_final_val
  1247. , p_times_in_sec
  1248. , p_trans_type
  1249. , p_ease_type
  1250. , p_delay
  1251. );
  1252. return true;
  1253. }
  1254. // convert INT to REAL is better for interpolaters
  1255. if(p_final_val.get_type() == Variant::INT) p_final_val = p_final_val.operator real_t();
  1256. ERR_FAIL_COND_V(p_object == NULL, false);
  1257. ERR_FAIL_COND_V(!ObjectDB::instance_validate(p_object), false);
  1258. ERR_FAIL_COND_V(p_initial == NULL, false);
  1259. ERR_FAIL_COND_V(!ObjectDB::instance_validate(p_initial), false);
  1260. ERR_FAIL_COND_V(p_times_in_sec <= 0, false);
  1261. ERR_FAIL_COND_V(p_trans_type < 0 || p_trans_type >= TRANS_COUNT, false);
  1262. ERR_FAIL_COND_V(p_ease_type < 0 || p_ease_type >= EASE_COUNT, false);
  1263. ERR_FAIL_COND_V(p_delay < 0, false);
  1264. ERR_EXPLAIN("Object has no method named: %s" + p_method);
  1265. ERR_FAIL_COND_V(!p_object->has_method(p_method), false);
  1266. ERR_EXPLAIN("Initial Object has no method named: %s" + p_initial_method);
  1267. ERR_FAIL_COND_V(!p_initial->has_method(p_initial_method), false);
  1268. Variant::CallError error;
  1269. Variant initial_val = p_initial->call(p_initial_method, NULL, 0, error);
  1270. ERR_FAIL_COND_V(error.error != Variant::CallError::CALL_OK, false);
  1271. // convert INT to REAL is better for interpolaters
  1272. if(initial_val.get_type() == Variant::INT) initial_val = initial_val.operator real_t();
  1273. ERR_FAIL_COND_V(initial_val.get_type() != p_final_val.get_type(), false);
  1274. InterpolateData data;
  1275. data.active = true;
  1276. data.type = TARGETING_METHOD;
  1277. data.finish = false;
  1278. data.elapsed = 0;
  1279. data.id = p_object->get_instance_ID();
  1280. data.key = p_method;
  1281. data.target_id = p_initial->get_instance_ID();
  1282. data.target_key = p_initial_method;
  1283. data.initial_val = initial_val;
  1284. data.final_val = p_final_val;
  1285. data.times_in_sec = p_times_in_sec;
  1286. data.trans_type = p_trans_type;
  1287. data.ease_type = p_ease_type;
  1288. data.delay = p_delay;
  1289. if(!_calc_delta_val(data.initial_val, data.final_val, data.delta_val))
  1290. return false;
  1291. interpolates.push_back(data);
  1292. return true;
  1293. }
  1294. Tween::Tween() {
  1295. //String autoplay;
  1296. tween_process_mode=TWEEN_PROCESS_IDLE;
  1297. processing=false;
  1298. active=false;
  1299. repeat=false;
  1300. speed_scale=1;
  1301. pending_update=0;
  1302. }
  1303. Tween::~Tween() {
  1304. }