ObjectStreamBinaryIn.cpp 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234
  1. // Jolt Physics Library (https://github.com/jrouwe/JoltPhysics)
  2. // SPDX-FileCopyrightText: 2021 Jorrit Rouwe
  3. // SPDX-License-Identifier: MIT
  4. #include <Jolt/Jolt.h>
  5. #ifdef JPH_OBJECT_STREAM
  6. #include <Jolt/ObjectStream/ObjectStreamBinaryIn.h>
  7. JPH_NAMESPACE_BEGIN
  8. ObjectStreamBinaryIn::ObjectStreamBinaryIn(istream &inStream) :
  9. ObjectStreamIn(inStream)
  10. {
  11. }
  12. bool ObjectStreamBinaryIn::ReadDataType(EOSDataType &outType)
  13. {
  14. uint32 type;
  15. mStream.read((char *)&type, sizeof(type));
  16. if (mStream.fail()) return false;
  17. outType = (EOSDataType)type;
  18. return true;
  19. }
  20. bool ObjectStreamBinaryIn::ReadName(String &outName)
  21. {
  22. return ReadPrimitiveData(outName);
  23. }
  24. bool ObjectStreamBinaryIn::ReadIdentifier(Identifier &outIdentifier)
  25. {
  26. Identifier id;
  27. mStream.read((char *)&id, sizeof(id));
  28. if (mStream.fail()) return false;
  29. outIdentifier = id;
  30. return true;
  31. }
  32. bool ObjectStreamBinaryIn::ReadCount(uint32 &outCount)
  33. {
  34. uint32 count;
  35. mStream.read((char *)&count, sizeof(count));
  36. if (mStream.fail()) return false;
  37. outCount = count;
  38. return true;
  39. }
  40. bool ObjectStreamBinaryIn::ReadPrimitiveData(uint8 &outPrimitive)
  41. {
  42. uint8 primitive;
  43. mStream.read((char *)&primitive, sizeof(primitive));
  44. if (mStream.fail()) return false;
  45. outPrimitive = primitive;
  46. return true;
  47. }
  48. bool ObjectStreamBinaryIn::ReadPrimitiveData(uint16 &outPrimitive)
  49. {
  50. uint16 primitive;
  51. mStream.read((char *)&primitive, sizeof(primitive));
  52. if (mStream.fail()) return false;
  53. outPrimitive = primitive;
  54. return true;
  55. }
  56. bool ObjectStreamBinaryIn::ReadPrimitiveData(int &outPrimitive)
  57. {
  58. int primitive;
  59. mStream.read((char *)&primitive, sizeof(primitive));
  60. if (mStream.fail()) return false;
  61. outPrimitive = primitive;
  62. return true;
  63. }
  64. bool ObjectStreamBinaryIn::ReadPrimitiveData(uint32 &outPrimitive)
  65. {
  66. uint32 primitive;
  67. mStream.read((char *)&primitive, sizeof(primitive));
  68. if (mStream.fail()) return false;
  69. outPrimitive = primitive;
  70. return true;
  71. }
  72. bool ObjectStreamBinaryIn::ReadPrimitiveData(uint64 &outPrimitive)
  73. {
  74. uint64 primitive;
  75. mStream.read((char *)&primitive, sizeof(primitive));
  76. if (mStream.fail()) return false;
  77. outPrimitive = primitive;
  78. return true;
  79. }
  80. bool ObjectStreamBinaryIn::ReadPrimitiveData(float &outPrimitive)
  81. {
  82. float primitive;
  83. mStream.read((char *)&primitive, sizeof(primitive));
  84. if (mStream.fail()) return false;
  85. outPrimitive = primitive;
  86. return true;
  87. }
  88. bool ObjectStreamBinaryIn::ReadPrimitiveData(double &outPrimitive)
  89. {
  90. double primitive;
  91. mStream.read((char *)&primitive, sizeof(primitive));
  92. if (mStream.fail()) return false;
  93. outPrimitive = primitive;
  94. return true;
  95. }
  96. bool ObjectStreamBinaryIn::ReadPrimitiveData(bool &outPrimitive)
  97. {
  98. bool primitive;
  99. mStream.read((char *)&primitive, sizeof(primitive));
  100. if (mStream.fail()) return false;
  101. outPrimitive = primitive;
  102. return true;
  103. }
  104. bool ObjectStreamBinaryIn::ReadPrimitiveData(String &outPrimitive)
  105. {
  106. // Read length or ID of string
  107. uint32 len;
  108. if (!ReadPrimitiveData(len))
  109. return false;
  110. // Check empty string
  111. if (len == 0)
  112. {
  113. outPrimitive.clear();
  114. return true;
  115. }
  116. // Check if it is an ID in the string table
  117. if (len & 0x80000000)
  118. {
  119. StringTable::iterator i = mStringTable.find(len);
  120. if (i == mStringTable.end())
  121. return false;
  122. outPrimitive = i->second;
  123. return true;
  124. }
  125. // Read the string
  126. char *data = (char *)JPH_STACK_ALLOC(len + 1);
  127. mStream.read(data, len);
  128. if (mStream.fail()) return false;
  129. data[len] = 0;
  130. outPrimitive = data;
  131. // Insert string in table
  132. mStringTable.try_emplace(mNextStringID, outPrimitive);
  133. mNextStringID++;
  134. return true;
  135. }
  136. bool ObjectStreamBinaryIn::ReadPrimitiveData(Float3 &outPrimitive)
  137. {
  138. Float3 primitive;
  139. mStream.read((char *)&primitive, sizeof(Float3));
  140. if (mStream.fail()) return false;
  141. outPrimitive = primitive;
  142. return true;
  143. }
  144. bool ObjectStreamBinaryIn::ReadPrimitiveData(Double3 &outPrimitive)
  145. {
  146. Double3 primitive;
  147. mStream.read((char *)&primitive, sizeof(Double3));
  148. if (mStream.fail()) return false;
  149. outPrimitive = primitive;
  150. return true;
  151. }
  152. bool ObjectStreamBinaryIn::ReadPrimitiveData(Vec3 &outPrimitive)
  153. {
  154. Float3 primitive;
  155. mStream.read((char *)&primitive, sizeof(Float3));
  156. if (mStream.fail()) return false;
  157. outPrimitive = Vec3(primitive); // Use Float3 constructor so that we initialize W too
  158. return true;
  159. }
  160. bool ObjectStreamBinaryIn::ReadPrimitiveData(DVec3 &outPrimitive)
  161. {
  162. Double3 primitive;
  163. mStream.read((char *)&primitive, sizeof(Double3));
  164. if (mStream.fail()) return false;
  165. outPrimitive = DVec3(primitive); // Use Float3 constructor so that we initialize W too
  166. return true;
  167. }
  168. bool ObjectStreamBinaryIn::ReadPrimitiveData(Vec4 &outPrimitive)
  169. {
  170. Vec4 primitive;
  171. mStream.read((char *)&primitive, sizeof(primitive));
  172. if (mStream.fail()) return false;
  173. outPrimitive = primitive;
  174. return true;
  175. }
  176. bool ObjectStreamBinaryIn::ReadPrimitiveData(Quat &outPrimitive)
  177. {
  178. Quat primitive;
  179. mStream.read((char *)&primitive, sizeof(primitive));
  180. if (mStream.fail()) return false;
  181. outPrimitive = primitive;
  182. return true;
  183. }
  184. bool ObjectStreamBinaryIn::ReadPrimitiveData(Mat44 &outPrimitive)
  185. {
  186. Mat44 primitive;
  187. mStream.read((char *)&primitive, sizeof(primitive));
  188. if (mStream.fail()) return false;
  189. outPrimitive = primitive;
  190. return true;
  191. }
  192. bool ObjectStreamBinaryIn::ReadPrimitiveData(DMat44 &outPrimitive)
  193. {
  194. Vec4 c0, c1, c2;
  195. DVec3 c3;
  196. if (!ReadPrimitiveData(c0) || !ReadPrimitiveData(c1) || !ReadPrimitiveData(c2) || !ReadPrimitiveData(c3))
  197. return false;
  198. outPrimitive = DMat44(c0, c1, c2, c3);
  199. return true;
  200. }
  201. JPH_NAMESPACE_END
  202. #endif // JPH_OBJECT_STREAM