visual_script_builtin_funcs.cpp 32 KB

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