visual_script_builtin_funcs.cpp 31 KB

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