marshalls.cpp 26 KB

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