gd_functions.cpp 38 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658
  1. /*************************************************************************/
  2. /* gd_functions.cpp */
  3. /*************************************************************************/
  4. /* This file is part of: */
  5. /* GODOT ENGINE */
  6. /* http://www.godotengine.org */
  7. /*************************************************************************/
  8. /* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
  9. /* */
  10. /* Permission is hereby granted, free of charge, to any person obtaining */
  11. /* a copy of this software and associated documentation files (the */
  12. /* "Software"), to deal in the Software without restriction, including */
  13. /* without limitation the rights to use, copy, modify, merge, publish, */
  14. /* distribute, sublicense, and/or sell copies of the Software, and to */
  15. /* permit persons to whom the Software is furnished to do so, subject to */
  16. /* the following conditions: */
  17. /* */
  18. /* The above copyright notice and this permission notice shall be */
  19. /* included in all copies or substantial portions of the Software. */
  20. /* */
  21. /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
  22. /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
  23. /* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
  24. /* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
  25. /* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
  26. /* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
  27. /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
  28. /*************************************************************************/
  29. #include "gd_functions.h"
  30. #include "math_funcs.h"
  31. #include "class_db.h"
  32. #include "reference.h"
  33. #include "gd_script.h"
  34. #include "func_ref.h"
  35. #include "os/os.h"
  36. #include "variant_parser.h"
  37. #include "io/marshalls.h"
  38. #include "io/json.h"
  39. const char *GDFunctions::get_func_name(Function p_func) {
  40. ERR_FAIL_INDEX_V(p_func,FUNC_MAX,"");
  41. static const char *_names[FUNC_MAX]={
  42. "sin",
  43. "cos",
  44. "tan",
  45. "sinh",
  46. "cosh",
  47. "tanh",
  48. "asin",
  49. "acos",
  50. "atan",
  51. "atan2",
  52. "sqrt",
  53. "fmod",
  54. "fposmod",
  55. "floor",
  56. "ceil",
  57. "round",
  58. "abs",
  59. "sign",
  60. "pow",
  61. "log",
  62. "exp",
  63. "is_nan",
  64. "is_inf",
  65. "ease",
  66. "decimals",
  67. "stepify",
  68. "lerp",
  69. "dectime",
  70. "randomize",
  71. "randi",
  72. "randf",
  73. "rand_range",
  74. "seed",
  75. "rand_seed",
  76. "deg2rad",
  77. "rad2deg",
  78. "linear2db",
  79. "db2linear",
  80. "max",
  81. "min",
  82. "clamp",
  83. "nearest_po2",
  84. "weakref",
  85. "funcref",
  86. "convert",
  87. "typeof",
  88. "type_exists",
  89. "char",
  90. "str",
  91. "print",
  92. "printt",
  93. "prints",
  94. "printerr",
  95. "printraw",
  96. "var2str",
  97. "str2var",
  98. "var2bytes",
  99. "bytes2var",
  100. "range",
  101. "load",
  102. "inst2dict",
  103. "dict2inst",
  104. "validate_json",
  105. "parse_json",
  106. "to_json",
  107. "hash",
  108. "Color8",
  109. "ColorN",
  110. "print_stack",
  111. "instance_from_id",
  112. };
  113. return _names[p_func];
  114. }
  115. void GDFunctions::call(Function p_func,const Variant **p_args,int p_arg_count,Variant &r_ret,Variant::CallError &r_error) {
  116. r_error.error=Variant::CallError::CALL_OK;
  117. #ifdef DEBUG_ENABLED
  118. #define VALIDATE_ARG_COUNT(m_count) \
  119. if (p_arg_count<m_count) {\
  120. r_error.error=Variant::CallError::CALL_ERROR_TOO_FEW_ARGUMENTS;\
  121. r_error.argument=m_count;\
  122. r_ret=Variant();\
  123. return;\
  124. }\
  125. if (p_arg_count>m_count) {\
  126. r_error.error=Variant::CallError::CALL_ERROR_TOO_MANY_ARGUMENTS;\
  127. r_error.argument=m_count;\
  128. r_ret=Variant();\
  129. return;\
  130. }
  131. #define VALIDATE_ARG_NUM(m_arg) \
  132. if (!p_args[m_arg]->is_num()) {\
  133. r_error.error=Variant::CallError::CALL_ERROR_INVALID_ARGUMENT;\
  134. r_error.argument=m_arg;\
  135. r_error.expected=Variant::REAL;\
  136. r_ret=Variant();\
  137. return;\
  138. }
  139. #else
  140. #define VALIDATE_ARG_COUNT(m_count)
  141. #define VALIDATE_ARG_NUM(m_arg)
  142. #endif
  143. //using a switch, so the compiler generates a jumptable
  144. switch(p_func) {
  145. case MATH_SIN: {
  146. VALIDATE_ARG_COUNT(1);
  147. VALIDATE_ARG_NUM(0);
  148. r_ret=Math::sin((double)*p_args[0]);
  149. } break;
  150. case MATH_COS: {
  151. VALIDATE_ARG_COUNT(1);
  152. VALIDATE_ARG_NUM(0);
  153. r_ret=Math::cos((double)*p_args[0]);
  154. } break;
  155. case MATH_TAN: {
  156. VALIDATE_ARG_COUNT(1);
  157. VALIDATE_ARG_NUM(0);
  158. r_ret=Math::tan((double)*p_args[0]);
  159. } break;
  160. case MATH_SINH: {
  161. VALIDATE_ARG_COUNT(1);
  162. VALIDATE_ARG_NUM(0);
  163. r_ret=Math::sinh((double)*p_args[0]);
  164. } break;
  165. case MATH_COSH: {
  166. VALIDATE_ARG_COUNT(1);
  167. VALIDATE_ARG_NUM(0);
  168. r_ret=Math::cosh((double)*p_args[0]);
  169. } break;
  170. case MATH_TANH: {
  171. VALIDATE_ARG_COUNT(1);
  172. VALIDATE_ARG_NUM(0);
  173. r_ret=Math::tanh((double)*p_args[0]);
  174. } break;
  175. case MATH_ASIN: {
  176. VALIDATE_ARG_COUNT(1);
  177. VALIDATE_ARG_NUM(0);
  178. r_ret=Math::asin((double)*p_args[0]);
  179. } break;
  180. case MATH_ACOS: {
  181. VALIDATE_ARG_COUNT(1);
  182. VALIDATE_ARG_NUM(0);
  183. r_ret=Math::acos((double)*p_args[0]);
  184. } break;
  185. case MATH_ATAN: {
  186. VALIDATE_ARG_COUNT(1);
  187. VALIDATE_ARG_NUM(0);
  188. r_ret=Math::atan((double)*p_args[0]);
  189. } break;
  190. case MATH_ATAN2: {
  191. VALIDATE_ARG_COUNT(2);
  192. VALIDATE_ARG_NUM(0);
  193. VALIDATE_ARG_NUM(1);
  194. r_ret=Math::atan2((double)*p_args[0],(double)*p_args[1]);
  195. } break;
  196. case MATH_SQRT: {
  197. VALIDATE_ARG_COUNT(1);
  198. VALIDATE_ARG_NUM(0);
  199. r_ret=Math::sqrt((double)*p_args[0]);
  200. } break;
  201. case MATH_FMOD: {
  202. VALIDATE_ARG_COUNT(2);
  203. VALIDATE_ARG_NUM(0);
  204. VALIDATE_ARG_NUM(1);
  205. r_ret=Math::fmod((double)*p_args[0],(double)*p_args[1]);
  206. } break;
  207. case MATH_FPOSMOD: {
  208. VALIDATE_ARG_COUNT(2);
  209. VALIDATE_ARG_NUM(0);
  210. VALIDATE_ARG_NUM(1);
  211. r_ret=Math::fposmod((double)*p_args[0],(double)*p_args[1]);
  212. } break;
  213. case MATH_FLOOR: {
  214. VALIDATE_ARG_COUNT(1);
  215. VALIDATE_ARG_NUM(0);
  216. r_ret=Math::floor((double)*p_args[0]);
  217. } break;
  218. case MATH_CEIL: {
  219. VALIDATE_ARG_COUNT(1);
  220. VALIDATE_ARG_NUM(0);
  221. r_ret=Math::ceil((double)*p_args[0]);
  222. } break;
  223. case MATH_ROUND: {
  224. VALIDATE_ARG_COUNT(1);
  225. VALIDATE_ARG_NUM(0);
  226. r_ret=Math::round((double)*p_args[0]);
  227. } break;
  228. case MATH_ABS: {
  229. VALIDATE_ARG_COUNT(1);
  230. if (p_args[0]->get_type()==Variant::INT) {
  231. int64_t i = *p_args[0];
  232. r_ret=ABS(i);
  233. } else if (p_args[0]->get_type()==Variant::REAL) {
  234. double r = *p_args[0];
  235. r_ret=Math::abs(r);
  236. } else {
  237. r_error.error=Variant::CallError::CALL_ERROR_INVALID_ARGUMENT;
  238. r_error.argument=0;
  239. r_error.expected=Variant::REAL;
  240. r_ret=Variant();
  241. }
  242. } break;
  243. case MATH_SIGN: {
  244. VALIDATE_ARG_COUNT(1);
  245. if (p_args[0]->get_type()==Variant::INT) {
  246. int64_t i = *p_args[0];
  247. r_ret= i < 0 ? -1 : ( i > 0 ? +1 : 0);
  248. } else if (p_args[0]->get_type()==Variant::REAL) {
  249. real_t r = *p_args[0];
  250. r_ret= r < 0.0 ? -1.0 : ( r > 0.0 ? +1.0 : 0.0);
  251. } else {
  252. r_error.error=Variant::CallError::CALL_ERROR_INVALID_ARGUMENT;
  253. r_error.argument=0;
  254. r_error.expected=Variant::REAL;
  255. r_ret=Variant();
  256. }
  257. } break;
  258. case MATH_POW: {
  259. VALIDATE_ARG_COUNT(2);
  260. VALIDATE_ARG_NUM(0);
  261. VALIDATE_ARG_NUM(1);
  262. r_ret=Math::pow((double)*p_args[0],(double)*p_args[1]);
  263. } break;
  264. case MATH_LOG: {
  265. VALIDATE_ARG_COUNT(1);
  266. VALIDATE_ARG_NUM(0);
  267. r_ret=Math::log((double)*p_args[0]);
  268. } break;
  269. case MATH_EXP: {
  270. VALIDATE_ARG_COUNT(1);
  271. VALIDATE_ARG_NUM(0);
  272. r_ret=Math::exp((double)*p_args[0]);
  273. } break;
  274. case MATH_ISNAN: {
  275. VALIDATE_ARG_COUNT(1);
  276. VALIDATE_ARG_NUM(0);
  277. r_ret=Math::is_nan((double)*p_args[0]);
  278. } break;
  279. case MATH_ISINF: {
  280. VALIDATE_ARG_COUNT(1);
  281. VALIDATE_ARG_NUM(0);
  282. r_ret=Math::is_inf((double)*p_args[0]);
  283. } break;
  284. case MATH_EASE: {
  285. VALIDATE_ARG_COUNT(2);
  286. VALIDATE_ARG_NUM(0);
  287. VALIDATE_ARG_NUM(1);
  288. r_ret=Math::ease((double)*p_args[0],(double)*p_args[1]);
  289. } break;
  290. case MATH_DECIMALS: {
  291. VALIDATE_ARG_COUNT(1);
  292. VALIDATE_ARG_NUM(0);
  293. r_ret=Math::step_decimals((double)*p_args[0]);
  294. } break;
  295. case MATH_STEPIFY: {
  296. VALIDATE_ARG_COUNT(2);
  297. VALIDATE_ARG_NUM(0);
  298. VALIDATE_ARG_NUM(1);
  299. r_ret=Math::stepify((double)*p_args[0],(double)*p_args[1]);
  300. } break;
  301. case MATH_LERP: {
  302. VALIDATE_ARG_COUNT(3);
  303. VALIDATE_ARG_NUM(0);
  304. VALIDATE_ARG_NUM(1);
  305. VALIDATE_ARG_NUM(2);
  306. r_ret=Math::lerp((double)*p_args[0],(double)*p_args[1],(double)*p_args[2]);
  307. } break;
  308. case MATH_DECTIME: {
  309. VALIDATE_ARG_COUNT(3);
  310. VALIDATE_ARG_NUM(0);
  311. VALIDATE_ARG_NUM(1);
  312. VALIDATE_ARG_NUM(2);
  313. r_ret=Math::dectime((double)*p_args[0],(double)*p_args[1],(double)*p_args[2]);
  314. } break;
  315. case MATH_RANDOMIZE: {
  316. Math::randomize();
  317. r_ret=Variant();
  318. } break;
  319. case MATH_RAND: {
  320. r_ret=Math::rand();
  321. } break;
  322. case MATH_RANDF: {
  323. r_ret=Math::randf();
  324. } break;
  325. case MATH_RANDOM: {
  326. VALIDATE_ARG_COUNT(2);
  327. VALIDATE_ARG_NUM(0);
  328. VALIDATE_ARG_NUM(1);
  329. r_ret=Math::random((double)*p_args[0],(double)*p_args[1]);
  330. } break;
  331. case MATH_SEED: {
  332. VALIDATE_ARG_COUNT(1);
  333. VALIDATE_ARG_NUM(0);
  334. uint64_t seed=*p_args[0];
  335. Math::seed(seed);
  336. r_ret=Variant();
  337. } break;
  338. case MATH_RANDSEED: {
  339. VALIDATE_ARG_COUNT(1);
  340. VALIDATE_ARG_NUM(0);
  341. uint64_t seed=*p_args[0];
  342. int ret = Math::rand_from_seed(&seed);
  343. Array reta;
  344. reta.push_back(ret);
  345. reta.push_back(seed);
  346. r_ret=reta;
  347. } break;
  348. case MATH_DEG2RAD: {
  349. VALIDATE_ARG_COUNT(1);
  350. VALIDATE_ARG_NUM(0);
  351. r_ret=Math::deg2rad((double)*p_args[0]);
  352. } break;
  353. case MATH_RAD2DEG: {
  354. VALIDATE_ARG_COUNT(1);
  355. VALIDATE_ARG_NUM(0);
  356. r_ret=Math::rad2deg((double)*p_args[0]);
  357. } break;
  358. case MATH_LINEAR2DB: {
  359. VALIDATE_ARG_COUNT(1);
  360. VALIDATE_ARG_NUM(0);
  361. r_ret=Math::linear2db((double)*p_args[0]);
  362. } break;
  363. case MATH_DB2LINEAR: {
  364. VALIDATE_ARG_COUNT(1);
  365. VALIDATE_ARG_NUM(0);
  366. r_ret=Math::db2linear((double)*p_args[0]);
  367. } break;
  368. case LOGIC_MAX: {
  369. VALIDATE_ARG_COUNT(2);
  370. if (p_args[0]->get_type()==Variant::INT && p_args[1]->get_type()==Variant::INT) {
  371. int64_t a = *p_args[0];
  372. int64_t b = *p_args[1];
  373. r_ret=MAX(a,b);
  374. } else {
  375. VALIDATE_ARG_NUM(0);
  376. VALIDATE_ARG_NUM(1);
  377. real_t a = *p_args[0];
  378. real_t b = *p_args[1];
  379. r_ret=MAX(a,b);
  380. }
  381. } break;
  382. case LOGIC_MIN: {
  383. VALIDATE_ARG_COUNT(2);
  384. if (p_args[0]->get_type()==Variant::INT && p_args[1]->get_type()==Variant::INT) {
  385. int64_t a = *p_args[0];
  386. int64_t b = *p_args[1];
  387. r_ret=MIN(a,b);
  388. } else {
  389. VALIDATE_ARG_NUM(0);
  390. VALIDATE_ARG_NUM(1);
  391. real_t a = *p_args[0];
  392. real_t b = *p_args[1];
  393. r_ret=MIN(a,b);
  394. }
  395. } break;
  396. case LOGIC_CLAMP: {
  397. VALIDATE_ARG_COUNT(3);
  398. if (p_args[0]->get_type()==Variant::INT && p_args[1]->get_type()==Variant::INT && p_args[2]->get_type()==Variant::INT) {
  399. int64_t a = *p_args[0];
  400. int64_t b = *p_args[1];
  401. int64_t c = *p_args[2];
  402. r_ret=CLAMP(a,b,c);
  403. } else {
  404. VALIDATE_ARG_NUM(0);
  405. VALIDATE_ARG_NUM(1);
  406. VALIDATE_ARG_NUM(2);
  407. real_t a = *p_args[0];
  408. real_t b = *p_args[1];
  409. real_t c = *p_args[2];
  410. r_ret=CLAMP(a,b,c);
  411. }
  412. } break;
  413. case LOGIC_NEAREST_PO2: {
  414. VALIDATE_ARG_COUNT(1);
  415. VALIDATE_ARG_NUM(0);
  416. int64_t num = *p_args[0];
  417. r_ret = nearest_power_of_2(num);
  418. } break;
  419. case OBJ_WEAKREF: {
  420. VALIDATE_ARG_COUNT(1);
  421. if (p_args[0]->get_type()!=Variant::OBJECT) {
  422. r_error.error=Variant::CallError::CALL_ERROR_INVALID_ARGUMENT;
  423. r_error.argument=0;
  424. r_error.expected=Variant::OBJECT;
  425. r_ret=Variant();
  426. return;
  427. }
  428. if (p_args[0]->is_ref()) {
  429. REF r = *p_args[0];
  430. if (!r.is_valid()) {
  431. r_ret=Variant();
  432. return;
  433. }
  434. Ref<WeakRef> wref = memnew( WeakRef );
  435. wref->set_ref(r);
  436. r_ret=wref;
  437. } else {
  438. Object *obj = *p_args[0];
  439. if (!obj) {
  440. r_ret=Variant();
  441. return;
  442. }
  443. Ref<WeakRef> wref = memnew( WeakRef );
  444. wref->set_obj(obj);
  445. r_ret=wref;
  446. }
  447. } break;
  448. case FUNC_FUNCREF: {
  449. VALIDATE_ARG_COUNT(2);
  450. if (p_args[0]->get_type()!=Variant::OBJECT) {
  451. r_error.error=Variant::CallError::CALL_ERROR_INVALID_ARGUMENT;
  452. r_error.argument=0;
  453. r_error.expected=Variant::OBJECT;
  454. r_ret=Variant();
  455. return;
  456. }
  457. if (p_args[1]->get_type()!=Variant::STRING && p_args[1]->get_type()!=Variant::NODE_PATH) {
  458. r_error.error=Variant::CallError::CALL_ERROR_INVALID_ARGUMENT;
  459. r_error.argument=1;
  460. r_error.expected=Variant::STRING;
  461. r_ret=Variant();
  462. return;
  463. }
  464. Ref<FuncRef> fr = memnew( FuncRef);
  465. fr->set_instance(*p_args[0]);
  466. fr->set_function(*p_args[1]);
  467. r_ret=fr;
  468. } break;
  469. case TYPE_CONVERT: {
  470. VALIDATE_ARG_COUNT(2);
  471. VALIDATE_ARG_NUM(1);
  472. int type=*p_args[1];
  473. if (type<0 || type>=Variant::VARIANT_MAX) {
  474. r_ret=RTR("Invalid type argument to convert(), use TYPE_* constants.");
  475. r_error.error=Variant::CallError::CALL_ERROR_INVALID_ARGUMENT;
  476. r_error.argument=0;
  477. r_error.expected=Variant::INT;
  478. return;
  479. } else {
  480. r_ret=Variant::construct(Variant::Type(type),p_args,1,r_error);
  481. }
  482. } break;
  483. case TYPE_OF: {
  484. VALIDATE_ARG_COUNT(1);
  485. r_ret = p_args[0]->get_type();
  486. } break;
  487. case TYPE_EXISTS: {
  488. VALIDATE_ARG_COUNT(1);
  489. r_ret = ClassDB::class_exists(*p_args[0]);
  490. } break;
  491. case TEXT_CHAR: {
  492. VALIDATE_ARG_COUNT(1);
  493. VALIDATE_ARG_NUM(0);
  494. CharType result[2] = {*p_args[0], 0};
  495. r_ret=String(result);
  496. } break;
  497. case TEXT_STR: {
  498. String str;
  499. for(int i=0;i<p_arg_count;i++) {
  500. String os = p_args[i]->operator String();
  501. if (i==0)
  502. str=os;
  503. else
  504. str+=os;
  505. }
  506. r_ret=str;
  507. } break;
  508. case TEXT_PRINT: {
  509. String str;
  510. for(int i=0;i<p_arg_count;i++) {
  511. str+=p_args[i]->operator String();
  512. }
  513. //str+="\n";
  514. print_line(str);
  515. r_ret=Variant();
  516. } break;
  517. case TEXT_PRINT_TABBED: {
  518. String str;
  519. for(int i=0;i<p_arg_count;i++) {
  520. if (i)
  521. str+="\t";
  522. str+=p_args[i]->operator String();
  523. }
  524. //str+="\n";
  525. print_line(str);
  526. r_ret=Variant();
  527. } break;
  528. case TEXT_PRINT_SPACED: {
  529. String str;
  530. for(int i=0;i<p_arg_count;i++) {
  531. if (i)
  532. str+=" ";
  533. str+=p_args[i]->operator String();
  534. }
  535. //str+="\n";
  536. print_line(str);
  537. r_ret=Variant();
  538. } break;
  539. case TEXT_PRINTERR: {
  540. String str;
  541. for(int i=0;i<p_arg_count;i++) {
  542. str+=p_args[i]->operator String();
  543. }
  544. //str+="\n";
  545. OS::get_singleton()->printerr("%s\n",str.utf8().get_data());
  546. r_ret=Variant();
  547. } break;
  548. case TEXT_PRINTRAW: {
  549. String str;
  550. for(int i=0;i<p_arg_count;i++) {
  551. str+=p_args[i]->operator String();
  552. }
  553. //str+="\n";
  554. OS::get_singleton()->print("%s",str.utf8().get_data());
  555. r_ret=Variant();
  556. } break;
  557. case VAR_TO_STR: {
  558. VALIDATE_ARG_COUNT(1);
  559. String vars;
  560. VariantWriter::write_to_string(*p_args[0],vars);
  561. r_ret=vars;
  562. } break;
  563. case STR_TO_VAR: {
  564. VALIDATE_ARG_COUNT(1);
  565. if (p_args[0]->get_type()!=Variant::STRING) {
  566. r_error.error=Variant::CallError::CALL_ERROR_INVALID_ARGUMENT;
  567. r_error.argument=0;
  568. r_error.expected=Variant::STRING;
  569. r_ret=Variant();
  570. return;
  571. }
  572. VariantParser::StreamString ss;
  573. ss.s=*p_args[0];
  574. String errs;
  575. int line;
  576. Error err = VariantParser::parse(&ss,r_ret,errs,line);
  577. if (err!=OK) {
  578. r_error.error=Variant::CallError::CALL_ERROR_INVALID_ARGUMENT;
  579. r_error.argument=0;
  580. r_error.expected=Variant::STRING;
  581. r_ret="Parse error at line "+itos(line)+": "+errs;
  582. return;
  583. }
  584. } break;
  585. case VAR_TO_BYTES: {
  586. VALIDATE_ARG_COUNT(1);
  587. PoolByteArray barr;
  588. int len;
  589. Error err = encode_variant(*p_args[0],NULL,len);
  590. if (err) {
  591. r_error.error=Variant::CallError::CALL_ERROR_INVALID_ARGUMENT;
  592. r_error.argument=0;
  593. r_error.expected=Variant::NIL;
  594. r_ret="Unexpected error encoding variable to bytes, likely unserializable type found (Object or RID).";
  595. return;
  596. }
  597. barr.resize(len);
  598. {
  599. PoolByteArray::Write w = barr.write();
  600. encode_variant(*p_args[0],w.ptr(),len);
  601. }
  602. r_ret=barr;
  603. } break;
  604. case BYTES_TO_VAR: {
  605. VALIDATE_ARG_COUNT(1);
  606. if (p_args[0]->get_type()!=Variant::POOL_BYTE_ARRAY) {
  607. r_error.error=Variant::CallError::CALL_ERROR_INVALID_ARGUMENT;
  608. r_error.argument=0;
  609. r_error.expected=Variant::POOL_BYTE_ARRAY;
  610. r_ret=Variant();
  611. return;
  612. }
  613. PoolByteArray varr=*p_args[0];
  614. Variant ret;
  615. {
  616. PoolByteArray::Read r=varr.read();
  617. Error err = decode_variant(ret,r.ptr(),varr.size(),NULL);
  618. if (err!=OK) {
  619. r_ret=RTR("Not enough bytes for decoding bytes, or invalid format.");
  620. r_error.error=Variant::CallError::CALL_ERROR_INVALID_ARGUMENT;
  621. r_error.argument=0;
  622. r_error.expected=Variant::POOL_BYTE_ARRAY;
  623. return;
  624. }
  625. }
  626. r_ret=ret;
  627. } break;
  628. case GEN_RANGE: {
  629. switch(p_arg_count) {
  630. case 0: {
  631. r_error.error=Variant::CallError::CALL_ERROR_TOO_FEW_ARGUMENTS;
  632. r_error.argument=1;
  633. r_ret=Variant();
  634. } break;
  635. case 1: {
  636. VALIDATE_ARG_NUM(0);
  637. int count=*p_args[0];
  638. Array arr;
  639. if (count<=0) {
  640. r_ret=arr;
  641. return;
  642. }
  643. Error err = arr.resize(count);
  644. if (err!=OK) {
  645. r_error.error=Variant::CallError::CALL_ERROR_INVALID_METHOD;
  646. r_ret=Variant();
  647. return;
  648. }
  649. for(int i=0;i<count;i++) {
  650. arr[i]=i;
  651. }
  652. r_ret=arr;
  653. } break;
  654. case 2: {
  655. VALIDATE_ARG_NUM(0);
  656. VALIDATE_ARG_NUM(1);
  657. int from=*p_args[0];
  658. int to=*p_args[1];
  659. Array arr;
  660. if (from>=to) {
  661. r_ret=arr;
  662. return;
  663. }
  664. Error err = arr.resize(to-from);
  665. if (err!=OK) {
  666. r_error.error=Variant::CallError::CALL_ERROR_INVALID_METHOD;
  667. r_ret=Variant();
  668. return;
  669. }
  670. for(int i=from;i<to;i++)
  671. arr[i-from]=i;
  672. r_ret=arr;
  673. } break;
  674. case 3: {
  675. VALIDATE_ARG_NUM(0);
  676. VALIDATE_ARG_NUM(1);
  677. VALIDATE_ARG_NUM(2);
  678. int from=*p_args[0];
  679. int to=*p_args[1];
  680. int incr=*p_args[2];
  681. if (incr==0) {
  682. r_ret=RTR("step argument is zero!");
  683. r_error.error=Variant::CallError::CALL_ERROR_INVALID_METHOD;
  684. return;
  685. }
  686. Array arr;
  687. if (from>=to && incr>0) {
  688. r_ret=arr;
  689. return;
  690. }
  691. if (from<=to && incr<0) {
  692. r_ret=arr;
  693. return;
  694. }
  695. //calculate how many
  696. int count=0;
  697. if (incr>0) {
  698. count=((to-from-1)/incr)+1;
  699. } else {
  700. count=((from-to-1)/-incr)+1;
  701. }
  702. Error err = arr.resize(count);
  703. if (err!=OK) {
  704. r_error.error=Variant::CallError::CALL_ERROR_INVALID_METHOD;
  705. r_ret=Variant();
  706. return;
  707. }
  708. if (incr>0) {
  709. int idx=0;
  710. for(int i=from;i<to;i+=incr) {
  711. arr[idx++]=i;
  712. }
  713. } else {
  714. int idx=0;
  715. for(int i=from;i>to;i+=incr) {
  716. arr[idx++]=i;
  717. }
  718. }
  719. r_ret=arr;
  720. } break;
  721. default: {
  722. r_error.error=Variant::CallError::CALL_ERROR_TOO_MANY_ARGUMENTS;
  723. r_error.argument=3;
  724. r_ret=Variant();
  725. } break;
  726. }
  727. } break;
  728. case RESOURCE_LOAD: {
  729. VALIDATE_ARG_COUNT(1);
  730. if (p_args[0]->get_type()!=Variant::STRING) {
  731. r_error.error=Variant::CallError::CALL_ERROR_INVALID_ARGUMENT;
  732. r_error.argument=0;
  733. r_error.expected=Variant::STRING;
  734. r_ret=Variant();
  735. } else {
  736. r_ret=ResourceLoader::load(*p_args[0]);
  737. }
  738. } break;
  739. case INST2DICT: {
  740. VALIDATE_ARG_COUNT(1);
  741. if (p_args[0]->get_type()==Variant::NIL) {
  742. r_ret=Variant();
  743. } else if (p_args[0]->get_type()!=Variant::OBJECT) {
  744. r_error.error=Variant::CallError::CALL_ERROR_INVALID_ARGUMENT;
  745. r_error.argument=0;
  746. r_ret=Variant();
  747. } else {
  748. Object *obj = *p_args[0];
  749. if (!obj) {
  750. r_ret=Variant();
  751. } else if (!obj->get_script_instance() || obj->get_script_instance()->get_language()!=GDScriptLanguage::get_singleton()) {
  752. r_error.error=Variant::CallError::CALL_ERROR_INVALID_ARGUMENT;
  753. r_error.argument=0;
  754. r_error.expected=Variant::DICTIONARY;
  755. r_ret=RTR("Not a script with an instance");
  756. return;
  757. } else {
  758. GDInstance *ins = static_cast<GDInstance*>(obj->get_script_instance());
  759. Ref<GDScript> base = ins->get_script();
  760. if (base.is_null()) {
  761. r_error.error=Variant::CallError::CALL_ERROR_INVALID_ARGUMENT;
  762. r_error.argument=0;
  763. r_error.expected=Variant::DICTIONARY;
  764. r_ret=RTR("Not based on a script");
  765. return;
  766. }
  767. GDScript *p = base.ptr();
  768. Vector<StringName> sname;
  769. while(p->_owner) {
  770. sname.push_back(p->name);
  771. p=p->_owner;
  772. }
  773. sname.invert();
  774. if (!p->path.is_resource_file()) {
  775. r_error.error=Variant::CallError::CALL_ERROR_INVALID_ARGUMENT;
  776. r_error.argument=0;
  777. r_error.expected=Variant::DICTIONARY;
  778. r_ret=Variant();
  779. r_ret=RTR("Not based on a resource file");
  780. return;
  781. }
  782. NodePath cp(sname,Vector<StringName>(),false);
  783. Dictionary d;
  784. d["@subpath"]=cp;
  785. d["@path"]=p->path;
  786. p = base.ptr();
  787. while(p) {
  788. for(Set<StringName>::Element *E=p->members.front();E;E=E->next()) {
  789. Variant value;
  790. if (ins->get(E->get(),value)) {
  791. String k = E->get();
  792. if (!d.has(k)) {
  793. d[k]=value;
  794. }
  795. }
  796. }
  797. p=p->_base;
  798. }
  799. r_ret=d;
  800. }
  801. }
  802. } break;
  803. case DICT2INST: {
  804. VALIDATE_ARG_COUNT(1);
  805. if (p_args[0]->get_type()!=Variant::DICTIONARY) {
  806. r_error.error=Variant::CallError::CALL_ERROR_INVALID_ARGUMENT;
  807. r_error.argument=0;
  808. r_error.expected=Variant::DICTIONARY;
  809. r_ret=Variant();
  810. return;
  811. }
  812. Dictionary d = *p_args[0];
  813. if (!d.has("@path")) {
  814. r_error.error=Variant::CallError::CALL_ERROR_INVALID_ARGUMENT;
  815. r_error.argument=0;
  816. r_error.expected=Variant::OBJECT;
  817. r_ret=RTR("Invalid instance dictionary format (missing @path)");
  818. return;
  819. }
  820. Ref<Script> scr = ResourceLoader::load(d["@path"]);
  821. if (!scr.is_valid()) {
  822. r_error.error=Variant::CallError::CALL_ERROR_INVALID_ARGUMENT;
  823. r_error.argument=0;
  824. r_error.expected=Variant::OBJECT;
  825. r_ret=RTR("Invalid instance dictionary format (can't load script at @path)");
  826. return;
  827. }
  828. Ref<GDScript> gdscr = scr;
  829. if (!gdscr.is_valid()) {
  830. r_error.error=Variant::CallError::CALL_ERROR_INVALID_ARGUMENT;
  831. r_error.argument=0;
  832. r_error.expected=Variant::OBJECT;
  833. r_ret=Variant();
  834. r_ret=RTR("Invalid instance dictionary format (invalid script at @path)");
  835. return;
  836. }
  837. NodePath sub;
  838. if (d.has("@subpath")) {
  839. sub=d["@subpath"];
  840. }
  841. for(int i=0;i<sub.get_name_count();i++) {
  842. gdscr = gdscr->subclasses[ sub.get_name(i)];
  843. if (!gdscr.is_valid()) {
  844. r_error.error=Variant::CallError::CALL_ERROR_INVALID_ARGUMENT;
  845. r_error.argument=0;
  846. r_error.expected=Variant::OBJECT;
  847. r_ret=Variant();
  848. r_ret=RTR("Invalid instance dictionary (invalid subclasses)");
  849. return;
  850. }
  851. }
  852. r_ret = gdscr->_new(NULL,0,r_error);
  853. GDInstance *ins = static_cast<GDInstance*>(static_cast<Object*>(r_ret)->get_script_instance());
  854. Ref<GDScript> gd_ref = ins->get_script();
  855. for(Map<StringName,GDScript::MemberInfo>::Element *E = gd_ref->member_indices.front(); E; E = E->next()) {
  856. if(d.has(E->key())) {
  857. ins->members[E->get().index] = d[E->key()];
  858. }
  859. }
  860. } break;
  861. case VALIDATE_JSON: {
  862. VALIDATE_ARG_COUNT(1);
  863. if (p_args[0]->get_type()!=Variant::STRING) {
  864. r_error.error=Variant::CallError::CALL_ERROR_INVALID_ARGUMENT;
  865. r_error.argument=0;
  866. r_error.expected=Variant::STRING;
  867. r_ret=Variant();
  868. return;
  869. }
  870. String errs;
  871. int errl;
  872. Error err = JSON::parse(*p_args[0],r_ret,errs,errl);
  873. if (err!=OK) {
  874. r_ret=itos(errl)+":"+errs;
  875. } else {
  876. r_ret="";
  877. }
  878. } break;
  879. case PARSE_JSON: {
  880. VALIDATE_ARG_COUNT(1);
  881. if (p_args[0]->get_type()!=Variant::STRING) {
  882. r_error.error=Variant::CallError::CALL_ERROR_INVALID_ARGUMENT;
  883. r_error.argument=0;
  884. r_error.expected=Variant::STRING;
  885. r_ret=Variant();
  886. return;
  887. }
  888. String errs;
  889. int errl;
  890. Error err = JSON::parse(*p_args[0],r_ret,errs,errl);
  891. if (err!=OK) {
  892. r_ret=Variant();
  893. }
  894. } break;
  895. case TO_JSON: {
  896. VALIDATE_ARG_COUNT(1);
  897. r_ret = JSON::print(*p_args[0]);
  898. } break;
  899. case HASH: {
  900. VALIDATE_ARG_COUNT(1);
  901. r_ret=p_args[0]->hash();
  902. } break;
  903. case COLOR8: {
  904. if (p_arg_count<3) {
  905. r_error.error=Variant::CallError::CALL_ERROR_TOO_FEW_ARGUMENTS;
  906. r_error.argument=3;
  907. r_ret=Variant();
  908. return;
  909. }
  910. if (p_arg_count>4) {
  911. r_error.error=Variant::CallError::CALL_ERROR_TOO_MANY_ARGUMENTS;
  912. r_error.argument=4;
  913. r_ret=Variant();
  914. return;
  915. }
  916. VALIDATE_ARG_NUM(0);
  917. VALIDATE_ARG_NUM(1);
  918. VALIDATE_ARG_NUM(2);
  919. Color color((float)*p_args[0]/255.0f,(float)*p_args[1]/255.0f,(float)*p_args[2]/255.0f);
  920. if (p_arg_count==4) {
  921. VALIDATE_ARG_NUM(3);
  922. color.a=(float)*p_args[3]/255.0f;
  923. }
  924. r_ret=color;
  925. } break;
  926. case COLORN: {
  927. if (p_arg_count<1) {
  928. r_error.error=Variant::CallError::CALL_ERROR_TOO_FEW_ARGUMENTS;
  929. r_error.argument=1;
  930. r_ret=Variant();
  931. return;
  932. }
  933. if (p_arg_count>2) {
  934. r_error.error=Variant::CallError::CALL_ERROR_TOO_MANY_ARGUMENTS;
  935. r_error.argument=2;
  936. r_ret=Variant();
  937. return;
  938. }
  939. if (p_args[0]->get_type()!=Variant::STRING) {
  940. r_error.error=Variant::CallError::CALL_ERROR_INVALID_ARGUMENT;
  941. r_error.argument=0;
  942. r_ret=Variant();
  943. } else {
  944. Color color = Color::named(*p_args[0]);
  945. if (p_arg_count==2) {
  946. VALIDATE_ARG_NUM(1);
  947. color.a=*p_args[1];
  948. }
  949. r_ret=color;
  950. }
  951. } break;
  952. case PRINT_STACK: {
  953. ScriptLanguage* script = GDScriptLanguage::get_singleton();
  954. for (int i=0; i < script->debug_get_stack_level_count(); i++) {
  955. print_line("Frame "+itos(i)+" - "+script->debug_get_stack_level_source(i)+":"+itos(script->debug_get_stack_level_line(i))+" in function '"+script->debug_get_stack_level_function(i)+"'");
  956. };
  957. } break;
  958. case INSTANCE_FROM_ID: {
  959. VALIDATE_ARG_COUNT(1);
  960. if (p_args[0]->get_type()!=Variant::INT && p_args[0]->get_type()!=Variant::REAL) {
  961. r_error.error=Variant::CallError::CALL_ERROR_INVALID_ARGUMENT;
  962. r_error.argument=0;
  963. r_error.expected=Variant::INT;
  964. r_ret=Variant();
  965. break;
  966. }
  967. uint32_t id=*p_args[0];
  968. r_ret=ObjectDB::get_instance(id);
  969. } break;
  970. case FUNC_MAX: {
  971. ERR_FAIL();
  972. } break;
  973. }
  974. }
  975. bool GDFunctions::is_deterministic(Function p_func) {
  976. //man i couldn't have chosen a worse function name,
  977. //way too controversial..
  978. switch(p_func) {
  979. case MATH_SIN:
  980. case MATH_COS:
  981. case MATH_TAN:
  982. case MATH_SINH:
  983. case MATH_COSH:
  984. case MATH_TANH:
  985. case MATH_ASIN:
  986. case MATH_ACOS:
  987. case MATH_ATAN:
  988. case MATH_ATAN2:
  989. case MATH_SQRT:
  990. case MATH_FMOD:
  991. case MATH_FPOSMOD:
  992. case MATH_FLOOR:
  993. case MATH_CEIL:
  994. case MATH_ROUND:
  995. case MATH_ABS:
  996. case MATH_SIGN:
  997. case MATH_POW:
  998. case MATH_LOG:
  999. case MATH_EXP:
  1000. case MATH_ISNAN:
  1001. case MATH_ISINF:
  1002. case MATH_EASE:
  1003. case MATH_DECIMALS:
  1004. case MATH_STEPIFY:
  1005. case MATH_LERP:
  1006. case MATH_DECTIME:
  1007. case MATH_DEG2RAD:
  1008. case MATH_RAD2DEG:
  1009. case MATH_LINEAR2DB:
  1010. case MATH_DB2LINEAR:
  1011. case LOGIC_MAX:
  1012. case LOGIC_MIN:
  1013. case LOGIC_CLAMP:
  1014. case LOGIC_NEAREST_PO2:
  1015. case TYPE_CONVERT:
  1016. case TYPE_OF:
  1017. case TYPE_EXISTS:
  1018. case TEXT_CHAR:
  1019. case TEXT_STR:
  1020. case COLOR8:
  1021. // enable for debug only, otherwise not desirable - case GEN_RANGE:
  1022. return true;
  1023. default:
  1024. return false;
  1025. }
  1026. return false;
  1027. }
  1028. MethodInfo GDFunctions::get_info(Function p_func) {
  1029. #ifdef TOOLS_ENABLED
  1030. //using a switch, so the compiler generates a jumptable
  1031. switch(p_func) {
  1032. case MATH_SIN: {
  1033. MethodInfo mi("sin",PropertyInfo(Variant::REAL,"s"));
  1034. mi.return_val.type=Variant::REAL;
  1035. return mi;
  1036. } break;
  1037. case MATH_COS: {
  1038. MethodInfo mi("cos",PropertyInfo(Variant::REAL,"s"));
  1039. mi.return_val.type=Variant::REAL;
  1040. return mi;
  1041. } break;
  1042. case MATH_TAN: {
  1043. MethodInfo mi("tan",PropertyInfo(Variant::REAL,"s"));
  1044. mi.return_val.type=Variant::REAL;
  1045. return mi;
  1046. } break;
  1047. case MATH_SINH: {
  1048. MethodInfo mi("sinh",PropertyInfo(Variant::REAL,"s"));
  1049. mi.return_val.type=Variant::REAL;
  1050. return mi;
  1051. } break;
  1052. case MATH_COSH: {
  1053. MethodInfo mi("cosh",PropertyInfo(Variant::REAL,"s"));
  1054. mi.return_val.type=Variant::REAL;
  1055. return mi;
  1056. } break;
  1057. case MATH_TANH: {
  1058. MethodInfo mi("tanh",PropertyInfo(Variant::REAL,"s"));
  1059. mi.return_val.type=Variant::REAL;
  1060. return mi;
  1061. } break;
  1062. case MATH_ASIN: {
  1063. MethodInfo mi("asin",PropertyInfo(Variant::REAL,"s"));
  1064. mi.return_val.type=Variant::REAL;
  1065. return mi;
  1066. } break;
  1067. case MATH_ACOS: {
  1068. MethodInfo mi("acos",PropertyInfo(Variant::REAL,"s"));
  1069. mi.return_val.type=Variant::REAL;
  1070. return mi;
  1071. } break;
  1072. case MATH_ATAN: {
  1073. MethodInfo mi("atan",PropertyInfo(Variant::REAL,"s"));
  1074. mi.return_val.type=Variant::REAL;
  1075. return mi;
  1076. } break;
  1077. case MATH_ATAN2: {
  1078. MethodInfo mi("atan2",PropertyInfo(Variant::REAL,"x"),PropertyInfo(Variant::REAL,"y"));
  1079. mi.return_val.type=Variant::REAL;
  1080. return mi;
  1081. } break;
  1082. case MATH_SQRT: {
  1083. MethodInfo mi("sqrt",PropertyInfo(Variant::REAL,"s"));
  1084. mi.return_val.type=Variant::REAL;
  1085. return mi;
  1086. } break;
  1087. case MATH_FMOD: {
  1088. MethodInfo mi("fmod",PropertyInfo(Variant::REAL,"x"),PropertyInfo(Variant::REAL,"y"));
  1089. mi.return_val.type=Variant::REAL;
  1090. return mi;
  1091. } break;
  1092. case MATH_FPOSMOD: {
  1093. MethodInfo mi("fposmod",PropertyInfo(Variant::REAL,"x"),PropertyInfo(Variant::REAL,"y"));
  1094. mi.return_val.type=Variant::REAL;
  1095. return mi;
  1096. } break;
  1097. case MATH_FLOOR: {
  1098. MethodInfo mi("floor",PropertyInfo(Variant::REAL,"s"));
  1099. mi.return_val.type=Variant::REAL;
  1100. return mi;
  1101. } break;
  1102. case MATH_CEIL: {
  1103. MethodInfo mi("ceil",PropertyInfo(Variant::REAL,"s"));
  1104. mi.return_val.type=Variant::REAL;
  1105. return mi;
  1106. } break;
  1107. case MATH_ROUND: {
  1108. MethodInfo mi("round",PropertyInfo(Variant::REAL,"s"));
  1109. mi.return_val.type=Variant::REAL;
  1110. return mi;
  1111. } break;
  1112. case MATH_ABS: {
  1113. MethodInfo mi("abs",PropertyInfo(Variant::REAL,"s"));
  1114. mi.return_val.type=Variant::REAL;
  1115. return mi;
  1116. } break;
  1117. case MATH_SIGN: {
  1118. MethodInfo mi("sign",PropertyInfo(Variant::REAL,"s"));
  1119. mi.return_val.type=Variant::REAL;
  1120. return mi;
  1121. } break;
  1122. case MATH_POW: {
  1123. MethodInfo mi("pow",PropertyInfo(Variant::REAL,"x"),PropertyInfo(Variant::REAL,"y"));
  1124. mi.return_val.type=Variant::REAL;
  1125. return mi;
  1126. } break;
  1127. case MATH_LOG: {
  1128. MethodInfo mi("log",PropertyInfo(Variant::REAL,"s"));
  1129. mi.return_val.type=Variant::REAL;
  1130. return mi;
  1131. } break;
  1132. case MATH_EXP: {
  1133. MethodInfo mi("exp",PropertyInfo(Variant::REAL,"s"));
  1134. mi.return_val.type=Variant::REAL;
  1135. return mi;
  1136. } break;
  1137. case MATH_ISNAN: {
  1138. MethodInfo mi("is_nan",PropertyInfo(Variant::REAL,"s"));
  1139. mi.return_val.type=Variant::REAL;
  1140. return mi;
  1141. } break;
  1142. case MATH_ISINF: {
  1143. MethodInfo mi("is_inf",PropertyInfo(Variant::REAL,"s"));
  1144. mi.return_val.type=Variant::REAL;
  1145. return mi;
  1146. } break;
  1147. case MATH_EASE: {
  1148. MethodInfo mi("ease",PropertyInfo(Variant::REAL,"s"),PropertyInfo(Variant::REAL,"curve"));
  1149. mi.return_val.type=Variant::REAL;
  1150. return mi;
  1151. } break;
  1152. case MATH_DECIMALS: {
  1153. MethodInfo mi("decimals",PropertyInfo(Variant::REAL,"step"));
  1154. mi.return_val.type=Variant::REAL;
  1155. return mi;
  1156. } break;
  1157. case MATH_STEPIFY: {
  1158. MethodInfo mi("stepify",PropertyInfo(Variant::REAL,"s"),PropertyInfo(Variant::REAL,"step"));
  1159. mi.return_val.type=Variant::REAL;
  1160. return mi;
  1161. } break;
  1162. case MATH_LERP: {
  1163. MethodInfo mi("lerp",PropertyInfo(Variant::REAL,"from"),PropertyInfo(Variant::REAL,"to"), PropertyInfo(Variant::REAL,"weight"));
  1164. mi.return_val.type=Variant::REAL;
  1165. return mi;
  1166. } break;
  1167. case MATH_DECTIME: {
  1168. MethodInfo mi("dectime",PropertyInfo(Variant::REAL,"value"),PropertyInfo(Variant::REAL,"amount"),PropertyInfo(Variant::REAL,"step"));
  1169. mi.return_val.type=Variant::REAL;
  1170. return mi;
  1171. } break;
  1172. case MATH_RANDOMIZE: {
  1173. MethodInfo mi("randomize");
  1174. mi.return_val.type=Variant::NIL;
  1175. return mi;
  1176. } break;
  1177. case MATH_RAND: {
  1178. MethodInfo mi("randi");
  1179. mi.return_val.type=Variant::INT;
  1180. return mi;
  1181. } break;
  1182. case MATH_RANDF: {
  1183. MethodInfo mi("randf");
  1184. mi.return_val.type=Variant::REAL;
  1185. return mi;
  1186. } break;
  1187. case MATH_RANDOM: {
  1188. MethodInfo mi("rand_range",PropertyInfo(Variant::REAL,"from"),PropertyInfo(Variant::REAL,"to"));
  1189. mi.return_val.type=Variant::REAL;
  1190. return mi;
  1191. } break;
  1192. case MATH_SEED: {
  1193. MethodInfo mi("seed",PropertyInfo(Variant::INT,"seed"));
  1194. mi.return_val.type=Variant::NIL;
  1195. return mi;
  1196. } break;
  1197. case MATH_RANDSEED: {
  1198. MethodInfo mi("rand_seed",PropertyInfo(Variant::INT,"seed"));
  1199. mi.return_val.type=Variant::ARRAY;
  1200. return mi;
  1201. } break;
  1202. case MATH_DEG2RAD: {
  1203. MethodInfo mi("deg2rad",PropertyInfo(Variant::REAL,"deg"));
  1204. mi.return_val.type=Variant::REAL;
  1205. return mi;
  1206. } break;
  1207. case MATH_RAD2DEG: {
  1208. MethodInfo mi("rad2deg",PropertyInfo(Variant::REAL,"rad"));
  1209. mi.return_val.type=Variant::REAL;
  1210. return mi;
  1211. } break;
  1212. case MATH_LINEAR2DB: {
  1213. MethodInfo mi("linear2db",PropertyInfo(Variant::REAL,"nrg"));
  1214. mi.return_val.type=Variant::REAL;
  1215. return mi;
  1216. } break;
  1217. case MATH_DB2LINEAR: {
  1218. MethodInfo mi("db2linear",PropertyInfo(Variant::REAL,"db"));
  1219. mi.return_val.type=Variant::REAL;
  1220. return mi;
  1221. } break;
  1222. case LOGIC_MAX: {
  1223. MethodInfo mi("max",PropertyInfo(Variant::REAL,"a"),PropertyInfo(Variant::REAL,"b"));
  1224. mi.return_val.type=Variant::REAL;
  1225. return mi;
  1226. } break;
  1227. case LOGIC_MIN: {
  1228. MethodInfo mi("min",PropertyInfo(Variant::REAL,"a"),PropertyInfo(Variant::REAL,"b"));
  1229. mi.return_val.type=Variant::REAL;
  1230. return mi;
  1231. } break;
  1232. case LOGIC_CLAMP: {
  1233. MethodInfo mi("clamp",PropertyInfo(Variant::REAL,"val"),PropertyInfo(Variant::REAL,"min"),PropertyInfo(Variant::REAL,"max"));
  1234. mi.return_val.type=Variant::REAL;
  1235. return mi;
  1236. } break;
  1237. case LOGIC_NEAREST_PO2: {
  1238. MethodInfo mi("nearest_po2",PropertyInfo(Variant::INT,"val"));
  1239. mi.return_val.type=Variant::INT;
  1240. return mi;
  1241. } break;
  1242. case OBJ_WEAKREF: {
  1243. MethodInfo mi("weakref",PropertyInfo(Variant::OBJECT,"obj"));
  1244. mi.return_val.type=Variant::OBJECT;
  1245. mi.return_val.name="WeakRef";
  1246. return mi;
  1247. } break;
  1248. case FUNC_FUNCREF: {
  1249. MethodInfo mi("funcref",PropertyInfo(Variant::OBJECT,"instance"),PropertyInfo(Variant::STRING,"funcname"));
  1250. mi.return_val.type=Variant::OBJECT;
  1251. mi.return_val.name="FuncRef";
  1252. return mi;
  1253. } break;
  1254. case TYPE_CONVERT: {
  1255. MethodInfo mi("convert",PropertyInfo(Variant::NIL,"what"),PropertyInfo(Variant::INT,"type"));
  1256. mi.return_val.type=Variant::OBJECT;
  1257. return mi;
  1258. } break;
  1259. case TYPE_OF: {
  1260. MethodInfo mi("typeof",PropertyInfo(Variant::NIL,"what"));
  1261. mi.return_val.type=Variant::INT;
  1262. return mi;
  1263. } break;
  1264. case TYPE_EXISTS: {
  1265. MethodInfo mi("type_exists",PropertyInfo(Variant::STRING,"type"));
  1266. mi.return_val.type=Variant::BOOL;
  1267. return mi;
  1268. } break;
  1269. case TEXT_CHAR: {
  1270. MethodInfo mi("char",PropertyInfo(Variant::INT,"ascii"));
  1271. mi.return_val.type=Variant::STRING;
  1272. return mi;
  1273. } break;
  1274. case TEXT_STR: {
  1275. MethodInfo mi("str",PropertyInfo(Variant::NIL,"what"),PropertyInfo(Variant::NIL,"..."));
  1276. mi.return_val.type=Variant::STRING;
  1277. return mi;
  1278. } break;
  1279. case TEXT_PRINT: {
  1280. MethodInfo mi("print",PropertyInfo(Variant::NIL,"what"),PropertyInfo(Variant::NIL,"..."));
  1281. mi.return_val.type=Variant::NIL;
  1282. return mi;
  1283. } break;
  1284. case TEXT_PRINT_TABBED: {
  1285. MethodInfo mi("printt",PropertyInfo(Variant::NIL,"what"),PropertyInfo(Variant::NIL,"..."));
  1286. mi.return_val.type=Variant::NIL;
  1287. return mi;
  1288. } break;
  1289. case TEXT_PRINT_SPACED: {
  1290. MethodInfo mi("prints",PropertyInfo(Variant::NIL,"what"),PropertyInfo(Variant::NIL,"..."));
  1291. mi.return_val.type=Variant::NIL;
  1292. return mi;
  1293. } break;
  1294. case TEXT_PRINTERR: {
  1295. MethodInfo mi("printerr",PropertyInfo(Variant::NIL,"what"),PropertyInfo(Variant::NIL,"..."));
  1296. mi.return_val.type=Variant::NIL;
  1297. return mi;
  1298. } break;
  1299. case TEXT_PRINTRAW: {
  1300. MethodInfo mi("printraw",PropertyInfo(Variant::NIL,"what"),PropertyInfo(Variant::NIL,"..."));
  1301. mi.return_val.type=Variant::NIL;
  1302. return mi;
  1303. } break;
  1304. case VAR_TO_STR: {
  1305. MethodInfo mi("var2str",PropertyInfo(Variant::NIL,"var"));
  1306. mi.return_val.type=Variant::STRING;
  1307. return mi;
  1308. } break;
  1309. case STR_TO_VAR: {
  1310. MethodInfo mi("str2var:Variant",PropertyInfo(Variant::STRING,"string"));
  1311. mi.return_val.type=Variant::NIL;
  1312. return mi;
  1313. } break;
  1314. case VAR_TO_BYTES: {
  1315. MethodInfo mi("var2bytes",PropertyInfo(Variant::NIL,"var"));
  1316. mi.return_val.type=Variant::POOL_BYTE_ARRAY;
  1317. return mi;
  1318. } break;
  1319. case BYTES_TO_VAR: {
  1320. MethodInfo mi("bytes2var:Variant",PropertyInfo(Variant::POOL_BYTE_ARRAY,"bytes"));
  1321. mi.return_val.type=Variant::NIL;
  1322. return mi;
  1323. } break;
  1324. case GEN_RANGE: {
  1325. MethodInfo mi("range",PropertyInfo(Variant::NIL,"..."));
  1326. mi.return_val.type=Variant::ARRAY;
  1327. return mi;
  1328. } break;
  1329. case RESOURCE_LOAD: {
  1330. MethodInfo mi("load",PropertyInfo(Variant::STRING,"path"));
  1331. mi.return_val.type=Variant::OBJECT;
  1332. mi.return_val.name="Resource";
  1333. return mi;
  1334. } break;
  1335. case INST2DICT: {
  1336. MethodInfo mi("inst2dict",PropertyInfo(Variant::OBJECT,"inst"));
  1337. mi.return_val.type=Variant::DICTIONARY;
  1338. return mi;
  1339. } break;
  1340. case DICT2INST: {
  1341. MethodInfo mi("dict2inst",PropertyInfo(Variant::DICTIONARY,"dict"));
  1342. mi.return_val.type=Variant::OBJECT;
  1343. return mi;
  1344. } break;
  1345. case VALIDATE_JSON: {
  1346. MethodInfo mi("validate_json:Variant",PropertyInfo(Variant::STRING,"json"));
  1347. mi.return_val.type=Variant::STRING;
  1348. return mi;
  1349. } break;
  1350. case PARSE_JSON: {
  1351. MethodInfo mi("parse_json:Variant",PropertyInfo(Variant::STRING,"json"));
  1352. mi.return_val.type=Variant::NIL;
  1353. return mi;
  1354. } break;
  1355. case TO_JSON: {
  1356. MethodInfo mi("to_json",PropertyInfo(Variant::NIL,"var:Variant"));
  1357. mi.return_val.type=Variant::STRING;
  1358. return mi;
  1359. } break;
  1360. case HASH: {
  1361. MethodInfo mi("hash",PropertyInfo(Variant::NIL,"var:Variant"));
  1362. mi.return_val.type=Variant::INT;
  1363. return mi;
  1364. } break;
  1365. case COLOR8: {
  1366. MethodInfo mi("Color8",PropertyInfo(Variant::INT,"r8"),PropertyInfo(Variant::INT,"g8"),PropertyInfo(Variant::INT,"b8"),PropertyInfo(Variant::INT,"a8"));
  1367. mi.return_val.type=Variant::COLOR;
  1368. return mi;
  1369. } break;
  1370. case COLORN: {
  1371. MethodInfo mi("ColorN",PropertyInfo(Variant::STRING,"name"),PropertyInfo(Variant::REAL,"alpha"));
  1372. mi.return_val.type=Variant::COLOR;
  1373. return mi;
  1374. } break;
  1375. case PRINT_STACK: {
  1376. MethodInfo mi("print_stack");
  1377. mi.return_val.type=Variant::NIL;
  1378. return mi;
  1379. } break;
  1380. case INSTANCE_FROM_ID: {
  1381. MethodInfo mi("instance_from_id",PropertyInfo(Variant::INT,"instance_id"));
  1382. mi.return_val.type=Variant::OBJECT;
  1383. return mi;
  1384. } break;
  1385. case FUNC_MAX: {
  1386. ERR_FAIL_V(MethodInfo());
  1387. } break;
  1388. }
  1389. #endif
  1390. return MethodInfo();
  1391. }