visual_script_builtin_funcs.cpp 33 KB

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