2
0

visual_script_builtin_funcs.cpp 31 KB

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