visual_script_builtin_funcs.cpp 35 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293
  1. /*************************************************************************/
  2. /* visual_script_builtin_funcs.cpp */
  3. /*************************************************************************/
  4. /* This file is part of: */
  5. /* GODOT ENGINE */
  6. /* http://www.godotengine.org */
  7. /*************************************************************************/
  8. /* Copyright (c) 2007-2017 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 "visual_script_builtin_funcs.h"
  30. #include "math_funcs.h"
  31. #include "class_db.h"
  32. #include "reference.h"
  33. #include "func_ref.h"
  34. #include "os/os.h"
  35. #include "variant_parser.h"
  36. #include "io/marshalls.h"
  37. const char* VisualScriptBuiltinFunc::func_name[VisualScriptBuiltinFunc::FUNC_MAX]={
  38. "sin",
  39. "cos",
  40. "tan",
  41. "sinh",
  42. "cosh",
  43. "tanh",
  44. "asin",
  45. "acos",
  46. "atan",
  47. "atan2",
  48. "sqrt",
  49. "fmod",
  50. "fposmod",
  51. "floor",
  52. "ceil",
  53. "round",
  54. "abs",
  55. "sign",
  56. "pow",
  57. "log",
  58. "exp",
  59. "is_nan",
  60. "is_inf",
  61. "ease",
  62. "decimals",
  63. "stepify",
  64. "lerp",
  65. "dectime",
  66. "randomize",
  67. "randi",
  68. "randf",
  69. "rand_range",
  70. "seed",
  71. "rand_seed",
  72. "deg2rad",
  73. "rad2deg",
  74. "linear2db",
  75. "db2linear",
  76. "max",
  77. "min",
  78. "clamp",
  79. "nearest_po2",
  80. "weakref",
  81. "funcref",
  82. "convert",
  83. "typeof",
  84. "type_exists",
  85. "char",
  86. "str",
  87. "print",
  88. "printerr",
  89. "printraw",
  90. "var2str",
  91. "str2var",
  92. "var2bytes",
  93. "bytes2var",
  94. "color_named",
  95. };
  96. VisualScriptBuiltinFunc::BuiltinFunc VisualScriptBuiltinFunc::find_function(const String& p_string) {
  97. for(int i=0;i<FUNC_MAX;i++) {
  98. if (p_string==func_name[i])
  99. return BuiltinFunc(i);
  100. }
  101. return FUNC_MAX;
  102. }
  103. String VisualScriptBuiltinFunc::get_func_name(BuiltinFunc p_func) {
  104. ERR_FAIL_INDEX_V(p_func,FUNC_MAX,String());
  105. return func_name[p_func];
  106. }
  107. int VisualScriptBuiltinFunc::get_output_sequence_port_count() const {
  108. return has_input_sequence_port() ? 1 : 0;
  109. }
  110. bool VisualScriptBuiltinFunc::has_input_sequence_port() const{
  111. switch(func) {
  112. case MATH_RANDOMIZE:
  113. case TEXT_PRINT:
  114. case TEXT_PRINTERR:
  115. case TEXT_PRINTRAW:
  116. return true;
  117. default:
  118. return false;
  119. }
  120. }
  121. int VisualScriptBuiltinFunc::get_func_argument_count(BuiltinFunc p_func) {
  122. switch(p_func) {
  123. case MATH_RANDOMIZE:
  124. case MATH_RAND:
  125. case MATH_RANDF:
  126. return 0;
  127. case MATH_SIN:
  128. case MATH_COS:
  129. case MATH_TAN:
  130. case MATH_SINH:
  131. case MATH_COSH:
  132. case MATH_TANH:
  133. case MATH_ASIN:
  134. case MATH_ACOS:
  135. case MATH_ATAN:
  136. case MATH_SQRT:
  137. case MATH_FLOOR:
  138. case MATH_CEIL:
  139. case MATH_ROUND:
  140. case MATH_ABS:
  141. case MATH_SIGN:
  142. case MATH_LOG:
  143. case MATH_EXP:
  144. case MATH_ISNAN:
  145. case MATH_ISINF:
  146. case MATH_DECIMALS:
  147. case MATH_SEED:
  148. case MATH_RANDSEED:
  149. case MATH_DEG2RAD:
  150. case MATH_RAD2DEG:
  151. case MATH_LINEAR2DB:
  152. case MATH_DB2LINEAR:
  153. case LOGIC_NEAREST_PO2:
  154. case OBJ_WEAKREF:
  155. case TYPE_OF:
  156. case TEXT_CHAR:
  157. case TEXT_STR:
  158. case TEXT_PRINT:
  159. case TEXT_PRINTERR:
  160. case TEXT_PRINTRAW:
  161. case VAR_TO_STR:
  162. case STR_TO_VAR:
  163. case VAR_TO_BYTES:
  164. case BYTES_TO_VAR:
  165. case TYPE_EXISTS:
  166. return 1;
  167. case MATH_ATAN2:
  168. case MATH_FMOD:
  169. case MATH_FPOSMOD:
  170. case MATH_POW:
  171. case MATH_EASE:
  172. case MATH_STEPIFY:
  173. case MATH_RANDOM:
  174. case LOGIC_MAX:
  175. case LOGIC_MIN:
  176. case FUNC_FUNCREF:
  177. case TYPE_CONVERT:
  178. case COLORN:
  179. return 2;
  180. case MATH_LERP:
  181. case MATH_DECTIME:
  182. case LOGIC_CLAMP:
  183. return 3;
  184. case FUNC_MAX:{}
  185. }
  186. return 0;
  187. }
  188. int VisualScriptBuiltinFunc::get_input_value_port_count() const{
  189. return get_func_argument_count(func);
  190. }
  191. int VisualScriptBuiltinFunc::get_output_value_port_count() const{
  192. switch(func) {
  193. case MATH_RANDOMIZE:
  194. case TEXT_PRINT:
  195. case TEXT_PRINTERR:
  196. case TEXT_PRINTRAW:
  197. case MATH_SEED:
  198. return 0;
  199. case MATH_RANDSEED:
  200. return 2;
  201. default:
  202. return 1;
  203. }
  204. return 1;
  205. }
  206. String VisualScriptBuiltinFunc::get_output_sequence_port_text(int p_port) const {
  207. return String();
  208. }
  209. PropertyInfo VisualScriptBuiltinFunc::get_input_value_port_info(int p_idx) const{
  210. switch(func) {
  211. case MATH_SIN:
  212. case MATH_COS:
  213. case MATH_TAN:
  214. case MATH_SINH:
  215. case MATH_COSH:
  216. case MATH_TANH:
  217. case MATH_ASIN:
  218. case MATH_ACOS:
  219. case MATH_ATAN:
  220. case MATH_ATAN2:
  221. case MATH_SQRT: {
  222. return PropertyInfo(Variant::REAL,"num");
  223. } break;
  224. case MATH_FMOD:
  225. case MATH_FPOSMOD: {
  226. if (p_idx==0)
  227. return PropertyInfo(Variant::REAL,"x");
  228. else
  229. return PropertyInfo(Variant::REAL,"y");
  230. } break;
  231. case MATH_FLOOR:
  232. case MATH_CEIL:
  233. case MATH_ROUND:
  234. case MATH_ABS:
  235. case MATH_SIGN: {
  236. return PropertyInfo(Variant::REAL,"num");
  237. } break;
  238. case MATH_POW: {
  239. if (p_idx==0)
  240. return PropertyInfo(Variant::REAL,"x");
  241. else
  242. return PropertyInfo(Variant::REAL,"y");
  243. } break;
  244. case MATH_LOG:
  245. case MATH_EXP:
  246. case MATH_ISNAN:
  247. case MATH_ISINF: {
  248. return PropertyInfo(Variant::REAL,"num");
  249. } break;
  250. case MATH_EASE: {
  251. if (p_idx==0)
  252. return PropertyInfo(Variant::REAL,"s");
  253. else
  254. return PropertyInfo(Variant::REAL,"curve");
  255. } break;
  256. case MATH_DECIMALS: {
  257. return PropertyInfo(Variant::REAL,"step");
  258. } break;
  259. case MATH_STEPIFY: {
  260. if (p_idx==0)
  261. return PropertyInfo(Variant::REAL,"s");
  262. else
  263. return PropertyInfo(Variant::REAL,"steps");
  264. } break;
  265. case MATH_LERP: {
  266. if (p_idx==0)
  267. return PropertyInfo(Variant::REAL,"from");
  268. else if (p_idx==1)
  269. return PropertyInfo(Variant::REAL,"to");
  270. else
  271. return PropertyInfo(Variant::REAL,"weight");
  272. } break;
  273. case MATH_DECTIME: {
  274. if (p_idx==0)
  275. return PropertyInfo(Variant::REAL,"value");
  276. else if (p_idx==1)
  277. return PropertyInfo(Variant::REAL,"amount");
  278. else
  279. return PropertyInfo(Variant::REAL,"step");
  280. } break;
  281. case MATH_RANDOMIZE: {
  282. } break;
  283. case MATH_RAND: {
  284. } break;
  285. case MATH_RANDF: {
  286. } break;
  287. case MATH_RANDOM: {
  288. if (p_idx==0)
  289. return PropertyInfo(Variant::REAL,"from");
  290. else
  291. return PropertyInfo(Variant::REAL,"to");
  292. } break;
  293. case MATH_SEED: {
  294. return PropertyInfo(Variant::INT,"seed");
  295. } break;
  296. case MATH_RANDSEED: {
  297. return PropertyInfo(Variant::INT,"seed");
  298. } break;
  299. case MATH_DEG2RAD: {
  300. return PropertyInfo(Variant::REAL,"deg");
  301. } break;
  302. case MATH_RAD2DEG: {
  303. return PropertyInfo(Variant::REAL,"rad");
  304. } break;
  305. case MATH_LINEAR2DB: {
  306. return PropertyInfo(Variant::REAL,"nrg");
  307. } break;
  308. case MATH_DB2LINEAR: {
  309. return PropertyInfo(Variant::REAL,"db");
  310. } break;
  311. case LOGIC_MAX: {
  312. if (p_idx==0)
  313. return PropertyInfo(Variant::REAL,"a");
  314. else
  315. return PropertyInfo(Variant::REAL,"b");
  316. } break;
  317. case LOGIC_MIN: {
  318. if (p_idx==0)
  319. return PropertyInfo(Variant::REAL,"a");
  320. else
  321. return PropertyInfo(Variant::REAL,"b");
  322. } break;
  323. case LOGIC_CLAMP: {
  324. if (p_idx==0)
  325. return PropertyInfo(Variant::REAL,"a");
  326. else if (p_idx==0) // FIXME: is it ok to test p_idx == 0 twice?
  327. return PropertyInfo(Variant::REAL,"min");
  328. else
  329. return PropertyInfo(Variant::REAL,"max");
  330. } break;
  331. case LOGIC_NEAREST_PO2: {
  332. return PropertyInfo(Variant::INT,"num");
  333. } break;
  334. case OBJ_WEAKREF: {
  335. return PropertyInfo(Variant::OBJECT,"source");
  336. } break;
  337. case FUNC_FUNCREF: {
  338. if (p_idx==0)
  339. return PropertyInfo(Variant::OBJECT,"instance");
  340. else
  341. return PropertyInfo(Variant::STRING,"funcname");
  342. } break;
  343. case TYPE_CONVERT: {
  344. if (p_idx==0)
  345. return PropertyInfo(Variant::NIL,"what");
  346. else
  347. return PropertyInfo(Variant::STRING,"type");
  348. } break;
  349. case TYPE_OF: {
  350. return PropertyInfo(Variant::NIL,"what");
  351. } break;
  352. case TYPE_EXISTS: {
  353. return PropertyInfo(Variant::STRING,"type");
  354. } break;
  355. case TEXT_CHAR: {
  356. return PropertyInfo(Variant::INT,"ascii");
  357. } break;
  358. case TEXT_STR: {
  359. return PropertyInfo(Variant::NIL,"value");
  360. } break;
  361. case TEXT_PRINT: {
  362. return PropertyInfo(Variant::NIL,"value");
  363. } break;
  364. case TEXT_PRINTERR: {
  365. return PropertyInfo(Variant::NIL,"value");
  366. } break;
  367. case TEXT_PRINTRAW: {
  368. return PropertyInfo(Variant::NIL,"value");
  369. } break;
  370. case VAR_TO_STR: {
  371. return PropertyInfo(Variant::NIL,"var");
  372. } break;
  373. case STR_TO_VAR: {
  374. return PropertyInfo(Variant::STRING,"string");
  375. } break;
  376. case VAR_TO_BYTES: {
  377. return PropertyInfo(Variant::NIL,"var");
  378. } break;
  379. case BYTES_TO_VAR: {
  380. return PropertyInfo(Variant::POOL_BYTE_ARRAY,"bytes");
  381. } break;
  382. case COLORN: {
  383. if (p_idx==0)
  384. return PropertyInfo(Variant::STRING,"name");
  385. else
  386. return PropertyInfo(Variant::REAL,"alpha");
  387. } break;
  388. case FUNC_MAX:{}
  389. }
  390. return PropertyInfo();
  391. }
  392. PropertyInfo VisualScriptBuiltinFunc::get_output_value_port_info(int p_idx) const{
  393. Variant::Type t=Variant::NIL;
  394. switch(func) {
  395. case MATH_SIN:
  396. case MATH_COS:
  397. case MATH_TAN:
  398. case MATH_SINH:
  399. case MATH_COSH:
  400. case MATH_TANH:
  401. case MATH_ASIN:
  402. case MATH_ACOS:
  403. case MATH_ATAN:
  404. case MATH_ATAN2:
  405. case MATH_SQRT:
  406. case MATH_FMOD:
  407. case MATH_FPOSMOD:
  408. case MATH_FLOOR:
  409. case MATH_CEIL: {
  410. t=Variant::REAL;
  411. } break;
  412. case MATH_ROUND: {
  413. t=Variant::INT;
  414. } break;
  415. case MATH_ABS: {
  416. t=Variant::NIL;
  417. } break;
  418. case MATH_SIGN: {
  419. t=Variant::NIL;
  420. } break;
  421. case MATH_POW:
  422. case MATH_LOG:
  423. case MATH_EXP: {
  424. t=Variant::REAL;
  425. } break;
  426. case MATH_ISNAN:
  427. case MATH_ISINF: {
  428. t=Variant::BOOL;
  429. } break;
  430. case MATH_EASE: {
  431. t=Variant::REAL;
  432. } break;
  433. case MATH_DECIMALS: {
  434. t=Variant::INT;
  435. } break;
  436. case MATH_STEPIFY:
  437. case MATH_LERP:
  438. case MATH_DECTIME: {
  439. t=Variant::REAL;
  440. } break;
  441. case MATH_RANDOMIZE: {
  442. } break;
  443. case MATH_RAND: {
  444. t=Variant::INT;
  445. } break;
  446. case MATH_RANDF:
  447. case MATH_RANDOM: {
  448. t=Variant::REAL;
  449. } break;
  450. case MATH_SEED: {
  451. } break;
  452. case MATH_RANDSEED: {
  453. if (p_idx==0)
  454. return PropertyInfo(Variant::INT,"rnd");
  455. else
  456. return PropertyInfo(Variant::INT,"seed");
  457. } break;
  458. case MATH_DEG2RAD:
  459. case MATH_RAD2DEG:
  460. case MATH_LINEAR2DB:
  461. case MATH_DB2LINEAR: {
  462. t=Variant::REAL;
  463. } break;
  464. case LOGIC_MAX:
  465. case LOGIC_MIN:
  466. case LOGIC_CLAMP: {
  467. } break;
  468. case LOGIC_NEAREST_PO2: {
  469. t=Variant::NIL;
  470. } break;
  471. case OBJ_WEAKREF: {
  472. t=Variant::OBJECT;
  473. } break;
  474. case FUNC_FUNCREF: {
  475. t=Variant::OBJECT;
  476. } break;
  477. case TYPE_CONVERT: {
  478. } break;
  479. case TYPE_OF: {
  480. t=Variant::INT;
  481. } break;
  482. case TYPE_EXISTS: {
  483. t=Variant::BOOL;
  484. } break;
  485. case TEXT_CHAR:
  486. case TEXT_STR: {
  487. t=Variant::STRING;
  488. } break;
  489. case TEXT_PRINT: {
  490. } break;
  491. case TEXT_PRINTERR: {
  492. } break;
  493. case TEXT_PRINTRAW: {
  494. } break;
  495. case VAR_TO_STR: {
  496. t=Variant::STRING;
  497. } break;
  498. case STR_TO_VAR: {
  499. } break;
  500. case VAR_TO_BYTES: {
  501. t=Variant::POOL_BYTE_ARRAY;
  502. } break;
  503. case BYTES_TO_VAR: {
  504. } break;
  505. case COLORN: {
  506. t=Variant::COLOR;
  507. } break;
  508. case FUNC_MAX:{}
  509. }
  510. return PropertyInfo(t,"");
  511. }
  512. String VisualScriptBuiltinFunc::get_caption() const {
  513. return "BuiltinFunc";
  514. }
  515. String VisualScriptBuiltinFunc::get_text() const {
  516. return func_name[func];
  517. }
  518. void VisualScriptBuiltinFunc::set_func(BuiltinFunc p_which) {
  519. ERR_FAIL_INDEX(p_which,FUNC_MAX);
  520. func=p_which;
  521. _change_notify();
  522. ports_changed_notify();
  523. }
  524. VisualScriptBuiltinFunc::BuiltinFunc VisualScriptBuiltinFunc::get_func() {
  525. return func;
  526. }
  527. #define VALIDATE_ARG_NUM(m_arg) \
  528. if (!p_inputs[m_arg]->is_num()) {\
  529. r_error.error=Variant::CallError::CALL_ERROR_INVALID_ARGUMENT;\
  530. r_error.argument=m_arg;\
  531. r_error.expected=Variant::REAL;\
  532. return;\
  533. }
  534. void VisualScriptBuiltinFunc::exec_func(BuiltinFunc p_func,const Variant** p_inputs,Variant* r_return,Variant::CallError& r_error,String& r_error_str) {
  535. switch(p_func) {
  536. case VisualScriptBuiltinFunc::MATH_SIN: {
  537. VALIDATE_ARG_NUM(0);
  538. *r_return=Math::sin((double)*p_inputs[0]);
  539. } break;
  540. case VisualScriptBuiltinFunc::MATH_COS: {
  541. VALIDATE_ARG_NUM(0);
  542. *r_return=Math::cos((double)*p_inputs[0]);
  543. } break;
  544. case VisualScriptBuiltinFunc::MATH_TAN: {
  545. VALIDATE_ARG_NUM(0);
  546. *r_return=Math::tan((double)*p_inputs[0]);
  547. } break;
  548. case VisualScriptBuiltinFunc::MATH_SINH: {
  549. VALIDATE_ARG_NUM(0);
  550. *r_return=Math::sinh((double)*p_inputs[0]);
  551. } break;
  552. case VisualScriptBuiltinFunc::MATH_COSH: {
  553. VALIDATE_ARG_NUM(0);
  554. *r_return=Math::cosh((double)*p_inputs[0]);
  555. } break;
  556. case VisualScriptBuiltinFunc::MATH_TANH: {
  557. VALIDATE_ARG_NUM(0);
  558. *r_return=Math::tanh((double)*p_inputs[0]);
  559. } break;
  560. case VisualScriptBuiltinFunc::MATH_ASIN: {
  561. VALIDATE_ARG_NUM(0);
  562. *r_return=Math::asin((double)*p_inputs[0]);
  563. } break;
  564. case VisualScriptBuiltinFunc::MATH_ACOS: {
  565. VALIDATE_ARG_NUM(0);
  566. *r_return=Math::acos((double)*p_inputs[0]);
  567. } break;
  568. case VisualScriptBuiltinFunc::MATH_ATAN: {
  569. VALIDATE_ARG_NUM(0);
  570. *r_return=Math::atan((double)*p_inputs[0]);
  571. } break;
  572. case VisualScriptBuiltinFunc::MATH_ATAN2: {
  573. VALIDATE_ARG_NUM(0);
  574. VALIDATE_ARG_NUM(1);
  575. *r_return=Math::atan2((double)*p_inputs[0],(double)*p_inputs[1]);
  576. } break;
  577. case VisualScriptBuiltinFunc::MATH_SQRT: {
  578. VALIDATE_ARG_NUM(0);
  579. *r_return=Math::sqrt((double)*p_inputs[0]);
  580. } break;
  581. case VisualScriptBuiltinFunc::MATH_FMOD: {
  582. VALIDATE_ARG_NUM(0);
  583. VALIDATE_ARG_NUM(1);
  584. *r_return=Math::fmod((double)*p_inputs[0],(double)*p_inputs[1]);
  585. } break;
  586. case VisualScriptBuiltinFunc::MATH_FPOSMOD: {
  587. VALIDATE_ARG_NUM(0);
  588. VALIDATE_ARG_NUM(1);
  589. *r_return=Math::fposmod((double)*p_inputs[0],(double)*p_inputs[1]);
  590. } break;
  591. case VisualScriptBuiltinFunc::MATH_FLOOR: {
  592. VALIDATE_ARG_NUM(0);
  593. *r_return=Math::floor((double)*p_inputs[0]);
  594. } break;
  595. case VisualScriptBuiltinFunc::MATH_CEIL: {
  596. VALIDATE_ARG_NUM(0);
  597. *r_return=Math::ceil((double)*p_inputs[0]);
  598. } break;
  599. case VisualScriptBuiltinFunc::MATH_ROUND: {
  600. VALIDATE_ARG_NUM(0);
  601. *r_return=Math::round((double)*p_inputs[0]);
  602. } break;
  603. case VisualScriptBuiltinFunc::MATH_ABS: {
  604. if (p_inputs[0]->get_type()==Variant::INT) {
  605. int64_t i = *p_inputs[0];
  606. *r_return=ABS(i);
  607. } else if (p_inputs[0]->get_type()==Variant::REAL) {
  608. real_t r = *p_inputs[0];
  609. *r_return=Math::abs(r);
  610. } else {
  611. r_error.error=Variant::CallError::CALL_ERROR_INVALID_ARGUMENT;
  612. r_error.argument=0;
  613. r_error.expected=Variant::REAL;
  614. }
  615. } break;
  616. case VisualScriptBuiltinFunc::MATH_SIGN: {
  617. if (p_inputs[0]->get_type()==Variant::INT) {
  618. int64_t i = *p_inputs[0];
  619. *r_return= i < 0 ? -1 : ( i > 0 ? +1 : 0);
  620. } else if (p_inputs[0]->get_type()==Variant::REAL) {
  621. real_t r = *p_inputs[0];
  622. *r_return= r < 0.0 ? -1.0 : ( r > 0.0 ? +1.0 : 0.0);
  623. } else {
  624. r_error.error=Variant::CallError::CALL_ERROR_INVALID_ARGUMENT;
  625. r_error.argument=0;
  626. r_error.expected=Variant::REAL;
  627. }
  628. } break;
  629. case VisualScriptBuiltinFunc::MATH_POW: {
  630. VALIDATE_ARG_NUM(0);
  631. VALIDATE_ARG_NUM(1);
  632. *r_return=Math::pow((double)*p_inputs[0],(double)*p_inputs[1]);
  633. } break;
  634. case VisualScriptBuiltinFunc::MATH_LOG: {
  635. VALIDATE_ARG_NUM(0);
  636. *r_return=Math::log((double)*p_inputs[0]);
  637. } break;
  638. case VisualScriptBuiltinFunc::MATH_EXP: {
  639. VALIDATE_ARG_NUM(0);
  640. *r_return=Math::exp((double)*p_inputs[0]);
  641. } break;
  642. case VisualScriptBuiltinFunc::MATH_ISNAN: {
  643. VALIDATE_ARG_NUM(0);
  644. *r_return=Math::is_nan((double)*p_inputs[0]);
  645. } break;
  646. case VisualScriptBuiltinFunc::MATH_ISINF: {
  647. VALIDATE_ARG_NUM(0);
  648. *r_return=Math::is_inf((double)*p_inputs[0]);
  649. } break;
  650. case VisualScriptBuiltinFunc::MATH_EASE: {
  651. VALIDATE_ARG_NUM(0);
  652. VALIDATE_ARG_NUM(1);
  653. *r_return=Math::ease((double)*p_inputs[0],(double)*p_inputs[1]);
  654. } break;
  655. case VisualScriptBuiltinFunc::MATH_DECIMALS: {
  656. VALIDATE_ARG_NUM(0);
  657. *r_return=Math::step_decimals((double)*p_inputs[0]);
  658. } break;
  659. case VisualScriptBuiltinFunc::MATH_STEPIFY: {
  660. VALIDATE_ARG_NUM(0);
  661. VALIDATE_ARG_NUM(1);
  662. *r_return=Math::stepify((double)*p_inputs[0],(double)*p_inputs[1]);
  663. } break;
  664. case VisualScriptBuiltinFunc::MATH_LERP: {
  665. VALIDATE_ARG_NUM(0);
  666. VALIDATE_ARG_NUM(1);
  667. VALIDATE_ARG_NUM(2);
  668. *r_return=Math::lerp((double)*p_inputs[0],(double)*p_inputs[1],(double)*p_inputs[2]);
  669. } break;
  670. case VisualScriptBuiltinFunc::MATH_DECTIME: {
  671. VALIDATE_ARG_NUM(0);
  672. VALIDATE_ARG_NUM(1);
  673. VALIDATE_ARG_NUM(2);
  674. *r_return=Math::dectime((double)*p_inputs[0],(double)*p_inputs[1],(double)*p_inputs[2]);
  675. } break;
  676. case VisualScriptBuiltinFunc::MATH_RANDOMIZE: {
  677. Math::randomize();
  678. } break;
  679. case VisualScriptBuiltinFunc::MATH_RAND: {
  680. *r_return=Math::rand();
  681. } break;
  682. case VisualScriptBuiltinFunc::MATH_RANDF: {
  683. *r_return=Math::randf();
  684. } break;
  685. case VisualScriptBuiltinFunc::MATH_RANDOM: {
  686. VALIDATE_ARG_NUM(0);
  687. VALIDATE_ARG_NUM(1);
  688. *r_return=Math::random((double)*p_inputs[0],(double)*p_inputs[1]);
  689. } break;
  690. case VisualScriptBuiltinFunc::MATH_SEED: {
  691. VALIDATE_ARG_NUM(0);
  692. uint64_t seed=*p_inputs[0];
  693. Math::seed(seed);
  694. } break;
  695. case VisualScriptBuiltinFunc::MATH_RANDSEED: {
  696. VALIDATE_ARG_NUM(0);
  697. uint64_t seed=*p_inputs[0];
  698. int ret = Math::rand_from_seed(&seed);
  699. Array reta;
  700. reta.push_back(ret);
  701. reta.push_back(seed);
  702. *r_return=reta;
  703. } break;
  704. case VisualScriptBuiltinFunc::MATH_DEG2RAD: {
  705. VALIDATE_ARG_NUM(0);
  706. *r_return=Math::deg2rad((double)*p_inputs[0]);
  707. } break;
  708. case VisualScriptBuiltinFunc::MATH_RAD2DEG: {
  709. VALIDATE_ARG_NUM(0);
  710. *r_return=Math::rad2deg((double)*p_inputs[0]);
  711. } break;
  712. case VisualScriptBuiltinFunc::MATH_LINEAR2DB: {
  713. VALIDATE_ARG_NUM(0);
  714. *r_return=Math::linear2db((double)*p_inputs[0]);
  715. } break;
  716. case VisualScriptBuiltinFunc::MATH_DB2LINEAR: {
  717. VALIDATE_ARG_NUM(0);
  718. *r_return=Math::db2linear((double)*p_inputs[0]);
  719. } break;
  720. case VisualScriptBuiltinFunc::LOGIC_MAX: {
  721. if (p_inputs[0]->get_type()==Variant::INT && p_inputs[1]->get_type()==Variant::INT) {
  722. int64_t a = *p_inputs[0];
  723. int64_t b = *p_inputs[1];
  724. *r_return=MAX(a,b);
  725. } else {
  726. VALIDATE_ARG_NUM(0);
  727. VALIDATE_ARG_NUM(1);
  728. real_t a = *p_inputs[0];
  729. real_t b = *p_inputs[1];
  730. *r_return=MAX(a,b);
  731. }
  732. } break;
  733. case VisualScriptBuiltinFunc::LOGIC_MIN: {
  734. if (p_inputs[0]->get_type()==Variant::INT && p_inputs[1]->get_type()==Variant::INT) {
  735. int64_t a = *p_inputs[0];
  736. int64_t b = *p_inputs[1];
  737. *r_return=MIN(a,b);
  738. } else {
  739. VALIDATE_ARG_NUM(0);
  740. VALIDATE_ARG_NUM(1);
  741. real_t a = *p_inputs[0];
  742. real_t b = *p_inputs[1];
  743. *r_return=MIN(a,b);
  744. }
  745. } break;
  746. case VisualScriptBuiltinFunc::LOGIC_CLAMP: {
  747. if (p_inputs[0]->get_type()==Variant::INT && p_inputs[1]->get_type()==Variant::INT && p_inputs[2]->get_type()==Variant::INT) {
  748. int64_t a = *p_inputs[0];
  749. int64_t b = *p_inputs[1];
  750. int64_t c = *p_inputs[2];
  751. *r_return=CLAMP(a,b,c);
  752. } else {
  753. VALIDATE_ARG_NUM(0);
  754. VALIDATE_ARG_NUM(1);
  755. VALIDATE_ARG_NUM(2);
  756. real_t a = *p_inputs[0];
  757. real_t b = *p_inputs[1];
  758. real_t c = *p_inputs[2];
  759. *r_return=CLAMP(a,b,c);
  760. }
  761. } break;
  762. case VisualScriptBuiltinFunc::LOGIC_NEAREST_PO2: {
  763. VALIDATE_ARG_NUM(0);
  764. int64_t num = *p_inputs[0];
  765. *r_return = nearest_power_of_2(num);
  766. } break;
  767. case VisualScriptBuiltinFunc::OBJ_WEAKREF: {
  768. if (p_inputs[0]->get_type()!=Variant::OBJECT) {
  769. r_error.error=Variant::CallError::CALL_ERROR_INVALID_ARGUMENT;
  770. r_error.argument=0;
  771. r_error.expected=Variant::OBJECT;
  772. return;
  773. }
  774. if (p_inputs[0]->is_ref()) {
  775. REF r = *p_inputs[0];
  776. if (!r.is_valid()) {
  777. return;
  778. }
  779. Ref<WeakRef> wref = memnew( WeakRef );
  780. wref->set_ref(r);
  781. *r_return=wref;
  782. } else {
  783. Object *obj = *p_inputs[0];
  784. if (!obj) {
  785. return;
  786. }
  787. Ref<WeakRef> wref = memnew( WeakRef );
  788. wref->set_obj(obj);
  789. *r_return=wref;
  790. }
  791. } break;
  792. case VisualScriptBuiltinFunc::FUNC_FUNCREF: {
  793. if (p_inputs[0]->get_type()!=Variant::OBJECT) {
  794. r_error.error=Variant::CallError::CALL_ERROR_INVALID_ARGUMENT;
  795. r_error.argument=0;
  796. r_error.expected=Variant::OBJECT;
  797. return;
  798. }
  799. if (p_inputs[1]->get_type()!=Variant::STRING && p_inputs[1]->get_type()!=Variant::NODE_PATH) {
  800. r_error.error=Variant::CallError::CALL_ERROR_INVALID_ARGUMENT;
  801. r_error.argument=1;
  802. r_error.expected=Variant::STRING;
  803. return;
  804. }
  805. Ref<FuncRef> fr = memnew( FuncRef);
  806. fr->set_instance(*p_inputs[0]);
  807. fr->set_function(*p_inputs[1]);
  808. *r_return=fr;
  809. } break;
  810. case VisualScriptBuiltinFunc::TYPE_CONVERT: {
  811. VALIDATE_ARG_NUM(1);
  812. int type=*p_inputs[1];
  813. if (type<0 || type>=Variant::VARIANT_MAX) {
  814. r_error_str=RTR("Invalid type argument to convert(), use TYPE_* constants.");
  815. r_error.error=Variant::CallError::CALL_ERROR_INVALID_ARGUMENT;
  816. r_error.argument=0;
  817. r_error.expected=Variant::INT;
  818. return;
  819. } else {
  820. *r_return=Variant::construct(Variant::Type(type),p_inputs,1,r_error);
  821. }
  822. } break;
  823. case VisualScriptBuiltinFunc::TYPE_OF: {
  824. *r_return = p_inputs[0]->get_type();
  825. } break;
  826. case VisualScriptBuiltinFunc::TYPE_EXISTS: {
  827. *r_return = ClassDB::class_exists(*p_inputs[0]);
  828. } break;
  829. case VisualScriptBuiltinFunc::TEXT_CHAR: {
  830. CharType result[2] = {*p_inputs[0], 0};
  831. *r_return=String(result);
  832. } break;
  833. case VisualScriptBuiltinFunc::TEXT_STR: {
  834. String str = *p_inputs[0];
  835. *r_return=str;
  836. } break;
  837. case VisualScriptBuiltinFunc::TEXT_PRINT: {
  838. String str = *p_inputs[0];
  839. print_line(str);
  840. } break;
  841. case VisualScriptBuiltinFunc::TEXT_PRINTERR: {
  842. String str = *p_inputs[0];
  843. //str+="\n";
  844. OS::get_singleton()->printerr("%s\n",str.utf8().get_data());
  845. } break;
  846. case VisualScriptBuiltinFunc::TEXT_PRINTRAW: {
  847. String str = *p_inputs[0];
  848. //str+="\n";
  849. OS::get_singleton()->print("%s",str.utf8().get_data());
  850. } break;
  851. case VisualScriptBuiltinFunc::VAR_TO_STR: {
  852. String vars;
  853. VariantWriter::write_to_string(*p_inputs[0],vars);
  854. *r_return=vars;
  855. } break;
  856. case VisualScriptBuiltinFunc::STR_TO_VAR: {
  857. if (p_inputs[0]->get_type()!=Variant::STRING) {
  858. r_error.error=Variant::CallError::CALL_ERROR_INVALID_ARGUMENT;
  859. r_error.argument=0;
  860. r_error.expected=Variant::STRING;
  861. return;
  862. }
  863. VariantParser::StreamString ss;
  864. ss.s=*p_inputs[0];
  865. String errs;
  866. int line;
  867. Error err = VariantParser::parse(&ss,*r_return,errs,line);
  868. if (err!=OK) {
  869. r_error.error=Variant::CallError::CALL_ERROR_INVALID_ARGUMENT;
  870. r_error.argument=0;
  871. r_error.expected=Variant::STRING;
  872. *r_return="Parse error at line "+itos(line)+": "+errs;
  873. return;
  874. }
  875. } break;
  876. case VisualScriptBuiltinFunc::VAR_TO_BYTES: {
  877. PoolByteArray barr;
  878. int len;
  879. Error err = encode_variant(*p_inputs[0],NULL,len);
  880. if (err) {
  881. r_error.error=Variant::CallError::CALL_ERROR_INVALID_ARGUMENT;
  882. r_error.argument=0;
  883. r_error.expected=Variant::NIL;
  884. r_error_str="Unexpected error encoding variable to bytes, likely unserializable type found (Object or RID).";
  885. return;
  886. }
  887. barr.resize(len);
  888. {
  889. PoolByteArray::Write w = barr.write();
  890. encode_variant(*p_inputs[0],w.ptr(),len);
  891. }
  892. *r_return=barr;
  893. } break;
  894. case VisualScriptBuiltinFunc::BYTES_TO_VAR: {
  895. if (p_inputs[0]->get_type()!=Variant::POOL_BYTE_ARRAY) {
  896. r_error.error=Variant::CallError::CALL_ERROR_INVALID_ARGUMENT;
  897. r_error.argument=0;
  898. r_error.expected=Variant::POOL_BYTE_ARRAY;
  899. return;
  900. }
  901. PoolByteArray varr=*p_inputs[0];
  902. Variant ret;
  903. {
  904. PoolByteArray::Read r=varr.read();
  905. Error err = decode_variant(ret,r.ptr(),varr.size(),NULL);
  906. if (err!=OK) {
  907. r_error_str=RTR("Not enough bytes for decoding bytes, or invalid format.");
  908. r_error.error=Variant::CallError::CALL_ERROR_INVALID_ARGUMENT;
  909. r_error.argument=0;
  910. r_error.expected=Variant::POOL_BYTE_ARRAY;
  911. return;
  912. }
  913. }
  914. *r_return=ret;
  915. } break;
  916. case VisualScriptBuiltinFunc::COLORN: {
  917. VALIDATE_ARG_NUM(1);
  918. Color color = Color::named(*p_inputs[0]);
  919. color.a=*p_inputs[1];
  920. *r_return=String(color);
  921. } break;
  922. default: {}
  923. }
  924. }
  925. class VisualScriptNodeInstanceBuiltinFunc : public VisualScriptNodeInstance {
  926. public:
  927. VisualScriptBuiltinFunc *node;
  928. VisualScriptInstance *instance;
  929. VisualScriptBuiltinFunc::BuiltinFunc func;
  930. //virtual int get_working_memory_size() const { return 0; }
  931. //virtual bool is_output_port_unsequenced(int p_idx) const { return false; }
  932. //virtual bool get_output_port_unsequenced(int p_idx,Variant* r_value,Variant* p_working_mem,String &r_error) const { return true; }
  933. virtual int step(const Variant** p_inputs,Variant** p_outputs,StartMode p_start_mode,Variant* p_working_mem,Variant::CallError& r_error,String& r_error_str) {
  934. VisualScriptBuiltinFunc::exec_func(func,p_inputs,p_outputs[0],r_error,r_error_str);
  935. return 0;
  936. }
  937. };
  938. VisualScriptNodeInstance* VisualScriptBuiltinFunc::instance(VisualScriptInstance* p_instance) {
  939. VisualScriptNodeInstanceBuiltinFunc * instance = memnew(VisualScriptNodeInstanceBuiltinFunc );
  940. instance->node=this;
  941. instance->instance=p_instance;
  942. instance->func=func;
  943. return instance;
  944. }
  945. void VisualScriptBuiltinFunc::_bind_methods() {
  946. ClassDB::bind_method(D_METHOD("set_func","which"),&VisualScriptBuiltinFunc::set_func);
  947. ClassDB::bind_method(D_METHOD("get_func"),&VisualScriptBuiltinFunc::get_func);
  948. String cc;
  949. for(int i=0;i<FUNC_MAX;i++) {
  950. if (i>0)
  951. cc+=",";
  952. cc+=func_name[i];
  953. }
  954. ADD_PROPERTY(PropertyInfo(Variant::INT,"function",PROPERTY_HINT_ENUM,cc),"set_func","get_func");
  955. }
  956. VisualScriptBuiltinFunc::VisualScriptBuiltinFunc() {
  957. func=MATH_SIN;
  958. }
  959. template<VisualScriptBuiltinFunc::BuiltinFunc func>
  960. static Ref<VisualScriptNode> create_builtin_func_node(const String& p_name) {
  961. Ref<VisualScriptBuiltinFunc> node;
  962. node.instance();
  963. node->set_func(func);
  964. return node;
  965. }
  966. void register_visual_script_builtin_func_node() {
  967. VisualScriptLanguage::singleton->add_register_func("functions/built_in/sin",create_builtin_func_node<VisualScriptBuiltinFunc::MATH_SIN>);
  968. VisualScriptLanguage::singleton->add_register_func("functions/built_in/cos",create_builtin_func_node<VisualScriptBuiltinFunc::MATH_COS>);
  969. VisualScriptLanguage::singleton->add_register_func("functions/built_in/tan",create_builtin_func_node<VisualScriptBuiltinFunc::MATH_TAN>);
  970. VisualScriptLanguage::singleton->add_register_func("functions/built_in/sinh",create_builtin_func_node<VisualScriptBuiltinFunc::MATH_SINH>);
  971. VisualScriptLanguage::singleton->add_register_func("functions/built_in/cosh",create_builtin_func_node<VisualScriptBuiltinFunc::MATH_COSH>);
  972. VisualScriptLanguage::singleton->add_register_func("functions/built_in/tanh",create_builtin_func_node<VisualScriptBuiltinFunc::MATH_TANH>);
  973. VisualScriptLanguage::singleton->add_register_func("functions/built_in/asin",create_builtin_func_node<VisualScriptBuiltinFunc::MATH_ASIN>);
  974. VisualScriptLanguage::singleton->add_register_func("functions/built_in/acos",create_builtin_func_node<VisualScriptBuiltinFunc::MATH_ACOS>);
  975. VisualScriptLanguage::singleton->add_register_func("functions/built_in/atan",create_builtin_func_node<VisualScriptBuiltinFunc::MATH_ATAN>);
  976. VisualScriptLanguage::singleton->add_register_func("functions/built_in/atan2",create_builtin_func_node<VisualScriptBuiltinFunc::MATH_ATAN2>);
  977. VisualScriptLanguage::singleton->add_register_func("functions/built_in/sqrt",create_builtin_func_node<VisualScriptBuiltinFunc::MATH_SQRT>);
  978. VisualScriptLanguage::singleton->add_register_func("functions/built_in/fmod",create_builtin_func_node<VisualScriptBuiltinFunc::MATH_FMOD>);
  979. VisualScriptLanguage::singleton->add_register_func("functions/built_in/fposmod",create_builtin_func_node<VisualScriptBuiltinFunc::MATH_FPOSMOD>);
  980. VisualScriptLanguage::singleton->add_register_func("functions/built_in/floor",create_builtin_func_node<VisualScriptBuiltinFunc::MATH_FLOOR>);
  981. VisualScriptLanguage::singleton->add_register_func("functions/built_in/ceil",create_builtin_func_node<VisualScriptBuiltinFunc::MATH_CEIL>);
  982. VisualScriptLanguage::singleton->add_register_func("functions/built_in/round",create_builtin_func_node<VisualScriptBuiltinFunc::MATH_ROUND>);
  983. VisualScriptLanguage::singleton->add_register_func("functions/built_in/abs",create_builtin_func_node<VisualScriptBuiltinFunc::MATH_ABS>);
  984. VisualScriptLanguage::singleton->add_register_func("functions/built_in/sign",create_builtin_func_node<VisualScriptBuiltinFunc::MATH_SIGN>);
  985. VisualScriptLanguage::singleton->add_register_func("functions/built_in/pow",create_builtin_func_node<VisualScriptBuiltinFunc::MATH_POW>);
  986. VisualScriptLanguage::singleton->add_register_func("functions/built_in/log",create_builtin_func_node<VisualScriptBuiltinFunc::MATH_LOG>);
  987. VisualScriptLanguage::singleton->add_register_func("functions/built_in/exp",create_builtin_func_node<VisualScriptBuiltinFunc::MATH_EXP>);
  988. VisualScriptLanguage::singleton->add_register_func("functions/built_in/isnan",create_builtin_func_node<VisualScriptBuiltinFunc::MATH_ISNAN>);
  989. VisualScriptLanguage::singleton->add_register_func("functions/built_in/isinf",create_builtin_func_node<VisualScriptBuiltinFunc::MATH_ISINF>);
  990. VisualScriptLanguage::singleton->add_register_func("functions/built_in/ease",create_builtin_func_node<VisualScriptBuiltinFunc::MATH_EASE>);
  991. VisualScriptLanguage::singleton->add_register_func("functions/built_in/decimals",create_builtin_func_node<VisualScriptBuiltinFunc::MATH_DECIMALS>);
  992. VisualScriptLanguage::singleton->add_register_func("functions/built_in/stepify",create_builtin_func_node<VisualScriptBuiltinFunc::MATH_STEPIFY>);
  993. VisualScriptLanguage::singleton->add_register_func("functions/built_in/lerp",create_builtin_func_node<VisualScriptBuiltinFunc::MATH_LERP>);
  994. VisualScriptLanguage::singleton->add_register_func("functions/built_in/dectime",create_builtin_func_node<VisualScriptBuiltinFunc::MATH_DECTIME>);
  995. VisualScriptLanguage::singleton->add_register_func("functions/built_in/randomize",create_builtin_func_node<VisualScriptBuiltinFunc::MATH_RANDOMIZE>);
  996. VisualScriptLanguage::singleton->add_register_func("functions/built_in/rand",create_builtin_func_node<VisualScriptBuiltinFunc::MATH_RAND>);
  997. VisualScriptLanguage::singleton->add_register_func("functions/built_in/randf",create_builtin_func_node<VisualScriptBuiltinFunc::MATH_RANDF>);
  998. VisualScriptLanguage::singleton->add_register_func("functions/built_in/random",create_builtin_func_node<VisualScriptBuiltinFunc::MATH_RANDOM>);
  999. VisualScriptLanguage::singleton->add_register_func("functions/built_in/seed",create_builtin_func_node<VisualScriptBuiltinFunc::MATH_SEED>);
  1000. VisualScriptLanguage::singleton->add_register_func("functions/built_in/randseed",create_builtin_func_node<VisualScriptBuiltinFunc::MATH_RANDSEED>);
  1001. VisualScriptLanguage::singleton->add_register_func("functions/built_in/deg2rad",create_builtin_func_node<VisualScriptBuiltinFunc::MATH_DEG2RAD>);
  1002. VisualScriptLanguage::singleton->add_register_func("functions/built_in/rad2deg",create_builtin_func_node<VisualScriptBuiltinFunc::MATH_RAD2DEG>);
  1003. VisualScriptLanguage::singleton->add_register_func("functions/built_in/linear2db",create_builtin_func_node<VisualScriptBuiltinFunc::MATH_LINEAR2DB>);
  1004. VisualScriptLanguage::singleton->add_register_func("functions/built_in/db2linear",create_builtin_func_node<VisualScriptBuiltinFunc::MATH_DB2LINEAR>);
  1005. VisualScriptLanguage::singleton->add_register_func("functions/built_in/max",create_builtin_func_node<VisualScriptBuiltinFunc::LOGIC_MAX>);
  1006. VisualScriptLanguage::singleton->add_register_func("functions/built_in/min",create_builtin_func_node<VisualScriptBuiltinFunc::LOGIC_MIN>);
  1007. VisualScriptLanguage::singleton->add_register_func("functions/built_in/clamp",create_builtin_func_node<VisualScriptBuiltinFunc::LOGIC_CLAMP>);
  1008. VisualScriptLanguage::singleton->add_register_func("functions/built_in/nearest_po2",create_builtin_func_node<VisualScriptBuiltinFunc::LOGIC_NEAREST_PO2>);
  1009. VisualScriptLanguage::singleton->add_register_func("functions/built_in/weakref",create_builtin_func_node<VisualScriptBuiltinFunc::OBJ_WEAKREF>);
  1010. VisualScriptLanguage::singleton->add_register_func("functions/built_in/funcref",create_builtin_func_node<VisualScriptBuiltinFunc::FUNC_FUNCREF>);
  1011. VisualScriptLanguage::singleton->add_register_func("functions/built_in/convert",create_builtin_func_node<VisualScriptBuiltinFunc::TYPE_CONVERT>);
  1012. VisualScriptLanguage::singleton->add_register_func("functions/built_in/typeof",create_builtin_func_node<VisualScriptBuiltinFunc::TYPE_OF>);
  1013. VisualScriptLanguage::singleton->add_register_func("functions/built_in/type_exists",create_builtin_func_node<VisualScriptBuiltinFunc::TYPE_EXISTS>);
  1014. VisualScriptLanguage::singleton->add_register_func("functions/built_in/char",create_builtin_func_node<VisualScriptBuiltinFunc::TEXT_CHAR>);
  1015. VisualScriptLanguage::singleton->add_register_func("functions/built_in/str",create_builtin_func_node<VisualScriptBuiltinFunc::TEXT_STR>);
  1016. VisualScriptLanguage::singleton->add_register_func("functions/built_in/print",create_builtin_func_node<VisualScriptBuiltinFunc::TEXT_PRINT>);
  1017. VisualScriptLanguage::singleton->add_register_func("functions/built_in/printerr",create_builtin_func_node<VisualScriptBuiltinFunc::TEXT_PRINTERR>);
  1018. VisualScriptLanguage::singleton->add_register_func("functions/built_in/printraw",create_builtin_func_node<VisualScriptBuiltinFunc::TEXT_PRINTRAW>);
  1019. VisualScriptLanguage::singleton->add_register_func("functions/built_in/var2str",create_builtin_func_node<VisualScriptBuiltinFunc::VAR_TO_STR>);
  1020. VisualScriptLanguage::singleton->add_register_func("functions/built_in/str2var",create_builtin_func_node<VisualScriptBuiltinFunc::STR_TO_VAR>);
  1021. VisualScriptLanguage::singleton->add_register_func("functions/built_in/var2bytes",create_builtin_func_node<VisualScriptBuiltinFunc::VAR_TO_BYTES>);
  1022. VisualScriptLanguage::singleton->add_register_func("functions/built_in/bytes2var",create_builtin_func_node<VisualScriptBuiltinFunc::BYTES_TO_VAR>);
  1023. VisualScriptLanguage::singleton->add_register_func("functions/built_in/color_named",create_builtin_func_node<VisualScriptBuiltinFunc::COLORN>);
  1024. }