Deserializer.cpp 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417
  1. //
  2. // Urho3D Engine
  3. // Copyright (c) 2008-2012 Lasse Oorni
  4. //
  5. // Permission is hereby granted, free of charge, to any person obtaining a copy
  6. // of this software and associated documentation files (the "Software"), to deal
  7. // in the Software without restriction, including without limitation the rights
  8. // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  9. // copies of the Software, and to permit persons to whom the Software is
  10. // furnished to do so, subject to the following conditions:
  11. //
  12. // The above copyright notice and this permission notice shall be included in
  13. // all copies or substantial portions of the Software.
  14. //
  15. // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  16. // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  17. // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  18. // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  19. // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  20. // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  21. // THE SOFTWARE.
  22. //
  23. #include "Precompiled.h"
  24. #include "Deserializer.h"
  25. #include "DebugNew.h"
  26. namespace Urho3D
  27. {
  28. static const float invQ = 1.0f / 32767.0f;
  29. Deserializer::Deserializer() :
  30. position_(0),
  31. size_(0)
  32. {
  33. }
  34. Deserializer::Deserializer(unsigned size) :
  35. position_(0),
  36. size_(size)
  37. {
  38. }
  39. Deserializer::~Deserializer()
  40. {
  41. }
  42. const String& Deserializer::GetName() const
  43. {
  44. return String::EMPTY;
  45. }
  46. unsigned Deserializer::GetChecksum()
  47. {
  48. return 0;
  49. }
  50. int Deserializer::ReadInt()
  51. {
  52. int ret;
  53. Read(&ret, sizeof ret);
  54. return ret;
  55. }
  56. short Deserializer::ReadShort()
  57. {
  58. short ret;
  59. Read(&ret, sizeof ret);
  60. return ret;
  61. }
  62. signed char Deserializer::ReadByte()
  63. {
  64. signed char ret;
  65. Read(&ret, sizeof ret);
  66. return ret;
  67. }
  68. unsigned Deserializer::ReadUInt()
  69. {
  70. unsigned ret;
  71. Read(&ret, sizeof ret);
  72. return ret;
  73. }
  74. unsigned short Deserializer::ReadUShort()
  75. {
  76. unsigned short ret;
  77. Read(&ret, sizeof ret);
  78. return ret;
  79. }
  80. unsigned char Deserializer::ReadUByte()
  81. {
  82. unsigned char ret;
  83. Read(&ret, sizeof ret);
  84. return ret;
  85. }
  86. bool Deserializer::ReadBool()
  87. {
  88. if (ReadUByte())
  89. return true;
  90. else
  91. return false;
  92. }
  93. float Deserializer::ReadFloat()
  94. {
  95. float ret;
  96. Read(&ret, sizeof ret);
  97. return ret;
  98. }
  99. IntRect Deserializer::ReadIntRect()
  100. {
  101. IntRect ret;
  102. Read((void*)ret.Data(), sizeof ret);
  103. return ret;
  104. }
  105. IntVector2 Deserializer::ReadIntVector2()
  106. {
  107. IntVector2 ret;
  108. Read((void*)ret.Data(), sizeof ret);
  109. return ret;
  110. }
  111. Rect Deserializer::ReadRect()
  112. {
  113. Rect ret;
  114. Read((void*)ret.Data(), sizeof ret);
  115. return ret;
  116. }
  117. Vector2 Deserializer::ReadVector2()
  118. {
  119. Vector2 ret;
  120. Read((void*)ret.Data(), sizeof ret);
  121. return ret;
  122. }
  123. Vector3 Deserializer::ReadVector3()
  124. {
  125. Vector3 ret;
  126. Read((void*)ret.Data(), sizeof ret);
  127. return ret;
  128. }
  129. Vector3 Deserializer::ReadPackedVector3(float maxAbsCoord)
  130. {
  131. Vector3 ret;
  132. float invV = maxAbsCoord / 32767.0f;
  133. short coords[3];
  134. Read(&coords[0], sizeof coords);
  135. ret.x_ = coords[0] * invV;
  136. ret.y_ = coords[1] * invV;
  137. ret.z_ = coords[2] * invV;
  138. return ret;
  139. }
  140. Vector4 Deserializer::ReadVector4()
  141. {
  142. Vector4 ret;
  143. Read((void*)ret.Data(), sizeof ret);
  144. return ret;
  145. }
  146. Quaternion Deserializer::ReadQuaternion()
  147. {
  148. Quaternion ret;
  149. Read((void*)ret.Data(), sizeof ret);
  150. return ret;
  151. }
  152. Quaternion Deserializer::ReadPackedQuaternion()
  153. {
  154. short coords[4];
  155. Quaternion ret;
  156. Read(&coords[0], sizeof coords);
  157. ret.w_ = coords[0] * invQ;
  158. ret.x_ = coords[1] * invQ;
  159. ret.y_ = coords[2] * invQ;
  160. ret.z_ = coords[3] * invQ;
  161. ret.Normalize();
  162. return ret;
  163. }
  164. Color Deserializer::ReadColor()
  165. {
  166. Color ret;
  167. Read((void*)ret.Data(), sizeof ret);
  168. return ret;
  169. }
  170. BoundingBox Deserializer::ReadBoundingBox()
  171. {
  172. BoundingBox ret;
  173. ret.min_ = ReadVector3();
  174. ret.max_ = ReadVector3();
  175. ret.defined_ = true;
  176. return ret;
  177. }
  178. String Deserializer::ReadString()
  179. {
  180. String ret;
  181. for (;;)
  182. {
  183. char c = ReadByte();
  184. if (!c)
  185. break;
  186. else
  187. ret += c;
  188. }
  189. return ret;
  190. }
  191. String Deserializer::ReadFileID()
  192. {
  193. String ret;
  194. ret.Resize(4);
  195. Read(&ret[0], 4);
  196. return ret;
  197. }
  198. StringHash Deserializer::ReadStringHash()
  199. {
  200. return StringHash(ReadUInt());
  201. }
  202. ShortStringHash Deserializer::ReadShortStringHash()
  203. {
  204. return ShortStringHash(ReadUShort());
  205. }
  206. PODVector<unsigned char> Deserializer::ReadBuffer()
  207. {
  208. PODVector<unsigned char> ret(ReadVLE());
  209. if (ret.Size())
  210. Read(&ret[0], ret.Size());
  211. return ret;
  212. }
  213. ResourceRef Deserializer::ReadResourceRef()
  214. {
  215. ResourceRef ret;
  216. ret.type_ = ReadShortStringHash();
  217. ret.id_ = ReadStringHash();
  218. return ret;
  219. }
  220. ResourceRefList Deserializer::ReadResourceRefList()
  221. {
  222. ResourceRefList ret;
  223. ret.type_ = ReadShortStringHash();
  224. ret.ids_.Resize(ReadVLE());
  225. if (ret.ids_.Size())
  226. Read(&ret.ids_[0], ret.ids_.Size() * sizeof(StringHash));
  227. return ret;
  228. }
  229. Variant Deserializer::ReadVariant()
  230. {
  231. VariantType type = (VariantType)ReadUByte();
  232. return ReadVariant(type);
  233. }
  234. Variant Deserializer::ReadVariant(VariantType type)
  235. {
  236. switch (type)
  237. {
  238. case VAR_INT:
  239. return Variant(ReadInt());
  240. case VAR_BOOL:
  241. return Variant(ReadBool());
  242. case VAR_FLOAT:
  243. return Variant(ReadFloat());
  244. case VAR_VECTOR2:
  245. return Variant(ReadVector2());
  246. case VAR_VECTOR3:
  247. return Variant(ReadVector3());
  248. case VAR_VECTOR4:
  249. return Variant(ReadVector4());
  250. case VAR_QUATERNION:
  251. return Variant(ReadQuaternion());
  252. case VAR_COLOR:
  253. return Variant(ReadColor());
  254. case VAR_STRING:
  255. return Variant(ReadString());
  256. case VAR_BUFFER:
  257. return Variant(ReadBuffer());
  258. case VAR_PTR:
  259. ReadUInt();
  260. return Variant((void*)0);
  261. case VAR_RESOURCEREF:
  262. return Variant(ReadResourceRef());
  263. case VAR_RESOURCEREFLIST:
  264. return Variant(ReadResourceRefList());
  265. case VAR_VARIANTVECTOR:
  266. return Variant(ReadVariantVector());
  267. case VAR_VARIANTMAP:
  268. return Variant(ReadVariantMap());
  269. case VAR_INTRECT:
  270. return Variant(ReadIntRect());
  271. case VAR_INTVECTOR2:
  272. return Variant(ReadIntVector2());
  273. default:
  274. return Variant();
  275. }
  276. }
  277. VariantVector Deserializer::ReadVariantVector()
  278. {
  279. VariantVector ret(ReadVLE());
  280. for (unsigned i = 0; i < ret.Size(); ++i)
  281. ret[i] = ReadVariant();
  282. return ret;
  283. }
  284. VariantMap Deserializer::ReadVariantMap()
  285. {
  286. VariantMap ret;
  287. unsigned num = ReadVLE();
  288. for (unsigned i = 0; i < num; ++i)
  289. {
  290. ShortStringHash key = ReadShortStringHash();
  291. ret[key] = ReadVariant();
  292. }
  293. return ret;
  294. }
  295. unsigned Deserializer::ReadVLE()
  296. {
  297. unsigned ret;
  298. unsigned char byte;
  299. byte = ReadUByte();
  300. ret = byte & 0x7f;
  301. if (byte < 0x80)
  302. return ret;
  303. byte = ReadUByte();
  304. ret |= ((unsigned)(byte & 0x7f)) << 7;
  305. if (byte < 0x80)
  306. return ret;
  307. byte = ReadUByte();
  308. ret |= ((unsigned)(byte & 0x7f)) << 14;
  309. if (byte < 0x80)
  310. return ret;
  311. byte = ReadUByte();
  312. ret |= ((unsigned)byte) << 21;
  313. return ret;
  314. }
  315. unsigned Deserializer::ReadNetID()
  316. {
  317. unsigned ret = 0;
  318. Read(&ret, 3);
  319. return ret;
  320. }
  321. String Deserializer::ReadLine()
  322. {
  323. String ret;
  324. while (!IsEof())
  325. {
  326. char c = ReadByte();
  327. if (c == 10)
  328. break;
  329. if (c == 13)
  330. {
  331. // Peek next char to see if it's 10, and skip it too
  332. if (!IsEof())
  333. {
  334. char next = ReadByte();
  335. if (next != 10)
  336. Seek(position_ - 1);
  337. }
  338. break;
  339. }
  340. ret += c;
  341. }
  342. return ret;
  343. }
  344. }