marshalls.cpp 26 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420
  1. /*************************************************************************/
  2. /* marshalls.cpp */
  3. /*************************************************************************/
  4. /* This file is part of: */
  5. /* GODOT ENGINE */
  6. /* http://www.godotengine.org */
  7. /*************************************************************************/
  8. /* Copyright (c) 2007-2015 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 "marshalls.h"
  30. #include "print_string.h"
  31. #include "os/keyboard.h"
  32. #include <stdio.h>
  33. Error decode_variant(Variant& r_variant,const uint8_t *p_buffer, int p_len,int *r_len) {
  34. const uint8_t * buf=p_buffer;
  35. int len=p_len;
  36. ERR_FAIL_COND_V(len<4,ERR_INVALID_DATA);
  37. uint32_t type=decode_uint32(buf);
  38. ERR_FAIL_COND_V(type>=Variant::VARIANT_MAX,ERR_INVALID_DATA);
  39. buf+=4;
  40. len-=4;
  41. if (r_len)
  42. *r_len=4;
  43. switch(type) {
  44. case Variant::NIL: {
  45. r_variant=Variant();
  46. } break;
  47. case Variant::BOOL: {
  48. ERR_FAIL_COND_V(len<4,ERR_INVALID_DATA);
  49. bool val = decode_uint32(buf);
  50. r_variant=val;
  51. if (r_len)
  52. (*r_len)+=4;
  53. } break;
  54. case Variant::INT: {
  55. ERR_FAIL_COND_V(len<4,ERR_INVALID_DATA);
  56. int val = decode_uint32(buf);
  57. r_variant=val;
  58. if (r_len)
  59. (*r_len)+=4;
  60. } break;
  61. case Variant::REAL: {
  62. ERR_FAIL_COND_V(len<(int)4,ERR_INVALID_DATA);
  63. float val = decode_float(buf);
  64. r_variant=val;
  65. if (r_len)
  66. (*r_len)+=4;
  67. } break;
  68. case Variant::STRING: {
  69. ERR_FAIL_COND_V(len<4,ERR_INVALID_DATA);
  70. uint32_t strlen = decode_uint32(buf);
  71. buf+=4;
  72. len-=4;
  73. ERR_FAIL_COND_V((int)strlen>len,ERR_INVALID_DATA);
  74. String str;
  75. str.parse_utf8((const char*)buf,strlen);
  76. r_variant=str;
  77. if (r_len) {
  78. if (strlen%4)
  79. (*r_len)+=4-strlen%4;
  80. (*r_len)+=4+strlen;
  81. }
  82. } break;
  83. // math types
  84. case Variant::VECTOR2: {
  85. ERR_FAIL_COND_V(len<(int)4*2,ERR_INVALID_DATA);
  86. Vector2 val;
  87. val.x=decode_float(&buf[0]);
  88. val.y=decode_float(&buf[4]);
  89. r_variant=val;
  90. if (r_len)
  91. (*r_len)+=4*2;
  92. } break; // 5
  93. case Variant::RECT2: {
  94. ERR_FAIL_COND_V(len<(int)4*4,ERR_INVALID_DATA);
  95. Rect2 val;
  96. val.pos.x=decode_float(&buf[0]);
  97. val.pos.y=decode_float(&buf[4]);
  98. val.size.x=decode_float(&buf[8]);
  99. val.size.y=decode_float(&buf[12]);
  100. r_variant=val;
  101. if (r_len)
  102. (*r_len)+=4*4;
  103. } break;
  104. case Variant::VECTOR3: {
  105. ERR_FAIL_COND_V(len<(int)4*3,ERR_INVALID_DATA);
  106. Vector3 val;
  107. val.x=decode_float(&buf[0]);
  108. val.y=decode_float(&buf[4]);
  109. val.z=decode_float(&buf[8]);
  110. r_variant=val;
  111. if (r_len)
  112. (*r_len)+=4*3;
  113. } break;
  114. case Variant::MATRIX32: {
  115. ERR_FAIL_COND_V(len<(int)4*6,ERR_INVALID_DATA);
  116. Matrix32 val;
  117. for(int i=0;i<3;i++) {
  118. for(int j=0;j<2;j++) {
  119. val.elements[i][j]=decode_float(&buf[(i*2+j)*4]);
  120. }
  121. }
  122. r_variant=val;
  123. if (r_len)
  124. (*r_len)+=4*6;
  125. } break;
  126. case Variant::PLANE: {
  127. ERR_FAIL_COND_V(len<(int)4*4,ERR_INVALID_DATA);
  128. Plane val;
  129. val.normal.x=decode_float(&buf[0]);
  130. val.normal.y=decode_float(&buf[4]);
  131. val.normal.z=decode_float(&buf[8]);
  132. val.d=decode_float(&buf[12]);
  133. r_variant=val;
  134. if (r_len)
  135. (*r_len)+=4*4;
  136. } break;
  137. case Variant::QUAT: {
  138. ERR_FAIL_COND_V(len<(int)4*4,ERR_INVALID_DATA);
  139. Quat val;
  140. val.x=decode_float(&buf[0]);
  141. val.y=decode_float(&buf[4]);
  142. val.z=decode_float(&buf[8]);
  143. val.w=decode_float(&buf[12]);
  144. r_variant=val;
  145. if (r_len)
  146. (*r_len)+=4*4;
  147. } break;
  148. case Variant::_AABB: {
  149. ERR_FAIL_COND_V(len<(int)4*6,ERR_INVALID_DATA);
  150. AABB val;
  151. val.pos.x=decode_float(&buf[0]);
  152. val.pos.y=decode_float(&buf[4]);
  153. val.pos.z=decode_float(&buf[8]);
  154. val.size.x=decode_float(&buf[12]);
  155. val.size.y=decode_float(&buf[16]);
  156. val.size.z=decode_float(&buf[20]);
  157. r_variant=val;
  158. if (r_len)
  159. (*r_len)+=4*6;
  160. } break;
  161. case Variant::MATRIX3: {
  162. ERR_FAIL_COND_V(len<(int)4*9,ERR_INVALID_DATA);
  163. Matrix3 val;
  164. for(int i=0;i<3;i++) {
  165. for(int j=0;j<3;j++) {
  166. val.elements[i][j]=decode_float(&buf[(i*3+j)*4]);
  167. }
  168. }
  169. r_variant=val;
  170. if (r_len)
  171. (*r_len)+=4*9;
  172. } break;
  173. case Variant::TRANSFORM: {
  174. ERR_FAIL_COND_V(len<(int)4*12,ERR_INVALID_DATA);
  175. Transform val;
  176. for(int i=0;i<3;i++) {
  177. for(int j=0;j<3;j++) {
  178. val.basis.elements[i][j]=decode_float(&buf[(i*3+j)*4]);
  179. }
  180. }
  181. val.origin[0]=decode_float(&buf[36]);
  182. val.origin[1]=decode_float(&buf[40]);
  183. val.origin[2]=decode_float(&buf[44]);
  184. r_variant=val;
  185. if (r_len)
  186. (*r_len)+=4*12;
  187. } break;
  188. // misc types
  189. case Variant::COLOR: {
  190. ERR_FAIL_COND_V(len<(int)4*4,ERR_INVALID_DATA);
  191. Color val;
  192. val.r=decode_float(&buf[0]);
  193. val.g=decode_float(&buf[4]);
  194. val.b=decode_float(&buf[8]);
  195. val.a=decode_float(&buf[12]);
  196. r_variant=val;
  197. if (r_len)
  198. (*r_len)+=4*4;
  199. } break;
  200. case Variant::IMAGE: {
  201. ERR_FAIL_COND_V(len<(int)5*4,ERR_INVALID_DATA);
  202. Image::Format fmt = (Image::Format)decode_uint32(&buf[0]);
  203. ERR_FAIL_INDEX_V( fmt, Image::FORMAT_MAX, ERR_INVALID_DATA);
  204. uint32_t mipmaps = decode_uint32(&buf[4]);
  205. uint32_t w = decode_uint32(&buf[8]);
  206. uint32_t h = decode_uint32(&buf[12]);
  207. uint32_t datalen = decode_uint32(&buf[16]);
  208. Image img;
  209. if (datalen>0) {
  210. len-=5*4;
  211. ERR_FAIL_COND_V( len < datalen, ERR_INVALID_DATA );
  212. DVector<uint8_t> data;
  213. data.resize(datalen);
  214. DVector<uint8_t>::Write wr = data.write();
  215. copymem(&wr[0],&buf[20],datalen);
  216. wr = DVector<uint8_t>::Write();
  217. img=Image(w,h,mipmaps,fmt,data);
  218. }
  219. r_variant=img;
  220. if (r_len) {
  221. if (datalen%4)
  222. (*r_len)+=4-datalen%4;
  223. (*r_len)+=4*5+datalen;
  224. }
  225. } break;
  226. case Variant::NODE_PATH: {
  227. ERR_FAIL_COND_V(len<4,ERR_INVALID_DATA);
  228. uint32_t strlen = decode_uint32(buf);
  229. if (strlen&0x80000000) {
  230. //new format
  231. ERR_FAIL_COND_V(len<12,ERR_INVALID_DATA);
  232. Vector<StringName> names;
  233. Vector<StringName> subnames;
  234. bool absolute;
  235. StringName prop;
  236. int i=0;
  237. uint32_t namecount=strlen&=0x7FFFFFFF;
  238. uint32_t subnamecount = decode_uint32(buf+4);
  239. uint32_t flags = decode_uint32(buf+8);
  240. len-=12;
  241. buf+=12;
  242. int total=namecount+subnamecount;
  243. if (flags&2)
  244. total++;
  245. if (r_len)
  246. (*r_len)+=12;
  247. for(int i=0;i<total;i++) {
  248. ERR_FAIL_COND_V((int)len<4,ERR_INVALID_DATA);
  249. strlen = decode_uint32(buf);
  250. int pad=0;
  251. if (strlen%4)
  252. pad+=4-strlen%4;
  253. buf+=4;
  254. len-=4;
  255. ERR_FAIL_COND_V((int)strlen+pad>len,ERR_INVALID_DATA);
  256. String str;
  257. str.parse_utf8((const char*)buf,strlen);
  258. if (i<namecount)
  259. names.push_back(str);
  260. else if (i<namecount+subnamecount)
  261. subnames.push_back(str);
  262. else
  263. prop=str;
  264. buf+=strlen+pad;
  265. len-=strlen+pad;
  266. if (r_len)
  267. (*r_len)+=4+strlen+pad;
  268. }
  269. r_variant=NodePath(names,subnames,flags&1,prop);
  270. } else {
  271. //old format, just a string
  272. buf+=4;
  273. len-=4;
  274. ERR_FAIL_COND_V((int)strlen>len,ERR_INVALID_DATA);
  275. String str;
  276. str.parse_utf8((const char*)buf,strlen);
  277. r_variant=NodePath(str);
  278. if (r_len)
  279. (*r_len)+=4+strlen;
  280. }
  281. } break;
  282. /*case Variant::RESOURCE: {
  283. ERR_EXPLAIN("Can't marshallize resources");
  284. ERR_FAIL_V(ERR_INVALID_DATA); //no, i'm sorry, no go
  285. } break;*/
  286. case Variant::_RID: {
  287. r_variant = RID();
  288. } break;
  289. case Variant::OBJECT: {
  290. r_variant = (Object*)NULL;
  291. } break;
  292. case Variant::INPUT_EVENT: {
  293. InputEvent ie;
  294. ie.type=decode_uint32(&buf[0]);
  295. ie.device=decode_uint32(&buf[4]);
  296. uint32_t len = decode_uint32(&buf[8])-12;
  297. if (r_len)
  298. (*r_len)+=12;
  299. switch(ie.type) {
  300. case InputEvent::KEY: {
  301. uint32_t mods=decode_uint32(&buf[12]);
  302. if (mods&KEY_MASK_SHIFT)
  303. ie.key.mod.shift=true;
  304. if (mods&KEY_MASK_CTRL)
  305. ie.key.mod.control=true;
  306. if (mods&KEY_MASK_ALT)
  307. ie.key.mod.alt=true;
  308. if (mods&KEY_MASK_META)
  309. ie.key.mod.meta=true;
  310. ie.key.scancode=decode_uint32(&buf[16]);
  311. if (r_len)
  312. (*r_len)+=8;
  313. } break;
  314. case InputEvent::MOUSE_BUTTON: {
  315. ie.mouse_button.button_index=decode_uint32(&buf[12]);
  316. if (r_len)
  317. (*r_len)+=4;
  318. } break;
  319. case InputEvent::JOYSTICK_BUTTON: {
  320. ie.joy_button.button_index=decode_uint32(&buf[12]);
  321. if (r_len)
  322. (*r_len)+=4;
  323. } break;
  324. case InputEvent::SCREEN_TOUCH: {
  325. ie.screen_touch.index=decode_uint32(&buf[12]);
  326. if (r_len)
  327. (*r_len)+=4;
  328. } break;
  329. case InputEvent::JOYSTICK_MOTION: {
  330. ie.joy_motion.axis=decode_uint32(&buf[12]);
  331. if (r_len)
  332. (*r_len)+=4;
  333. } break;
  334. }
  335. r_variant = ie;
  336. } break;
  337. case Variant::DICTIONARY: {
  338. ERR_FAIL_COND_V(len<4,ERR_INVALID_DATA);
  339. uint32_t count = decode_uint32(buf);
  340. bool shared = count&0x80000000;
  341. count&=0x7FFFFFFF;
  342. buf+=4;
  343. len-=4;
  344. if (r_len) {
  345. (*r_len)+=4;
  346. }
  347. Dictionary d(shared);
  348. for(uint32_t i=0;i<count;i++) {
  349. Variant key,value;
  350. int used;
  351. Error err = decode_variant(key,buf,len,&used);
  352. ERR_FAIL_COND_V(err,err);
  353. buf+=used;
  354. len-=used;
  355. if (r_len) {
  356. (*r_len)+=used;
  357. }
  358. err = decode_variant(value,buf,len,&used);
  359. ERR_FAIL_COND_V(err,err);
  360. buf+=used;
  361. len-=used;
  362. if (r_len) {
  363. (*r_len)+=used;
  364. }
  365. d[key]=value;
  366. }
  367. r_variant=d;
  368. } break;
  369. case Variant::ARRAY: {
  370. ERR_FAIL_COND_V(len<4,ERR_INVALID_DATA);
  371. uint32_t count = decode_uint32(buf);
  372. bool shared = count&0x80000000;
  373. count&=0x7FFFFFFF;
  374. buf+=4;
  375. len-=4;
  376. if (r_len) {
  377. (*r_len)+=4;
  378. }
  379. Array varr(shared);
  380. for(uint32_t i=0;i<count;i++) {
  381. int used=0;
  382. Variant v;
  383. Error err = decode_variant(v,buf,len,&used);
  384. ERR_FAIL_COND_V(err,err);
  385. buf+=used;
  386. len-=used;
  387. varr.push_back(v);
  388. if (r_len) {
  389. (*r_len)+=used;
  390. }
  391. }
  392. r_variant=varr;
  393. } break;
  394. // arrays
  395. case Variant::RAW_ARRAY: {
  396. ERR_FAIL_COND_V(len<4,ERR_INVALID_DATA);
  397. uint32_t count = decode_uint32(buf);
  398. buf+=4;
  399. len-=4;
  400. ERR_FAIL_COND_V((int)count>len,ERR_INVALID_DATA);
  401. DVector<uint8_t> data;
  402. if (count) {
  403. data.resize(count);
  404. DVector<uint8_t>::Write w = data.write();
  405. for(int i=0;i<count;i++) {
  406. w[i]=buf[i];
  407. }
  408. w = DVector<uint8_t>::Write();
  409. }
  410. r_variant=data;
  411. if (r_len) {
  412. if (count%4)
  413. (*r_len)+=4-count%4;
  414. (*r_len)+=4+count;
  415. }
  416. } break;
  417. case Variant::INT_ARRAY: {
  418. ERR_FAIL_COND_V(len<4,ERR_INVALID_DATA);
  419. uint32_t count = decode_uint32(buf);
  420. buf+=4;
  421. len-=4;
  422. ERR_FAIL_COND_V((int)count*4>len,ERR_INVALID_DATA);
  423. DVector<int> data;
  424. if (count) {
  425. //const int*rbuf=(const int*)buf;
  426. data.resize(count);
  427. DVector<int>::Write w = data.write();
  428. for(int i=0;i<count;i++) {
  429. w[i]=decode_uint32(&buf[i*4]);
  430. }
  431. w = DVector<int>::Write();
  432. }
  433. r_variant=Variant(data);
  434. if (r_len) {
  435. (*r_len)+=4+count*sizeof(int);
  436. }
  437. } break;
  438. case Variant::REAL_ARRAY: {
  439. ERR_FAIL_COND_V(len<4,ERR_INVALID_DATA);
  440. uint32_t count = decode_uint32(buf);
  441. buf+=4;
  442. len-=4;
  443. ERR_FAIL_COND_V((int)count*4>len,ERR_INVALID_DATA);
  444. DVector<float> data;
  445. if (count) {
  446. //const float*rbuf=(const float*)buf;
  447. data.resize(count);
  448. DVector<float>::Write w = data.write();
  449. for(int i=0;i<count;i++) {
  450. w[i]=decode_float(&buf[i*4]);
  451. }
  452. w = DVector<float>::Write();
  453. }
  454. r_variant=data;
  455. if (r_len) {
  456. (*r_len)+=4+count*sizeof(float);
  457. }
  458. } break;
  459. case Variant::STRING_ARRAY: {
  460. ERR_FAIL_COND_V(len<4,ERR_INVALID_DATA);
  461. uint32_t count = decode_uint32(buf);
  462. ERR_FAIL_COND_V(count<0,ERR_INVALID_DATA);
  463. DVector<String> strings;
  464. buf+=4;
  465. len-=4;
  466. if (r_len)
  467. (*r_len)+=4;
  468. //printf("string count: %i\n",count);
  469. for(int i=0;i<(int)count;i++) {
  470. ERR_FAIL_COND_V(len<4,ERR_INVALID_DATA);
  471. uint32_t strlen = decode_uint32(buf);
  472. buf+=4;
  473. len-=4;
  474. ERR_FAIL_COND_V((int)strlen>len,ERR_INVALID_DATA);
  475. //printf("loaded string: %s\n",(const char*)buf);
  476. String str;
  477. str.parse_utf8((const char*)buf,strlen);
  478. strings.push_back(str);
  479. buf+=strlen;
  480. len-=strlen;
  481. if (r_len)
  482. (*r_len)+=4+strlen;
  483. if (strlen%4) {
  484. int pad = 4-(strlen%4);
  485. buf+=pad;
  486. len-=pad;
  487. if (r_len) {
  488. (*r_len)+=pad;
  489. }
  490. }
  491. }
  492. r_variant=strings;
  493. } break;
  494. case Variant::VECTOR2_ARRAY: {
  495. ERR_FAIL_COND_V(len<4,ERR_INVALID_DATA);
  496. uint32_t count = decode_uint32(buf);
  497. ERR_FAIL_COND_V(count<0,ERR_INVALID_DATA);
  498. buf+=4;
  499. len-=4;
  500. ERR_FAIL_COND_V((int)count*4*2>len,ERR_INVALID_DATA);
  501. DVector<Vector2> varray;
  502. if (r_len) {
  503. (*r_len)+=4;
  504. }
  505. if (count) {
  506. varray.resize(count);
  507. DVector<Vector2>::Write w = varray.write();
  508. const float *r = (const float*)buf;
  509. for(int i=0;i<(int)count;i++) {
  510. w[i].x=decode_float(buf+i*4*2+4*0);
  511. w[i].y=decode_float(buf+i*4*2+4*1);
  512. }
  513. int adv = 4*2*count;
  514. if (r_len)
  515. (*r_len)+=adv;
  516. len-=adv;
  517. buf+=adv;
  518. }
  519. r_variant=varray;
  520. } break;
  521. case Variant::VECTOR3_ARRAY: {
  522. ERR_FAIL_COND_V(len<4,ERR_INVALID_DATA);
  523. uint32_t count = decode_uint32(buf);
  524. ERR_FAIL_COND_V(count<0,ERR_INVALID_DATA);
  525. buf+=4;
  526. len-=4;
  527. ERR_FAIL_COND_V((int)count*4*3>len,ERR_INVALID_DATA);
  528. DVector<Vector3> varray;
  529. if (r_len) {
  530. (*r_len)+=4;
  531. }
  532. if (count) {
  533. varray.resize(count);
  534. DVector<Vector3>::Write w = varray.write();
  535. const float *r = (const float*)buf;
  536. for(int i=0;i<(int)count;i++) {
  537. w[i].x=decode_float(buf+i*4*3+4*0);
  538. w[i].y=decode_float(buf+i*4*3+4*1);
  539. w[i].z=decode_float(buf+i*4*3+4*2);
  540. }
  541. int adv = 4*3*count;
  542. if (r_len)
  543. (*r_len)+=adv;
  544. len-=adv;
  545. buf+=adv;
  546. }
  547. r_variant=varray;
  548. } break;
  549. case Variant::COLOR_ARRAY: {
  550. ERR_FAIL_COND_V(len<4,ERR_INVALID_DATA);
  551. uint32_t count = decode_uint32(buf);
  552. ERR_FAIL_COND_V(count<0,ERR_INVALID_DATA);
  553. buf+=4;
  554. len-=4;
  555. ERR_FAIL_COND_V((int)count*4*4>len,ERR_INVALID_DATA);
  556. DVector<Color> carray;
  557. if (r_len) {
  558. (*r_len)+=4;
  559. }
  560. if (count) {
  561. carray.resize(count);
  562. DVector<Color>::Write w = carray.write();
  563. const float *r = (const float*)buf;
  564. for(int i=0;i<(int)count;i++) {
  565. w[i].r=decode_float(buf+i*4*4+4*0);
  566. w[i].g=decode_float(buf+i*4*4+4*1);
  567. w[i].b=decode_float(buf+i*4*4+4*2);
  568. w[i].a=decode_float(buf+i*4*4+4*3);
  569. }
  570. int adv = 4*4*count;
  571. if (r_len)
  572. (*r_len)+=adv;
  573. len-=adv;
  574. buf+=adv;
  575. }
  576. r_variant=carray;
  577. } break;
  578. default: { ERR_FAIL_V(ERR_BUG); }
  579. }
  580. return OK;
  581. }
  582. Error encode_variant(const Variant& p_variant, uint8_t *r_buffer, int &r_len) {
  583. uint8_t * buf=r_buffer;
  584. r_len=0;
  585. if (buf) {
  586. encode_uint32(p_variant.get_type(),buf);
  587. buf+=4;
  588. }
  589. r_len+=4;
  590. switch(p_variant.get_type()) {
  591. case Variant::NIL: {
  592. //nothing to do
  593. } break;
  594. case Variant::BOOL: {
  595. if (buf) {
  596. encode_uint32(p_variant.operator bool(),buf);
  597. }
  598. r_len+=4;
  599. } break;
  600. case Variant::INT: {
  601. if (buf) {
  602. encode_uint32(p_variant.operator int(),buf);
  603. }
  604. r_len+=4;
  605. } break;
  606. case Variant::REAL: {
  607. if (buf) {
  608. encode_float(p_variant.operator float(),buf);
  609. }
  610. r_len+=4;
  611. } break;
  612. case Variant::NODE_PATH: {
  613. NodePath np=p_variant;
  614. if (buf) {
  615. encode_uint32(uint32_t(np.get_name_count())|0x80000000,buf); //for compatibility with the old format
  616. encode_uint32(np.get_subname_count(),buf+4);
  617. uint32_t flags=0;
  618. if (np.is_absolute())
  619. flags|=1;
  620. if (np.get_property()!=StringName())
  621. flags|=2;
  622. encode_uint32(flags,buf+8);
  623. buf+=12;
  624. }
  625. r_len+=12;
  626. int total = np.get_name_count()+np.get_subname_count();
  627. if (np.get_property()!=StringName())
  628. total++;
  629. for(int i=0;i<total;i++) {
  630. String str;
  631. if (i<np.get_name_count())
  632. str=np.get_name(i);
  633. else if (i<np.get_name_count()+np.get_subname_count())
  634. str=np.get_subname(i-np.get_subname_count());
  635. else
  636. str=np.get_property();
  637. CharString utf8 = str.utf8();
  638. int pad = 0;
  639. if (utf8.length()%4)
  640. pad=4-utf8.length()%4;
  641. if (buf) {
  642. encode_uint32(utf8.length(),buf);
  643. buf+=4;
  644. copymem(buf,utf8.get_data(),utf8.length());
  645. buf+=pad+utf8.length();
  646. }
  647. r_len+=4+utf8.length()+pad;
  648. }
  649. } break;
  650. case Variant::STRING: {
  651. CharString utf8 = p_variant.operator String().utf8();
  652. if (buf) {
  653. encode_uint32(utf8.length(),buf);
  654. buf+=4;
  655. copymem(buf,utf8.get_data(),utf8.length());
  656. }
  657. r_len+=4+utf8.length();
  658. while (r_len%4)
  659. r_len++; //pad
  660. } break;
  661. // math types
  662. case Variant::VECTOR2: {
  663. if (buf) {
  664. Vector2 v2=p_variant;
  665. encode_float(v2.x,&buf[0]);
  666. encode_float(v2.y,&buf[4]);
  667. }
  668. r_len+=2*4;
  669. } break; // 5
  670. case Variant::RECT2: {
  671. if (buf) {
  672. Rect2 r2=p_variant;
  673. encode_float(r2.pos.x,&buf[0]);
  674. encode_float(r2.pos.y,&buf[4]);
  675. encode_float(r2.size.x,&buf[8]);
  676. encode_float(r2.size.y,&buf[12]);
  677. }
  678. r_len+=4*4;
  679. } break;
  680. case Variant::VECTOR3: {
  681. if (buf) {
  682. Vector3 v3=p_variant;
  683. encode_float(v3.x,&buf[0]);
  684. encode_float(v3.y,&buf[4]);
  685. encode_float(v3.z,&buf[8]);
  686. }
  687. r_len+=3*4;
  688. } break;
  689. case Variant::MATRIX32: {
  690. if (buf) {
  691. Matrix32 val=p_variant;
  692. for(int i=0;i<3;i++) {
  693. for(int j=0;j<2;j++) {
  694. copymem(&buf[(i*2+j)*4],&val.elements[i][j],sizeof(float));
  695. }
  696. }
  697. }
  698. r_len+=6*4;
  699. } break;
  700. case Variant::PLANE: {
  701. if (buf) {
  702. Plane p=p_variant;
  703. encode_float(p.normal.x,&buf[0]);
  704. encode_float(p.normal.y,&buf[4]);
  705. encode_float(p.normal.z,&buf[8]);
  706. encode_float(p.d,&buf[12]);
  707. }
  708. r_len+=4*4;
  709. } break;
  710. case Variant::QUAT: {
  711. if (buf) {
  712. Quat q=p_variant;
  713. encode_float(q.x,&buf[0]);
  714. encode_float(q.y,&buf[4]);
  715. encode_float(q.z,&buf[8]);
  716. encode_float(q.w,&buf[12]);
  717. }
  718. r_len+=4*4;
  719. } break;
  720. case Variant::_AABB: {
  721. if (buf) {
  722. AABB aabb=p_variant;
  723. encode_float(aabb.pos.x,&buf[0]);
  724. encode_float(aabb.pos.y,&buf[4]);
  725. encode_float(aabb.pos.z,&buf[8]);
  726. encode_float(aabb.size.x,&buf[12]);
  727. encode_float(aabb.size.y,&buf[16]);
  728. encode_float(aabb.size.z,&buf[20]);
  729. }
  730. r_len+=6*4;
  731. } break;
  732. case Variant::MATRIX3: {
  733. if (buf) {
  734. Matrix3 val=p_variant;
  735. for(int i=0;i<3;i++) {
  736. for(int j=0;j<3;j++) {
  737. copymem(&buf[(i*3+j)*4],&val.elements[i][j],sizeof(float));
  738. }
  739. }
  740. }
  741. r_len+=9*4;
  742. } break;
  743. case Variant::TRANSFORM: {
  744. if (buf) {
  745. Transform val=p_variant;
  746. for(int i=0;i<3;i++) {
  747. for(int j=0;j<3;j++) {
  748. copymem(&buf[(i*3+j)*4],&val.basis.elements[i][j],sizeof(float));
  749. }
  750. }
  751. encode_float(val.origin.x,&buf[36]);
  752. encode_float(val.origin.y,&buf[40]);
  753. encode_float(val.origin.z,&buf[44]);
  754. }
  755. r_len+=12*4;
  756. } break;
  757. // misc types
  758. case Variant::COLOR: {
  759. if (buf) {
  760. Color c=p_variant;
  761. encode_float(c.r,&buf[0]);
  762. encode_float(c.g,&buf[4]);
  763. encode_float(c.b,&buf[8]);
  764. encode_float(c.a,&buf[12]);
  765. }
  766. r_len+=4*4;
  767. } break;
  768. case Variant::IMAGE: {
  769. Image image = p_variant;
  770. DVector<uint8_t> data=image.get_data();
  771. if (buf) {
  772. encode_uint32(image.get_format(),&buf[0]);
  773. encode_uint32(image.get_mipmaps(),&buf[4]);
  774. encode_uint32(image.get_width(),&buf[8]);
  775. encode_uint32(image.get_height(),&buf[12]);
  776. int ds=data.size();
  777. encode_uint32(ds,&buf[16]);
  778. DVector<uint8_t>::Read r = data.read();
  779. copymem(&buf[20],&r[0],ds);
  780. }
  781. int pad=0;
  782. if (data.size()%4)
  783. pad=4-data.size()%4;
  784. r_len+=data.size()+5*4+pad;
  785. } break;
  786. /*case Variant::RESOURCE: {
  787. ERR_EXPLAIN("Can't marshallize resources");
  788. ERR_FAIL_V(ERR_INVALID_DATA); //no, i'm sorry, no go
  789. } break;*/
  790. case Variant::_RID:
  791. case Variant::OBJECT: {
  792. } break;
  793. case Variant::INPUT_EVENT: {
  794. InputEvent ie=p_variant;
  795. if (buf) {
  796. encode_uint32(ie.type,&buf[0]);
  797. encode_uint32(ie.device,&buf[4]);
  798. encode_uint32(0,&buf[8]);
  799. }
  800. int llen=12;
  801. switch(ie.type) {
  802. case InputEvent::KEY: {
  803. if (buf) {
  804. uint32_t mods=0;
  805. if (ie.key.mod.shift)
  806. mods|=KEY_MASK_SHIFT;
  807. if (ie.key.mod.control)
  808. mods|=KEY_MASK_CTRL;
  809. if (ie.key.mod.alt)
  810. mods|=KEY_MASK_ALT;
  811. if (ie.key.mod.meta)
  812. mods|=KEY_MASK_META;
  813. encode_uint32(mods,&buf[llen]);
  814. encode_uint32(ie.key.scancode,&buf[llen+4]);
  815. }
  816. llen+=8;
  817. } break;
  818. case InputEvent::MOUSE_BUTTON: {
  819. if (buf) {
  820. encode_uint32(ie.mouse_button.button_index,&buf[llen]);
  821. }
  822. llen+=4;
  823. } break;
  824. case InputEvent::JOYSTICK_BUTTON: {
  825. if (buf) {
  826. encode_uint32(ie.joy_button.button_index,&buf[llen]);
  827. }
  828. llen+=4;
  829. } break;
  830. case InputEvent::SCREEN_TOUCH: {
  831. if (buf) {
  832. encode_uint32(ie.screen_touch.index,&buf[llen]);
  833. }
  834. llen+=4;
  835. } break;
  836. case InputEvent::JOYSTICK_MOTION: {
  837. if (buf) {
  838. int axis = ie.joy_motion.axis;
  839. encode_uint32(axis,&buf[llen]);
  840. }
  841. llen+=4;
  842. } break;
  843. }
  844. if (buf)
  845. encode_uint32(llen,&buf[8]);
  846. r_len+=llen;
  847. // not supported
  848. } break;
  849. case Variant::DICTIONARY: {
  850. Dictionary d = p_variant;
  851. if (buf) {
  852. encode_uint32(uint32_t(d.size())|(d.is_shared()?0x80000000:0),buf);
  853. buf+=4;
  854. }
  855. r_len+=4;
  856. List<Variant> keys;
  857. d.get_key_list(&keys);
  858. for(List<Variant>::Element *E=keys.front();E;E=E->next()) {
  859. /*
  860. CharString utf8 = E->->utf8();
  861. if (buf) {
  862. encode_uint32(utf8.length()+1,buf);
  863. buf+=4;
  864. copymem(buf,utf8.get_data(),utf8.length()+1);
  865. }
  866. r_len+=4+utf8.length()+1;
  867. while (r_len%4)
  868. r_len++; //pad
  869. */
  870. int len;
  871. encode_variant(E->get(),buf,len);
  872. ERR_FAIL_COND_V(len%4,ERR_BUG);
  873. r_len+=len;
  874. if (buf)
  875. buf += len;
  876. encode_variant(d[E->get()],buf,len);
  877. ERR_FAIL_COND_V(len%4,ERR_BUG);
  878. r_len+=len;
  879. if (buf)
  880. buf += len;
  881. }
  882. } break;
  883. case Variant::ARRAY: {
  884. Array v = p_variant;
  885. if (buf) {
  886. encode_uint32(uint32_t(v.size())|(v.is_shared()?0x80000000:0),buf);
  887. buf+=4;
  888. }
  889. r_len+=4;
  890. for(int i=0;i<v.size();i++) {
  891. int len;
  892. encode_variant(v.get(i),buf,len);
  893. ERR_FAIL_COND_V(len%4,ERR_BUG);
  894. r_len+=len;
  895. if (buf)
  896. buf+=len;
  897. }
  898. } break;
  899. // arrays
  900. case Variant::RAW_ARRAY: {
  901. DVector<uint8_t> data = p_variant;
  902. int datalen=data.size();
  903. int datasize=sizeof(uint8_t);
  904. if (buf) {
  905. encode_uint32(datalen,buf);
  906. buf+=4;
  907. DVector<uint8_t>::Read r = data.read();
  908. copymem(buf,&r[0],datalen*datasize);
  909. }
  910. r_len+=4+datalen*datasize;
  911. while(r_len%4)
  912. r_len++;
  913. } break;
  914. case Variant::INT_ARRAY: {
  915. DVector<int> data = p_variant;
  916. int datalen=data.size();
  917. int datasize=sizeof(int32_t);
  918. if (buf) {
  919. encode_uint32(datalen,buf);
  920. buf+=4;
  921. DVector<int>::Read r = data.read();
  922. for(int i=0;i<datalen;i++)
  923. encode_uint32(r[i],&buf[i*datasize]);
  924. }
  925. r_len+=4+datalen*datasize;
  926. } break;
  927. case Variant::REAL_ARRAY: {
  928. DVector<real_t> data = p_variant;
  929. int datalen=data.size();
  930. int datasize=sizeof(real_t);
  931. if (buf) {
  932. encode_uint32(datalen,buf);
  933. buf+=4;
  934. DVector<real_t>::Read r = data.read();
  935. for(int i=0;i<datalen;i++)
  936. encode_float(r[i],&buf[i*datasize]);
  937. }
  938. r_len+=4+datalen*datasize;
  939. } break;
  940. case Variant::STRING_ARRAY: {
  941. DVector<String> data = p_variant;
  942. int len=data.size();
  943. if (buf) {
  944. encode_uint32(len,buf);
  945. buf+=4;
  946. }
  947. r_len+=4;
  948. for(int i=0;i<len;i++) {
  949. CharString utf8 = data.get(i).utf8();
  950. if (buf) {
  951. encode_uint32(utf8.length()+1,buf);
  952. buf+=4;
  953. copymem(buf,utf8.get_data(),utf8.length()+1);
  954. buf+=utf8.length()+1;
  955. }
  956. r_len+=4+utf8.length()+1;
  957. while (r_len%4) {
  958. r_len++; //pad
  959. if (buf)
  960. buf++;
  961. }
  962. }
  963. } break;
  964. case Variant::VECTOR2_ARRAY: {
  965. DVector<Vector2> data = p_variant;
  966. int len=data.size();
  967. if (buf) {
  968. encode_uint32(len,buf);
  969. buf+=4;
  970. }
  971. r_len+=4;
  972. if (buf) {
  973. for(int i=0;i<len;i++) {
  974. Vector2 v = data.get(i);
  975. encode_float(v.x,&buf[0]);
  976. encode_float(v.y,&buf[4]);
  977. buf+=4*2;
  978. }
  979. }
  980. r_len+=4*2*len;
  981. } break;
  982. case Variant::VECTOR3_ARRAY: {
  983. DVector<Vector3> data = p_variant;
  984. int len=data.size();
  985. if (buf) {
  986. encode_uint32(len,buf);
  987. buf+=4;
  988. }
  989. r_len+=4;
  990. if (buf) {
  991. for(int i=0;i<len;i++) {
  992. Vector3 v = data.get(i);
  993. encode_float(v.x,&buf[0]);
  994. encode_float(v.y,&buf[4]);
  995. encode_float(v.z,&buf[8]);
  996. buf+=4*3;
  997. }
  998. }
  999. r_len+=4*3*len;
  1000. } break;
  1001. case Variant::COLOR_ARRAY: {
  1002. DVector<Color> data = p_variant;
  1003. int len=data.size();
  1004. if (buf) {
  1005. encode_uint32(len,buf);
  1006. buf+=4;
  1007. }
  1008. r_len+=4;
  1009. if (buf) {
  1010. for(int i=0;i<len;i++) {
  1011. Color c = data.get(i);
  1012. encode_float(c.r,&buf[0]);
  1013. encode_float(c.g,&buf[4]);
  1014. encode_float(c.b,&buf[8]);
  1015. encode_float(c.a,&buf[12]);
  1016. buf+=4*4;
  1017. }
  1018. }
  1019. r_len+=4*4*len;
  1020. } break;
  1021. default: { ERR_FAIL_V(ERR_BUG); }
  1022. }
  1023. return OK;
  1024. }